From f3523b1d900e19911bf0041ac1c75877b0bfc943 Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Fri, 25 May 2018 19:42:39 -0700 Subject: return all edits for an editgroup GET --- rust/fatcat-api/README.md | 2 +- rust/fatcat-api/api.yaml | 8 ++ rust/fatcat-api/api/swagger.yaml | 31 ++++++ rust/fatcat-api/src/models.rs | 20 ++-- rust/fatcat-openapi2.yml | 8 ++ rust/migrations/2018-05-12-001226_init/up.sql | 20 ++-- rust/src/api_server.rs | 133 ++++++++++++++++++++++---- rust/src/database_models.rs | 2 +- rust/src/database_schema.rs | 20 ++-- rust/tests/test_api_server.rs | 10 ++ 10 files changed, 202 insertions(+), 52 deletions(-) diff --git a/rust/fatcat-api/README.md b/rust/fatcat-api/README.md index 364f7271..146758fb 100644 --- a/rust/fatcat-api/README.md +++ b/rust/fatcat-api/README.md @@ -13,7 +13,7 @@ To see how to make this your own, look here: [README](https://github.com/swagger-api/swagger-codegen/blob/master/README.md) - API version: 0.1.0 -- Build date: 2018-05-26T01:47:28.955Z +- Build date: 2018-05-26T02:33:00.709Z This autogenerated project defines an API crate `fatcat` which contains: * An `Api` trait defining the API in Rust. diff --git a/rust/fatcat-api/api.yaml b/rust/fatcat-api/api.yaml index cfce24d7..146c11dd 100644 --- a/rust/fatcat-api/api.yaml +++ b/rust/fatcat-api/api.yaml @@ -50,6 +50,10 @@ x-entity-edit-props: &ENTITYEDITPROPS type: integer example: 42 format: int64 + redirect_ident: + type: string + example: "f1f046a3-45c9-4b99-adce-000000000002" + #format: uuid editgroup_id: type: integer example: 16 @@ -174,6 +178,10 @@ definitions: type: string entity_edit: type: object + required: + - edit_id + - ident + - editgroup_id properties: <<: *ENTITYEDITPROPS editor: diff --git a/rust/fatcat-api/api/swagger.yaml b/rust/fatcat-api/api/swagger.yaml index 506cb9db..db7b0e03 100644 --- a/rust/fatcat-api/api/swagger.yaml +++ b/rust/fatcat-api/api/swagger.yaml @@ -1300,6 +1300,10 @@ definitions: upperCaseName: "WORK_ENTITY" entity_edit: type: "object" + required: + - "edit_id" + - "editgroup_id" + - "ident" properties: extra: type: "object" @@ -1307,6 +1311,9 @@ definitions: type: "integer" format: "int64" example: 16 + redirect_ident: + type: "string" + example: "f1f046a3-45c9-4b99-adce-000000000002" revision: type: "integer" format: "int64" @@ -1322,6 +1329,7 @@ definitions: ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 upperCaseName: "ENTITY_EDIT" @@ -1360,55 +1368,65 @@ definitions: - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 creators: - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 files: - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 containers: - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 releases: - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 description: "description" @@ -1480,55 +1498,65 @@ definitions: - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 creators: - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 files: - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 containers: - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 releases: - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 - ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" edit_id: 847 + redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: 16 revision: 42 upperCaseName: "EDITGROUP_EDITS" @@ -1585,6 +1613,9 @@ x-entity-edit-props: type: "integer" example: 42 format: "int64" + redirect_ident: + type: "string" + example: "f1f046a3-45c9-4b99-adce-000000000002" editgroup_id: type: "integer" example: 16 diff --git a/rust/fatcat-api/src/models.rs b/rust/fatcat-api/src/models.rs index e3ce33c3..68242058 100644 --- a/rust/fatcat-api/src/models.rs +++ b/rust/fatcat-api/src/models.rs @@ -285,30 +285,32 @@ pub struct EntityEdit { pub extra: Option, #[serde(rename = "editgroup_id")] + pub editgroup_id: i64, + + #[serde(rename = "redirect_ident")] #[serde(skip_serializing_if = "Option::is_none")] - pub editgroup_id: Option, + pub redirect_ident: Option, #[serde(rename = "revision")] #[serde(skip_serializing_if = "Option::is_none")] pub revision: Option, #[serde(rename = "ident")] - #[serde(skip_serializing_if = "Option::is_none")] - pub ident: Option, + pub ident: String, #[serde(rename = "edit_id")] - #[serde(skip_serializing_if = "Option::is_none")] - pub edit_id: Option, + pub edit_id: i64, } impl EntityEdit { - pub fn new() -> EntityEdit { + pub fn new(editgroup_id: i64, ident: String, edit_id: i64) -> EntityEdit { EntityEdit { extra: None, - editgroup_id: None, + editgroup_id: editgroup_id, + redirect_ident: None, revision: None, - ident: None, - edit_id: None, + ident: ident, + edit_id: edit_id, } } } diff --git a/rust/fatcat-openapi2.yml b/rust/fatcat-openapi2.yml index cfce24d7..146c11dd 100644 --- a/rust/fatcat-openapi2.yml +++ b/rust/fatcat-openapi2.yml @@ -50,6 +50,10 @@ x-entity-edit-props: &ENTITYEDITPROPS type: integer example: 42 format: int64 + redirect_ident: + type: string + example: "f1f046a3-45c9-4b99-adce-000000000002" + #format: uuid editgroup_id: type: integer example: 16 @@ -174,6 +178,10 @@ definitions: type: string entity_edit: type: object + required: + - edit_id + - ident + - editgroup_id properties: <<: *ENTITYEDITPROPS editor: diff --git a/rust/migrations/2018-05-12-001226_init/up.sql b/rust/migrations/2018-05-12-001226_init/up.sql index 1fbd7c09..1f366f90 100644 --- a/rust/migrations/2018-05-12-001226_init/up.sql +++ b/rust/migrations/2018-05-12-001226_init/up.sql @@ -54,11 +54,11 @@ CREATE TABLE creator_ident ( CREATE TABLE creator_edit ( id BIGSERIAL PRIMARY KEY, - extra_json JSON, + editgroup_id BIGINT REFERENCES editgroup(id) NOT NULL, ident_id UUID REFERENCES creator_ident(id) NOT NULL, rev_id BIGINT REFERENCES creator_rev(id), redirect_id UUID REFERENCES creator_ident(id), - editgroup_id BIGINT REFERENCES editgroup(id) NOT NULL + extra_json JSON ); -------------------- Containers -------------------------------------------- @@ -82,11 +82,11 @@ CREATE TABLE container_ident ( CREATE TABLE container_edit ( id BIGSERIAL PRIMARY KEY, - extra_json JSON, + editgroup_id BIGINT REFERENCES editgroup(id) NOT NULL, ident_id UUID REFERENCES container_ident(id) NOT NULL, rev_id BIGINT REFERENCES container_rev(id), redirect_id UUID REFERENCES container_ident(id), - editgroup_id BIGINT REFERENCES editgroup(id) NOT NULL + extra_json JSON ); -------------------- Files ------------------------------------------------- @@ -108,11 +108,11 @@ CREATE TABLE file_ident ( CREATE TABLE file_edit ( id BIGSERIAL PRIMARY KEY, - extra_json JSON, + editgroup_id BIGINT REFERENCES editgroup(id) NOT NULL, ident_id UUID REFERENCES file_ident(id) NOT NULL, rev_id BIGINT REFERENCES file_rev(id), redirect_id UUID REFERENCES file_ident(id), - editgroup_id BIGINT REFERENCES editgroup(id) NOT NULL + extra_json JSON ); -------------------- Release ----------------------------------------------- @@ -143,11 +143,11 @@ CREATE TABLE release_ident ( CREATE TABLE release_edit ( id BIGSERIAL PRIMARY KEY, - extra_json JSON, + editgroup_id BIGINT REFERENCES editgroup(id) NOT NULL, ident_id UUID REFERENCES release_ident(id) NOT NULL, rev_id BIGINT REFERENCES release_rev(id), redirect_id UUID REFERENCES release_ident(id), - editgroup_id BIGINT REFERENCES editgroup(id) NOT NULL + extra_json JSON ); -------------------- Works -------------------------------------------------- @@ -169,11 +169,11 @@ CREATE TABLE work_ident ( CREATE TABLE work_edit ( id BIGSERIAL PRIMARY KEY, - extra_json JSON, + editgroup_id BIGINT REFERENCES editgroup(id) NOT NULL, ident_id UUID REFERENCES work_ident(id) NOT NULL, rev_id BIGINT REFERENCES work_rev(id), redirect_id UUID REFERENCES work_ident(id), - editgroup_id BIGINT REFERENCES editgroup(id) NOT NULL + extra_json JSON ); diff --git a/rust/src/api_server.rs b/rust/src/api_server.rs index c9c8e754..8311896f 100644 --- a/rust/src/api_server.rs +++ b/rust/src/api_server.rs @@ -4,9 +4,10 @@ use ConnectionPool; use api_helpers::*; use chrono; use database_models::*; -use database_schema::{changelog, container_ident, container_rev, creator_ident, creator_rev, - editgroup, editor, file_ident, file_release, file_rev, release_contrib, - release_ident, release_ref, release_rev, work_ident, work_rev}; +use database_schema::{changelog, container_edit, container_ident, container_rev, creator_edit, + creator_ident, creator_rev, editgroup, editor, file_edit, file_ident, + file_release, file_rev, release_contrib, release_edit, release_ident, + release_ref, release_rev, work_edit, work_ident, work_rev}; use diesel::prelude::*; use diesel::{self, insert_into}; use errors::*; @@ -342,7 +343,8 @@ impl Server { let entity = ReleaseEntity { title: rev.title, release_type: rev.release_type, - date: rev.date.map(|v| chrono::DateTime::from_utc(v.and_hms(0, 0, 0), chrono::Utc)), + date: rev.date + .map(|v| chrono::DateTime::from_utc(v.and_hms(0, 0, 0), chrono::Utc)), doi: rev.doi, volume: rev.volume, pages: rev.pages, @@ -405,7 +407,8 @@ impl Server { let entity = ReleaseEntity { title: rev.title, release_type: rev.release_type, - date: rev.date.map(|v| chrono::DateTime::from_utc(v.and_hms(0, 0, 0), chrono::Utc)), + date: rev.date + .map(|v| chrono::DateTime::from_utc(v.and_hms(0, 0, 0), chrono::Utc)), doi: rev.doi, volume: rev.volume, pages: rev.pages, @@ -429,11 +432,94 @@ impl Server { let row: EditgroupRow = editgroup::table.find(id as i64).first(&conn)?; + let edits = EditgroupEdits { + containers: Some( + container_edit::table + .filter(container_edit::editgroup_id.eq(id)) + .get_results(&conn) + .unwrap() + .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(), + }) + .collect(), + ), + creators: Some( + creator_edit::table + .filter(creator_edit::editgroup_id.eq(id)) + .get_results(&conn) + .unwrap() + .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(), + }) + .collect(), + ), + files: Some( + file_edit::table + .filter(file_edit::editgroup_id.eq(id)) + .get_results(&conn) + .unwrap() + .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(), + }) + .collect(), + ), + releases: Some( + release_edit::table + .filter(release_edit::editgroup_id.eq(id)) + .get_results(&conn) + .unwrap() + .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(), + }) + .collect(), + ), + works: Some( + work_edit::table + .filter(work_edit::editgroup_id.eq(id)) + .get_results(&conn) + .unwrap() + .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(), + }) + .collect(), + ), + }; + let eg = Editgroup { id: Some(row.id), editor_id: row.editor_id, description: row.description, - edits: None, + edits: Some(edits), extra: row.extra_json, }; Ok(Some(eg)) @@ -565,10 +651,11 @@ impl Api for Server { let edit = &edit; let entity_edit = EntityEdit { - editgroup_id: Some(edit.editgroup_id), + editgroup_id: edit.editgroup_id, revision: Some(edit.rev_id.unwrap()), - ident: Some(edit.ident_id.to_string()), - edit_id: Some(edit.id), + redirect_ident: None, + ident: edit.ident_id.to_string(), + edit_id: edit.id, extra: edit.extra_json.clone(), }; Box::new(futures::done(Ok(ContainerPostResponse::CreatedEntity( @@ -607,10 +694,11 @@ impl Api for Server { let edit = &edit; let entity_edit = EntityEdit { - editgroup_id: Some(edit.editgroup_id), + editgroup_id: edit.editgroup_id, revision: Some(edit.rev_id.unwrap()), - ident: Some(edit.ident_id.to_string()), - edit_id: Some(edit.id), + redirect_ident: None, + ident: edit.ident_id.to_string(), + edit_id: edit.id, extra: edit.extra_json.clone(), }; Box::new(futures::done(Ok(CreatorPostResponse::CreatedEntity( @@ -673,10 +761,11 @@ impl Api for Server { }; let entity_edit = EntityEdit { - editgroup_id: Some(edit.editgroup_id), + editgroup_id: edit.editgroup_id, revision: Some(edit.rev_id.unwrap()), - ident: Some(edit.ident_id.to_string()), - edit_id: Some(edit.id), + redirect_ident: None, + ident: edit.ident_id.to_string(), + edit_id: edit.id, extra: edit.extra_json.clone(), }; Box::new(futures::done(Ok(FilePostResponse::CreatedEntity( @@ -715,10 +804,11 @@ impl Api for Server { let edit = &edit; let entity_edit = EntityEdit { - editgroup_id: Some(edit.editgroup_id), + editgroup_id: edit.editgroup_id, revision: Some(edit.rev_id.unwrap()), - ident: Some(edit.ident_id.to_string()), - edit_id: Some(edit.id), + redirect_ident: None, + ident: edit.ident_id.to_string(), + edit_id: edit.id, extra: edit.extra_json.clone(), }; Box::new(futures::done(Ok(WorkPostResponse::CreatedEntity( @@ -823,10 +913,11 @@ impl Api for Server { }; let entity_edit = EntityEdit { - editgroup_id: Some(edit.editgroup_id), + editgroup_id: edit.editgroup_id, revision: Some(edit.rev_id.unwrap()), - ident: Some(edit.ident_id.to_string()), - edit_id: Some(edit.id), + redirect_ident: None, + ident: edit.ident_id.to_string(), + edit_id: edit.id, extra: edit.extra_json.clone(), }; Box::new(futures::done(Ok(ReleasePostResponse::CreatedEntity( diff --git a/rust/src/database_models.rs b/rust/src/database_models.rs index 2b205fe7..b27bca3f 100644 --- a/rust/src/database_models.rs +++ b/rust/src/database_models.rs @@ -36,10 +36,10 @@ macro_rules! entity_structs { #[table_name = $edit_table] pub struct $edit_struct { pub id: i64, + pub editgroup_id: i64, pub ident_id: Uuid, pub rev_id: Option, pub redirect_id: Option, - pub editgroup_id: i64, pub extra_json: Option, } diff --git a/rust/src/database_schema.rs b/rust/src/database_schema.rs index 3adbd63a..7d8ff4e1 100644 --- a/rust/src/database_schema.rs +++ b/rust/src/database_schema.rs @@ -9,11 +9,11 @@ table! { table! { container_edit (id) { id -> Int8, - extra_json -> Nullable, + editgroup_id -> Int8, ident_id -> Uuid, rev_id -> Nullable, redirect_id -> Nullable, - editgroup_id -> Int8, + extra_json -> Nullable, } } @@ -39,11 +39,11 @@ table! { table! { creator_edit (id) { id -> Int8, - extra_json -> Nullable, + editgroup_id -> Int8, ident_id -> Uuid, rev_id -> Nullable, redirect_id -> Nullable, - editgroup_id -> Int8, + extra_json -> Nullable, } } @@ -86,11 +86,11 @@ table! { table! { file_edit (id) { id -> Int8, - extra_json -> Nullable, + editgroup_id -> Int8, ident_id -> Uuid, rev_id -> Nullable, redirect_id -> Nullable, - editgroup_id -> Int8, + extra_json -> Nullable, } } @@ -134,11 +134,11 @@ table! { table! { release_edit (id) { id -> Int8, - extra_json -> Nullable, + editgroup_id -> Int8, ident_id -> Uuid, rev_id -> Nullable, redirect_id -> Nullable, - editgroup_id -> Int8, + extra_json -> Nullable, } } @@ -180,11 +180,11 @@ table! { table! { work_edit (id) { id -> Int8, - extra_json -> Nullable, + editgroup_id -> Int8, ident_id -> Uuid, rev_id -> Nullable, redirect_id -> Nullable, - editgroup_id -> Int8, + extra_json -> Nullable, } } diff --git a/rust/tests/test_api_server.rs b/rust/tests/test_api_server.rs index 01db031f..8eedfa2f 100644 --- a/rust/tests/test_api_server.rs +++ b/rust/tests/test_api_server.rs @@ -341,6 +341,16 @@ fn test_accept_editgroup() { .unwrap(); assert_eq!(c, 2); + check_response( + request::get( + &format!("http://localhost:9411/v0/editgroup/{}", editgroup_id), + headers.clone(), + &router, + ), + status::Ok, + None, + ); + check_response( request::post( &format!("http://localhost:9411/v0/editgroup/{}/accept", editgroup_id), -- cgit v1.2.3