diff options
-rw-r--r-- | rust/src/api_server.rs | 120 | ||||
-rw-r--r-- | rust/src/database_models.rs | 2 |
2 files changed, 52 insertions, 70 deletions
diff --git a/rust/src/api_server.rs b/rust/src/api_server.rs index c0787c74..fc304fb7 100644 --- a/rust/src/api_server.rs +++ b/rust/src/api_server.rs @@ -25,8 +25,14 @@ use uuid; type DbConn = diesel::r2d2::PooledConnection<diesel::r2d2::ConnectionManager<diesel::PgConnection>>; -// Helper for calling through to handlers +/// Helper for generating wrappers (which return "Box::new(futures::done(Ok(BLAH)))" like the +/// codegen fatcat-api code wants) that call through to actual helpers (which have simple Result<> +/// return types) macro_rules! wrap_entity_handlers { + // Would much rather just have entity ident, then generate the other fields from that, but Rust + // stable doesn't have a mechanism to "concat" or generate new identifiers in macros, at least + // in the context of defining new functions. + // The only stable approach I know of would be: https://github.com/dtolnay/mashup ($get_fn:ident, $get_handler:ident, $get_resp:ident, $post_fn:ident, $post_handler:ident, $post_resp:ident, $model:ident) => { fn $get_fn( @@ -87,12 +93,16 @@ pub struct Server { pub db_pool: ConnectionPool, } -fn container_row2entity(ident: Option<ContainerIdentRow>, rev: ContainerRevRow) -> Result<ContainerEntity> { +fn container_row2entity( + ident: Option<ContainerIdentRow>, + rev: ContainerRevRow, +) -> Result<ContainerEntity> { let (state, ident_id, redirect_id) = match ident { Some(i) => ( Some(i.state().unwrap().shortname()), Some(i.id.to_string()), - i.redirect_id.map(|u| u.to_string())), + i.redirect_id.map(|u| u.to_string()), + ), None => (None, None, None), }; Ok(ContainerEntity { @@ -115,7 +125,8 @@ fn creator_row2entity(ident: Option<CreatorIdentRow>, rev: CreatorRevRow) -> Res Some(i) => ( Some(i.state().unwrap().shortname()), Some(i.id.to_string()), - i.redirect_id.map(|u| u.to_string())), + i.redirect_id.map(|u| u.to_string()), + ), None => (None, None, None), }; Ok(CreatorEntity { @@ -130,13 +141,17 @@ fn creator_row2entity(ident: Option<CreatorIdentRow>, rev: CreatorRevRow) -> Res }) } -fn file_row2entity(ident: Option<FileIdentRow>, rev: FileRevRow, conn: DbConn) -> Result<FileEntity> { - +fn file_row2entity( + ident: Option<FileIdentRow>, + rev: FileRevRow, + conn: DbConn, +) -> Result<FileEntity> { let (state, ident_id, redirect_id) = match ident { Some(i) => ( Some(i.state().unwrap().shortname()), Some(i.id.to_string()), - i.redirect_id.map(|u| u.to_string())), + i.redirect_id.map(|u| u.to_string()), + ), None => (None, None, None), }; @@ -162,13 +177,17 @@ fn file_row2entity(ident: Option<FileIdentRow>, rev: FileRevRow, conn: DbConn) - }) } -fn release_row2entity(ident: Option<ReleaseIdentRow>, rev: ReleaseRevRow, conn: DbConn) -> Result<ReleaseEntity> { - +fn release_row2entity( + ident: Option<ReleaseIdentRow>, + rev: ReleaseRevRow, + conn: DbConn, +) -> Result<ReleaseEntity> { let (state, ident_id, redirect_id) = match ident { Some(i) => ( Some(i.state().unwrap().shortname()), Some(i.id.to_string()), - i.redirect_id.map(|u| u.to_string())), + i.redirect_id.map(|u| u.to_string()), + ), None => (None, None, None), }; @@ -226,7 +245,8 @@ fn work_row2entity(ident: Option<WorkIdentRow>, rev: WorkRevRow) -> Result<WorkE Some(i) => ( Some(i.state().unwrap().shortname()), Some(i.id.to_string()), - i.redirect_id.map(|u| u.to_string())), + i.redirect_id.map(|u| u.to_string()), + ), None => (None, None, None), }; Ok(WorkEntity { @@ -241,17 +261,15 @@ fn work_row2entity(ident: Option<WorkIdentRow>, rev: WorkRevRow) -> Result<WorkE } impl Server { - fn container_id_get_handler(&self, id: String) -> Result<ContainerEntity> { let conn = self.db_pool.get().expect("db_pool error"); let id = uuid::Uuid::parse_str(&id)?; // TODO: handle Deletions - let (ident, rev): (ContainerIdentRow, ContainerRevRow) = - container_ident::table - .find(id) - .inner_join(container_rev::table) - .first(&conn)?; + let (ident, rev): (ContainerIdentRow, ContainerRevRow) = container_ident::table + .find(id) + .inner_join(container_rev::table) + .first(&conn)?; container_row2entity(Some(ident), rev) } @@ -259,13 +277,12 @@ impl Server { fn container_lookup_get_handler(&self, issnl: String) -> Result<ContainerEntity> { let conn = self.db_pool.get().expect("db_pool error"); - let (ident, rev): (ContainerIdentRow, ContainerRevRow) = - container_ident::table - .inner_join(container_rev::table) - .filter(container_rev::issnl.eq(&issnl)) - .filter(container_ident::is_live.eq(true)) - .filter(container_ident::redirect_id.is_null()) - .first(&conn)?; + let (ident, rev): (ContainerIdentRow, ContainerRevRow) = container_ident::table + .inner_join(container_rev::table) + .filter(container_rev::issnl.eq(&issnl)) + .filter(container_ident::is_live.eq(true)) + .filter(container_ident::redirect_id.is_null()) + .first(&conn)?; container_row2entity(Some(ident), rev) } @@ -599,75 +616,40 @@ impl Server { container_edit::table .filter(container_edit::editgroup_id.eq(id)) .get_results(&conn)? - .iter() - .map(|e: &ContainerEditRow| EntityEdit { - edit_id: e.id, - editgroup_id: e.editgroup_id, - revision: e.rev_id, - redirect_ident: e.redirect_id.map(|v| v.to_string()), - ident: e.ident_id.to_string(), - extra: e.extra_json.clone(), - }) + .into_iter() + .map(|e: ContainerEditRow| e.to_model().unwrap()) .collect(), ), creators: Some( creator_edit::table .filter(creator_edit::editgroup_id.eq(id)) .get_results(&conn)? - .iter() - .map(|e: &CreatorEditRow| EntityEdit { - edit_id: e.id, - editgroup_id: e.editgroup_id, - revision: e.rev_id, - redirect_ident: e.redirect_id.map(|v| v.to_string()), - ident: e.ident_id.to_string(), - extra: e.extra_json.clone(), - }) + .into_iter() + .map(|e: CreatorEditRow| e.to_model().unwrap()) .collect(), ), files: Some( file_edit::table .filter(file_edit::editgroup_id.eq(id)) .get_results(&conn)? - .iter() - .map(|e: &FileEditRow| EntityEdit { - edit_id: e.id, - editgroup_id: e.editgroup_id, - revision: e.rev_id, - redirect_ident: e.redirect_id.map(|v| v.to_string()), - ident: e.ident_id.to_string(), - extra: e.extra_json.clone(), - }) + .into_iter() + .map(|e: FileEditRow| e.to_model().unwrap()) .collect(), ), releases: Some( release_edit::table .filter(release_edit::editgroup_id.eq(id)) .get_results(&conn)? - .iter() - .map(|e: &ReleaseEditRow| EntityEdit { - edit_id: e.id, - editgroup_id: e.editgroup_id, - revision: e.rev_id, - redirect_ident: e.redirect_id.map(|v| v.to_string()), - ident: e.ident_id.to_string(), - extra: e.extra_json.clone(), - }) + .into_iter() + .map(|e: ReleaseEditRow| e.to_model().unwrap()) .collect(), ), works: Some( work_edit::table .filter(work_edit::editgroup_id.eq(id)) .get_results(&conn)? - .iter() - .map(|e: &WorkEditRow| EntityEdit { - edit_id: e.id, - editgroup_id: e.editgroup_id, - revision: e.rev_id, - redirect_ident: e.redirect_id.map(|v| v.to_string()), - ident: e.ident_id.to_string(), - extra: e.extra_json.clone(), - }) + .into_iter() + .map(|e: WorkEditRow| e.to_model().unwrap()) .collect(), ), }; diff --git a/rust/src/database_models.rs b/rust/src/database_models.rs index b46d6ffb..b62492ab 100644 --- a/rust/src/database_models.rs +++ b/rust/src/database_models.rs @@ -1,9 +1,9 @@ use chrono; use database_schema::*; use errors::*; +use fatcat_api::models::EntityEdit; use serde_json; use uuid::Uuid; -use fatcat_api::models::EntityEdit; // Ugh. I thought the whole point was to *not* do this, but: // https://github.com/diesel-rs/diesel/issues/1589 |