From 91c080a2e82ec4e8908cb8e3916a543519151847 Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Tue, 11 Sep 2018 16:10:47 -0700 Subject: implement new editgroup_id behavior --- rust/fatcat-api-spec/README.md | 2 +- rust/fatcat-api-spec/api.yaml | 49 +++++++- rust/fatcat-api-spec/api/swagger.yaml | 137 +++++++++++++-------- rust/fatcat-api-spec/examples/client.rs | 20 +-- rust/fatcat-api-spec/examples/server_lib/server.rs | 80 +++++++++--- rust/fatcat-api-spec/src/client.rs | 113 ++++++++++++++--- rust/fatcat-api-spec/src/lib.rs | 80 ++++++------ rust/fatcat-api-spec/src/models.rs | 55 ++++----- rust/fatcat-api-spec/src/server.rs | 60 +++++++-- rust/src/api_entity_crud.rs | 37 ++---- rust/src/api_helpers.rs | 41 +++--- rust/src/api_server.rs | 14 +-- rust/src/api_wrappers.rs | 19 ++- 13 files changed, 458 insertions(+), 249 deletions(-) diff --git a/rust/fatcat-api-spec/README.md b/rust/fatcat-api-spec/README.md index 4c613ba7..6945d13d 100644 --- a/rust/fatcat-api-spec/README.md +++ b/rust/fatcat-api-spec/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-09-11T20:55:46.846Z +- Build date: 2018-09-11T22:56:39.846Z This autogenerated project defines an API crate `fatcat` which contains: * An `Api` trait defining the API in Rust. diff --git a/rust/fatcat-api-spec/api.yaml b/rust/fatcat-api-spec/api.yaml index 2b0615d2..d5414405 100644 --- a/rust/fatcat-api-spec/api.yaml +++ b/rust/fatcat-api-spec/api.yaml @@ -52,15 +52,12 @@ x-entity-props: &ENTITYPROPS <<: *FATCATUUID redirect: <<: *FATCATIDENT - editgroup_id: - <<: *FATCATIDENT extra: type: object additionalProperties: {} -# TODO: -# edit_extra: -# type: object -# additionalProperties: {} + edit_extra: + type: object + additionalProperties: {} definitions: error_response: @@ -432,6 +429,10 @@ paths: required: true schema: $ref: "#/definitions/container_entity" + - name: editgroup + in: query + required: false + type: string responses: 201: description: Created Entity @@ -495,6 +496,10 @@ paths: required: true schema: $ref: "#/definitions/container_entity" + - name: editgroup + in: query + required: false + type: string responses: 200: description: Updated Entity @@ -558,6 +563,10 @@ paths: required: true schema: $ref: "#/definitions/creator_entity" + - name: editgroup + in: query + required: false + type: string responses: 201: description: Created Entity @@ -621,6 +630,10 @@ paths: required: true schema: $ref: "#/definitions/creator_entity" + - name: editgroup + in: query + required: false + type: string responses: 200: description: Updated Entity @@ -700,6 +713,10 @@ paths: required: true schema: $ref: "#/definitions/file_entity" + - name: editgroup + in: query + required: false + type: string responses: 201: description: Created Entity @@ -763,6 +780,10 @@ paths: required: true schema: $ref: "#/definitions/file_entity" + - name: editgroup + in: query + required: false + type: string responses: 200: description: Updated Entity @@ -826,6 +847,10 @@ paths: required: true schema: $ref: "#/definitions/release_entity" + - name: editgroup + in: query + required: false + type: string responses: 201: description: Created Entity @@ -889,6 +914,10 @@ paths: required: true schema: $ref: "#/definitions/release_entity" + - name: editgroup + in: query + required: false + type: string responses: 200: description: Updated Entity @@ -968,6 +997,10 @@ paths: required: true schema: $ref: "#/definitions/work_entity" + - name: editgroup + in: query + required: false + type: string responses: 201: description: Created Entity @@ -1031,6 +1064,10 @@ paths: required: true schema: $ref: "#/definitions/work_entity" + - name: editgroup + in: query + required: false + type: string responses: 200: description: Updated Entity diff --git a/rust/fatcat-api-spec/api/swagger.yaml b/rust/fatcat-api-spec/api/swagger.yaml index 9bc84351..5f54c5b4 100644 --- a/rust/fatcat-api-spec/api/swagger.yaml +++ b/rust/fatcat-api-spec/api/swagger.yaml @@ -29,6 +29,12 @@ paths: model_key: "editgroup_edits" uppercase_operation_id: "CREATE_CONTAINER" consumesJson: true + - name: "editgroup" + in: "query" + required: false + type: "string" + formatString: "{:?}" + example: "Some(\"editgroup_example\".to_string())" responses: 201: description: "Created Entity" @@ -229,6 +235,12 @@ paths: model_key: "editgroup_edits" uppercase_operation_id: "UPDATE_CONTAINER" consumesJson: true + - name: "editgroup" + in: "query" + required: false + type: "string" + formatString: "{:?}" + example: "Some(\"editgroup_example\".to_string())" responses: 200: description: "Updated Entity" @@ -461,6 +473,12 @@ paths: model_key: "editgroup_edits" uppercase_operation_id: "CREATE_CREATOR" consumesJson: true + - name: "editgroup" + in: "query" + required: false + type: "string" + formatString: "{:?}" + example: "Some(\"editgroup_example\".to_string())" responses: 201: description: "Created Entity" @@ -661,6 +679,12 @@ paths: model_key: "editgroup_edits" uppercase_operation_id: "UPDATE_CREATOR" consumesJson: true + - name: "editgroup" + in: "query" + required: false + type: "string" + formatString: "{:?}" + example: "Some(\"editgroup_example\".to_string())" responses: 200: description: "Updated Entity" @@ -947,6 +971,12 @@ paths: model_key: "editgroup_edits" uppercase_operation_id: "CREATE_FILE" consumesJson: true + - name: "editgroup" + in: "query" + required: false + type: "string" + formatString: "{:?}" + example: "Some(\"editgroup_example\".to_string())" responses: 201: description: "Created Entity" @@ -1147,6 +1177,12 @@ paths: model_key: "editgroup_edits" uppercase_operation_id: "UPDATE_FILE" consumesJson: true + - name: "editgroup" + in: "query" + required: false + type: "string" + formatString: "{:?}" + example: "Some(\"editgroup_example\".to_string())" responses: 200: description: "Updated Entity" @@ -1376,6 +1412,12 @@ paths: model_key: "editgroup_edits" uppercase_operation_id: "CREATE_RELEASE" consumesJson: true + - name: "editgroup" + in: "query" + required: false + type: "string" + formatString: "{:?}" + example: "Some(\"editgroup_example\".to_string())" responses: 201: description: "Created Entity" @@ -1576,6 +1618,12 @@ paths: model_key: "editgroup_edits" uppercase_operation_id: "UPDATE_RELEASE" consumesJson: true + - name: "editgroup" + in: "query" + required: false + type: "string" + formatString: "{:?}" + example: "Some(\"editgroup_example\".to_string())" responses: 200: description: "Updated Entity" @@ -1859,6 +1907,12 @@ paths: model_key: "editgroup_edits" uppercase_operation_id: "CREATE_WORK" consumesJson: true + - name: "editgroup" + in: "query" + required: false + type: "string" + formatString: "{:?}" + example: "Some(\"editgroup_example\".to_string())" responses: 201: description: "Created Entity" @@ -2059,6 +2113,12 @@ paths: model_key: "editgroup_edits" uppercase_operation_id: "UPDATE_WORK" consumesJson: true + - name: "editgroup" + in: "query" + required: false + type: "string" + formatString: "{:?}" + example: "Some(\"editgroup_example\".to_string())" responses: 200: description: "Updated Entity" @@ -2710,15 +2770,10 @@ definitions: name: type: "string" example: "Journal of Important Results" + edit_extra: + type: "object" extra: type: "object" - editgroup_id: - type: "string" - example: "q3nouwy3nnbsvo3h5klxsx4a7y" - description: "base32-encoded unique identifier" - minLength: 26 - maxLength: 26 - pattern: "[a-zA-Z2-7]{26}" redirect: type: "string" example: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2754,11 +2809,11 @@ definitions: extra: "{}" name: "Journal of Important Results" publisher: "Society of Curious Students" - editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" issnl: "1234-5678" abbrev: "abbrev" wikidata_qid: "wikidata_qid" state: "wip" + edit_extra: "{}" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" upperCaseName: "CONTAINER_ENTITY" creator_entity: @@ -2809,26 +2864,21 @@ definitions: minLength: 26 maxLength: 26 pattern: "[a-zA-Z2-7]{26}" - editgroup_id: - type: "string" - example: "q3nouwy3nnbsvo3h5klxsx4a7y" - description: "base32-encoded unique identifier" - minLength: 26 - maxLength: 26 - pattern: "[a-zA-Z2-7]{26}" extra: type: "object" + edit_extra: + type: "object" example: redirect: "q3nouwy3nnbsvo3h5klxsx4a7y" surname: "surname" ident: "q3nouwy3nnbsvo3h5klxsx4a7y" extra: "{}" - editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" orcid: "0000-0002-1825-0097" wikidata_qid: "wikidata_qid" state: "wip" given_name: "given_name" display_name: "Grace Hopper" + edit_extra: "{}" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" upperCaseName: "CREATOR_ENTITY" file_entity: @@ -2858,15 +2908,10 @@ definitions: type: "integer" format: "int64" example: 1048576 + edit_extra: + type: "object" extra: type: "object" - editgroup_id: - type: "string" - example: "q3nouwy3nnbsvo3h5klxsx4a7y" - description: "base32-encoded unique identifier" - minLength: 26 - maxLength: 26 - pattern: "[a-zA-Z2-7]{26}" redirect: type: "string" example: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2911,9 +2956,9 @@ definitions: url: "https://example.edu/~frau/prcding.pdf" size: 1048576 extra: "{}" - editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" mimetype: "application/pdf" state: "wip" + edit_extra: "{}" md5: "d41efcc592d1e40ac13905377399eb9b" upperCaseName: "FILE_ENTITY" release_entity: @@ -3011,15 +3056,10 @@ definitions: minLength: 26 maxLength: 26 pattern: "[a-zA-Z2-7]{26}" - editgroup_id: - type: "string" - example: "q3nouwy3nnbsvo3h5klxsx4a7y" - description: "base32-encoded unique identifier" - minLength: 26 - maxLength: 26 - pattern: "[a-zA-Z2-7]{26}" extra: type: "object" + edit_extra: + type: "object" example: container: redirect: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -3028,11 +3068,11 @@ definitions: extra: "{}" name: "Journal of Important Results" publisher: "Society of Curious Students" - editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" issnl: "1234-5678" abbrev: "abbrev" wikidata_qid: "wikidata_qid" state: "wip" + edit_extra: "{}" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" ident: "q3nouwy3nnbsvo3h5klxsx4a7y" language: "language" @@ -3043,12 +3083,12 @@ definitions: surname: "surname" ident: "q3nouwy3nnbsvo3h5klxsx4a7y" extra: "{}" - editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" orcid: "0000-0002-1825-0097" wikidata_qid: "wikidata_qid" state: "wip" given_name: "given_name" display_name: "Grace Hopper" + edit_extra: "{}" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" raw_name: "raw_name" role: "role" @@ -3060,12 +3100,12 @@ definitions: surname: "surname" ident: "q3nouwy3nnbsvo3h5klxsx4a7y" extra: "{}" - editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" orcid: "0000-0002-1825-0097" wikidata_qid: "wikidata_qid" state: "wip" given_name: "given_name" display_name: "Grace Hopper" + edit_extra: "{}" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" raw_name: "raw_name" role: "role" @@ -3075,8 +3115,8 @@ definitions: pages: "pages" core_id: "core_id" extra: "{}" - editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" state: "wip" + edit_extra: "{}" redirect: "q3nouwy3nnbsvo3h5klxsx4a7y" work_id: "q3nouwy3nnbsvo3h5klxsx4a7y" issue: "12" @@ -3131,9 +3171,9 @@ definitions: url: "https://example.edu/~frau/prcding.pdf" size: 1048576 extra: "{}" - editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" mimetype: "application/pdf" state: "wip" + edit_extra: "{}" md5: "d41efcc592d1e40ac13905377399eb9b" - redirect: "q3nouwy3nnbsvo3h5klxsx4a7y" sha256: "a77e4c11a57f1d757fca5754a8f83b5d4ece49a2d28596889127c1a2f3f28832" @@ -3150,9 +3190,9 @@ definitions: url: "https://example.edu/~frau/prcding.pdf" size: 1048576 extra: "{}" - editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" mimetype: "application/pdf" state: "wip" + edit_extra: "{}" md5: "d41efcc592d1e40ac13905377399eb9b" pmcid: "pmcid" container_id: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -3161,15 +3201,10 @@ definitions: work_entity: type: "object" properties: + edit_extra: + type: "object" extra: type: "object" - editgroup_id: - type: "string" - example: "q3nouwy3nnbsvo3h5klxsx4a7y" - description: "base32-encoded unique identifier" - minLength: 26 - maxLength: 26 - pattern: "[a-zA-Z2-7]{26}" redirect: type: "string" example: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -3202,8 +3237,8 @@ definitions: redirect: "q3nouwy3nnbsvo3h5klxsx4a7y" ident: "q3nouwy3nnbsvo3h5klxsx4a7y" extra: "{}" - editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" state: "wip" + edit_extra: "{}" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" upperCaseName: "WORK_ENTITY" entity_history_entry: @@ -3713,12 +3748,12 @@ definitions: surname: "surname" ident: "q3nouwy3nnbsvo3h5klxsx4a7y" extra: "{}" - editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" orcid: "0000-0002-1825-0097" wikidata_qid: "wikidata_qid" state: "wip" given_name: "given_name" display_name: "Grace Hopper" + edit_extra: "{}" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" raw_name: "raw_name" role: "role" @@ -3924,16 +3959,12 @@ x-entity-props: minLength: 26 maxLength: 26 description: "base32-encoded unique identifier" - editgroup_id: - description: "base32-encoded unique identifier" - maxLength: 26 - minLength: 26 - pattern: "[a-zA-Z2-7]{26}" - example: "q3nouwy3nnbsvo3h5klxsx4a7y" - type: "string" extra: type: "object" additionalProperties: {} + edit_extra: + type: "object" + additionalProperties: {} x-entity-responses: 400: description: "Bad Request" diff --git a/rust/fatcat-api-spec/examples/client.rs b/rust/fatcat-api-spec/examples/client.rs index cc94af11..5d600965 100644 --- a/rust/fatcat-api-spec/examples/client.rs +++ b/rust/fatcat-api-spec/examples/client.rs @@ -97,7 +97,7 @@ fn main() { // Disabled because there's no example. // Some("CreateContainer") => { - // let result = client.create_container(???).wait(); + // let result = client.create_container(???, Some("editgroup_example".to_string())).wait(); // println!("{:?} (X-Span-ID: {:?})", result, client.context().x_span_id.clone().unwrap_or(String::from(""))); // }, Some("CreateContainerBatch") => { @@ -107,7 +107,7 @@ fn main() { // Disabled because there's no example. // Some("CreateCreator") => { - // let result = client.create_creator(???).wait(); + // let result = client.create_creator(???, Some("editgroup_example".to_string())).wait(); // println!("{:?} (X-Span-ID: {:?})", result, client.context().x_span_id.clone().unwrap_or(String::from(""))); // }, Some("CreateCreatorBatch") => { @@ -123,7 +123,7 @@ fn main() { // Disabled because there's no example. // Some("CreateFile") => { - // let result = client.create_file(???).wait(); + // let result = client.create_file(???, Some("editgroup_example".to_string())).wait(); // println!("{:?} (X-Span-ID: {:?})", result, client.context().x_span_id.clone().unwrap_or(String::from(""))); // }, Some("CreateFileBatch") => { @@ -133,7 +133,7 @@ fn main() { // Disabled because there's no example. // Some("CreateRelease") => { - // let result = client.create_release(???).wait(); + // let result = client.create_release(???, Some("editgroup_example".to_string())).wait(); // println!("{:?} (X-Span-ID: {:?})", result, client.context().x_span_id.clone().unwrap_or(String::from(""))); // }, Some("CreateReleaseBatch") => { @@ -143,7 +143,7 @@ fn main() { // Disabled because there's no example. // Some("CreateWork") => { - // let result = client.create_work(???).wait(); + // let result = client.create_work(???, Some("editgroup_example".to_string())).wait(); // println!("{:?} (X-Span-ID: {:?})", result, client.context().x_span_id.clone().unwrap_or(String::from(""))); // }, Some("CreateWorkBatch") => { @@ -293,31 +293,31 @@ fn main() { // Disabled because there's no example. // Some("UpdateContainer") => { - // let result = client.update_container("id_example".to_string(), ???).wait(); + // let result = client.update_container("id_example".to_string(), ???, Some("editgroup_example".to_string())).wait(); // println!("{:?} (X-Span-ID: {:?})", result, client.context().x_span_id.clone().unwrap_or(String::from(""))); // }, // Disabled because there's no example. // Some("UpdateCreator") => { - // let result = client.update_creator("id_example".to_string(), ???).wait(); + // let result = client.update_creator("id_example".to_string(), ???, Some("editgroup_example".to_string())).wait(); // println!("{:?} (X-Span-ID: {:?})", result, client.context().x_span_id.clone().unwrap_or(String::from(""))); // }, // Disabled because there's no example. // Some("UpdateFile") => { - // let result = client.update_file("id_example".to_string(), ???).wait(); + // let result = client.update_file("id_example".to_string(), ???, Some("editgroup_example".to_string())).wait(); // println!("{:?} (X-Span-ID: {:?})", result, client.context().x_span_id.clone().unwrap_or(String::from(""))); // }, // Disabled because there's no example. // Some("UpdateRelease") => { - // let result = client.update_release("id_example".to_string(), ???).wait(); + // let result = client.update_release("id_example".to_string(), ???, Some("editgroup_example".to_string())).wait(); // println!("{:?} (X-Span-ID: {:?})", result, client.context().x_span_id.clone().unwrap_or(String::from(""))); // }, // Disabled because there's no example. // Some("UpdateWork") => { - // let result = client.update_work("id_example".to_string(), ???).wait(); + // let result = client.update_work("id_example".to_string(), ???, Some("editgroup_example".to_string())).wait(); // println!("{:?} (X-Span-ID: {:?})", result, client.context().x_span_id.clone().unwrap_or(String::from(""))); // }, _ => panic!("Invalid operation provided"), diff --git a/rust/fatcat-api-spec/examples/server_lib/server.rs b/rust/fatcat-api-spec/examples/server_lib/server.rs index ab08f594..2ca8eb3b 100644 --- a/rust/fatcat-api-spec/examples/server_lib/server.rs +++ b/rust/fatcat-api-spec/examples/server_lib/server.rs @@ -29,9 +29,14 @@ impl Api for Server { Box::new(futures::failed("Generic failure".into())) } - fn create_container(&self, entity: models::ContainerEntity, context: &Context) -> Box + Send> { + fn create_container(&self, entity: models::ContainerEntity, editgroup: Option, context: &Context) -> Box + Send> { let context = context.clone(); - println!("create_container({:?}) - X-Span-ID: {:?}", entity, context.x_span_id.unwrap_or(String::from("")).clone()); + println!( + "create_container({:?}, {:?}) - X-Span-ID: {:?}", + entity, + editgroup, + context.x_span_id.unwrap_or(String::from("")).clone() + ); Box::new(futures::failed("Generic failure".into())) } @@ -53,9 +58,14 @@ impl Api for Server { Box::new(futures::failed("Generic failure".into())) } - fn create_creator(&self, entity: models::CreatorEntity, context: &Context) -> Box + Send> { + fn create_creator(&self, entity: models::CreatorEntity, editgroup: Option, context: &Context) -> Box + Send> { let context = context.clone(); - println!("create_creator({:?}) - X-Span-ID: {:?}", entity, context.x_span_id.unwrap_or(String::from("")).clone()); + println!( + "create_creator({:?}, {:?}) - X-Span-ID: {:?}", + entity, + editgroup, + context.x_span_id.unwrap_or(String::from("")).clone() + ); Box::new(futures::failed("Generic failure".into())) } @@ -83,9 +93,14 @@ impl Api for Server { Box::new(futures::failed("Generic failure".into())) } - fn create_file(&self, entity: models::FileEntity, context: &Context) -> Box + Send> { + fn create_file(&self, entity: models::FileEntity, editgroup: Option, context: &Context) -> Box + Send> { let context = context.clone(); - println!("create_file({:?}) - X-Span-ID: {:?}", entity, context.x_span_id.unwrap_or(String::from("")).clone()); + println!( + "create_file({:?}, {:?}) - X-Span-ID: {:?}", + entity, + editgroup, + context.x_span_id.unwrap_or(String::from("")).clone() + ); Box::new(futures::failed("Generic failure".into())) } @@ -107,9 +122,14 @@ impl Api for Server { Box::new(futures::failed("Generic failure".into())) } - fn create_release(&self, entity: models::ReleaseEntity, context: &Context) -> Box + Send> { + fn create_release(&self, entity: models::ReleaseEntity, editgroup: Option, context: &Context) -> Box + Send> { let context = context.clone(); - println!("create_release({:?}) - X-Span-ID: {:?}", entity, context.x_span_id.unwrap_or(String::from("")).clone()); + println!( + "create_release({:?}, {:?}) - X-Span-ID: {:?}", + entity, + editgroup, + context.x_span_id.unwrap_or(String::from("")).clone() + ); Box::new(futures::failed("Generic failure".into())) } @@ -131,9 +151,14 @@ impl Api for Server { Box::new(futures::failed("Generic failure".into())) } - fn create_work(&self, entity: models::WorkEntity, context: &Context) -> Box + Send> { + fn create_work(&self, entity: models::WorkEntity, editgroup: Option, context: &Context) -> Box + Send> { let context = context.clone(); - println!("create_work({:?}) - X-Span-ID: {:?}", entity, context.x_span_id.unwrap_or(String::from("")).clone()); + println!( + "create_work({:?}, {:?}) - X-Span-ID: {:?}", + entity, + editgroup, + context.x_span_id.unwrap_or(String::from("")).clone() + ); Box::new(futures::failed("Generic failure".into())) } @@ -373,48 +398,63 @@ impl Api for Server { Box::new(futures::failed("Generic failure".into())) } - fn update_container(&self, id: String, entity: models::ContainerEntity, context: &Context) -> Box + Send> { + fn update_container(&self, id: String, entity: models::ContainerEntity, editgroup: Option, context: &Context) -> Box + Send> { let context = context.clone(); println!( - "update_container(\"{}\", {:?}) - X-Span-ID: {:?}", + "update_container(\"{}\", {:?}, {:?}) - X-Span-ID: {:?}", id, entity, + editgroup, context.x_span_id.unwrap_or(String::from("")).clone() ); Box::new(futures::failed("Generic failure".into())) } - fn update_creator(&self, id: String, entity: models::CreatorEntity, context: &Context) -> Box + Send> { + fn update_creator(&self, id: String, entity: models::CreatorEntity, editgroup: Option, context: &Context) -> Box + Send> { let context = context.clone(); println!( - "update_creator(\"{}\", {:?}) - X-Span-ID: {:?}", + "update_creator(\"{}\", {:?}, {:?}) - X-Span-ID: {:?}", id, entity, + editgroup, context.x_span_id.unwrap_or(String::from("")).clone() ); Box::new(futures::failed("Generic failure".into())) } - fn update_file(&self, id: String, entity: models::FileEntity, context: &Context) -> Box + Send> { + fn update_file(&self, id: String, entity: models::FileEntity, editgroup: Option, context: &Context) -> Box + Send> { let context = context.clone(); - println!("update_file(\"{}\", {:?}) - X-Span-ID: {:?}", id, entity, context.x_span_id.unwrap_or(String::from("")).clone()); + println!( + "update_file(\"{}\", {:?}, {:?}) - X-Span-ID: {:?}", + id, + entity, + editgroup, + context.x_span_id.unwrap_or(String::from("")).clone() + ); Box::new(futures::failed("Generic failure".into())) } - fn update_release(&self, id: String, entity: models::ReleaseEntity, context: &Context) -> Box + Send> { + fn update_release(&self, id: String, entity: models::ReleaseEntity, editgroup: Option, context: &Context) -> Box + Send> { let context = context.clone(); println!( - "update_release(\"{}\", {:?}) - X-Span-ID: {:?}", + "update_release(\"{}\", {:?}, {:?}) - X-Span-ID: {:?}", id, entity, + editgroup, context.x_span_id.unwrap_or(String::from("")).clone() ); Box::new(futures::failed("Generic failure".into())) } - fn update_work(&self, id: String, entity: models::WorkEntity, context: &Context) -> Box + Send> { + fn update_work(&self, id: String, entity: models::WorkEntity, editgroup: Option, context: &Context) -> Box + Send> { let context = context.clone(); - println!("update_work(\"{}\", {:?}) - X-Span-ID: {:?}", id, entity, context.x_span_id.unwrap_or(String::from("")).clone()); + println!( + "update_work(\"{}\", {:?}, {:?}) - X-Span-ID: {:?}", + id, + entity, + editgroup, + context.x_span_id.unwrap_or(String::from("")).clone() + ); Box::new(futures::failed("Generic failure".into())) } } diff --git a/rust/fatcat-api-spec/src/client.rs b/rust/fatcat-api-spec/src/client.rs index a08e3cfe..c403515b 100644 --- a/rust/fatcat-api-spec/src/client.rs +++ b/rust/fatcat-api-spec/src/client.rs @@ -233,8 +233,11 @@ impl Api for Client { Box::new(futures::done(result)) } - fn create_container(&self, param_entity: models::ContainerEntity, context: &Context) -> Box + Send> { - let url = format!("{}/v0/container", self.base_path); + fn create_container(&self, param_entity: models::ContainerEntity, param_editgroup: Option, context: &Context) -> Box + Send> { + // Query parameters + let query_editgroup = param_editgroup.map_or_else(String::new, |query| format!("editgroup={editgroup}&", editgroup = query.to_string())); + + let url = format!("{}/v0/container?{editgroup}", self.base_path, editgroup = utf8_percent_encode(&query_editgroup, QUERY_ENCODE_SET)); let body = serde_json::to_string(¶m_entity).expect("impossible to fail to serialize"); @@ -378,8 +381,11 @@ impl Api for Client { Box::new(futures::done(result)) } - fn create_creator(&self, param_entity: models::CreatorEntity, context: &Context) -> Box + Send> { - let url = format!("{}/v0/creator", self.base_path); + fn create_creator(&self, param_entity: models::CreatorEntity, param_editgroup: Option, context: &Context) -> Box + Send> { + // Query parameters + let query_editgroup = param_editgroup.map_or_else(String::new, |query| format!("editgroup={editgroup}&", editgroup = query.to_string())); + + let url = format!("{}/v0/creator?{editgroup}", self.base_path, editgroup = utf8_percent_encode(&query_editgroup, QUERY_ENCODE_SET)); let body = serde_json::to_string(¶m_entity).expect("impossible to fail to serialize"); @@ -581,8 +587,11 @@ impl Api for Client { Box::new(futures::done(result)) } - fn create_file(&self, param_entity: models::FileEntity, context: &Context) -> Box + Send> { - let url = format!("{}/v0/file", self.base_path); + fn create_file(&self, param_entity: models::FileEntity, param_editgroup: Option, context: &Context) -> Box + Send> { + // Query parameters + let query_editgroup = param_editgroup.map_or_else(String::new, |query| format!("editgroup={editgroup}&", editgroup = query.to_string())); + + let url = format!("{}/v0/file?{editgroup}", self.base_path, editgroup = utf8_percent_encode(&query_editgroup, QUERY_ENCODE_SET)); let body = serde_json::to_string(¶m_entity).expect("impossible to fail to serialize"); @@ -726,8 +735,11 @@ impl Api for Client { Box::new(futures::done(result)) } - fn create_release(&self, param_entity: models::ReleaseEntity, context: &Context) -> Box + Send> { - let url = format!("{}/v0/release", self.base_path); + fn create_release(&self, param_entity: models::ReleaseEntity, param_editgroup: Option, context: &Context) -> Box + Send> { + // Query parameters + let query_editgroup = param_editgroup.map_or_else(String::new, |query| format!("editgroup={editgroup}&", editgroup = query.to_string())); + + let url = format!("{}/v0/release?{editgroup}", self.base_path, editgroup = utf8_percent_encode(&query_editgroup, QUERY_ENCODE_SET)); let body = serde_json::to_string(¶m_entity).expect("impossible to fail to serialize"); @@ -871,8 +883,11 @@ impl Api for Client { Box::new(futures::done(result)) } - fn create_work(&self, param_entity: models::WorkEntity, context: &Context) -> Box + Send> { - let url = format!("{}/v0/work", self.base_path); + fn create_work(&self, param_entity: models::WorkEntity, param_editgroup: Option, context: &Context) -> Box + Send> { + // Query parameters + let query_editgroup = param_editgroup.map_or_else(String::new, |query| format!("editgroup={editgroup}&", editgroup = query.to_string())); + + let url = format!("{}/v0/work?{editgroup}", self.base_path, editgroup = utf8_percent_encode(&query_editgroup, QUERY_ENCODE_SET)); let body = serde_json::to_string(¶m_entity).expect("impossible to fail to serialize"); @@ -2799,8 +2814,22 @@ impl Api for Client { Box::new(futures::done(result)) } - fn update_container(&self, param_id: String, param_entity: models::ContainerEntity, context: &Context) -> Box + Send> { - let url = format!("{}/v0/container/{id}", self.base_path, id = utf8_percent_encode(¶m_id.to_string(), PATH_SEGMENT_ENCODE_SET)); + fn update_container( + &self, + param_id: String, + param_entity: models::ContainerEntity, + param_editgroup: Option, + context: &Context, + ) -> Box + Send> { + // Query parameters + let query_editgroup = param_editgroup.map_or_else(String::new, |query| format!("editgroup={editgroup}&", editgroup = query.to_string())); + + let url = format!( + "{}/v0/container/{id}?{editgroup}", + self.base_path, + id = utf8_percent_encode(¶m_id.to_string(), PATH_SEGMENT_ENCODE_SET), + editgroup = utf8_percent_encode(&query_editgroup, QUERY_ENCODE_SET) + ); let body = serde_json::to_string(¶m_entity).expect("impossible to fail to serialize"); @@ -2864,8 +2893,22 @@ impl Api for Client { Box::new(futures::done(result)) } - fn update_creator(&self, param_id: String, param_entity: models::CreatorEntity, context: &Context) -> Box + Send> { - let url = format!("{}/v0/creator/{id}", self.base_path, id = utf8_percent_encode(¶m_id.to_string(), PATH_SEGMENT_ENCODE_SET)); + fn update_creator( + &self, + param_id: String, + param_entity: models::CreatorEntity, + param_editgroup: Option, + context: &Context, + ) -> Box + Send> { + // Query parameters + let query_editgroup = param_editgroup.map_or_else(String::new, |query| format!("editgroup={editgroup}&", editgroup = query.to_string())); + + let url = format!( + "{}/v0/creator/{id}?{editgroup}", + self.base_path, + id = utf8_percent_encode(¶m_id.to_string(), PATH_SEGMENT_ENCODE_SET), + editgroup = utf8_percent_encode(&query_editgroup, QUERY_ENCODE_SET) + ); let body = serde_json::to_string(¶m_entity).expect("impossible to fail to serialize"); @@ -2929,8 +2972,16 @@ impl Api for Client { Box::new(futures::done(result)) } - fn update_file(&self, param_id: String, param_entity: models::FileEntity, context: &Context) -> Box + Send> { - let url = format!("{}/v0/file/{id}", self.base_path, id = utf8_percent_encode(¶m_id.to_string(), PATH_SEGMENT_ENCODE_SET)); + fn update_file(&self, param_id: String, param_entity: models::FileEntity, param_editgroup: Option, context: &Context) -> Box + Send> { + // Query parameters + let query_editgroup = param_editgroup.map_or_else(String::new, |query| format!("editgroup={editgroup}&", editgroup = query.to_string())); + + let url = format!( + "{}/v0/file/{id}?{editgroup}", + self.base_path, + id = utf8_percent_encode(¶m_id.to_string(), PATH_SEGMENT_ENCODE_SET), + editgroup = utf8_percent_encode(&query_editgroup, QUERY_ENCODE_SET) + ); let body = serde_json::to_string(¶m_entity).expect("impossible to fail to serialize"); @@ -2994,8 +3045,22 @@ impl Api for Client { Box::new(futures::done(result)) } - fn update_release(&self, param_id: String, param_entity: models::ReleaseEntity, context: &Context) -> Box + Send> { - let url = format!("{}/v0/release/{id}", self.base_path, id = utf8_percent_encode(¶m_id.to_string(), PATH_SEGMENT_ENCODE_SET)); + fn update_release( + &self, + param_id: String, + param_entity: models::ReleaseEntity, + param_editgroup: Option, + context: &Context, + ) -> Box + Send> { + // Query parameters + let query_editgroup = param_editgroup.map_or_else(String::new, |query| format!("editgroup={editgroup}&", editgroup = query.to_string())); + + let url = format!( + "{}/v0/release/{id}?{editgroup}", + self.base_path, + id = utf8_percent_encode(¶m_id.to_string(), PATH_SEGMENT_ENCODE_SET), + editgroup = utf8_percent_encode(&query_editgroup, QUERY_ENCODE_SET) + ); let body = serde_json::to_string(¶m_entity).expect("impossible to fail to serialize"); @@ -3059,8 +3124,16 @@ impl Api for Client { Box::new(futures::done(result)) } - fn update_work(&self, param_id: String, param_entity: models::WorkEntity, context: &Context) -> Box + Send> { - let url = format!("{}/v0/work/{id}", self.base_path, id = utf8_percent_encode(¶m_id.to_string(), PATH_SEGMENT_ENCODE_SET)); + fn update_work(&self, param_id: String, param_entity: models::WorkEntity, param_editgroup: Option, context: &Context) -> Box + Send> { + // Query parameters + let query_editgroup = param_editgroup.map_or_else(String::new, |query| format!("editgroup={editgroup}&", editgroup = query.to_string())); + + let url = format!( + "{}/v0/work/{id}?{editgroup}", + self.base_path, + id = utf8_percent_encode(¶m_id.to_string(), PATH_SEGMENT_ENCODE_SET), + editgroup = utf8_percent_encode(&query_editgroup, QUERY_ENCODE_SET) + ); let body = serde_json::to_string(¶m_entity).expect("impossible to fail to serialize"); diff --git a/rust/fatcat-api-spec/src/lib.rs b/rust/fatcat-api-spec/src/lib.rs index a08c6e04..a246bb43 100644 --- a/rust/fatcat-api-spec/src/lib.rs +++ b/rust/fatcat-api-spec/src/lib.rs @@ -566,7 +566,7 @@ pub enum UpdateWorkResponse { pub trait Api { fn accept_editgroup(&self, id: String, context: &Context) -> Box + Send>; - fn create_container(&self, entity: models::ContainerEntity, context: &Context) -> Box + Send>; + fn create_container(&self, entity: models::ContainerEntity, editgroup: Option, context: &Context) -> Box + Send>; fn create_container_batch( &self, @@ -576,7 +576,7 @@ pub trait Api { context: &Context, ) -> Box + Send>; - fn create_creator(&self, entity: models::CreatorEntity, context: &Context) -> Box + Send>; + fn create_creator(&self, entity: models::CreatorEntity, editgroup: Option, context: &Context) -> Box + Send>; fn create_creator_batch( &self, @@ -588,7 +588,7 @@ pub trait Api { fn create_editgroup(&self, entity: models::Editgroup, context: &Context) -> Box + Send>; - fn create_file(&self, entity: models::FileEntity, context: &Context) -> Box + Send>; + fn create_file(&self, entity: models::FileEntity, editgroup: Option, context: &Context) -> Box + Send>; fn create_file_batch( &self, @@ -598,7 +598,7 @@ pub trait Api { context: &Context, ) -> Box + Send>; - fn create_release(&self, entity: models::ReleaseEntity, context: &Context) -> Box + Send>; + fn create_release(&self, entity: models::ReleaseEntity, editgroup: Option, context: &Context) -> Box + Send>; fn create_release_batch( &self, @@ -608,7 +608,7 @@ pub trait Api { context: &Context, ) -> Box + Send>; - fn create_work(&self, entity: models::WorkEntity, context: &Context) -> Box + Send>; + fn create_work(&self, entity: models::WorkEntity, editgroup: Option, context: &Context) -> Box + Send>; fn create_work_batch( &self, @@ -674,22 +674,22 @@ pub trait Api { fn lookup_release(&self, doi: String, context: &Context) -> Box + Send>; - fn update_container(&self, id: String, entity: models::ContainerEntity, context: &Context) -> Box + Send>; + fn update_container(&self, id: String, entity: models::ContainerEntity, editgroup: Option, context: &Context) -> Box + Send>; - fn update_creator(&self, id: String, entity: models::CreatorEntity, context: &Context) -> Box + Send>; + fn update_creator(&self, id: String, entity: models::CreatorEntity, editgroup: Option, context: &Context) -> Box + Send>; - fn update_file(&self, id: String, entity: models::FileEntity, context: &Context) -> Box + Send>; + fn update_file(&self, id: String, entity: models::FileEntity, editgroup: Option, context: &Context) -> Box + Send>; - fn update_release(&self, id: String, entity: models::ReleaseEntity, context: &Context) -> Box + Send>; + fn update_release(&self, id: String, entity: models::ReleaseEntity, editgroup: Option, context: &Context) -> Box + Send>; - fn update_work(&self, id: String, entity: models::WorkEntity, context: &Context) -> Box + Send>; + fn update_work(&self, id: String, entity: models::WorkEntity, editgroup: Option, context: &Context) -> Box + Send>; } /// API without a `Context` pub trait ApiNoContext { fn accept_editgroup(&self, id: String) -> Box + Send>; - fn create_container(&self, entity: models::ContainerEntity) -> Box + Send>; + fn create_container(&self, entity: models::ContainerEntity, editgroup: Option) -> Box + Send>; fn create_container_batch( &self, @@ -698,7 +698,7 @@ pub trait ApiNoContext { editgroup: Option, ) -> Box + Send>; - fn create_creator(&self, entity: models::CreatorEntity) -> Box + Send>; + fn create_creator(&self, entity: models::CreatorEntity, editgroup: Option) -> Box + Send>; fn create_creator_batch( &self, @@ -709,11 +709,11 @@ pub trait ApiNoContext { fn create_editgroup(&self, entity: models::Editgroup) -> Box + Send>; - fn create_file(&self, entity: models::FileEntity) -> Box + Send>; + fn create_file(&self, entity: models::FileEntity, editgroup: Option) -> Box + Send>; fn create_file_batch(&self, entity_list: &Vec, autoaccept: Option, editgroup: Option) -> Box + Send>; - fn create_release(&self, entity: models::ReleaseEntity) -> Box + Send>; + fn create_release(&self, entity: models::ReleaseEntity, editgroup: Option) -> Box + Send>; fn create_release_batch( &self, @@ -722,7 +722,7 @@ pub trait ApiNoContext { editgroup: Option, ) -> Box + Send>; - fn create_work(&self, entity: models::WorkEntity) -> Box + Send>; + fn create_work(&self, entity: models::WorkEntity, editgroup: Option) -> Box + Send>; fn create_work_batch(&self, entity_list: &Vec, autoaccept: Option, editgroup: Option) -> Box + Send>; @@ -782,15 +782,15 @@ pub trait ApiNoContext { fn lookup_release(&self, doi: String) -> Box + Send>; - fn update_container(&self, id: String, entity: models::ContainerEntity) -> Box + Send>; + fn update_container(&self, id: String, entity: models::ContainerEntity, editgroup: Option) -> Box + Send>; - fn update_creator(&self, id: String, entity: models::CreatorEntity) -> Box + Send>; + fn update_creator(&self, id: String, entity: models::CreatorEntity, editgroup: Option) -> Box + Send>; - fn update_file(&self, id: String, entity: models::FileEntity) -> Box + Send>; + fn update_file(&self, id: String, entity: models::FileEntity, editgroup: Option) -> Box + Send>; - fn update_release(&self, id: String, entity: models::ReleaseEntity) -> Box + Send>; + fn update_release(&self, id: String, entity: models::ReleaseEntity, editgroup: Option) -> Box + Send>; - fn update_work(&self, id: String, entity: models::WorkEntity) -> Box + Send>; + fn update_work(&self, id: String, entity: models::WorkEntity, editgroup: Option) -> Box + Send>; } /// Trait to extend an API to make it easy to bind it to a context. @@ -813,8 +813,8 @@ impl<'a, T: Api> ApiNoContext for ContextWrapper<'a, T> { self.api().accept_editgroup(id, &self.context()) } - fn create_container(&self, entity: models::ContainerEntity) -> Box + Send> { - self.api().create_container(entity, &self.context()) + fn create_container(&self, entity: models::ContainerEntity, editgroup: Option) -> Box + Send> { + self.api().create_container(entity, editgroup, &self.context()) } fn create_container_batch( @@ -826,8 +826,8 @@ impl<'a, T: Api> ApiNoContext for ContextWrapper<'a, T> { self.api().create_container_batch(entity_list, autoaccept, editgroup, &self.context()) } - fn create_creator(&self, entity: models::CreatorEntity) -> Box + Send> { - self.api().create_creator(entity, &self.context()) + fn create_creator(&self, entity: models::CreatorEntity, editgroup: Option) -> Box + Send> { + self.api().create_creator(entity, editgroup, &self.context()) } fn create_creator_batch( @@ -843,16 +843,16 @@ impl<'a, T: Api> ApiNoContext for ContextWrapper<'a, T> { self.api().create_editgroup(entity, &self.context()) } - fn create_file(&self, entity: models::FileEntity) -> Box + Send> { - self.api().create_file(entity, &self.context()) + fn create_file(&self, entity: models::FileEntity, editgroup: Option) -> Box + Send> { + self.api().create_file(entity, editgroup, &self.context()) } fn create_file_batch(&self, entity_list: &Vec, autoaccept: Option, editgroup: Option) -> Box + Send> { self.api().create_file_batch(entity_list, autoaccept, editgroup, &self.context()) } - fn create_release(&self, entity: models::ReleaseEntity) -> Box + Send> { - self.api().create_release(entity, &self.context()) + fn create_release(&self, entity: models::ReleaseEntity, editgroup: Option) -> Box + Send> { + self.api().create_release(entity, editgroup, &self.context()) } fn create_release_batch( @@ -864,8 +864,8 @@ impl<'a, T: Api> ApiNoContext for ContextWrapper<'a, T> { self.api().create_release_batch(entity_list, autoaccept, editgroup, &self.context()) } - fn create_work(&self, entity: models::WorkEntity) -> Box + Send> { - self.api().create_work(entity, &self.context()) + fn create_work(&self, entity: models::WorkEntity, editgroup: Option) -> Box + Send> { + self.api().create_work(entity, editgroup, &self.context()) } fn create_work_batch(&self, entity_list: &Vec, autoaccept: Option, editgroup: Option) -> Box + Send> { @@ -984,24 +984,24 @@ impl<'a, T: Api> ApiNoContext for ContextWrapper<'a, T> { self.api().lookup_release(doi, &self.context()) } - fn update_container(&self, id: String, entity: models::ContainerEntity) -> Box + Send> { - self.api().update_container(id, entity, &self.context()) + fn update_container(&self, id: String, entity: models::ContainerEntity, editgroup: Option) -> Box + Send> { + self.api().update_container(id, entity, editgroup, &self.context()) } - fn update_creator(&self, id: String, entity: models::CreatorEntity) -> Box + Send> { - self.api().update_creator(id, entity, &self.context()) + fn update_creator(&self, id: String, entity: models::CreatorEntity, editgroup: Option) -> Box + Send> { + self.api().update_creator(id, entity, editgroup, &self.context()) } - fn update_file(&self, id: String, entity: models::FileEntity) -> Box + Send> { - self.api().update_file(id, entity, &self.context()) + fn update_file(&self, id: String, entity: models::FileEntity, editgroup: Option) -> Box + Send> { + self.api().update_file(id, entity, editgroup, &self.context()) } - fn update_release(&self, id: String, entity: models::ReleaseEntity) -> Box + Send> { - self.api().update_release(id, entity, &self.context()) + fn update_release(&self, id: String, entity: models::ReleaseEntity, editgroup: Option) -> Box + Send> { + self.api().update_release(id, entity, editgroup, &self.context()) } - fn update_work(&self, id: String, entity: models::WorkEntity) -> Box + Send> { - self.api().update_work(id, entity, &self.context()) + fn update_work(&self, id: String, entity: models::WorkEntity, editgroup: Option) -> Box + Send> { + self.api().update_work(id, entity, editgroup, &self.context()) } } diff --git a/rust/fatcat-api-spec/src/models.rs b/rust/fatcat-api-spec/src/models.rs index 81701b70..980d3059 100644 --- a/rust/fatcat-api-spec/src/models.rs +++ b/rust/fatcat-api-spec/src/models.rs @@ -61,14 +61,13 @@ pub struct ContainerEntity { #[serde(rename = "name")] pub name: String, - #[serde(rename = "extra")] + #[serde(rename = "edit_extra")] #[serde(skip_serializing_if = "Option::is_none")] - pub extra: Option, + pub edit_extra: Option, - /// base32-encoded unique identifier - #[serde(rename = "editgroup_id")] + #[serde(rename = "extra")] #[serde(skip_serializing_if = "Option::is_none")] - pub editgroup_id: Option, + pub extra: Option, /// base32-encoded unique identifier #[serde(rename = "redirect")] @@ -100,8 +99,8 @@ impl ContainerEntity { issnl: None, publisher: None, name: name, + edit_extra: None, extra: None, - editgroup_id: None, redirect: None, revision: None, ident: None, @@ -151,14 +150,13 @@ pub struct CreatorEntity { #[serde(skip_serializing_if = "Option::is_none")] pub redirect: Option, - /// base32-encoded unique identifier - #[serde(rename = "editgroup_id")] - #[serde(skip_serializing_if = "Option::is_none")] - pub editgroup_id: Option, - #[serde(rename = "extra")] #[serde(skip_serializing_if = "Option::is_none")] pub extra: Option, + + #[serde(rename = "edit_extra")] + #[serde(skip_serializing_if = "Option::is_none")] + pub edit_extra: Option, } impl CreatorEntity { @@ -173,8 +171,8 @@ impl CreatorEntity { ident: None, revision: None, redirect: None, - editgroup_id: None, extra: None, + edit_extra: None, } } } @@ -372,14 +370,13 @@ pub struct FileEntity { #[serde(skip_serializing_if = "Option::is_none")] pub size: Option, - #[serde(rename = "extra")] + #[serde(rename = "edit_extra")] #[serde(skip_serializing_if = "Option::is_none")] - pub extra: Option, + pub edit_extra: Option, - /// base32-encoded unique identifier - #[serde(rename = "editgroup_id")] + #[serde(rename = "extra")] #[serde(skip_serializing_if = "Option::is_none")] - pub editgroup_id: Option, + pub extra: Option, /// base32-encoded unique identifier #[serde(rename = "redirect")] @@ -412,8 +409,8 @@ impl FileEntity { md5: None, sha1: None, size: None, + edit_extra: None, extra: None, - editgroup_id: None, redirect: None, revision: None, ident: None, @@ -590,14 +587,13 @@ pub struct ReleaseEntity { #[serde(skip_serializing_if = "Option::is_none")] pub redirect: Option, - /// base32-encoded unique identifier - #[serde(rename = "editgroup_id")] - #[serde(skip_serializing_if = "Option::is_none")] - pub editgroup_id: Option, - #[serde(rename = "extra")] #[serde(skip_serializing_if = "Option::is_none")] pub extra: Option, + + #[serde(rename = "edit_extra")] + #[serde(skip_serializing_if = "Option::is_none")] + pub edit_extra: Option, } impl ReleaseEntity { @@ -629,8 +625,8 @@ impl ReleaseEntity { ident: None, revision: None, redirect: None, - editgroup_id: None, extra: None, + edit_extra: None, } } } @@ -742,14 +738,13 @@ impl Success { #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct WorkEntity { - #[serde(rename = "extra")] + #[serde(rename = "edit_extra")] #[serde(skip_serializing_if = "Option::is_none")] - pub extra: Option, + pub edit_extra: Option, - /// base32-encoded unique identifier - #[serde(rename = "editgroup_id")] + #[serde(rename = "extra")] #[serde(skip_serializing_if = "Option::is_none")] - pub editgroup_id: Option, + pub extra: Option, /// base32-encoded unique identifier #[serde(rename = "redirect")] @@ -775,8 +770,8 @@ pub struct WorkEntity { impl WorkEntity { pub fn new() -> WorkEntity { WorkEntity { + edit_extra: None, extra: None, - editgroup_id: None, redirect: None, revision: None, ident: None, diff --git a/rust/fatcat-api-spec/src/server.rs b/rust/fatcat-api-spec/src/server.rs index 5510b34d..8c699065 100644 --- a/rust/fatcat-api-spec/src/server.rs +++ b/rust/fatcat-api-spec/src/server.rs @@ -204,6 +204,10 @@ where context.auth_data = req.extensions.remove::(); context.authorization = req.extensions.remove::(); + // Query parameters (note that non-required or collection query parameters will ignore garbage values, rather than causing a 400 response) + let query_params = req.get::().unwrap_or_default(); + let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::().ok()); + // Body parameters (note that non-required body parameters will ignore garbage // values, rather than causing a 400 response). Produce warning header and logs for // any unused fields. @@ -229,7 +233,7 @@ where }; let param_entity = param_entity.ok_or_else(|| Response::with((status::BadRequest, "Missing required body parameter entity".to_string())))?; - match api.create_container(param_entity, context).wait() { + match api.create_container(param_entity, param_editgroup, context).wait() { Ok(rsp) => match rsp { CreateContainerResponse::CreatedEntity(body) => { let body_string = serde_json::to_string(&body).expect("impossible to fail to serialize"); @@ -423,6 +427,10 @@ where context.auth_data = req.extensions.remove::(); context.authorization = req.extensions.remove::(); + // Query parameters (note that non-required or collection query parameters will ignore garbage values, rather than causing a 400 response) + let query_params = req.get::().unwrap_or_default(); + let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::().ok()); + // Body parameters (note that non-required body parameters will ignore garbage // values, rather than causing a 400 response). Produce warning header and logs for // any unused fields. @@ -448,7 +456,7 @@ where }; let param_entity = param_entity.ok_or_else(|| Response::with((status::BadRequest, "Missing required body parameter entity".to_string())))?; - match api.create_creator(param_entity, context).wait() { + match api.create_creator(param_entity, param_editgroup, context).wait() { Ok(rsp) => match rsp { CreateCreatorResponse::CreatedEntity(body) => { let body_string = serde_json::to_string(&body).expect("impossible to fail to serialize"); @@ -736,6 +744,10 @@ where context.auth_data = req.extensions.remove::(); context.authorization = req.extensions.remove::(); + // Query parameters (note that non-required or collection query parameters will ignore garbage values, rather than causing a 400 response) + let query_params = req.get::().unwrap_or_default(); + let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::().ok()); + // Body parameters (note that non-required body parameters will ignore garbage // values, rather than causing a 400 response). Produce warning header and logs for // any unused fields. @@ -761,7 +773,7 @@ where }; let param_entity = param_entity.ok_or_else(|| Response::with((status::BadRequest, "Missing required body parameter entity".to_string())))?; - match api.create_file(param_entity, context).wait() { + match api.create_file(param_entity, param_editgroup, context).wait() { Ok(rsp) => match rsp { CreateFileResponse::CreatedEntity(body) => { let body_string = serde_json::to_string(&body).expect("impossible to fail to serialize"); @@ -955,6 +967,10 @@ where context.auth_data = req.extensions.remove::(); context.authorization = req.extensions.remove::(); + // Query parameters (note that non-required or collection query parameters will ignore garbage values, rather than causing a 400 response) + let query_params = req.get::().unwrap_or_default(); + let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::().ok()); + // Body parameters (note that non-required body parameters will ignore garbage // values, rather than causing a 400 response). Produce warning header and logs for // any unused fields. @@ -980,7 +996,7 @@ where }; let param_entity = param_entity.ok_or_else(|| Response::with((status::BadRequest, "Missing required body parameter entity".to_string())))?; - match api.create_release(param_entity, context).wait() { + match api.create_release(param_entity, param_editgroup, context).wait() { Ok(rsp) => match rsp { CreateReleaseResponse::CreatedEntity(body) => { let body_string = serde_json::to_string(&body).expect("impossible to fail to serialize"); @@ -1174,6 +1190,10 @@ where context.auth_data = req.extensions.remove::(); context.authorization = req.extensions.remove::(); + // Query parameters (note that non-required or collection query parameters will ignore garbage values, rather than causing a 400 response) + let query_params = req.get::().unwrap_or_default(); + let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::().ok()); + // Body parameters (note that non-required body parameters will ignore garbage // values, rather than causing a 400 response). Produce warning header and logs for // any unused fields. @@ -1199,7 +1219,7 @@ where }; let param_entity = param_entity.ok_or_else(|| Response::with((status::BadRequest, "Missing required body parameter entity".to_string())))?; - match api.create_work(param_entity, context).wait() { + match api.create_work(param_entity, param_editgroup, context).wait() { Ok(rsp) => match rsp { CreateWorkResponse::CreatedEntity(body) => { let body_string = serde_json::to_string(&body).expect("impossible to fail to serialize"); @@ -3868,6 +3888,10 @@ where .map_err(|e| Response::with((status::BadRequest, format!("Couldn't parse path parameter id: {}", e))))? }; + // Query parameters (note that non-required or collection query parameters will ignore garbage values, rather than causing a 400 response) + let query_params = req.get::().unwrap_or_default(); + let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::().ok()); + // Body parameters (note that non-required body parameters will ignore garbage // values, rather than causing a 400 response). Produce warning header and logs for // any unused fields. @@ -3893,7 +3917,7 @@ where }; let param_entity = param_entity.ok_or_else(|| Response::with((status::BadRequest, "Missing required body parameter entity".to_string())))?; - match api.update_container(param_id, param_entity, context).wait() { + match api.update_container(param_id, param_entity, param_editgroup, context).wait() { Ok(rsp) => match rsp { UpdateContainerResponse::UpdatedEntity(body) => { let body_string = serde_json::to_string(&body).expect("impossible to fail to serialize"); @@ -3990,6 +4014,10 @@ where .map_err(|e| Response::with((status::BadRequest, format!("Couldn't parse path parameter id: {}", e))))? }; + // Query parameters (note that non-required or collection query parameters will ignore garbage values, rather than causing a 400 response) + let query_params = req.get::().unwrap_or_default(); + let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::().ok()); + // Body parameters (note that non-required body parameters will ignore garbage // values, rather than causing a 400 response). Produce warning header and logs for // any unused fields. @@ -4015,7 +4043,7 @@ where }; let param_entity = param_entity.ok_or_else(|| Response::with((status::BadRequest, "Missing required body parameter entity".to_string())))?; - match api.update_creator(param_id, param_entity, context).wait() { + match api.update_creator(param_id, param_entity, param_editgroup, context).wait() { Ok(rsp) => match rsp { UpdateCreatorResponse::UpdatedEntity(body) => { let body_string = serde_json::to_string(&body).expect("impossible to fail to serialize"); @@ -4112,6 +4140,10 @@ where .map_err(|e| Response::with((status::BadRequest, format!("Couldn't parse path parameter id: {}", e))))? }; + // Query parameters (note that non-required or collection query parameters will ignore garbage values, rather than causing a 400 response) + let query_params = req.get::().unwrap_or_default(); + let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::().ok()); + // Body parameters (note that non-required body parameters will ignore garbage // values, rather than causing a 400 response). Produce warning header and logs for // any unused fields. @@ -4137,7 +4169,7 @@ where }; let param_entity = param_entity.ok_or_else(|| Response::with((status::BadRequest, "Missing required body parameter entity".to_string())))?; - match api.update_file(param_id, param_entity, context).wait() { + match api.update_file(param_id, param_entity, param_editgroup, context).wait() { Ok(rsp) => match rsp { UpdateFileResponse::UpdatedEntity(body) => { let body_string = serde_json::to_string(&body).expect("impossible to fail to serialize"); @@ -4234,6 +4266,10 @@ where .map_err(|e| Response::with((status::BadRequest, format!("Couldn't parse path parameter id: {}", e))))? }; + // Query parameters (note that non-required or collection query parameters will ignore garbage values, rather than causing a 400 response) + let query_params = req.get::().unwrap_or_default(); + let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::().ok()); + // Body parameters (note that non-required body parameters will ignore garbage // values, rather than causing a 400 response). Produce warning header and logs for // any unused fields. @@ -4259,7 +4295,7 @@ where }; let param_entity = param_entity.ok_or_else(|| Response::with((status::BadRequest, "Missing required body parameter entity".to_string())))?; - match api.update_release(param_id, param_entity, context).wait() { + match api.update_release(param_id, param_entity, param_editgroup, context).wait() { Ok(rsp) => match rsp { UpdateReleaseResponse::UpdatedEntity(body) => { let body_string = serde_json::to_string(&body).expect("impossible to fail to serialize"); @@ -4356,6 +4392,10 @@ where .map_err(|e| Response::with((status::BadRequest, format!("Couldn't parse path parameter id: {}", e))))? }; + // Query parameters (note that non-required or collection query parameters will ignore garbage values, rather than causing a 400 response) + let query_params = req.get::().unwrap_or_default(); + let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::().ok()); + // Body parameters (note that non-required body parameters will ignore garbage // values, rather than causing a 400 response). Produce warning header and logs for // any unused fields. @@ -4381,7 +4421,7 @@ where }; let param_entity = param_entity.ok_or_else(|| Response::with((status::BadRequest, "Missing required body parameter entity".to_string())))?; - match api.update_work(param_id, param_entity, context).wait() { + match api.update_work(param_id, param_entity, param_editgroup, context).wait() { Ok(rsp) => match rsp { UpdateWorkResponse::UpdatedEntity(body) => { let body_string = serde_json::to_string(&body).expect("impossible to fail to serialize"); diff --git a/rust/src/api_entity_crud.rs b/rust/src/api_entity_crud.rs index 401b9835..1cb9adf8 100644 --- a/rust/src/api_entity_crud.rs +++ b/rust/src/api_entity_crud.rs @@ -41,8 +41,6 @@ where type IdentNewRow; type RevRow; - fn parse_editgroup_id(&self) -> Result>; - // Generic Methods fn db_get(conn: &DbConn, ident: FatCatId) -> Result; fn db_get_rev(conn: &DbConn, rev_id: Uuid) -> Result; @@ -81,18 +79,6 @@ where fn db_insert_revs(conn: &DbConn, models: &[&Self]) -> Result>; } -// TODO: this could be a separate trait on all entities -macro_rules! generic_parse_editgroup_id{ - () => { - fn parse_editgroup_id(&self) -> Result> { - match &self.editgroup_id { - Some(s) => Ok(Some(FatCatId::from_str(&s)?)), - None => Ok(None), - } - } - } -} - macro_rules! generic_db_get { ($ident_table:ident, $rev_table:ident) => { fn db_get(conn: &DbConn, ident: FatCatId) -> Result { @@ -394,7 +380,6 @@ impl EntityCrud for ContainerEntity { type IdentNewRow = ContainerIdentNewRow; type RevRow = ContainerRevRow; - generic_parse_editgroup_id!(); generic_db_get!(container_ident, container_rev); generic_db_get_rev!(container_rev); generic_db_expand!(); @@ -432,7 +417,7 @@ impl EntityCrud for ContainerEntity { revision: Some(rev_row.id.to_string()), redirect: redirect_id, extra: rev_row.extra_json, - editgroup_id: None, + edit_extra: None, }) } @@ -475,7 +460,6 @@ impl EntityCrud for CreatorEntity { type IdentNewRow = CreatorIdentNewRow; type RevRow = CreatorRevRow; - generic_parse_editgroup_id!(); generic_db_get!(creator_ident, creator_rev); generic_db_get_rev!(creator_rev); generic_db_expand!(); @@ -510,8 +494,8 @@ impl EntityCrud for CreatorEntity { ident: ident_id, revision: Some(rev_row.id.to_string()), redirect: redirect_id, - editgroup_id: None, extra: rev_row.extra_json, + edit_extra: None, }) } @@ -553,7 +537,6 @@ impl EntityCrud for FileEntity { type IdentNewRow = FileIdentNewRow; type RevRow = FileRevRow; - generic_parse_editgroup_id!(); generic_db_get!(file_ident, file_rev); generic_db_get_rev!(file_rev); generic_db_expand!(); @@ -608,8 +591,8 @@ impl EntityCrud for FileEntity { ident: ident_id, revision: Some(rev_row.id.to_string()), redirect: redirect_id, - editgroup_id: None, extra: rev_row.extra_json, + edit_extra: None, }) } @@ -691,7 +674,6 @@ impl EntityCrud for ReleaseEntity { type IdentNewRow = ReleaseIdentNewRow; type RevRow = ReleaseRevRow; - generic_parse_editgroup_id!(); generic_db_get!(release_ident, release_rev); generic_db_get_rev!(release_rev); //generic_db_create!(release_ident, release_edit); @@ -703,18 +685,16 @@ impl EntityCrud for ReleaseEntity { generic_db_insert_rev!(); fn db_expand(&mut self, conn: &DbConn, expand: ExpandFlags) -> Result<()> { - let ident = match &self.ident { None => bail!("Can't expand a non-concrete entity"), - Some(s) => FatCatId::from_str(&s)? + Some(s) => FatCatId::from_str(&s)?, }; if expand.files { self.files = Some(get_release_files(ident, conn)?); } if expand.container { if let Some(ref cid) = self.container_id { - self.container = - Some(ContainerEntity::db_get(conn, FatCatId::from_str(&cid)?)?); + self.container = Some(ContainerEntity::db_get(conn, FatCatId::from_str(&cid)?)?); } } Ok(()) @@ -744,8 +724,8 @@ impl EntityCrud for ReleaseEntity { revision: None, redirect: None, state: None, - editgroup_id: None, extra: None, + edit_extra: None, }); }; } @@ -904,8 +884,8 @@ impl EntityCrud for ReleaseEntity { ident: ident_id, revision: Some(rev_row.id.to_string()), redirect: redirect_id, - editgroup_id: None, extra: rev_row.extra_json, + edit_extra: None, }) } @@ -1086,7 +1066,6 @@ impl EntityCrud for WorkEntity { type IdentNewRow = WorkIdentNewRow; type RevRow = WorkRevRow; - generic_parse_editgroup_id!(); generic_db_get!(work_ident, work_rev); generic_db_get_rev!(work_rev); generic_db_expand!(); @@ -1117,8 +1096,8 @@ impl EntityCrud for WorkEntity { ident: ident_id, revision: Some(rev_row.id.to_string()), redirect: redirect_id, - editgroup_id: None, extra: rev_row.extra_json, + edit_extra: None, }) } diff --git a/rust/src/api_helpers.rs b/rust/src/api_helpers.rs index ee1f9f14..f260d25f 100644 --- a/rust/src/api_helpers.rs +++ b/rust/src/api_helpers.rs @@ -21,7 +21,7 @@ pub struct EditContext { pub autoaccept: bool, } -#[derive(Clone,Copy,PartialEq)] +#[derive(Clone, Copy, PartialEq)] pub struct ExpandFlags { pub files: bool, pub container: bool, @@ -30,7 +30,6 @@ pub struct ExpandFlags { } impl ExpandFlags { - pub fn from_string(param: &str) -> ExpandFlags { let list: Vec<&str> = param.split_terminator(",").collect(); ExpandFlags::from_strings(&list) @@ -72,24 +71,34 @@ fn test_expand_flags() { assert!(ExpandFlags::from_strings(&vec![]).files == false); assert!(ExpandFlags::from_strings(&vec!["files"]).files == true); assert!(ExpandFlags::from_strings(&vec!["file"]).files == false); - let all = ExpandFlags::from_strings(&vec!["files", "container", "other_thing", "releases", "creators"]); - assert!(all == ExpandFlags { - files: true, - container: true, - releases: true, - creators: true - }); + let all = ExpandFlags::from_strings(&vec![ + "files", + "container", + "other_thing", + "releases", + "creators", + ]); + assert!( + all == ExpandFlags { + files: true, + container: true, + releases: true, + creators: true + } + ); assert!(ExpandFlags::from_string("").files == false); assert!(ExpandFlags::from_string("files").files == true); assert!(ExpandFlags::from_string("something,,files").files == true); assert!(ExpandFlags::from_string("file").files == false); let all = ExpandFlags::from_string("files,container,other_thing,releases,creators"); - assert!(all == ExpandFlags { - files: true, - container: true, - releases: true, - creators: true - }); + assert!( + all == ExpandFlags { + files: true, + container: true, + releases: true, + creators: true + } + ); assert!(all == ExpandFlags::all()); } @@ -169,7 +178,7 @@ pub fn accept_editgroup(editgroup_id: FatCatId, conn: &DbConn) -> Result, + editgroup_id: Option, conn: &DbConn, ) -> Result> { - let editgroup_id: Option = match editgroup { - Some(s) => Some(FatCatId::from_str(&s)?), - None => None, - }; - let edit_context = make_edit_context(conn, editgroup_id.clone(), autoaccept)?; + let edit_context = make_edit_context(conn, editgroup_id, autoaccept)?; let model_list: Vec<&models::$model> = entity_list.iter().map(|e| e).collect(); let edits = $model::db_create_batch(conn, &edit_context, model_list.as_slice())?; @@ -57,10 +53,7 @@ pub struct Server { pub db_pool: ConnectionPool, } -pub fn get_release_files ( - id: FatCatId, - conn: &DbConn, -) -> Result> { +pub fn get_release_files(id: FatCatId, conn: &DbConn) -> Result> { let rows: Vec<(FileRevRow, FileIdentRow, FileReleaseRow)> = file_rev::table .inner_join(file_ident::table) .inner_join(file_release::table) @@ -75,7 +68,6 @@ pub fn get_release_files ( } impl Server { - pub fn lookup_container_handler(&self, issnl: &str, conn: &DbConn) -> Result { check_issn(issnl)?; let (ident, rev): (ContainerIdentRow, ContainerRevRow) = container_ident::table diff --git a/rust/src/api_wrappers.rs b/rust/src/api_wrappers.rs index ca4081da..1f61cc9b 100644 --- a/rust/src/api_wrappers.rs +++ b/rust/src/api_wrappers.rs @@ -68,11 +68,15 @@ macro_rules! wrap_entity_handlers { fn $post_fn( &self, entity: models::$model, + editgroup: Option, _context: &Context, ) -> Box + Send> { let conn = self.db_pool.get().expect("db_pool error"); let ret = match conn.transaction(|| { - let edit_context = make_edit_context(&conn, entity.parse_editgroup_id()?, false)?; + let editgroup_id = if let Some(s) = editgroup { + Some(FatCatId::from_str(&s)?) + } else { None }; + let edit_context = make_edit_context(&conn, editgroup_id, false)?; entity.db_create(&conn, &edit_context)?.into_model() }) { Ok(edit) => @@ -102,7 +106,12 @@ macro_rules! wrap_entity_handlers { _context: &Context, ) -> Box + Send> { let conn = self.db_pool.get().expect("db_pool error"); - let ret = match conn.transaction(|| self.$post_batch_handler(entity_list, autoaccept.unwrap_or(false), editgroup, &conn)) { + let ret = match conn.transaction(|| { + let editgroup_id = if let Some(s) = editgroup { + Some(FatCatId::from_str(&s)?) + } else { None }; + self.$post_batch_handler(entity_list, autoaccept.unwrap_or(false), editgroup_id, &conn) + }) { Ok(edit) => $post_batch_resp::CreatedEntities(edit), Err(Error(ErrorKind::Diesel(e), _)) => @@ -126,12 +135,16 @@ macro_rules! wrap_entity_handlers { &self, id: String, entity: models::$model, + editgroup: Option, _context: &Context, ) -> Box + Send> { let conn = self.db_pool.get().expect("db_pool error"); let ret = match conn.transaction(|| { let entity_id = FatCatId::from_str(&id)?; - let edit_context = make_edit_context(&conn, entity.parse_editgroup_id()?, false)?; + let editgroup_id = if let Some(s) = editgroup { + Some(FatCatId::from_str(&s)?) + } else { None }; + let edit_context = make_edit_context(&conn, editgroup_id, false)?; entity.db_update(&conn, &edit_context, entity_id)?.into_model() }) { Ok(edit) => -- cgit v1.2.3