diff options
-rw-r--r-- | rust/TODO | 2 | ||||
-rw-r--r-- | rust/src/api_server.rs | 5 | ||||
-rw-r--r-- | rust/src/database_entity_crud.rs | 88 |
3 files changed, 48 insertions, 47 deletions
@@ -1,4 +1,6 @@ +- fatcat_api -> fatcat_api_schema (or spec? models? types?) +- fatcat -> fatcat-api-server - refactor rev creation (from an entity) into it's own function, across the board => attach to database module structs? => should make cockroachdb compatible (single use of CTE) diff --git a/rust/src/api_server.rs b/rust/src/api_server.rs index ecf0c242..57aeebea 100644 --- a/rust/src/api_server.rs +++ b/rust/src/api_server.rs @@ -49,7 +49,7 @@ macro_rules! count_entity { fn make_edit_context(conn: &DbConn, editgroup_id: Option<FatCatId>) -> Result<EditContext> { let editor_id = Uuid::parse_str("00000000-0000-0000-AAAA-000000000001")?; // TODO: auth let editgroup_id = match editgroup_id { - None => FatCatId::from_uuid(&get_or_create_editgroup(editor_id, conn).expect("current editgroup")), + None => FatCatId::from_uuid(&get_or_create_editgroup(editor_id, conn)?), Some(param) => param, }; Ok(EditContext { @@ -386,8 +386,7 @@ impl Server { editgroup::description.eq(entity.description), editgroup::extra_json.eq(entity.extra), )) - .get_result(conn) - .expect("error creating edit group"); + .get_result(conn)?; Ok(Editgroup { id: Some(uuid2fcid(&row.id)), diff --git a/rust/src/database_entity_crud.rs b/rust/src/database_entity_crud.rs index b8ff195a..0f5c5f9d 100644 --- a/rust/src/database_entity_crud.rs +++ b/rust/src/database_entity_crud.rs @@ -222,14 +222,14 @@ macro_rules! generic_db_get_history { .limit(limit) .get_results(conn)?; - let history: Vec<EntityHistoryEntry> = rows.into_iter() - .map(|(eg_row, cl_row, e_row)| EntityHistoryEntry { - edit: e_row.into_model().expect("edit row to model"), + let history: Result<Vec<EntityHistoryEntry>> = rows.into_iter() + .map(|(eg_row, cl_row, e_row)| Ok(EntityHistoryEntry { + edit: e_row.into_model()?, editgroup: eg_row.into_model_partial(), changelog_entry: cl_row.into_model(), - }) + })) .collect(); - Ok(history) + history } } } @@ -470,16 +470,14 @@ impl EntityCrud for FileEntity { match &model.releases { None => (), Some(release_list) => { - let these_release_rows: Vec<FileReleaseRow> = release_list + let these_release_rows: Result<Vec<FileReleaseRow>> = release_list .iter() - .map(|r| FileReleaseRow { + .map(|r| Ok(FileReleaseRow { file_rev: rev_id.clone(), - target_release_ident_id: fcid2uuid(r) - // XXX: shouldn't expect - .expect("invalid fatcat identifier"), - }) + target_release_ident_id: FatCatId::from_str(r)?.to_uuid(), + })) .collect(); - file_release_rows.extend(these_release_rows); + file_release_rows.extend(these_release_rows?); } }; @@ -615,8 +613,7 @@ impl EntityCrud for ReleaseEntity { let refs: Vec<ReleaseRef> = release_ref::table .filter(release_ref::release_rev.eq(rev_row.id)) .order(release_ref::index_val.asc()) - .get_results(conn) - .expect("fetch release refs") + .get_results(conn)? .into_iter() .map(|r: ReleaseRefRow| ReleaseRef { index: r.index_val, @@ -636,8 +633,7 @@ impl EntityCrud for ReleaseEntity { release_contrib::role.asc(), release_contrib::index_val.asc(), )) - .get_results(conn) - .expect("fetch release refs") + .get_results(conn)? .into_iter() .map(|c: ReleaseContribRow| ReleaseContrib { index: c.index_val, @@ -717,7 +713,7 @@ impl EntityCrud for ReleaseEntity { let rev_ids: Vec<Uuid> = insert_into(release_rev::table) .values(models.iter() - .map(|model| ReleaseRevNewRow { + .map(|model| Ok(ReleaseRevNewRow { title: model.title.clone(), release_type: model.release_type.clone(), release_status: model.release_status.clone(), @@ -731,18 +727,19 @@ impl EntityCrud for ReleaseEntity { volume: model.volume.clone(), issue: model.issue.clone(), pages: model.pages.clone(), - work_ident_id: model.work_id - .clone() - .map(|s| FatCatId::from_str(&s).expect("invalid fatcat identifier").to_uuid()) - .expect("release_revs must have a work_id by the time they are inserted; this is an internal soundness error"), - container_ident_id: model.container_id - .clone() - .map(|s| FatCatId::from_str(&s).expect("invalid fatcat identifier").to_uuid()), + work_ident_id: match model.work_id.clone() { + None => bail!("release_revs must have a work_id by the time they are inserted; this is an internal soundness error"), + Some(s) => FatCatId::from_str(&s)?.to_uuid(), + }, + container_ident_id: match model.container_id.clone() { + None => None, + Some(s) => Some(FatCatId::from_str(&s)?.to_uuid()), + }, publisher: model.publisher.clone(), language: model.language.clone(), extra_json: model.extra.clone() - }) - .collect::<Vec<ReleaseRevNewRow>>()) + })) + .collect::<Result<Vec<ReleaseRevNewRow>>>()?) .returning(release_rev::id) .get_results(conn)?; @@ -755,11 +752,12 @@ impl EntityCrud for ReleaseEntity { Some(ref_list) => { let these_ref_rows: Vec<ReleaseRefNewRow> = ref_list .iter() - .map(|r| ReleaseRefNewRow { + .map(|r| Ok(ReleaseRefNewRow { release_rev: rev_id.clone(), - target_release_ident_id: r.target_release_id - .clone() - .map(|v| fcid2uuid(&v).expect("valid fatcat identifier")), + target_release_ident_id: match r.target_release_id.clone() { + None => None, + Some(v) => Some(FatCatId::from_str(&v)?.to_uuid()), + }, index_val: r.index, key: r.key.clone(), container_title: r.container_title.clone(), @@ -767,8 +765,8 @@ impl EntityCrud for ReleaseEntity { title: r.title.clone(), locator: r.locator.clone(), extra_json: r.extra.clone(), - }) - .collect(); + })) + .collect::<Result<Vec<ReleaseRefNewRow>>>()?; release_ref_rows.extend(these_ref_rows); } }; @@ -778,18 +776,18 @@ impl EntityCrud for ReleaseEntity { Some(contrib_list) => { let these_contrib_rows: Vec<ReleaseContribNewRow> = contrib_list .iter() - .map(|c| ReleaseContribNewRow { + .map(|c| Ok(ReleaseContribNewRow { release_rev: rev_id.clone(), - creator_ident_id: c.creator_id - .clone() - // XXX: shouldn't have these expects - .map(|v| fcid2uuid(&v).expect("valid fatcat identifier")), + creator_ident_id: match c.creator_id.clone() { + None => None, + Some(v) => Some(FatCatId::from_str(&v)?.to_uuid()), + }, raw_name: c.raw_name.clone(), index_val: c.index, role: c.role.clone(), extra_json: c.extra.clone(), - }) - .collect(); + })) + .collect::<Result<Vec<ReleaseContribNewRow>>>()?; release_contrib_rows.extend(these_contrib_rows); } }; @@ -816,17 +814,19 @@ impl EntityCrud for ReleaseEntity { } let release_abstract_rows: Vec<ReleaseRevAbstractNewRow> = abstract_list .into_iter() - .map(|c| ReleaseRevAbstractNewRow { + .map(|c| Ok(ReleaseRevAbstractNewRow { release_rev: rev_id.clone(), abstract_sha1: match c.content { Some(ref content) => Sha1::from(content).hexdigest(), - // XXX: shouldn't have these expects - None => c.sha1.clone().expect("either abstract_sha1 or content is required"), + None => match c.sha1.clone() { + Some(v) => v, + None => { bail!("either abstract_sha1 or content is required") } + }, }, lang: c.lang.clone(), mimetype: c.mimetype.clone(), - }) - .collect(); + })) + .collect::<Result<Vec<ReleaseRevAbstractNewRow>>>()?; insert_into(release_rev_abstract::table) .values(release_abstract_rows) .execute(conn)?; |