diff options
| author | Bryan Newbold <bnewbold@robocracy.org> | 2018-09-11 16:10:47 -0700 | 
|---|---|---|
| committer | Bryan Newbold <bnewbold@robocracy.org> | 2018-09-11 16:10:47 -0700 | 
| commit | 91c080a2e82ec4e8908cb8e3916a543519151847 (patch) | |
| tree | 1d6f450546bcd0d0888bd0f4ec52d66a8a3cfd0f /rust | |
| parent | 6315c314969d4e66db4da09a8c2ff245aafe0fc1 (diff) | |
| download | fatcat-91c080a2e82ec4e8908cb8e3916a543519151847.tar.gz fatcat-91c080a2e82ec4e8908cb8e3916a543519151847.zip | |
implement new editgroup_id behavior
Diffstat (limited to 'rust')
| -rw-r--r-- | rust/fatcat-api-spec/README.md | 2 | ||||
| -rw-r--r-- | rust/fatcat-api-spec/api.yaml | 49 | ||||
| -rw-r--r-- | rust/fatcat-api-spec/api/swagger.yaml | 137 | ||||
| -rw-r--r-- | rust/fatcat-api-spec/examples/client.rs | 20 | ||||
| -rw-r--r-- | rust/fatcat-api-spec/examples/server_lib/server.rs | 80 | ||||
| -rw-r--r-- | rust/fatcat-api-spec/src/client.rs | 113 | ||||
| -rw-r--r-- | rust/fatcat-api-spec/src/lib.rs | 80 | ||||
| -rw-r--r-- | rust/fatcat-api-spec/src/models.rs | 55 | ||||
| -rw-r--r-- | rust/fatcat-api-spec/src/server.rs | 60 | ||||
| -rw-r--r-- | rust/src/api_entity_crud.rs | 37 | ||||
| -rw-r--r-- | rust/src/api_helpers.rs | 41 | ||||
| -rw-r--r-- | rust/src/api_server.rs | 14 | ||||
| -rw-r--r-- | 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("<none>")));          //  },          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("<none>")));          //  },          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("<none>")));          //  },          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("<none>")));          //  },          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("<none>")));          //  },          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("<none>")));          //  },          // 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("<none>")));          //  },          // 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("<none>")));          //  },          // 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("<none>")));          //  },          // 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("<none>")));          //  },          _ => 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<Future<Item = CreateContainerResponse, Error = ApiError> + Send> { +    fn create_container(&self, entity: models::ContainerEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = CreateContainerResponse, Error = ApiError> + Send> {          let context = context.clone(); -        println!("create_container({:?}) - X-Span-ID: {:?}", entity, context.x_span_id.unwrap_or(String::from("<none>")).clone()); +        println!( +            "create_container({:?}, {:?}) - X-Span-ID: {:?}", +            entity, +            editgroup, +            context.x_span_id.unwrap_or(String::from("<none>")).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<Future<Item = CreateCreatorResponse, Error = ApiError> + Send> { +    fn create_creator(&self, entity: models::CreatorEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = CreateCreatorResponse, Error = ApiError> + Send> {          let context = context.clone(); -        println!("create_creator({:?}) - X-Span-ID: {:?}", entity, context.x_span_id.unwrap_or(String::from("<none>")).clone()); +        println!( +            "create_creator({:?}, {:?}) - X-Span-ID: {:?}", +            entity, +            editgroup, +            context.x_span_id.unwrap_or(String::from("<none>")).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<Future<Item = CreateFileResponse, Error = ApiError> + Send> { +    fn create_file(&self, entity: models::FileEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = CreateFileResponse, Error = ApiError> + Send> {          let context = context.clone(); -        println!("create_file({:?}) - X-Span-ID: {:?}", entity, context.x_span_id.unwrap_or(String::from("<none>")).clone()); +        println!( +            "create_file({:?}, {:?}) - X-Span-ID: {:?}", +            entity, +            editgroup, +            context.x_span_id.unwrap_or(String::from("<none>")).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<Future<Item = CreateReleaseResponse, Error = ApiError> + Send> { +    fn create_release(&self, entity: models::ReleaseEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = CreateReleaseResponse, Error = ApiError> + Send> {          let context = context.clone(); -        println!("create_release({:?}) - X-Span-ID: {:?}", entity, context.x_span_id.unwrap_or(String::from("<none>")).clone()); +        println!( +            "create_release({:?}, {:?}) - X-Span-ID: {:?}", +            entity, +            editgroup, +            context.x_span_id.unwrap_or(String::from("<none>")).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<Future<Item = CreateWorkResponse, Error = ApiError> + Send> { +    fn create_work(&self, entity: models::WorkEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = CreateWorkResponse, Error = ApiError> + Send> {          let context = context.clone(); -        println!("create_work({:?}) - X-Span-ID: {:?}", entity, context.x_span_id.unwrap_or(String::from("<none>")).clone()); +        println!( +            "create_work({:?}, {:?}) - X-Span-ID: {:?}", +            entity, +            editgroup, +            context.x_span_id.unwrap_or(String::from("<none>")).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<Future<Item = UpdateContainerResponse, Error = ApiError> + Send> { +    fn update_container(&self, id: String, entity: models::ContainerEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = UpdateContainerResponse, Error = ApiError> + 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("<none>")).clone()          );          Box::new(futures::failed("Generic failure".into()))      } -    fn update_creator(&self, id: String, entity: models::CreatorEntity, context: &Context) -> Box<Future<Item = UpdateCreatorResponse, Error = ApiError> + Send> { +    fn update_creator(&self, id: String, entity: models::CreatorEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = UpdateCreatorResponse, Error = ApiError> + 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("<none>")).clone()          );          Box::new(futures::failed("Generic failure".into()))      } -    fn update_file(&self, id: String, entity: models::FileEntity, context: &Context) -> Box<Future<Item = UpdateFileResponse, Error = ApiError> + Send> { +    fn update_file(&self, id: String, entity: models::FileEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = UpdateFileResponse, Error = ApiError> + Send> {          let context = context.clone(); -        println!("update_file(\"{}\", {:?}) - X-Span-ID: {:?}", id, entity, context.x_span_id.unwrap_or(String::from("<none>")).clone()); +        println!( +            "update_file(\"{}\", {:?}, {:?}) - X-Span-ID: {:?}", +            id, +            entity, +            editgroup, +            context.x_span_id.unwrap_or(String::from("<none>")).clone() +        );          Box::new(futures::failed("Generic failure".into()))      } -    fn update_release(&self, id: String, entity: models::ReleaseEntity, context: &Context) -> Box<Future<Item = UpdateReleaseResponse, Error = ApiError> + Send> { +    fn update_release(&self, id: String, entity: models::ReleaseEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = UpdateReleaseResponse, Error = ApiError> + 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("<none>")).clone()          );          Box::new(futures::failed("Generic failure".into()))      } -    fn update_work(&self, id: String, entity: models::WorkEntity, context: &Context) -> Box<Future<Item = UpdateWorkResponse, Error = ApiError> + Send> { +    fn update_work(&self, id: String, entity: models::WorkEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = UpdateWorkResponse, Error = ApiError> + Send> {          let context = context.clone(); -        println!("update_work(\"{}\", {:?}) - X-Span-ID: {:?}", id, entity, context.x_span_id.unwrap_or(String::from("<none>")).clone()); +        println!( +            "update_work(\"{}\", {:?}, {:?}) - X-Span-ID: {:?}", +            id, +            entity, +            editgroup, +            context.x_span_id.unwrap_or(String::from("<none>")).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<Future<Item = CreateContainerResponse, Error = ApiError> + Send> { -        let url = format!("{}/v0/container", self.base_path); +    fn create_container(&self, param_entity: models::ContainerEntity, param_editgroup: Option<String>, context: &Context) -> Box<Future<Item = CreateContainerResponse, Error = ApiError> + 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<Future<Item = CreateCreatorResponse, Error = ApiError> + Send> { -        let url = format!("{}/v0/creator", self.base_path); +    fn create_creator(&self, param_entity: models::CreatorEntity, param_editgroup: Option<String>, context: &Context) -> Box<Future<Item = CreateCreatorResponse, Error = ApiError> + 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<Future<Item = CreateFileResponse, Error = ApiError> + Send> { -        let url = format!("{}/v0/file", self.base_path); +    fn create_file(&self, param_entity: models::FileEntity, param_editgroup: Option<String>, context: &Context) -> Box<Future<Item = CreateFileResponse, Error = ApiError> + 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<Future<Item = CreateReleaseResponse, Error = ApiError> + Send> { -        let url = format!("{}/v0/release", self.base_path); +    fn create_release(&self, param_entity: models::ReleaseEntity, param_editgroup: Option<String>, context: &Context) -> Box<Future<Item = CreateReleaseResponse, Error = ApiError> + 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<Future<Item = CreateWorkResponse, Error = ApiError> + Send> { -        let url = format!("{}/v0/work", self.base_path); +    fn create_work(&self, param_entity: models::WorkEntity, param_editgroup: Option<String>, context: &Context) -> Box<Future<Item = CreateWorkResponse, Error = ApiError> + 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<Future<Item = UpdateContainerResponse, Error = ApiError> + 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<String>, +        context: &Context, +    ) -> Box<Future<Item = UpdateContainerResponse, Error = ApiError> + 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<Future<Item = UpdateCreatorResponse, Error = ApiError> + 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<String>, +        context: &Context, +    ) -> Box<Future<Item = UpdateCreatorResponse, Error = ApiError> + 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<Future<Item = UpdateFileResponse, Error = ApiError> + 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<String>, context: &Context) -> Box<Future<Item = UpdateFileResponse, Error = ApiError> + 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<Future<Item = UpdateReleaseResponse, Error = ApiError> + 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<String>, +        context: &Context, +    ) -> Box<Future<Item = UpdateReleaseResponse, Error = ApiError> + 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<Future<Item = UpdateWorkResponse, Error = ApiError> + 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<String>, context: &Context) -> Box<Future<Item = UpdateWorkResponse, Error = ApiError> + 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<Future<Item = AcceptEditgroupResponse, Error = ApiError> + Send>; -    fn create_container(&self, entity: models::ContainerEntity, context: &Context) -> Box<Future<Item = CreateContainerResponse, Error = ApiError> + Send>; +    fn create_container(&self, entity: models::ContainerEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = CreateContainerResponse, Error = ApiError> + Send>;      fn create_container_batch(          &self, @@ -576,7 +576,7 @@ pub trait Api {          context: &Context,      ) -> Box<Future<Item = CreateContainerBatchResponse, Error = ApiError> + Send>; -    fn create_creator(&self, entity: models::CreatorEntity, context: &Context) -> Box<Future<Item = CreateCreatorResponse, Error = ApiError> + Send>; +    fn create_creator(&self, entity: models::CreatorEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = CreateCreatorResponse, Error = ApiError> + Send>;      fn create_creator_batch(          &self, @@ -588,7 +588,7 @@ pub trait Api {      fn create_editgroup(&self, entity: models::Editgroup, context: &Context) -> Box<Future<Item = CreateEditgroupResponse, Error = ApiError> + Send>; -    fn create_file(&self, entity: models::FileEntity, context: &Context) -> Box<Future<Item = CreateFileResponse, Error = ApiError> + Send>; +    fn create_file(&self, entity: models::FileEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = CreateFileResponse, Error = ApiError> + Send>;      fn create_file_batch(          &self, @@ -598,7 +598,7 @@ pub trait Api {          context: &Context,      ) -> Box<Future<Item = CreateFileBatchResponse, Error = ApiError> + Send>; -    fn create_release(&self, entity: models::ReleaseEntity, context: &Context) -> Box<Future<Item = CreateReleaseResponse, Error = ApiError> + Send>; +    fn create_release(&self, entity: models::ReleaseEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = CreateReleaseResponse, Error = ApiError> + Send>;      fn create_release_batch(          &self, @@ -608,7 +608,7 @@ pub trait Api {          context: &Context,      ) -> Box<Future<Item = CreateReleaseBatchResponse, Error = ApiError> + Send>; -    fn create_work(&self, entity: models::WorkEntity, context: &Context) -> Box<Future<Item = CreateWorkResponse, Error = ApiError> + Send>; +    fn create_work(&self, entity: models::WorkEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = CreateWorkResponse, Error = ApiError> + Send>;      fn create_work_batch(          &self, @@ -674,22 +674,22 @@ pub trait Api {      fn lookup_release(&self, doi: String, context: &Context) -> Box<Future<Item = LookupReleaseResponse, Error = ApiError> + Send>; -    fn update_container(&self, id: String, entity: models::ContainerEntity, context: &Context) -> Box<Future<Item = UpdateContainerResponse, Error = ApiError> + Send>; +    fn update_container(&self, id: String, entity: models::ContainerEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = UpdateContainerResponse, Error = ApiError> + Send>; -    fn update_creator(&self, id: String, entity: models::CreatorEntity, context: &Context) -> Box<Future<Item = UpdateCreatorResponse, Error = ApiError> + Send>; +    fn update_creator(&self, id: String, entity: models::CreatorEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = UpdateCreatorResponse, Error = ApiError> + Send>; -    fn update_file(&self, id: String, entity: models::FileEntity, context: &Context) -> Box<Future<Item = UpdateFileResponse, Error = ApiError> + Send>; +    fn update_file(&self, id: String, entity: models::FileEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = UpdateFileResponse, Error = ApiError> + Send>; -    fn update_release(&self, id: String, entity: models::ReleaseEntity, context: &Context) -> Box<Future<Item = UpdateReleaseResponse, Error = ApiError> + Send>; +    fn update_release(&self, id: String, entity: models::ReleaseEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = UpdateReleaseResponse, Error = ApiError> + Send>; -    fn update_work(&self, id: String, entity: models::WorkEntity, context: &Context) -> Box<Future<Item = UpdateWorkResponse, Error = ApiError> + Send>; +    fn update_work(&self, id: String, entity: models::WorkEntity, editgroup: Option<String>, context: &Context) -> Box<Future<Item = UpdateWorkResponse, Error = ApiError> + Send>;  }  /// API without a `Context`  pub trait ApiNoContext {      fn accept_editgroup(&self, id: String) -> Box<Future<Item = AcceptEditgroupResponse, Error = ApiError> + Send>; -    fn create_container(&self, entity: models::ContainerEntity) -> Box<Future<Item = CreateContainerResponse, Error = ApiError> + Send>; +    fn create_container(&self, entity: models::ContainerEntity, editgroup: Option<String>) -> Box<Future<Item = CreateContainerResponse, Error = ApiError> + Send>;      fn create_container_batch(          &self, @@ -698,7 +698,7 @@ pub trait ApiNoContext {          editgroup: Option<String>,      ) -> Box<Future<Item = CreateContainerBatchResponse, Error = ApiError> + Send>; -    fn create_creator(&self, entity: models::CreatorEntity) -> Box<Future<Item = CreateCreatorResponse, Error = ApiError> + Send>; +    fn create_creator(&self, entity: models::CreatorEntity, editgroup: Option<String>) -> Box<Future<Item = CreateCreatorResponse, Error = ApiError> + Send>;      fn create_creator_batch(          &self, @@ -709,11 +709,11 @@ pub trait ApiNoContext {      fn create_editgroup(&self, entity: models::Editgroup) -> Box<Future<Item = CreateEditgroupResponse, Error = ApiError> + Send>; -    fn create_file(&self, entity: models::FileEntity) -> Box<Future<Item = CreateFileResponse, Error = ApiError> + Send>; +    fn create_file(&self, entity: models::FileEntity, editgroup: Option<String>) -> Box<Future<Item = CreateFileResponse, Error = ApiError> + Send>;      fn create_file_batch(&self, entity_list: &Vec<models::FileEntity>, autoaccept: Option<bool>, editgroup: Option<String>) -> Box<Future<Item = CreateFileBatchResponse, Error = ApiError> + Send>; -    fn create_release(&self, entity: models::ReleaseEntity) -> Box<Future<Item = CreateReleaseResponse, Error = ApiError> + Send>; +    fn create_release(&self, entity: models::ReleaseEntity, editgroup: Option<String>) -> Box<Future<Item = CreateReleaseResponse, Error = ApiError> + Send>;      fn create_release_batch(          &self, @@ -722,7 +722,7 @@ pub trait ApiNoContext {          editgroup: Option<String>,      ) -> Box<Future<Item = CreateReleaseBatchResponse, Error = ApiError> + Send>; -    fn create_work(&self, entity: models::WorkEntity) -> Box<Future<Item = CreateWorkResponse, Error = ApiError> + Send>; +    fn create_work(&self, entity: models::WorkEntity, editgroup: Option<String>) -> Box<Future<Item = CreateWorkResponse, Error = ApiError> + Send>;      fn create_work_batch(&self, entity_list: &Vec<models::WorkEntity>, autoaccept: Option<bool>, editgroup: Option<String>) -> Box<Future<Item = CreateWorkBatchResponse, Error = ApiError> + Send>; @@ -782,15 +782,15 @@ pub trait ApiNoContext {      fn lookup_release(&self, doi: String) -> Box<Future<Item = LookupReleaseResponse, Error = ApiError> + Send>; -    fn update_container(&self, id: String, entity: models::ContainerEntity) -> Box<Future<Item = UpdateContainerResponse, Error = ApiError> + Send>; +    fn update_container(&self, id: String, entity: models::ContainerEntity, editgroup: Option<String>) -> Box<Future<Item = UpdateContainerResponse, Error = ApiError> + Send>; -    fn update_creator(&self, id: String, entity: models::CreatorEntity) -> Box<Future<Item = UpdateCreatorResponse, Error = ApiError> + Send>; +    fn update_creator(&self, id: String, entity: models::CreatorEntity, editgroup: Option<String>) -> Box<Future<Item = UpdateCreatorResponse, Error = ApiError> + Send>; -    fn update_file(&self, id: String, entity: models::FileEntity) -> Box<Future<Item = UpdateFileResponse, Error = ApiError> + Send>; +    fn update_file(&self, id: String, entity: models::FileEntity, editgroup: Option<String>) -> Box<Future<Item = UpdateFileResponse, Error = ApiError> + Send>; -    fn update_release(&self, id: String, entity: models::ReleaseEntity) -> Box<Future<Item = UpdateReleaseResponse, Error = ApiError> + Send>; +    fn update_release(&self, id: String, entity: models::ReleaseEntity, editgroup: Option<String>) -> Box<Future<Item = UpdateReleaseResponse, Error = ApiError> + Send>; -    fn update_work(&self, id: String, entity: models::WorkEntity) -> Box<Future<Item = UpdateWorkResponse, Error = ApiError> + Send>; +    fn update_work(&self, id: String, entity: models::WorkEntity, editgroup: Option<String>) -> Box<Future<Item = UpdateWorkResponse, Error = ApiError> + 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<Future<Item = CreateContainerResponse, Error = ApiError> + Send> { -        self.api().create_container(entity, &self.context()) +    fn create_container(&self, entity: models::ContainerEntity, editgroup: Option<String>) -> Box<Future<Item = CreateContainerResponse, Error = ApiError> + 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<Future<Item = CreateCreatorResponse, Error = ApiError> + Send> { -        self.api().create_creator(entity, &self.context()) +    fn create_creator(&self, entity: models::CreatorEntity, editgroup: Option<String>) -> Box<Future<Item = CreateCreatorResponse, Error = ApiError> + 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<Future<Item = CreateFileResponse, Error = ApiError> + Send> { -        self.api().create_file(entity, &self.context()) +    fn create_file(&self, entity: models::FileEntity, editgroup: Option<String>) -> Box<Future<Item = CreateFileResponse, Error = ApiError> + Send> { +        self.api().create_file(entity, editgroup, &self.context())      }      fn create_file_batch(&self, entity_list: &Vec<models::FileEntity>, autoaccept: Option<bool>, editgroup: Option<String>) -> Box<Future<Item = CreateFileBatchResponse, Error = ApiError> + Send> {          self.api().create_file_batch(entity_list, autoaccept, editgroup, &self.context())      } -    fn create_release(&self, entity: models::ReleaseEntity) -> Box<Future<Item = CreateReleaseResponse, Error = ApiError> + Send> { -        self.api().create_release(entity, &self.context()) +    fn create_release(&self, entity: models::ReleaseEntity, editgroup: Option<String>) -> Box<Future<Item = CreateReleaseResponse, Error = ApiError> + 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<Future<Item = CreateWorkResponse, Error = ApiError> + Send> { -        self.api().create_work(entity, &self.context()) +    fn create_work(&self, entity: models::WorkEntity, editgroup: Option<String>) -> Box<Future<Item = CreateWorkResponse, Error = ApiError> + Send> { +        self.api().create_work(entity, editgroup, &self.context())      }      fn create_work_batch(&self, entity_list: &Vec<models::WorkEntity>, autoaccept: Option<bool>, editgroup: Option<String>) -> Box<Future<Item = CreateWorkBatchResponse, Error = ApiError> + 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<Future<Item = UpdateContainerResponse, Error = ApiError> + Send> { -        self.api().update_container(id, entity, &self.context()) +    fn update_container(&self, id: String, entity: models::ContainerEntity, editgroup: Option<String>) -> Box<Future<Item = UpdateContainerResponse, Error = ApiError> + Send> { +        self.api().update_container(id, entity, editgroup, &self.context())      } -    fn update_creator(&self, id: String, entity: models::CreatorEntity) -> Box<Future<Item = UpdateCreatorResponse, Error = ApiError> + Send> { -        self.api().update_creator(id, entity, &self.context()) +    fn update_creator(&self, id: String, entity: models::CreatorEntity, editgroup: Option<String>) -> Box<Future<Item = UpdateCreatorResponse, Error = ApiError> + Send> { +        self.api().update_creator(id, entity, editgroup, &self.context())      } -    fn update_file(&self, id: String, entity: models::FileEntity) -> Box<Future<Item = UpdateFileResponse, Error = ApiError> + Send> { -        self.api().update_file(id, entity, &self.context()) +    fn update_file(&self, id: String, entity: models::FileEntity, editgroup: Option<String>) -> Box<Future<Item = UpdateFileResponse, Error = ApiError> + Send> { +        self.api().update_file(id, entity, editgroup, &self.context())      } -    fn update_release(&self, id: String, entity: models::ReleaseEntity) -> Box<Future<Item = UpdateReleaseResponse, Error = ApiError> + Send> { -        self.api().update_release(id, entity, &self.context()) +    fn update_release(&self, id: String, entity: models::ReleaseEntity, editgroup: Option<String>) -> Box<Future<Item = UpdateReleaseResponse, Error = ApiError> + Send> { +        self.api().update_release(id, entity, editgroup, &self.context())      } -    fn update_work(&self, id: String, entity: models::WorkEntity) -> Box<Future<Item = UpdateWorkResponse, Error = ApiError> + Send> { -        self.api().update_work(id, entity, &self.context()) +    fn update_work(&self, id: String, entity: models::WorkEntity, editgroup: Option<String>) -> Box<Future<Item = UpdateWorkResponse, Error = ApiError> + 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<serde_json::Value>, +    pub edit_extra: Option<serde_json::Value>, -    /// base32-encoded unique identifier -    #[serde(rename = "editgroup_id")] +    #[serde(rename = "extra")]      #[serde(skip_serializing_if = "Option::is_none")] -    pub editgroup_id: Option<String>, +    pub extra: Option<serde_json::Value>,      /// 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<String>, -    /// base32-encoded unique identifier -    #[serde(rename = "editgroup_id")] -    #[serde(skip_serializing_if = "Option::is_none")] -    pub editgroup_id: Option<String>, -      #[serde(rename = "extra")]      #[serde(skip_serializing_if = "Option::is_none")]      pub extra: Option<serde_json::Value>, + +    #[serde(rename = "edit_extra")] +    #[serde(skip_serializing_if = "Option::is_none")] +    pub edit_extra: Option<serde_json::Value>,  }  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<i64>, -    #[serde(rename = "extra")] +    #[serde(rename = "edit_extra")]      #[serde(skip_serializing_if = "Option::is_none")] -    pub extra: Option<serde_json::Value>, +    pub edit_extra: Option<serde_json::Value>, -    /// base32-encoded unique identifier -    #[serde(rename = "editgroup_id")] +    #[serde(rename = "extra")]      #[serde(skip_serializing_if = "Option::is_none")] -    pub editgroup_id: Option<String>, +    pub extra: Option<serde_json::Value>,      /// 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<String>, -    /// base32-encoded unique identifier -    #[serde(rename = "editgroup_id")] -    #[serde(skip_serializing_if = "Option::is_none")] -    pub editgroup_id: Option<String>, -      #[serde(rename = "extra")]      #[serde(skip_serializing_if = "Option::is_none")]      pub extra: Option<serde_json::Value>, + +    #[serde(rename = "edit_extra")] +    #[serde(skip_serializing_if = "Option::is_none")] +    pub edit_extra: Option<serde_json::Value>,  }  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<serde_json::Value>, +    pub edit_extra: Option<serde_json::Value>, -    /// base32-encoded unique identifier -    #[serde(rename = "editgroup_id")] +    #[serde(rename = "extra")]      #[serde(skip_serializing_if = "Option::is_none")] -    pub editgroup_id: Option<String>, +    pub extra: Option<serde_json::Value>,      /// 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::<AuthData>();                  context.authorization = req.extensions.remove::<Authorization>(); +                // 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::<UrlEncodedQuery>().unwrap_or_default(); +                let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::<String>().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::<AuthData>();                  context.authorization = req.extensions.remove::<Authorization>(); +                // 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::<UrlEncodedQuery>().unwrap_or_default(); +                let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::<String>().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::<AuthData>();                  context.authorization = req.extensions.remove::<Authorization>(); +                // 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::<UrlEncodedQuery>().unwrap_or_default(); +                let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::<String>().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::<AuthData>();                  context.authorization = req.extensions.remove::<Authorization>(); +                // 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::<UrlEncodedQuery>().unwrap_or_default(); +                let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::<String>().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::<AuthData>();                  context.authorization = req.extensions.remove::<Authorization>(); +                // 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::<UrlEncodedQuery>().unwrap_or_default(); +                let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::<String>().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::<UrlEncodedQuery>().unwrap_or_default(); +                let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::<String>().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::<UrlEncodedQuery>().unwrap_or_default(); +                let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::<String>().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::<UrlEncodedQuery>().unwrap_or_default(); +                let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::<String>().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::<UrlEncodedQuery>().unwrap_or_default(); +                let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::<String>().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::<UrlEncodedQuery>().unwrap_or_default(); +                let param_editgroup = query_params.get("editgroup").and_then(|list| list.first()).and_then(|x| x.parse::<String>().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<Option<FatCatId>>; -      // Generic Methods      fn db_get(conn: &DbConn, ident: FatCatId) -> Result<Self>;      fn db_get_rev(conn: &DbConn, rev_id: Uuid) -> Result<Self>; @@ -81,18 +79,6 @@ where      fn db_insert_revs(conn: &DbConn, models: &[&Self]) -> Result<Vec<Uuid>>;  } -// TODO: this could be a separate trait on all entities -macro_rules! generic_parse_editgroup_id{ -    () => { -        fn parse_editgroup_id(&self) -> Result<Option<FatCatId>> { -            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<Self> { @@ -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<Changel      Ok(entry)  } -#[derive(Clone,Copy,PartialEq)] +#[derive(Clone, Copy, PartialEq)]  pub struct FatCatId(Uuid);  impl ToString for FatCatId { diff --git a/rust/src/api_server.rs b/rust/src/api_server.rs index f25e6169..055758e0 100644 --- a/rust/src/api_server.rs +++ b/rust/src/api_server.rs @@ -19,15 +19,11 @@ macro_rules! entity_batch_handler {              &self,              entity_list: &[models::$model],              autoaccept: bool, -            editgroup: Option<String>, +            editgroup_id: Option<FatCatId>,              conn: &DbConn,          ) -> Result<Vec<EntityEdit>> { -            let editgroup_id: Option<FatCatId> = 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<Vec<FileEntity>> { +pub fn get_release_files(id: FatCatId, conn: &DbConn) -> Result<Vec<FileEntity>> {      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<ContainerEntity> {          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<String>,              _context: &Context,          ) -> Box<Future<Item = $post_resp, Error = ApiError> + 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<Future<Item = $post_batch_resp, Error = ApiError> + 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<String>,              _context: &Context,          ) -> Box<Future<Item = $update_resp, Error = ApiError> + 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) => | 
