mirror of
				https://github.com/johrpan/musicus.git
				synced 2025-10-26 19:57:25 +01:00 
			
		
		
		
	server: Switch to strings for IDs
This commit is contained in:
		
							parent
							
								
									3b8ed4bdb1
								
							
						
					
					
						commit
						157bdb2917
					
				
					 8 changed files with 132 additions and 140 deletions
				
			
		|  | @ -8,63 +8,63 @@ CREATE TABLE users ( | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| CREATE TABLE persons ( | CREATE TABLE persons ( | ||||||
|     id BIGINT NOT NULL PRIMARY KEY, |     id TEXT NOT NULL PRIMARY KEY, | ||||||
|     first_name TEXT NOT NULL, |     first_name TEXT NOT NULL, | ||||||
|     last_name TEXT NOT NULL, |     last_name TEXT NOT NULL, | ||||||
|     created_by TEXT NOT NULL REFERENCES users(username) |     created_by TEXT NOT NULL REFERENCES users(username) | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| CREATE TABLE instruments ( | CREATE TABLE instruments ( | ||||||
|     id BIGINT NOT NULL PRIMARY KEY, |     id TEXT NOT NULL PRIMARY KEY, | ||||||
|     name TEXT NOT NULL, |     name TEXT NOT NULL, | ||||||
|     created_by TEXT NOT NULL REFERENCES users(username) |     created_by TEXT NOT NULL REFERENCES users(username) | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| CREATE TABLE works ( | CREATE TABLE works ( | ||||||
|     id BIGINT NOT NULL PRIMARY KEY, |     id TEXT NOT NULL PRIMARY KEY, | ||||||
|     composer BIGINT NOT NULL REFERENCES persons(id), |     composer TEXT NOT NULL REFERENCES persons(id), | ||||||
|     title TEXT NOT NULL, |     title TEXT NOT NULL, | ||||||
|     created_by TEXT NOT NULL REFERENCES users(username) |     created_by TEXT NOT NULL REFERENCES users(username) | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| CREATE TABLE instrumentations ( | CREATE TABLE instrumentations ( | ||||||
|     id BIGINT NOT NULL PRIMARY KEY, |     id BIGINT NOT NULL PRIMARY KEY, | ||||||
|     work BIGINT NOT NULL REFERENCES works(id) ON DELETE CASCADE, |     work TEXT NOT NULL REFERENCES works(id) ON DELETE CASCADE, | ||||||
|     instrument BIGINT NOT NULL REFERENCES instruments(id) ON DELETE CASCADE |     instrument TEXT NOT NULL REFERENCES instruments(id) ON DELETE CASCADE | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| CREATE TABLE work_parts ( | CREATE TABLE work_parts ( | ||||||
|     id BIGINT NOT NULL PRIMARY KEY, |     id BIGINT NOT NULL PRIMARY KEY, | ||||||
|     work BIGINT NOT NULL REFERENCES works(id) ON DELETE CASCADE, |     work TEXT NOT NULL REFERENCES works(id) ON DELETE CASCADE, | ||||||
|     part_index BIGINT NOT NULL, |     part_index BIGINT NOT NULL, | ||||||
|     title TEXT NOT NULL, |     title TEXT NOT NULL, | ||||||
|     composer BIGINT REFERENCES persons(id) |     composer TEXT REFERENCES persons(id) | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| CREATE TABLE work_sections ( | CREATE TABLE work_sections ( | ||||||
|     id BIGINT NOT NULL PRIMARY KEY, |     id BIGINT NOT NULL PRIMARY KEY, | ||||||
|     work BIGINT NOT NULL REFERENCES works(id) ON DELETE CASCADE, |     work TEXT NOT NULL REFERENCES works(id) ON DELETE CASCADE, | ||||||
|     title TEXT NOT NULL, |     title TEXT NOT NULL, | ||||||
|     before_index BIGINT NOT NULL |     before_index BIGINT NOT NULL | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| CREATE TABLE ensembles ( | CREATE TABLE ensembles ( | ||||||
|     id BIGINT NOT NULL PRIMARY KEY, |     id TEXT NOT NULL PRIMARY KEY, | ||||||
|     name TEXT NOT NULL, |     name TEXT NOT NULL, | ||||||
|     created_by TEXT NOT NULL REFERENCES users(username) |     created_by TEXT NOT NULL REFERENCES users(username) | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| CREATE TABLE recordings ( | CREATE TABLE recordings ( | ||||||
|     id BIGINT NOT NULL PRIMARY KEY, |     id TEXT NOT NULL PRIMARY KEY, | ||||||
|     work BIGINT NOT NULL REFERENCES works(id), |     work TEXT NOT NULL REFERENCES works(id), | ||||||
|     comment TEXT NOT NULL, |     comment TEXT NOT NULL, | ||||||
|     created_by TEXT NOT NULL REFERENCES users(username) |     created_by TEXT NOT NULL REFERENCES users(username) | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| CREATE TABLE performances ( | CREATE TABLE performances ( | ||||||
|     id BIGINT NOT NULL PRIMARY KEY, |     id BIGINT NOT NULL PRIMARY KEY, | ||||||
|     recording BIGINT NOT NULL REFERENCES recordings(id) ON DELETE CASCADE, |     recording TEXT NOT NULL REFERENCES recordings(id) ON DELETE CASCADE, | ||||||
|     person BIGINT REFERENCES persons(id), |     person TEXT REFERENCES persons(id), | ||||||
|     ensemble BIGINT REFERENCES ensembles(id), |     ensemble TEXT REFERENCES ensembles(id), | ||||||
|     role BIGINT REFERENCES instruments(id) |     role TEXT REFERENCES instruments(id) | ||||||
| ); | ); | ||||||
|  | @ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; | ||||||
| #[derive(Serialize, Deserialize, Debug, Clone)] | #[derive(Serialize, Deserialize, Debug, Clone)] | ||||||
| #[serde(rename_all = "camelCase")] | #[serde(rename_all = "camelCase")] | ||||||
| pub struct Ensemble { | pub struct Ensemble { | ||||||
|     pub id: u32, |     pub id: String, | ||||||
|     pub name: String, |     pub name: String, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -17,7 +17,7 @@ pub struct Ensemble { | ||||||
| #[derive(Insertable, Queryable, AsChangeset, Debug, Clone)] | #[derive(Insertable, Queryable, AsChangeset, Debug, Clone)] | ||||||
| #[table_name = "ensembles"] | #[table_name = "ensembles"] | ||||||
| struct EnsembleRow { | struct EnsembleRow { | ||||||
|     pub id: i64, |     pub id: String, | ||||||
|     pub name: String, |     pub name: String, | ||||||
|     pub created_by: String, |     pub created_by: String, | ||||||
| } | } | ||||||
|  | @ -25,7 +25,7 @@ struct EnsembleRow { | ||||||
| impl From<EnsembleRow> for Ensemble { | impl From<EnsembleRow> for Ensemble { | ||||||
|     fn from(row: EnsembleRow) -> Ensemble { |     fn from(row: EnsembleRow) -> Ensemble { | ||||||
|         Ensemble { |         Ensemble { | ||||||
|             id: row.id as u32, |             id: row.id, | ||||||
|             name: row.name, |             name: row.name, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | @ -34,7 +34,7 @@ impl From<EnsembleRow> for Ensemble { | ||||||
| /// Update an existing ensemble or insert a new one. This will only work, if the provided user is
 | /// Update an existing ensemble or insert a new one. This will only work, if the provided user is
 | ||||||
| /// allowed to do that.
 | /// allowed to do that.
 | ||||||
| pub fn update_ensemble(conn: &DbConn, ensemble: &Ensemble, user: &User) -> Result<()> { | pub fn update_ensemble(conn: &DbConn, ensemble: &Ensemble, user: &User) -> Result<()> { | ||||||
|     let old_row = get_ensemble_row(conn, ensemble.id)?; |     let old_row = get_ensemble_row(conn, &ensemble.id)?; | ||||||
| 
 | 
 | ||||||
|     let allowed = match old_row { |     let allowed = match old_row { | ||||||
|         Some(row) => user.may_edit(&row.created_by), |         Some(row) => user.may_edit(&row.created_by), | ||||||
|  | @ -43,7 +43,7 @@ pub fn update_ensemble(conn: &DbConn, ensemble: &Ensemble, user: &User) -> Resul | ||||||
| 
 | 
 | ||||||
|     if allowed { |     if allowed { | ||||||
|         let new_row = EnsembleRow { |         let new_row = EnsembleRow { | ||||||
|             id: ensemble.id as i64, |             id: ensemble.id.clone(), | ||||||
|             name: ensemble.name.clone(), |             name: ensemble.name.clone(), | ||||||
|             created_by: user.username.clone(), |             created_by: user.username.clone(), | ||||||
|         }; |         }; | ||||||
|  | @ -62,7 +62,7 @@ pub fn update_ensemble(conn: &DbConn, ensemble: &Ensemble, user: &User) -> Resul | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Get an existing ensemble.
 | /// Get an existing ensemble.
 | ||||||
| pub fn get_ensemble(conn: &DbConn, id: u32) -> Result<Option<Ensemble>> { | pub fn get_ensemble(conn: &DbConn, id: &str) -> Result<Option<Ensemble>> { | ||||||
|     let row = get_ensemble_row(conn, id)?; |     let row = get_ensemble_row(conn, id)?; | ||||||
|     let ensemble = row.map(|row| row.into()); |     let ensemble = row.map(|row| row.into()); | ||||||
| 
 | 
 | ||||||
|  | @ -70,9 +70,9 @@ pub fn get_ensemble(conn: &DbConn, id: u32) -> Result<Option<Ensemble>> { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Delete an existing ensemble. This will only work if the provided user is allowed to do that.
 | /// Delete an existing ensemble. This will only work if the provided user is allowed to do that.
 | ||||||
| pub fn delete_ensemble(conn: &DbConn, id: u32, user: &User) -> Result<()> { | pub fn delete_ensemble(conn: &DbConn, id: &str, user: &User) -> Result<()> { | ||||||
|     if user.may_delete() { |     if user.may_delete() { | ||||||
|         diesel::delete(ensembles::table.filter(ensembles::id.eq(id as i64))).execute(conn)?; |         diesel::delete(ensembles::table.filter(ensembles::id.eq(id))).execute(conn)?; | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } else { |     } else { | ||||||
|         Err(Error::new(ServerError::Forbidden)) |         Err(Error::new(ServerError::Forbidden)) | ||||||
|  | @ -88,9 +88,9 @@ pub fn get_ensembles(conn: &DbConn) -> Result<Vec<Ensemble>> { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Get a ensemble row if it exists.
 | /// Get a ensemble row if it exists.
 | ||||||
| fn get_ensemble_row(conn: &DbConn, id: u32) -> Result<Option<EnsembleRow>> { | fn get_ensemble_row(conn: &DbConn, id: &str) -> Result<Option<EnsembleRow>> { | ||||||
|     let row = ensembles::table |     let row = ensembles::table | ||||||
|         .filter(ensembles::id.eq(id as i64)) |         .filter(ensembles::id.eq(id)) | ||||||
|         .load::<EnsembleRow>(conn)? |         .load::<EnsembleRow>(conn)? | ||||||
|         .into_iter() |         .into_iter() | ||||||
|         .next(); |         .next(); | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; | ||||||
| #[derive(Serialize, Deserialize, Debug, Clone)] | #[derive(Serialize, Deserialize, Debug, Clone)] | ||||||
| #[serde(rename_all = "camelCase")] | #[serde(rename_all = "camelCase")] | ||||||
| pub struct Instrument { | pub struct Instrument { | ||||||
|     pub id: u32, |     pub id: String, | ||||||
|     pub name: String, |     pub name: String, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -17,7 +17,7 @@ pub struct Instrument { | ||||||
| #[derive(Insertable, Queryable, AsChangeset, Debug, Clone)] | #[derive(Insertable, Queryable, AsChangeset, Debug, Clone)] | ||||||
| #[table_name = "instruments"] | #[table_name = "instruments"] | ||||||
| struct InstrumentRow { | struct InstrumentRow { | ||||||
|     pub id: i64, |     pub id: String, | ||||||
|     pub name: String, |     pub name: String, | ||||||
|     pub created_by: String, |     pub created_by: String, | ||||||
| } | } | ||||||
|  | @ -25,7 +25,7 @@ struct InstrumentRow { | ||||||
| impl From<InstrumentRow> for Instrument { | impl From<InstrumentRow> for Instrument { | ||||||
|     fn from(row: InstrumentRow) -> Instrument { |     fn from(row: InstrumentRow) -> Instrument { | ||||||
|         Instrument { |         Instrument { | ||||||
|             id: row.id as u32, |             id: row.id, | ||||||
|             name: row.name, |             name: row.name, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | @ -34,7 +34,7 @@ impl From<InstrumentRow> for Instrument { | ||||||
| /// Update an existing instrument or insert a new one. This will only work, if the provided user is
 | /// Update an existing instrument or insert a new one. This will only work, if the provided user is
 | ||||||
| /// allowed to do that.
 | /// allowed to do that.
 | ||||||
| pub fn update_instrument(conn: &DbConn, instrument: &Instrument, user: &User) -> Result<()> { | pub fn update_instrument(conn: &DbConn, instrument: &Instrument, user: &User) -> Result<()> { | ||||||
|     let old_row = get_instrument_row(conn, instrument.id)?; |     let old_row = get_instrument_row(conn, &instrument.id)?; | ||||||
| 
 | 
 | ||||||
|     let allowed = match old_row { |     let allowed = match old_row { | ||||||
|         Some(row) => user.may_edit(&row.created_by), |         Some(row) => user.may_edit(&row.created_by), | ||||||
|  | @ -43,7 +43,7 @@ pub fn update_instrument(conn: &DbConn, instrument: &Instrument, user: &User) -> | ||||||
| 
 | 
 | ||||||
|     if allowed { |     if allowed { | ||||||
|         let new_row = InstrumentRow { |         let new_row = InstrumentRow { | ||||||
|             id: instrument.id as i64, |             id: instrument.id.clone(), | ||||||
|             name: instrument.name.clone(), |             name: instrument.name.clone(), | ||||||
|             created_by: user.username.clone(), |             created_by: user.username.clone(), | ||||||
|         }; |         }; | ||||||
|  | @ -62,7 +62,7 @@ pub fn update_instrument(conn: &DbConn, instrument: &Instrument, user: &User) -> | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Get an existing instrument.
 | /// Get an existing instrument.
 | ||||||
| pub fn get_instrument(conn: &DbConn, id: u32) -> Result<Option<Instrument>> { | pub fn get_instrument(conn: &DbConn, id: &str) -> Result<Option<Instrument>> { | ||||||
|     let row = get_instrument_row(conn, id)?; |     let row = get_instrument_row(conn, id)?; | ||||||
|     let instrument = row.map(|row| row.into()); |     let instrument = row.map(|row| row.into()); | ||||||
| 
 | 
 | ||||||
|  | @ -70,9 +70,9 @@ pub fn get_instrument(conn: &DbConn, id: u32) -> Result<Option<Instrument>> { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Delete an existing instrument. This will only work if the provided user is allowed to do that.
 | /// Delete an existing instrument. This will only work if the provided user is allowed to do that.
 | ||||||
| pub fn delete_instrument(conn: &DbConn, id: u32, user: &User) -> Result<()> { | pub fn delete_instrument(conn: &DbConn, id: &str, user: &User) -> Result<()> { | ||||||
|     if user.may_delete() { |     if user.may_delete() { | ||||||
|         diesel::delete(instruments::table.filter(instruments::id.eq(id as i64))).execute(conn)?; |         diesel::delete(instruments::table.filter(instruments::id.eq(id))).execute(conn)?; | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } else { |     } else { | ||||||
|         Err(Error::new(ServerError::Forbidden)) |         Err(Error::new(ServerError::Forbidden)) | ||||||
|  | @ -88,9 +88,9 @@ pub fn get_instruments(conn: &DbConn) -> Result<Vec<Instrument>> { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Get a instrument row if it exists.
 | /// Get a instrument row if it exists.
 | ||||||
| fn get_instrument_row(conn: &DbConn, id: u32) -> Result<Option<InstrumentRow>> { | fn get_instrument_row(conn: &DbConn, id: &str) -> Result<Option<InstrumentRow>> { | ||||||
|     let row = instruments::table |     let row = instruments::table | ||||||
|         .filter(instruments::id.eq(id as i64)) |         .filter(instruments::id.eq(id)) | ||||||
|         .load::<InstrumentRow>(conn)? |         .load::<InstrumentRow>(conn)? | ||||||
|         .into_iter() |         .into_iter() | ||||||
|         .next(); |         .next(); | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; | ||||||
| #[derive(Serialize, Deserialize, Debug, Clone)] | #[derive(Serialize, Deserialize, Debug, Clone)] | ||||||
| #[serde(rename_all = "camelCase")] | #[serde(rename_all = "camelCase")] | ||||||
| pub struct Person { | pub struct Person { | ||||||
|     pub id: u32, |     pub id: String, | ||||||
|     pub first_name: String, |     pub first_name: String, | ||||||
|     pub last_name: String, |     pub last_name: String, | ||||||
| } | } | ||||||
|  | @ -18,7 +18,7 @@ pub struct Person { | ||||||
| #[derive(Insertable, Queryable, AsChangeset, Debug, Clone)] | #[derive(Insertable, Queryable, AsChangeset, Debug, Clone)] | ||||||
| #[table_name = "persons"] | #[table_name = "persons"] | ||||||
| struct PersonRow { | struct PersonRow { | ||||||
|     pub id: i64, |     pub id: String, | ||||||
|     pub first_name: String, |     pub first_name: String, | ||||||
|     pub last_name: String, |     pub last_name: String, | ||||||
|     pub created_by: String, |     pub created_by: String, | ||||||
|  | @ -27,7 +27,7 @@ struct PersonRow { | ||||||
| impl From<PersonRow> for Person { | impl From<PersonRow> for Person { | ||||||
|     fn from(row: PersonRow) -> Person { |     fn from(row: PersonRow) -> Person { | ||||||
|         Person { |         Person { | ||||||
|             id: row.id as u32, |             id: row.id, | ||||||
|             first_name: row.first_name, |             first_name: row.first_name, | ||||||
|             last_name: row.last_name, |             last_name: row.last_name, | ||||||
|         } |         } | ||||||
|  | @ -37,7 +37,7 @@ impl From<PersonRow> for Person { | ||||||
| /// Update an existing person or insert a new one. This will only work, if the provided user is
 | /// Update an existing person or insert a new one. This will only work, if the provided user is
 | ||||||
| /// allowed to do that.
 | /// allowed to do that.
 | ||||||
| pub fn update_person(conn: &DbConn, person: &Person, user: &User) -> Result<()> { | pub fn update_person(conn: &DbConn, person: &Person, user: &User) -> Result<()> { | ||||||
|     let old_row = get_person_row(conn, person.id)?; |     let old_row = get_person_row(conn, &person.id)?; | ||||||
| 
 | 
 | ||||||
|     let allowed = match old_row { |     let allowed = match old_row { | ||||||
|         Some(row) => user.may_edit(&row.created_by), |         Some(row) => user.may_edit(&row.created_by), | ||||||
|  | @ -46,7 +46,7 @@ pub fn update_person(conn: &DbConn, person: &Person, user: &User) -> Result<()> | ||||||
| 
 | 
 | ||||||
|     if allowed { |     if allowed { | ||||||
|         let new_row = PersonRow { |         let new_row = PersonRow { | ||||||
|             id: person.id as i64, |             id: person.id.clone(), | ||||||
|             first_name: person.first_name.clone(), |             first_name: person.first_name.clone(), | ||||||
|             last_name: person.last_name.clone(), |             last_name: person.last_name.clone(), | ||||||
|             created_by: user.username.clone(), |             created_by: user.username.clone(), | ||||||
|  | @ -66,7 +66,7 @@ pub fn update_person(conn: &DbConn, person: &Person, user: &User) -> Result<()> | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Get an existing person.
 | /// Get an existing person.
 | ||||||
| pub fn get_person(conn: &DbConn, id: u32) -> Result<Option<Person>> { | pub fn get_person(conn: &DbConn, id: &str) -> Result<Option<Person>> { | ||||||
|     let row = get_person_row(conn, id)?; |     let row = get_person_row(conn, id)?; | ||||||
|     let person = row.map(|row| row.into()); |     let person = row.map(|row| row.into()); | ||||||
| 
 | 
 | ||||||
|  | @ -74,9 +74,9 @@ pub fn get_person(conn: &DbConn, id: u32) -> Result<Option<Person>> { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Delete an existing person. This will only work if the provided user is allowed to do that.
 | /// Delete an existing person. This will only work if the provided user is allowed to do that.
 | ||||||
| pub fn delete_person(conn: &DbConn, id: u32, user: &User) -> Result<()> { | pub fn delete_person(conn: &DbConn, id: &str, user: &User) -> Result<()> { | ||||||
|     if user.may_delete() { |     if user.may_delete() { | ||||||
|         diesel::delete(persons::table.filter(persons::id.eq(id as i64))).execute(conn)?; |         diesel::delete(persons::table.filter(persons::id.eq(id))).execute(conn)?; | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } else { |     } else { | ||||||
|         Err(Error::new(ServerError::Forbidden)) |         Err(Error::new(ServerError::Forbidden)) | ||||||
|  | @ -92,9 +92,9 @@ pub fn get_persons(conn: &DbConn) -> Result<Vec<Person>> { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Get a person row if it exists.
 | /// Get a person row if it exists.
 | ||||||
| fn get_person_row(conn: &DbConn, id: u32) -> Result<Option<PersonRow>> { | fn get_person_row(conn: &DbConn, id: &str) -> Result<Option<PersonRow>> { | ||||||
|     let row = persons::table |     let row = persons::table | ||||||
|         .filter(persons::id.eq(id as i64)) |         .filter(persons::id.eq(id)) | ||||||
|         .load::<PersonRow>(conn)? |         .load::<PersonRow>(conn)? | ||||||
|         .into_iter() |         .into_iter() | ||||||
|         .next(); |         .next(); | ||||||
|  |  | ||||||
|  | @ -10,7 +10,7 @@ use serde::{Deserialize, Serialize}; | ||||||
| #[derive(Serialize, Deserialize, Debug, Clone)] | #[derive(Serialize, Deserialize, Debug, Clone)] | ||||||
| #[serde(rename_all = "camelCase")] | #[serde(rename_all = "camelCase")] | ||||||
| pub struct Recording { | pub struct Recording { | ||||||
|     pub id: u32, |     pub id: String, | ||||||
|     pub work: Work, |     pub work: Work, | ||||||
|     pub comment: String, |     pub comment: String, | ||||||
|     pub performances: Vec<Performance>, |     pub performances: Vec<Performance>, | ||||||
|  | @ -29,8 +29,8 @@ pub struct Performance { | ||||||
| #[derive(Insertable, Queryable, Debug, Clone)] | #[derive(Insertable, Queryable, Debug, Clone)] | ||||||
| #[table_name = "recordings"] | #[table_name = "recordings"] | ||||||
| struct RecordingRow { | struct RecordingRow { | ||||||
|     pub id: i64, |     pub id: String, | ||||||
|     pub work: i64, |     pub work: String, | ||||||
|     pub comment: String, |     pub comment: String, | ||||||
|     pub created_by: String, |     pub created_by: String, | ||||||
| } | } | ||||||
|  | @ -40,10 +40,10 @@ struct RecordingRow { | ||||||
| #[table_name = "performances"] | #[table_name = "performances"] | ||||||
| struct PerformanceRow { | struct PerformanceRow { | ||||||
|     pub id: i64, |     pub id: i64, | ||||||
|     pub recording: i64, |     pub recording: String, | ||||||
|     pub person: Option<i64>, |     pub person: Option<String>, | ||||||
|     pub ensemble: Option<i64>, |     pub ensemble: Option<String>, | ||||||
|     pub role: Option<i64>, |     pub role: Option<String>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Update an existing recording or insert a new one. This will only work, if the provided user is
 | /// Update an existing recording or insert a new one. This will only work, if the provided user is
 | ||||||
|  | @ -51,7 +51,7 @@ struct PerformanceRow { | ||||||
| // TODO: Also add newly created associated items.
 | // TODO: Also add newly created associated items.
 | ||||||
| pub fn update_recording(conn: &DbConn, recording: &Recording, user: &User) -> Result<()> { | pub fn update_recording(conn: &DbConn, recording: &Recording, user: &User) -> Result<()> { | ||||||
|     conn.transaction::<(), Error, _>(|| { |     conn.transaction::<(), Error, _>(|| { | ||||||
|         let old_row = get_recording_row(conn, recording.id)?; |         let old_row = get_recording_row(conn, &recording.id)?; | ||||||
| 
 | 
 | ||||||
|         let allowed = match old_row { |         let allowed = match old_row { | ||||||
|             Some(row) => user.may_edit(&row.created_by), |             Some(row) => user.may_edit(&row.created_by), | ||||||
|  | @ -59,7 +59,7 @@ pub fn update_recording(conn: &DbConn, recording: &Recording, user: &User) -> Re | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         if allowed { |         if allowed { | ||||||
|             let id = recording.id as i64; |             let id = &recording.id; | ||||||
| 
 | 
 | ||||||
|             // This will also delete the old performances.
 |             // This will also delete the old performances.
 | ||||||
|             diesel::delete(recordings::table) |             diesel::delete(recordings::table) | ||||||
|  | @ -67,8 +67,8 @@ pub fn update_recording(conn: &DbConn, recording: &Recording, user: &User) -> Re | ||||||
|                 .execute(conn)?; |                 .execute(conn)?; | ||||||
| 
 | 
 | ||||||
|             let row = RecordingRow { |             let row = RecordingRow { | ||||||
|                 id, |                 id: id.clone(), | ||||||
|                 work: recording.work.id as i64, |                 work: recording.work.id.clone(), | ||||||
|                 comment: recording.comment.clone(), |                 comment: recording.comment.clone(), | ||||||
|                 created_by: user.username.clone(), |                 created_by: user.username.clone(), | ||||||
|             }; |             }; | ||||||
|  | @ -81,13 +81,13 @@ pub fn update_recording(conn: &DbConn, recording: &Recording, user: &User) -> Re | ||||||
|                 diesel::insert_into(performances::table) |                 diesel::insert_into(performances::table) | ||||||
|                     .values(PerformanceRow { |                     .values(PerformanceRow { | ||||||
|                         id: rand::random(), |                         id: rand::random(), | ||||||
|                         recording: id, |                         recording: id.clone(), | ||||||
|                         person: performance.person.as_ref().map(|person| person.id as i64), |                         person: performance.person.as_ref().map(|person| person.id.clone()), | ||||||
|                         ensemble: performance |                         ensemble: performance | ||||||
|                             .ensemble |                             .ensemble | ||||||
|                             .as_ref() |                             .as_ref() | ||||||
|                             .map(|ensemble| ensemble.id as i64), |                             .map(|ensemble| ensemble.id.clone()), | ||||||
|                         role: performance.role.as_ref().map(|role| role.id as i64), |                         role: performance.role.as_ref().map(|role| role.id.clone()), | ||||||
|                     }) |                     }) | ||||||
|                     .execute(conn)?; |                     .execute(conn)?; | ||||||
|             } |             } | ||||||
|  | @ -102,7 +102,7 @@ pub fn update_recording(conn: &DbConn, recording: &Recording, user: &User) -> Re | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Get an existing recording and all available information from related tables.
 | /// Get an existing recording and all available information from related tables.
 | ||||||
| pub fn get_recording(conn: &DbConn, id: u32) -> Result<Option<Recording>> { | pub fn get_recording(conn: &DbConn, id: &str) -> Result<Option<Recording>> { | ||||||
|     let recording = match get_recording_row(conn, id)? { |     let recording = match get_recording_row(conn, id)? { | ||||||
|         Some(row) => Some(get_description_for_recording_row(conn, &row)?), |         Some(row) => Some(get_description_for_recording_row(conn, &row)?), | ||||||
|         None => None, |         None => None, | ||||||
|  | @ -112,13 +112,13 @@ pub fn get_recording(conn: &DbConn, id: u32) -> Result<Option<Recording>> { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Get all available information on all recordings where a person is performing.
 | /// Get all available information on all recordings where a person is performing.
 | ||||||
| pub fn get_recordings_for_person(conn: &DbConn, person_id: u32) -> Result<Vec<Recording>> { | pub fn get_recordings_for_person(conn: &DbConn, person_id: &str) -> Result<Vec<Recording>> { | ||||||
|     let mut recordings: Vec<Recording> = Vec::new(); |     let mut recordings: Vec<Recording> = Vec::new(); | ||||||
| 
 | 
 | ||||||
|     let rows = recordings::table |     let rows = recordings::table | ||||||
|         .inner_join(performances::table.on(performances::recording.eq(recordings::id))) |         .inner_join(performances::table.on(performances::recording.eq(recordings::id))) | ||||||
|         .inner_join(persons::table.on(persons::id.nullable().eq(performances::person))) |         .inner_join(persons::table.on(persons::id.nullable().eq(performances::person))) | ||||||
|         .filter(persons::id.eq(person_id as i64)) |         .filter(persons::id.eq(person_id)) | ||||||
|         .select(recordings::table::all_columns()) |         .select(recordings::table::all_columns()) | ||||||
|         .load::<RecordingRow>(conn)?; |         .load::<RecordingRow>(conn)?; | ||||||
| 
 | 
 | ||||||
|  | @ -130,13 +130,13 @@ pub fn get_recordings_for_person(conn: &DbConn, person_id: u32) -> Result<Vec<Re | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Get all available information on all recordings where an ensemble is performing.
 | /// Get all available information on all recordings where an ensemble is performing.
 | ||||||
| pub fn get_recordings_for_ensemble(conn: &DbConn, ensemble_id: u32) -> Result<Vec<Recording>> { | pub fn get_recordings_for_ensemble(conn: &DbConn, ensemble_id: &str) -> Result<Vec<Recording>> { | ||||||
|     let mut recordings: Vec<Recording> = Vec::new(); |     let mut recordings: Vec<Recording> = Vec::new(); | ||||||
| 
 | 
 | ||||||
|     let rows = recordings::table |     let rows = recordings::table | ||||||
|         .inner_join(performances::table.on(performances::recording.eq(recordings::id))) |         .inner_join(performances::table.on(performances::recording.eq(recordings::id))) | ||||||
|         .inner_join(ensembles::table.on(ensembles::id.nullable().eq(performances::ensemble))) |         .inner_join(ensembles::table.on(ensembles::id.nullable().eq(performances::ensemble))) | ||||||
|         .filter(ensembles::id.eq(ensemble_id as i64)) |         .filter(ensembles::id.eq(ensemble_id)) | ||||||
|         .select(recordings::table::all_columns()) |         .select(recordings::table::all_columns()) | ||||||
|         .load::<RecordingRow>(conn)?; |         .load::<RecordingRow>(conn)?; | ||||||
| 
 | 
 | ||||||
|  | @ -148,11 +148,11 @@ pub fn get_recordings_for_ensemble(conn: &DbConn, ensemble_id: u32) -> Result<Ve | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Get allavailable information on all recordings of a work.
 | /// Get allavailable information on all recordings of a work.
 | ||||||
| pub fn get_recordings_for_work(conn: &DbConn, work_id: u32) -> Result<Vec<Recording>> { | pub fn get_recordings_for_work(conn: &DbConn, work_id: &str) -> Result<Vec<Recording>> { | ||||||
|     let mut recordings: Vec<Recording> = Vec::new(); |     let mut recordings: Vec<Recording> = Vec::new(); | ||||||
| 
 | 
 | ||||||
|     let rows = recordings::table |     let rows = recordings::table | ||||||
|         .filter(recordings::work.eq(work_id as i64)) |         .filter(recordings::work.eq(work_id)) | ||||||
|         .load::<RecordingRow>(conn)?; |         .load::<RecordingRow>(conn)?; | ||||||
| 
 | 
 | ||||||
|     for row in rows { |     for row in rows { | ||||||
|  | @ -165,9 +165,9 @@ pub fn get_recordings_for_work(conn: &DbConn, work_id: u32) -> Result<Vec<Record | ||||||
| /// Delete an existing recording. This will fail if there are still references to this
 | /// Delete an existing recording. This will fail if there are still references to this
 | ||||||
| /// recording from other tables that are not directly part of the recording data. Also, the
 | /// recording from other tables that are not directly part of the recording data. Also, the
 | ||||||
| /// provided user has to be allowed to delete the recording.
 | /// provided user has to be allowed to delete the recording.
 | ||||||
| pub fn delete_recording(conn: &DbConn, id: u32, user: &User) -> Result<()> { | pub fn delete_recording(conn: &DbConn, id: &str, user: &User) -> Result<()> { | ||||||
|     if user.may_delete() { |     if user.may_delete() { | ||||||
|         diesel::delete(recordings::table.filter(recordings::id.eq(id as i64))).execute(conn)?; |         diesel::delete(recordings::table.filter(recordings::id.eq(id))).execute(conn)?; | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } else { |     } else { | ||||||
|         Err(Error::new(ServerError::Forbidden)) |         Err(Error::new(ServerError::Forbidden)) | ||||||
|  | @ -175,9 +175,9 @@ pub fn delete_recording(conn: &DbConn, id: u32, user: &User) -> Result<()> { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Get an existing recording row.
 | /// Get an existing recording row.
 | ||||||
| fn get_recording_row(conn: &DbConn, id: u32) -> Result<Option<RecordingRow>> { | fn get_recording_row(conn: &DbConn, id: &str) -> Result<Option<RecordingRow>> { | ||||||
|     Ok(recordings::table |     Ok(recordings::table | ||||||
|         .filter(recordings::id.eq(id as i64)) |         .filter(recordings::id.eq(id)) | ||||||
|         .load::<RecordingRow>(conn)? |         .load::<RecordingRow>(conn)? | ||||||
|         .into_iter() |         .into_iter() | ||||||
|         .next()) |         .next()) | ||||||
|  | @ -188,43 +188,36 @@ fn get_description_for_recording_row(conn: &DbConn, row: &RecordingRow) -> Resul | ||||||
|     let mut performances: Vec<Performance> = Vec::new(); |     let mut performances: Vec<Performance> = Vec::new(); | ||||||
| 
 | 
 | ||||||
|     let performance_rows = performances::table |     let performance_rows = performances::table | ||||||
|         .filter(performances::recording.eq(row.id)) |         .filter(performances::recording.eq(&row.id)) | ||||||
|         .load::<PerformanceRow>(conn)?; |         .load::<PerformanceRow>(conn)?; | ||||||
| 
 | 
 | ||||||
|     for row in performance_rows { |     for row in performance_rows { | ||||||
|         performances.push(Performance { |         performances.push(Performance { | ||||||
|             person: match row.person { |             person: match row.person { | ||||||
|                 Some(id) => { |                 Some(id) => { | ||||||
|                     let id = id as u32; |                     Some(get_person(conn, &id)?.ok_or(anyhow!("No person with ID: {}", id))?) | ||||||
|                     Some(get_person(conn, id)?.ok_or(anyhow!("No person with ID: {}", id))?) |  | ||||||
|                 } |                 } | ||||||
|                 None => None, |                 None => None, | ||||||
|             }, |             }, | ||||||
|             ensemble: match row.ensemble { |             ensemble: match row.ensemble { | ||||||
|                 Some(id) => { |                 Some(id) => { | ||||||
|                     let id = id as u32; |                     Some(get_ensemble(conn, &id)?.ok_or(anyhow!("No ensemble with ID: {}", id))?) | ||||||
|                     Some(get_ensemble(conn, id)?.ok_or(anyhow!("No ensemble with ID: {}", id))?) |  | ||||||
|                 } |                 } | ||||||
|                 None => None, |                 None => None, | ||||||
|             }, |             }, | ||||||
|             role: match row.role { |             role: match row.role { | ||||||
|                 Some(id) => { |                 Some(id) => Some( | ||||||
|                     let id = id as u32; |                     get_instrument(conn, &id)?.ok_or(anyhow!("No instrument with ID: {}", id))?, | ||||||
|                     Some( |                 ), | ||||||
|                         get_instrument(conn, id)? |  | ||||||
|                             .ok_or(anyhow!("No instrument with ID: {}", id))?, |  | ||||||
|                     ) |  | ||||||
|                 } |  | ||||||
|                 None => None, |                 None => None, | ||||||
|             }, |             }, | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     let id = row.work as u32; |     let work = get_work(conn, &row.work)?.ok_or(anyhow!("No work with ID: {}", &row.work))?; | ||||||
|     let work = get_work(conn, id)?.ok_or(anyhow!("No work with ID: {}", id))?; |  | ||||||
| 
 | 
 | ||||||
|     let recording = Recording { |     let recording = Recording { | ||||||
|         id: row.id as u32, |         id: row.id.clone(), | ||||||
|         work, |         work, | ||||||
|         comment: row.comment.clone(), |         comment: row.comment.clone(), | ||||||
|         performances, |         performances, | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| table! { | table! { | ||||||
|     ensembles (id) { |     ensembles (id) { | ||||||
|         id -> Int8, |         id -> Text, | ||||||
|         name -> Text, |         name -> Text, | ||||||
|         created_by -> Text, |         created_by -> Text, | ||||||
|     } |     } | ||||||
|  | @ -9,14 +9,14 @@ table! { | ||||||
| table! { | table! { | ||||||
|     instrumentations (id) { |     instrumentations (id) { | ||||||
|         id -> Int8, |         id -> Int8, | ||||||
|         work -> Int8, |         work -> Text, | ||||||
|         instrument -> Int8, |         instrument -> Text, | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| table! { | table! { | ||||||
|     instruments (id) { |     instruments (id) { | ||||||
|         id -> Int8, |         id -> Text, | ||||||
|         name -> Text, |         name -> Text, | ||||||
|         created_by -> Text, |         created_by -> Text, | ||||||
|     } |     } | ||||||
|  | @ -25,16 +25,16 @@ table! { | ||||||
| table! { | table! { | ||||||
|     performances (id) { |     performances (id) { | ||||||
|         id -> Int8, |         id -> Int8, | ||||||
|         recording -> Int8, |         recording -> Text, | ||||||
|         person -> Nullable<Int8>, |         person -> Nullable<Text>, | ||||||
|         ensemble -> Nullable<Int8>, |         ensemble -> Nullable<Text>, | ||||||
|         role -> Nullable<Int8>, |         role -> Nullable<Text>, | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| table! { | table! { | ||||||
|     persons (id) { |     persons (id) { | ||||||
|         id -> Int8, |         id -> Text, | ||||||
|         first_name -> Text, |         first_name -> Text, | ||||||
|         last_name -> Text, |         last_name -> Text, | ||||||
|         created_by -> Text, |         created_by -> Text, | ||||||
|  | @ -43,8 +43,8 @@ table! { | ||||||
| 
 | 
 | ||||||
| table! { | table! { | ||||||
|     recordings (id) { |     recordings (id) { | ||||||
|         id -> Int8, |         id -> Text, | ||||||
|         work -> Int8, |         work -> Text, | ||||||
|         comment -> Text, |         comment -> Text, | ||||||
|         created_by -> Text, |         created_by -> Text, | ||||||
|     } |     } | ||||||
|  | @ -64,17 +64,17 @@ table! { | ||||||
| table! { | table! { | ||||||
|     work_parts (id) { |     work_parts (id) { | ||||||
|         id -> Int8, |         id -> Int8, | ||||||
|         work -> Int8, |         work -> Text, | ||||||
|         part_index -> Int8, |         part_index -> Int8, | ||||||
|         title -> Text, |         title -> Text, | ||||||
|         composer -> Nullable<Int8>, |         composer -> Nullable<Text>, | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| table! { | table! { | ||||||
|     work_sections (id) { |     work_sections (id) { | ||||||
|         id -> Int8, |         id -> Int8, | ||||||
|         work -> Int8, |         work -> Text, | ||||||
|         title -> Text, |         title -> Text, | ||||||
|         before_index -> Int8, |         before_index -> Int8, | ||||||
|     } |     } | ||||||
|  | @ -82,8 +82,8 @@ table! { | ||||||
| 
 | 
 | ||||||
| table! { | table! { | ||||||
|     works (id) { |     works (id) { | ||||||
|         id -> Int8, |         id -> Text, | ||||||
|         composer -> Int8, |         composer -> Text, | ||||||
|         title -> Text, |         title -> Text, | ||||||
|         created_by -> Text, |         created_by -> Text, | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -10,7 +10,7 @@ use std::convert::TryInto; | ||||||
| #[derive(Serialize, Deserialize, Debug, Clone)] | #[derive(Serialize, Deserialize, Debug, Clone)] | ||||||
| #[serde(rename_all = "camelCase")] | #[serde(rename_all = "camelCase")] | ||||||
| pub struct Work { | pub struct Work { | ||||||
|     pub id: u32, |     pub id: String, | ||||||
|     pub title: String, |     pub title: String, | ||||||
|     pub composer: Person, |     pub composer: Person, | ||||||
|     pub instruments: Vec<Instrument>, |     pub instruments: Vec<Instrument>, | ||||||
|  | @ -38,8 +38,8 @@ pub struct WorkSection { | ||||||
| #[derive(Insertable, Queryable, Debug, Clone)] | #[derive(Insertable, Queryable, Debug, Clone)] | ||||||
| #[table_name = "works"] | #[table_name = "works"] | ||||||
| struct WorkRow { | struct WorkRow { | ||||||
|     pub id: i64, |     pub id: String, | ||||||
|     pub composer: i64, |     pub composer: String, | ||||||
|     pub title: String, |     pub title: String, | ||||||
|     pub created_by: String, |     pub created_by: String, | ||||||
| } | } | ||||||
|  | @ -49,8 +49,8 @@ struct WorkRow { | ||||||
| #[table_name = "instrumentations"] | #[table_name = "instrumentations"] | ||||||
| struct InstrumentationRow { | struct InstrumentationRow { | ||||||
|     pub id: i64, |     pub id: i64, | ||||||
|     pub work: i64, |     pub work: String, | ||||||
|     pub instrument: i64, |     pub instrument: String, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Table data for a work part.
 | /// Table data for a work part.
 | ||||||
|  | @ -58,10 +58,10 @@ struct InstrumentationRow { | ||||||
| #[table_name = "work_parts"] | #[table_name = "work_parts"] | ||||||
| struct WorkPartRow { | struct WorkPartRow { | ||||||
|     pub id: i64, |     pub id: i64, | ||||||
|     pub work: i64, |     pub work: String, | ||||||
|     pub part_index: i64, |     pub part_index: i64, | ||||||
|     pub title: String, |     pub title: String, | ||||||
|     pub composer: Option<i64>, |     pub composer: Option<String>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Table data for a work section.
 | /// Table data for a work section.
 | ||||||
|  | @ -69,7 +69,7 @@ struct WorkPartRow { | ||||||
| #[derive(Insertable, Queryable, Debug, Clone)] | #[derive(Insertable, Queryable, Debug, Clone)] | ||||||
| struct WorkSectionRow { | struct WorkSectionRow { | ||||||
|     pub id: i64, |     pub id: i64, | ||||||
|     pub work: i64, |     pub work: String, | ||||||
|     pub title: String, |     pub title: String, | ||||||
|     pub before_index: i64, |     pub before_index: i64, | ||||||
| } | } | ||||||
|  | @ -79,7 +79,7 @@ struct WorkSectionRow { | ||||||
| // TODO: Also add newly created associated items.
 | // TODO: Also add newly created associated items.
 | ||||||
| pub fn update_work(conn: &DbConn, work: &Work, user: &User) -> Result<()> { | pub fn update_work(conn: &DbConn, work: &Work, user: &User) -> Result<()> { | ||||||
|     conn.transaction::<(), Error, _>(|| { |     conn.transaction::<(), Error, _>(|| { | ||||||
|         let old_row = get_work_row(conn, work.id)?; |         let old_row = get_work_row(conn, &work.id)?; | ||||||
| 
 | 
 | ||||||
|         let allowed = match old_row { |         let allowed = match old_row { | ||||||
|             Some(row) => user.may_edit(&row.created_by), |             Some(row) => user.may_edit(&row.created_by), | ||||||
|  | @ -87,7 +87,7 @@ pub fn update_work(conn: &DbConn, work: &Work, user: &User) -> Result<()> { | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         if allowed { |         if allowed { | ||||||
|             let id = work.id as i64; |             let id = &work.id; | ||||||
| 
 | 
 | ||||||
|             // This will also delete rows from associated tables.
 |             // This will also delete rows from associated tables.
 | ||||||
|             diesel::delete(works::table) |             diesel::delete(works::table) | ||||||
|  | @ -95,8 +95,8 @@ pub fn update_work(conn: &DbConn, work: &Work, user: &User) -> Result<()> { | ||||||
|                 .execute(conn)?; |                 .execute(conn)?; | ||||||
| 
 | 
 | ||||||
|             let row = WorkRow { |             let row = WorkRow { | ||||||
|                 id, |                 id: id.clone(), | ||||||
|                 composer: work.composer.id as i64, |                 composer: work.composer.id.clone(), | ||||||
|                 title: work.title.clone(), |                 title: work.title.clone(), | ||||||
|                 created_by: user.username.clone(), |                 created_by: user.username.clone(), | ||||||
|             }; |             }; | ||||||
|  | @ -109,8 +109,8 @@ pub fn update_work(conn: &DbConn, work: &Work, user: &User) -> Result<()> { | ||||||
|                 diesel::insert_into(instrumentations::table) |                 diesel::insert_into(instrumentations::table) | ||||||
|                     .values(InstrumentationRow { |                     .values(InstrumentationRow { | ||||||
|                         id: rand::random(), |                         id: rand::random(), | ||||||
|                         work: id, |                         work: id.clone(), | ||||||
|                         instrument: instrument.id as i64, |                         instrument: instrument.id.clone(), | ||||||
|                     }) |                     }) | ||||||
|                     .execute(conn)?; |                     .execute(conn)?; | ||||||
|             } |             } | ||||||
|  | @ -118,10 +118,10 @@ pub fn update_work(conn: &DbConn, work: &Work, user: &User) -> Result<()> { | ||||||
|             for (index, part) in work.parts.iter().enumerate() { |             for (index, part) in work.parts.iter().enumerate() { | ||||||
|                 let row = WorkPartRow { |                 let row = WorkPartRow { | ||||||
|                     id: rand::random(), |                     id: rand::random(), | ||||||
|                     work: id, |                     work: id.clone(), | ||||||
|                     part_index: index.try_into()?, |                     part_index: index.try_into()?, | ||||||
|                     title: part.title.clone(), |                     title: part.title.clone(), | ||||||
|                     composer: part.composer.as_ref().map(|person| person.id as i64), |                     composer: part.composer.as_ref().map(|person| person.id.clone()), | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 diesel::insert_into(work_parts::table) |                 diesel::insert_into(work_parts::table) | ||||||
|  | @ -132,7 +132,7 @@ pub fn update_work(conn: &DbConn, work: &Work, user: &User) -> Result<()> { | ||||||
|             for section in &work.sections { |             for section in &work.sections { | ||||||
|                 let row = WorkSectionRow { |                 let row = WorkSectionRow { | ||||||
|                     id: rand::random(), |                     id: rand::random(), | ||||||
|                     work: id, |                     work: id.clone(), | ||||||
|                     title: section.title.clone(), |                     title: section.title.clone(), | ||||||
|                     before_index: section.before_index, |                     before_index: section.before_index, | ||||||
|                 }; |                 }; | ||||||
|  | @ -152,7 +152,7 @@ pub fn update_work(conn: &DbConn, work: &Work, user: &User) -> Result<()> { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Get an existing work and all available information from related tables.
 | /// Get an existing work and all available information from related tables.
 | ||||||
| pub fn get_work(conn: &DbConn, id: u32) -> Result<Option<Work>> { | pub fn get_work(conn: &DbConn, id: &str) -> Result<Option<Work>> { | ||||||
|     let work = match get_work_row(conn, id)? { |     let work = match get_work_row(conn, id)? { | ||||||
|         Some(row) => Some(get_description_for_work_row(conn, &row)?), |         Some(row) => Some(get_description_for_work_row(conn, &row)?), | ||||||
|         None => None, |         None => None, | ||||||
|  | @ -164,9 +164,9 @@ pub fn get_work(conn: &DbConn, id: u32) -> Result<Option<Work>> { | ||||||
| /// Delete an existing work. This will fail if there are still other tables that relate to
 | /// Delete an existing work. This will fail if there are still other tables that relate to
 | ||||||
| /// this work except for the things that are part of the information on the work itself. Also,
 | /// this work except for the things that are part of the information on the work itself. Also,
 | ||||||
| /// this will only succeed, if the provided user is allowed to delete the work.
 | /// this will only succeed, if the provided user is allowed to delete the work.
 | ||||||
| pub fn delete_work(conn: &DbConn, id: u32, user: &User) -> Result<()> { | pub fn delete_work(conn: &DbConn, id: &str, user: &User) -> Result<()> { | ||||||
|     if user.may_delete() { |     if user.may_delete() { | ||||||
|         diesel::delete(works::table.filter(works::id.eq(id as i64))).execute(conn)?; |         diesel::delete(works::table.filter(works::id.eq(id))).execute(conn)?; | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } else { |     } else { | ||||||
|         Err(Error::new(ServerError::Forbidden)) |         Err(Error::new(ServerError::Forbidden)) | ||||||
|  | @ -174,11 +174,11 @@ pub fn delete_work(conn: &DbConn, id: u32, user: &User) -> Result<()> { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Get all existing works by a composer and related information from other tables.
 | /// Get all existing works by a composer and related information from other tables.
 | ||||||
| pub fn get_works(conn: &DbConn, composer_id: u32) -> Result<Vec<Work>> { | pub fn get_works(conn: &DbConn, composer_id: &str) -> Result<Vec<Work>> { | ||||||
|     let mut works: Vec<Work> = Vec::new(); |     let mut works: Vec<Work> = Vec::new(); | ||||||
| 
 | 
 | ||||||
|     let rows = works::table |     let rows = works::table | ||||||
|         .filter(works::composer.eq(composer_id as i64)) |         .filter(works::composer.eq(composer_id)) | ||||||
|         .load::<WorkRow>(conn)?; |         .load::<WorkRow>(conn)?; | ||||||
| 
 | 
 | ||||||
|     for row in rows { |     for row in rows { | ||||||
|  | @ -189,9 +189,9 @@ pub fn get_works(conn: &DbConn, composer_id: u32) -> Result<Vec<Work>> { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Get an already existing work without related rows from other tables.
 | /// Get an already existing work without related rows from other tables.
 | ||||||
| fn get_work_row(conn: &DbConn, id: u32) -> Result<Option<WorkRow>> { | fn get_work_row(conn: &DbConn, id: &str) -> Result<Option<WorkRow>> { | ||||||
|     Ok(works::table |     Ok(works::table | ||||||
|         .filter(works::id.eq(id as i64)) |         .filter(works::id.eq(id)) | ||||||
|         .load::<WorkRow>(conn)? |         .load::<WorkRow>(conn)? | ||||||
|         .into_iter() |         .into_iter() | ||||||
|         .next()) |         .next()) | ||||||
|  | @ -202,19 +202,19 @@ fn get_description_for_work_row(conn: &DbConn, row: &WorkRow) -> Result<Work> { | ||||||
|     let mut instruments: Vec<Instrument> = Vec::new(); |     let mut instruments: Vec<Instrument> = Vec::new(); | ||||||
| 
 | 
 | ||||||
|     let instrumentations = instrumentations::table |     let instrumentations = instrumentations::table | ||||||
|         .filter(instrumentations::work.eq(row.id)) |         .filter(instrumentations::work.eq(&row.id)) | ||||||
|         .load::<InstrumentationRow>(conn)?; |         .load::<InstrumentationRow>(conn)?; | ||||||
| 
 | 
 | ||||||
|     for instrumentation in instrumentations { |     for instrumentation in instrumentations { | ||||||
|         let id = instrumentation.instrument as u32; |         let id = instrumentation.instrument.clone(); | ||||||
|         instruments |         instruments | ||||||
|             .push(get_instrument(conn, id)?.ok_or(anyhow!("No instrument with ID: {}", id))?); |             .push(get_instrument(conn, &id)?.ok_or(anyhow!("No instrument with ID: {}", id))?); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     let mut parts: Vec<WorkPart> = Vec::new(); |     let mut parts: Vec<WorkPart> = Vec::new(); | ||||||
| 
 | 
 | ||||||
|     let part_rows = work_parts::table |     let part_rows = work_parts::table | ||||||
|         .filter(work_parts::work.eq(row.id)) |         .filter(work_parts::work.eq(&row.id)) | ||||||
|         .load::<WorkPartRow>(conn)?; |         .load::<WorkPartRow>(conn)?; | ||||||
| 
 | 
 | ||||||
|     for part_row in part_rows { |     for part_row in part_rows { | ||||||
|  | @ -222,8 +222,7 @@ fn get_description_for_work_row(conn: &DbConn, row: &WorkRow) -> Result<Work> { | ||||||
|             title: part_row.title, |             title: part_row.title, | ||||||
|             composer: match part_row.composer { |             composer: match part_row.composer { | ||||||
|                 Some(id) => { |                 Some(id) => { | ||||||
|                     let id = id as u32; |                     Some(get_person(conn, &id)?.ok_or(anyhow!("No person with ID: {}", id))?) | ||||||
|                     Some(get_person(conn, id)?.ok_or(anyhow!("No person with ID: {}", id))?) |  | ||||||
|                 } |                 } | ||||||
|                 None => None, |                 None => None, | ||||||
|             }, |             }, | ||||||
|  | @ -233,7 +232,7 @@ fn get_description_for_work_row(conn: &DbConn, row: &WorkRow) -> Result<Work> { | ||||||
|     let mut sections: Vec<WorkSection> = Vec::new(); |     let mut sections: Vec<WorkSection> = Vec::new(); | ||||||
| 
 | 
 | ||||||
|     let section_rows = work_sections::table |     let section_rows = work_sections::table | ||||||
|         .filter(work_sections::work.eq(row.id)) |         .filter(work_sections::work.eq(&row.id)) | ||||||
|         .load::<WorkSectionRow>(conn)?; |         .load::<WorkSectionRow>(conn)?; | ||||||
| 
 | 
 | ||||||
|     for section in section_rows { |     for section in section_rows { | ||||||
|  | @ -243,11 +242,11 @@ fn get_description_for_work_row(conn: &DbConn, row: &WorkRow) -> Result<Work> { | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     let id = row.composer as u32; |     let id = &row.composer; | ||||||
|     let composer = get_person(conn, id)?.ok_or(anyhow!("No person with ID: {}", id))?; |     let composer = get_person(conn, id)?.ok_or(anyhow!("No person with ID: {}", id))?; | ||||||
| 
 | 
 | ||||||
|     Ok(Work { |     Ok(Work { | ||||||
|         id: row.id as u32, |         id: row.id.clone(), | ||||||
|         composer, |         composer, | ||||||
|         title: row.title.clone(), |         title: row.title.clone(), | ||||||
|         instruments, |         instruments, | ||||||
|  |  | ||||||
|  | @ -9,11 +9,11 @@ use actix_web_httpauth::extractors::bearer::BearerAuth; | ||||||
| #[get("/persons/{id}")] | #[get("/persons/{id}")] | ||||||
| pub async fn get_person( | pub async fn get_person( | ||||||
|     db: web::Data<DbPool>, |     db: web::Data<DbPool>, | ||||||
|     id: web::Path<u32>, |     id: web::Path<String>, | ||||||
| ) -> Result<HttpResponse, ServerError> { | ) -> Result<HttpResponse, ServerError> { | ||||||
|     let data = web::block(move || { |     let data = web::block(move || { | ||||||
|         let conn = db.into_inner().get()?; |         let conn = db.into_inner().get()?; | ||||||
|         database::get_person(&conn, id.into_inner())?.ok_or(ServerError::NotFound) |         database::get_person(&conn, &id.into_inner())?.ok_or(ServerError::NotFound) | ||||||
|     }) |     }) | ||||||
|     .await?; |     .await?; | ||||||
| 
 | 
 | ||||||
|  | @ -55,13 +55,13 @@ pub async fn get_persons(db: web::Data<DbPool>) -> Result<HttpResponse, ServerEr | ||||||
| pub async fn delete_person( | pub async fn delete_person( | ||||||
|     auth: BearerAuth, |     auth: BearerAuth, | ||||||
|     db: web::Data<DbPool>, |     db: web::Data<DbPool>, | ||||||
|     id: web::Path<u32>, |     id: web::Path<String>, | ||||||
| ) -> Result<HttpResponse, ServerError> { | ) -> Result<HttpResponse, ServerError> { | ||||||
|     web::block(move || { |     web::block(move || { | ||||||
|         let conn = db.into_inner().get()?; |         let conn = db.into_inner().get()?; | ||||||
|         let user = authenticate(&conn, auth.token()).or(Err(ServerError::Unauthorized))?; |         let user = authenticate(&conn, auth.token()).or(Err(ServerError::Unauthorized))?; | ||||||
| 
 | 
 | ||||||
|         database::delete_person(&conn, id.into_inner(), &user)?; |         database::delete_person(&conn, &id.into_inner(), &user)?; | ||||||
| 
 | 
 | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     }) |     }) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Elias Projahn
						Elias Projahn