diff options
Diffstat (limited to 'rust')
| -rw-r--r-- | rust/fatcat-api/README.md | 2 | ||||
| -rw-r--r-- | rust/fatcat-api/api.yaml | 50 | ||||
| -rw-r--r-- | rust/fatcat-api/api/swagger.yaml | 234 | ||||
| -rw-r--r-- | rust/fatcat-api/src/models.rs | 81 | ||||
| -rw-r--r-- | rust/src/api_server.rs | 56 | ||||
| -rw-r--r-- | rust/src/database_models.rs | 28 | ||||
| -rw-r--r-- | rust/src/database_schema.rs | 19 | ||||
| -rw-r--r-- | rust/tests/test_api_server.rs | 13 | 
8 files changed, 333 insertions, 150 deletions
| diff --git a/rust/fatcat-api/README.md b/rust/fatcat-api/README.md index 856d54b5..57f877d2 100644 --- a/rust/fatcat-api/README.md +++ b/rust/fatcat-api/README.md @@ -13,7 +13,7 @@ To see how to make this your own, look here:  [README](https://github.com/swagger-api/swagger-codegen/blob/master/README.md)  - API version: 0.1.0 -- Build date: 2018-05-28T21:40:16.318Z +- Build date: 2018-06-04T07:14:27.260Z  This autogenerated project defines an API crate `fatcat` which contains:  * An `Api` trait defining the API in Rust. diff --git a/rust/fatcat-api/api.yaml b/rust/fatcat-api/api.yaml index 8ced937d..c53ff4a7 100644 --- a/rust/fatcat-api/api.yaml +++ b/rust/fatcat-api/api.yaml @@ -22,7 +22,7 @@ x-entity-props: &ENTITYPROPS    ident:      type: string      #format: uuid -    example: "f1f046a3-45c9-4b99-adce-000000000001" +    example: "00000000-0000-0000-adce-000000000001"    revision:      type: integer      example: 42 @@ -30,7 +30,7 @@ x-entity-props: &ENTITYPROPS    redirect:      type: string      #format: uuid -    example: "f1f046a3-45c9-4b99-adce-000000000002" +    example: "00000000-0000-0000-adce-000000000002"    editgroup_id:      type: integer      example: 16 @@ -80,12 +80,16 @@ definitions:    creator_entity:      type: object      required: -      - full_name +      - display_name      properties:        <<: *ENTITYPROPS -      full_name: +      display_name:          type: string          example: "Grace Hopper" +      given_name: +        type: string +      surname: +        type: string        orcid:          type: string          #format: custom @@ -106,10 +110,17 @@ definitions:          type: string          #format: custom          example: "d41efcc592d1e40ac13905377399eb9b" +      sha256: +        type: string +        #format: custom +        example: "a77e4c11a57f1d757fca5754a8f83b5d4ece49a2d28596889127c1a2f3f28832"        url:          type: string          format: url          example: "https://example.edu/~frau/prcding.pdf" +      mimetype: +        type: string +        example: "application/pdf"        releases:          type: array          items: @@ -126,14 +137,17 @@ definitions:          type: string        work_id:          type: string -        example: "f1f046a3-45c9-4b99-adce-000000000001" +        example: "00000000-0000-0000-adce-000000000001"        container_id:          type: string -        example: "f1f046a3-45c9-4b99-adce-000000000001" +        example: "00000000-0000-0000-adce-000000000001"        release_type:          type: string +        example: "book" +      release_status: +        type: string          example: "preprint" -      date: +      release_date:          type: string          format: date        doi: @@ -152,6 +166,8 @@ definitions:          example: "12"        publisher:          type: string +      language: +        type: string        contribs:          type: array          items: @@ -179,14 +195,14 @@ definitions:            format: int64        ident:            type: string -          example: "f1f046a3-45c9-4b99-adce-000000000001" +          example: "00000000-0000-0000-adce-000000000001"        revision:            type: integer            example: 42            format: int64        redirect_ident:            type: string -          example: "f1f046a3-45c9-4b99-adce-000000000002" +          example: "00000000-0000-0000-adce-000000000002"            #format: uuid        editgroup_id:            type: integer @@ -269,8 +285,20 @@ definitions:        target_release_id:          type: string          #format: uuid -      stub: +      raw: +        type: string +      key: +        type: string +      year: +        type: integer +        format: int64 +      container_title: +        type: string +      title: +        type: string +      locator:          type: string +        example: "p123"    release_contrib:      type: object      properties: @@ -280,7 +308,7 @@ definitions:        creator_id:          type: string          #format: uuid -      creator_stub: +      raw:          type: string        role:          type: string diff --git a/rust/fatcat-api/api/swagger.yaml b/rust/fatcat-api/api/swagger.yaml index 0bb29bc6..2a847e1c 100644 --- a/rust/fatcat-api/api/swagger.yaml +++ b/rust/fatcat-api/api/swagger.yaml @@ -1365,14 +1365,14 @@ definitions:          example: 16        redirect:          type: "string" -        example: "f1f046a3-45c9-4b99-adce-000000000002" +        example: "00000000-0000-0000-adce-000000000002"        revision:          type: "integer"          format: "int64"          example: 42        ident:          type: "string" -        example: "f1f046a3-45c9-4b99-adce-000000000001" +        example: "00000000-0000-0000-adce-000000000001"        state:          type: "string"          enum: @@ -1381,9 +1381,9 @@ definitions:          - "redirect"          - "deleted"      example: -      redirect: "f1f046a3-45c9-4b99-adce-000000000002" +      redirect: "00000000-0000-0000-adce-000000000002"        coden: "coden" -      ident: "f1f046a3-45c9-4b99-adce-000000000001" +      ident: "00000000-0000-0000-adce-000000000001"        extra: "{}"        name: "Journal of Important Results"        publisher: "Society of Curious Students" @@ -1396,12 +1396,16 @@ definitions:    creator_entity:      type: "object"      required: -    - "full_name" +    - "display_name"      properties:        orcid:          type: "string"          example: "0000-0002-1825-0097" -      full_name: +      surname: +        type: "string" +      given_name: +        type: "string" +      display_name:          type: "string"          example: "Grace Hopper"        state: @@ -1413,14 +1417,14 @@ definitions:          - "deleted"        ident:          type: "string" -        example: "f1f046a3-45c9-4b99-adce-000000000001" +        example: "00000000-0000-0000-adce-000000000001"        revision:          type: "integer"          format: "int64"          example: 42        redirect:          type: "string" -        example: "f1f046a3-45c9-4b99-adce-000000000002" +        example: "00000000-0000-0000-adce-000000000002"        editgroup_id:          type: "integer"          format: "int64" @@ -1428,13 +1432,15 @@ definitions:        extra:          type: "object"      example: -      redirect: "f1f046a3-45c9-4b99-adce-000000000002" -      full_name: "Grace Hopper" -      ident: "f1f046a3-45c9-4b99-adce-000000000001" +      redirect: "00000000-0000-0000-adce-000000000002" +      surname: "surname" +      ident: "00000000-0000-0000-adce-000000000001"        extra: "{}"        editgroup_id: 16        orcid: "0000-0002-1825-0097"        state: "wip" +      given_name: "given_name" +      display_name: "Grace Hopper"        revision: 42      upperCaseName: "CREATOR_ENTITY"    file_entity: @@ -1444,10 +1450,16 @@ definitions:          type: "array"          items:            type: "string" +      mimetype: +        type: "string" +        example: "application/pdf"        url:          type: "string"          format: "url"          example: "https://example.edu/~frau/prcding.pdf" +      sha256: +        type: "string" +        example: "a77e4c11a57f1d757fca5754a8f83b5d4ece49a2d28596889127c1a2f3f28832"        md5:          type: "string"          example: "d41efcc592d1e40ac13905377399eb9b" @@ -1466,14 +1478,14 @@ definitions:          example: 16        redirect:          type: "string" -        example: "f1f046a3-45c9-4b99-adce-000000000002" +        example: "00000000-0000-0000-adce-000000000002"        revision:          type: "integer"          format: "int64"          example: 42        ident:          type: "string" -        example: "f1f046a3-45c9-4b99-adce-000000000001" +        example: "00000000-0000-0000-adce-000000000001"        state:          type: "string"          enum: @@ -1482,19 +1494,21 @@ definitions:          - "redirect"          - "deleted"      example: +      redirect: "00000000-0000-0000-adce-000000000002" +      sha256: "a77e4c11a57f1d757fca5754a8f83b5d4ece49a2d28596889127c1a2f3f28832" +      ident: "00000000-0000-0000-adce-000000000001" +      url: "https://example.edu/~frau/prcding.pdf" +      releases: +      - "releases" +      - "releases" +      revision: 42        sha1: "f013d66c7f6817d08b7eb2a93e6d0440c1f3e7f8" -      redirect: "f1f046a3-45c9-4b99-adce-000000000002"        size: 1048576 -      ident: "f1f046a3-45c9-4b99-adce-000000000001"        extra: "{}"        editgroup_id: 16 +      mimetype: "application/pdf"        state: "wip" -      url: "https://example.edu/~frau/prcding.pdf" -      releases: -      - "releases" -      - "releases"        md5: "d41efcc592d1e40ac13905377399eb9b" -      revision: 42      upperCaseName: "FILE_ENTITY"    release_entity:      type: "object" @@ -1510,6 +1524,8 @@ definitions:          type: "array"          items:            $ref: "#/definitions/release_contrib" +      language: +        type: "string"        publisher:          type: "string"        issue: @@ -1524,18 +1540,21 @@ definitions:        doi:          type: "string"          example: "10.1234/abcde.789" -      date: +      release_date:          type: "string"          format: "date" -      release_type: +      release_status:          type: "string"          example: "preprint" +      release_type: +        type: "string" +        example: "book"        container_id:          type: "string" -        example: "f1f046a3-45c9-4b99-adce-000000000001" +        example: "00000000-0000-0000-adce-000000000001"        work_id:          type: "string" -        example: "f1f046a3-45c9-4b99-adce-000000000001" +        example: "00000000-0000-0000-adce-000000000001"        title:          type: "string"        state: @@ -1547,14 +1566,14 @@ definitions:          - "deleted"        ident:          type: "string" -        example: "f1f046a3-45c9-4b99-adce-000000000001" +        example: "00000000-0000-0000-adce-000000000001"        revision:          type: "integer"          format: "int64"          example: 42        redirect:          type: "string" -        example: "f1f046a3-45c9-4b99-adce-000000000002" +        example: "00000000-0000-0000-adce-000000000002"        editgroup_id:          type: "integer"          format: "int64" @@ -1562,38 +1581,50 @@ definitions:        extra:          type: "object"      example: -      date: "2000-01-23" -      redirect: "f1f046a3-45c9-4b99-adce-000000000002" -      work_id: "f1f046a3-45c9-4b99-adce-000000000001" +      redirect: "00000000-0000-0000-adce-000000000002" +      work_id: "00000000-0000-0000-adce-000000000001"        issue: "12" -      ident: "f1f046a3-45c9-4b99-adce-000000000001" -      release_type: "preprint" +      ident: "00000000-0000-0000-adce-000000000001" +      release_type: "book" +      language: "language"        title: "title" +      release_status: "preprint"        contribs:        - role: "role" -        creator_stub: "creator_stub"          creator_id: "creator_id" -        index: 6 +        index: 1 +        raw: "raw"        - role: "role" -        creator_stub: "creator_stub"          creator_id: "creator_id" -        index: 6 +        index: 1 +        raw: "raw"        revision: 42        volume: "volume"        pages: "pages"        refs:        - target_release_id: "target_release_id" -        stub: "stub" +        year: 6 +        container_title: "container_title"          index: 0 +        raw: "raw" +        title: "title" +        locator: "p123" +        key: "key"        - target_release_id: "target_release_id" -        stub: "stub" +        year: 6 +        container_title: "container_title"          index: 0 +        raw: "raw" +        title: "title" +        locator: "p123" +        key: "key" +      release_date: "2000-01-23"        isbn13: "isbn13"        extra: "{}"        publisher: "publisher"        editgroup_id: 16        state: "wip" -      container_id: "f1f046a3-45c9-4b99-adce-000000000001" +      container_id: "00000000-0000-0000-adce-000000000001"        doi: "10.1234/abcde.789"      upperCaseName: "RELEASE_ENTITY"    work_entity: @@ -1609,14 +1640,14 @@ definitions:          example: 16        redirect:          type: "string" -        example: "f1f046a3-45c9-4b99-adce-000000000002" +        example: "00000000-0000-0000-adce-000000000002"        revision:          type: "integer"          format: "int64"          example: 42        ident:          type: "string" -        example: "f1f046a3-45c9-4b99-adce-000000000001" +        example: "00000000-0000-0000-adce-000000000001"        state:          type: "string"          enum: @@ -1625,8 +1656,8 @@ definitions:          - "redirect"          - "deleted"      example: -      redirect: "f1f046a3-45c9-4b99-adce-000000000002" -      ident: "f1f046a3-45c9-4b99-adce-000000000001" +      redirect: "00000000-0000-0000-adce-000000000002" +      ident: "00000000-0000-0000-adce-000000000001"        extra: "{}"        work_type: "work_type"        editgroup_id: 16 @@ -1646,14 +1677,14 @@ definitions:          example: 847        ident:          type: "string" -        example: "f1f046a3-45c9-4b99-adce-000000000001" +        example: "00000000-0000-0000-adce-000000000001"        revision:          type: "integer"          format: "int64"          example: 42        redirect_ident:          type: "string" -        example: "f1f046a3-45c9-4b99-adce-000000000002" +        example: "00000000-0000-0000-adce-000000000002"        editgroup_id:          type: "integer"          format: "int64" @@ -1661,10 +1692,10 @@ definitions:        extra:          type: "object"      example: -      ident: "f1f046a3-45c9-4b99-adce-000000000001" +      ident: "00000000-0000-0000-adce-000000000001"        edit_id: 847        extra: "{}" -      redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +      redirect_ident: "00000000-0000-0000-adce-000000000002"        editgroup_id: 16        revision: 42      upperCaseName: "ENTITY_EDIT" @@ -1700,68 +1731,68 @@ definitions:        extra: "{}"        edits:          works: -        - ident: "f1f046a3-45c9-4b99-adce-000000000001" +        - ident: "00000000-0000-0000-adce-000000000001"            edit_id: 847            extra: "{}" -          redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +          redirect_ident: "00000000-0000-0000-adce-000000000002"            editgroup_id: 16            revision: 42 -        - ident: "f1f046a3-45c9-4b99-adce-000000000001" +        - ident: "00000000-0000-0000-adce-000000000001"            edit_id: 847            extra: "{}" -          redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +          redirect_ident: "00000000-0000-0000-adce-000000000002"            editgroup_id: 16            revision: 42          creators: -        - ident: "f1f046a3-45c9-4b99-adce-000000000001" +        - ident: "00000000-0000-0000-adce-000000000001"            edit_id: 847            extra: "{}" -          redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +          redirect_ident: "00000000-0000-0000-adce-000000000002"            editgroup_id: 16            revision: 42 -        - ident: "f1f046a3-45c9-4b99-adce-000000000001" +        - ident: "00000000-0000-0000-adce-000000000001"            edit_id: 847            extra: "{}" -          redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +          redirect_ident: "00000000-0000-0000-adce-000000000002"            editgroup_id: 16            revision: 42          files: -        - ident: "f1f046a3-45c9-4b99-adce-000000000001" +        - ident: "00000000-0000-0000-adce-000000000001"            edit_id: 847            extra: "{}" -          redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +          redirect_ident: "00000000-0000-0000-adce-000000000002"            editgroup_id: 16            revision: 42 -        - ident: "f1f046a3-45c9-4b99-adce-000000000001" +        - ident: "00000000-0000-0000-adce-000000000001"            edit_id: 847            extra: "{}" -          redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +          redirect_ident: "00000000-0000-0000-adce-000000000002"            editgroup_id: 16            revision: 42          containers: -        - ident: "f1f046a3-45c9-4b99-adce-000000000001" +        - ident: "00000000-0000-0000-adce-000000000001"            edit_id: 847            extra: "{}" -          redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +          redirect_ident: "00000000-0000-0000-adce-000000000002"            editgroup_id: 16            revision: 42 -        - ident: "f1f046a3-45c9-4b99-adce-000000000001" +        - ident: "00000000-0000-0000-adce-000000000001"            edit_id: 847            extra: "{}" -          redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +          redirect_ident: "00000000-0000-0000-adce-000000000002"            editgroup_id: 16            revision: 42          releases: -        - ident: "f1f046a3-45c9-4b99-adce-000000000001" +        - ident: "00000000-0000-0000-adce-000000000001"            edit_id: 847            extra: "{}" -          redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +          redirect_ident: "00000000-0000-0000-adce-000000000002"            editgroup_id: 16            revision: 42 -        - ident: "f1f046a3-45c9-4b99-adce-000000000001" +        - ident: "00000000-0000-0000-adce-000000000001"            edit_id: 847            extra: "{}" -          redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +          redirect_ident: "00000000-0000-0000-adce-000000000002"            editgroup_id: 16            revision: 42        description: "description" @@ -1781,12 +1812,29 @@ definitions:          format: "int64"        target_release_id:          type: "string" -      stub: +      raw: +        type: "string" +      key:          type: "string" +      year: +        type: "integer" +        format: "int64" +      container_title: +        type: "string" +      title: +        type: "string" +      locator: +        type: "string" +        example: "p123"      example:        target_release_id: "target_release_id" -      stub: "stub" +      year: 6 +      container_title: "container_title"        index: 0 +      raw: "raw" +      title: "title" +      locator: "p123" +      key: "key"      upperCaseName: "RELEASE_REF"    release_contrib:      type: "object" @@ -1796,15 +1844,15 @@ definitions:          format: "int64"        creator_id:          type: "string" -      creator_stub: +      raw:          type: "string"        role:          type: "string"      example:        role: "role" -      creator_stub: "creator_stub"        creator_id: "creator_id" -      index: 6 +      index: 1 +      raw: "raw"      upperCaseName: "RELEASE_CONTRIB"    editgroup_edits:      properties: @@ -1830,68 +1878,68 @@ definitions:            $ref: "#/definitions/entity_edit"      example:        works: -      - ident: "f1f046a3-45c9-4b99-adce-000000000001" +      - ident: "00000000-0000-0000-adce-000000000001"          edit_id: 847          extra: "{}" -        redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +        redirect_ident: "00000000-0000-0000-adce-000000000002"          editgroup_id: 16          revision: 42 -      - ident: "f1f046a3-45c9-4b99-adce-000000000001" +      - ident: "00000000-0000-0000-adce-000000000001"          edit_id: 847          extra: "{}" -        redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +        redirect_ident: "00000000-0000-0000-adce-000000000002"          editgroup_id: 16          revision: 42        creators: -      - ident: "f1f046a3-45c9-4b99-adce-000000000001" +      - ident: "00000000-0000-0000-adce-000000000001"          edit_id: 847          extra: "{}" -        redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +        redirect_ident: "00000000-0000-0000-adce-000000000002"          editgroup_id: 16          revision: 42 -      - ident: "f1f046a3-45c9-4b99-adce-000000000001" +      - ident: "00000000-0000-0000-adce-000000000001"          edit_id: 847          extra: "{}" -        redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +        redirect_ident: "00000000-0000-0000-adce-000000000002"          editgroup_id: 16          revision: 42        files: -      - ident: "f1f046a3-45c9-4b99-adce-000000000001" +      - ident: "00000000-0000-0000-adce-000000000001"          edit_id: 847          extra: "{}" -        redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +        redirect_ident: "00000000-0000-0000-adce-000000000002"          editgroup_id: 16          revision: 42 -      - ident: "f1f046a3-45c9-4b99-adce-000000000001" +      - ident: "00000000-0000-0000-adce-000000000001"          edit_id: 847          extra: "{}" -        redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +        redirect_ident: "00000000-0000-0000-adce-000000000002"          editgroup_id: 16          revision: 42        containers: -      - ident: "f1f046a3-45c9-4b99-adce-000000000001" +      - ident: "00000000-0000-0000-adce-000000000001"          edit_id: 847          extra: "{}" -        redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +        redirect_ident: "00000000-0000-0000-adce-000000000002"          editgroup_id: 16          revision: 42 -      - ident: "f1f046a3-45c9-4b99-adce-000000000001" +      - ident: "00000000-0000-0000-adce-000000000001"          edit_id: 847          extra: "{}" -        redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +        redirect_ident: "00000000-0000-0000-adce-000000000002"          editgroup_id: 16          revision: 42        releases: -      - ident: "f1f046a3-45c9-4b99-adce-000000000001" +      - ident: "00000000-0000-0000-adce-000000000001"          edit_id: 847          extra: "{}" -        redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +        redirect_ident: "00000000-0000-0000-adce-000000000002"          editgroup_id: 16          revision: 42 -      - ident: "f1f046a3-45c9-4b99-adce-000000000001" +      - ident: "00000000-0000-0000-adce-000000000001"          edit_id: 847          extra: "{}" -        redirect_ident: "f1f046a3-45c9-4b99-adce-000000000002" +        redirect_ident: "00000000-0000-0000-adce-000000000002"          editgroup_id: 16          revision: 42      upperCaseName: "EDITGROUP_EDITS" @@ -1921,14 +1969,14 @@ x-entity-props:      - "deleted"    ident:      type: "string" -    example: "f1f046a3-45c9-4b99-adce-000000000001" +    example: "00000000-0000-0000-adce-000000000001"    revision:      type: "integer"      example: 42      format: "int64"    redirect:      type: "string" -    example: "f1f046a3-45c9-4b99-adce-000000000002" +    example: "00000000-0000-0000-adce-000000000002"    editgroup_id:      type: "integer"      example: 16 diff --git a/rust/fatcat-api/src/models.rs b/rust/fatcat-api/src/models.rs index ab18e9b3..140e0c2e 100644 --- a/rust/fatcat-api/src/models.rs +++ b/rust/fatcat-api/src/models.rs @@ -163,8 +163,16 @@ pub struct CreatorEntity {      #[serde(skip_serializing_if = "Option::is_none")]      pub orcid: Option<String>, -    #[serde(rename = "full_name")] -    pub full_name: String, +    #[serde(rename = "surname")] +    #[serde(skip_serializing_if = "Option::is_none")] +    pub surname: Option<String>, + +    #[serde(rename = "given_name")] +    #[serde(skip_serializing_if = "Option::is_none")] +    pub given_name: Option<String>, + +    #[serde(rename = "display_name")] +    pub display_name: String,      // Note: inline enums are not fully supported by swagger-codegen      #[serde(rename = "state")] @@ -193,10 +201,12 @@ pub struct CreatorEntity {  }  impl CreatorEntity { -    pub fn new(full_name: String) -> CreatorEntity { +    pub fn new(display_name: String) -> CreatorEntity {          CreatorEntity {              orcid: None, -            full_name: full_name, +            surname: None, +            given_name: None, +            display_name: display_name,              state: None,              ident: None,              revision: None, @@ -343,10 +353,18 @@ pub struct FileEntity {      #[serde(skip_serializing_if = "Option::is_none")]      pub releases: Option<Vec<String>>, +    #[serde(rename = "mimetype")] +    #[serde(skip_serializing_if = "Option::is_none")] +    pub mimetype: Option<String>, +      #[serde(rename = "url")]      #[serde(skip_serializing_if = "Option::is_none")]      pub url: Option<String>, +    #[serde(rename = "sha256")] +    #[serde(skip_serializing_if = "Option::is_none")] +    pub sha256: Option<String>, +      #[serde(rename = "md5")]      #[serde(skip_serializing_if = "Option::is_none")]      pub md5: Option<String>, @@ -389,7 +407,9 @@ impl FileEntity {      pub fn new() -> FileEntity {          FileEntity {              releases: None, +            mimetype: None,              url: None, +            sha256: None,              md5: None,              sha1: None,              size: None, @@ -413,9 +433,9 @@ pub struct ReleaseContrib {      #[serde(skip_serializing_if = "Option::is_none")]      pub creator_id: Option<String>, -    #[serde(rename = "creator_stub")] +    #[serde(rename = "raw")]      #[serde(skip_serializing_if = "Option::is_none")] -    pub creator_stub: Option<String>, +    pub raw: Option<String>,      #[serde(rename = "role")]      #[serde(skip_serializing_if = "Option::is_none")] @@ -427,7 +447,7 @@ impl ReleaseContrib {          ReleaseContrib {              index: None,              creator_id: None, -            creator_stub: None, +            raw: None,              role: None,          }      } @@ -443,6 +463,10 @@ pub struct ReleaseEntity {      #[serde(skip_serializing_if = "Option::is_none")]      pub contribs: Option<Vec<models::ReleaseContrib>>, +    #[serde(rename = "language")] +    #[serde(skip_serializing_if = "Option::is_none")] +    pub language: Option<String>, +      #[serde(rename = "publisher")]      #[serde(skip_serializing_if = "Option::is_none")]      pub publisher: Option<String>, @@ -467,9 +491,13 @@ pub struct ReleaseEntity {      #[serde(skip_serializing_if = "Option::is_none")]      pub doi: Option<String>, -    #[serde(rename = "date")] +    #[serde(rename = "release_date")] +    #[serde(skip_serializing_if = "Option::is_none")] +    pub release_date: Option<chrono::DateTime<chrono::Utc>>, + +    #[serde(rename = "release_status")]      #[serde(skip_serializing_if = "Option::is_none")] -    pub date: Option<chrono::DateTime<chrono::Utc>>, +    pub release_status: Option<String>,      #[serde(rename = "release_type")]      #[serde(skip_serializing_if = "Option::is_none")] @@ -516,13 +544,15 @@ impl ReleaseEntity {          ReleaseEntity {              refs: None,              contribs: None, +            language: None,              publisher: None,              issue: None,              pages: None,              volume: None,              isbn13: None,              doi: None, -            date: None, +            release_date: None, +            release_status: None,              release_type: None,              container_id: None,              work_id: work_id, @@ -547,9 +577,29 @@ pub struct ReleaseRef {      #[serde(skip_serializing_if = "Option::is_none")]      pub target_release_id: Option<String>, -    #[serde(rename = "stub")] +    #[serde(rename = "raw")] +    #[serde(skip_serializing_if = "Option::is_none")] +    pub raw: Option<String>, + +    #[serde(rename = "key")] +    #[serde(skip_serializing_if = "Option::is_none")] +    pub key: Option<String>, + +    #[serde(rename = "year")] +    #[serde(skip_serializing_if = "Option::is_none")] +    pub year: Option<i64>, + +    #[serde(rename = "container_title")] +    #[serde(skip_serializing_if = "Option::is_none")] +    pub container_title: Option<String>, + +    #[serde(rename = "title")] +    #[serde(skip_serializing_if = "Option::is_none")] +    pub title: Option<String>, + +    #[serde(rename = "locator")]      #[serde(skip_serializing_if = "Option::is_none")] -    pub stub: Option<String>, +    pub locator: Option<String>,  }  impl ReleaseRef { @@ -557,7 +607,12 @@ impl ReleaseRef {          ReleaseRef {              index: None,              target_release_id: None, -            stub: None, +            raw: None, +            key: None, +            year: None, +            container_title: None, +            title: None, +            locator: None,          }      }  } diff --git a/rust/src/api_server.rs b/rust/src/api_server.rs index 0706fc22..c167c067 100644 --- a/rust/src/api_server.rs +++ b/rust/src/api_server.rs @@ -155,7 +155,9 @@ fn creator_row2entity(ident: Option<CreatorIdentRow>, rev: CreatorRevRow) -> Res          None => (None, None, None),      };      Ok(CreatorEntity { -        full_name: rev.full_name, +        display_name: rev.display_name, +        given_name: rev.given_name, +        surname: rev.surname,          orcid: rev.orcid,          state: state,          ident: ident_id, @@ -189,9 +191,11 @@ fn file_row2entity(      Ok(FileEntity {          sha1: rev.sha1, +        sha256: rev.sha256,          md5: rev.md5,          size: rev.size.map(|v| v as i64),          url: rev.url, +        mimetype: rev.mimetype,          releases: Some(releases),          state: state,          ident: ident_id, @@ -223,7 +227,12 @@ fn release_row2entity(          .iter()          .map(|r: &ReleaseRefRow| ReleaseRef {              index: r.index.clone(), -            stub: r.stub.clone(), +            key: r.key.clone(), +            raw: r.raw.clone(), +            container_title: r.container_title.clone(), +            year: r.year.clone(), +            title: r.title.clone(), +            locator: r.locator.clone(),              target_release_id: r.target_release_ident_id.map(|v| v.to_string()),          })          .collect(); @@ -236,7 +245,7 @@ fn release_row2entity(          .map(|c: &ReleaseContribRow| ReleaseContrib {              index: c.index,              role: c.role.clone(), -            creator_stub: c.stub.clone(), +            raw: c.raw.clone(),              creator_id: c.creator_ident_id.map(|v| v.to_string()),          })          .collect(); @@ -244,7 +253,8 @@ fn release_row2entity(      Ok(ReleaseEntity {          title: rev.title,          release_type: rev.release_type, -        date: rev.date +        release_status: rev.release_status, +        release_date: rev.release_date              .map(|v| chrono::DateTime::from_utc(v.and_hms(0, 0, 0), chrono::Utc)),          doi: rev.doi,          isbn13: rev.isbn13, @@ -253,6 +263,7 @@ fn release_row2entity(          issue: rev.issue,          container_id: rev.container_ident_id.map(|u| u.to_string()),          publisher: rev.publisher, +        language: rev.language,          work_id: rev.work_ident_id.to_string(),          refs: Some(refs),          contribs: Some(contribs), @@ -481,16 +492,18 @@ impl Server {          };          let edit: CreatorEditRow = diesel::sql_query( -            "WITH rev AS ( INSERT INTO creator_rev (full_name, orcid, extra_json) -                        VALUES ($1, $2, $3) +            "WITH rev AS ( INSERT INTO creator_rev (display_name, given_name, surname, orcid, extra_json) +                        VALUES ($1, $2, $3, $4, $5)                          RETURNING id ),                  ident AS ( INSERT INTO creator_ident (rev_id)                              VALUES ((SELECT rev.id FROM rev))                              RETURNING id )              INSERT INTO creator_edit (editgroup_id, ident_id, rev_id) VALUES -                ($4, (SELECT ident.id FROM ident), (SELECT rev.id FROM rev)) +                ($6, (SELECT ident.id FROM ident), (SELECT rev.id FROM rev))              RETURNING *", -        ).bind::<diesel::sql_types::Text, _>(entity.full_name) +        ).bind::<diesel::sql_types::Text, _>(entity.display_name) +            .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(entity.given_name) +            .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(entity.surname)              .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(entity.orcid)              .bind::<diesel::sql_types::Nullable<diesel::sql_types::Json>, _>(entity.extra)              .bind::<diesel::sql_types::BigInt, _>(editgroup_id) @@ -521,19 +534,21 @@ impl Server {          let edit: FileEditRow =              diesel::sql_query( -                "WITH rev AS ( INSERT INTO file_rev (size, sha1, md5, url, extra_json) -                        VALUES ($1, $2, $3, $4, $5) +                "WITH rev AS ( INSERT INTO file_rev (size, sha1, sha256, md5, url, mimetype, extra_json) +                        VALUES ($1, $2, $3, $4, $5, $6, $7)                          RETURNING id ),                  ident AS ( INSERT INTO file_ident (rev_id)                              VALUES ((SELECT rev.id FROM rev))                              RETURNING id )              INSERT INTO file_edit (editgroup_id, ident_id, rev_id) VALUES -                ($6, (SELECT ident.id FROM ident), (SELECT rev.id FROM rev)) +                ($8, (SELECT ident.id FROM ident), (SELECT rev.id FROM rev))              RETURNING *",              ).bind::<diesel::sql_types::Nullable<diesel::sql_types::Int8>, _>(entity.size)                  .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(entity.sha1) +                .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(entity.sha256)                  .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(entity.md5)                  .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(entity.url) +                .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(entity.mimetype)                  .bind::<diesel::sql_types::Nullable<diesel::sql_types::Json>, _>(entity.extra)                  .bind::<diesel::sql_types::BigInt, _>(editgroup_id)                  .get_result(conn)?; @@ -590,19 +605,20 @@ impl Server {          };          let edit: ReleaseEditRow = diesel::sql_query( -            "WITH rev AS ( INSERT INTO release_rev (title, release_type, date, doi, isbn13, volume, pages, issue, work_ident_id, container_ident_id, publisher, extra_json) -                        VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) +            "WITH rev AS ( INSERT INTO release_rev (title, release_type, release_status, release_date, doi, isbn13, volume, pages, issue, work_ident_id, container_ident_id, publisher, language, extra_json) +                        VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14)                          RETURNING id ),                  ident AS ( INSERT INTO release_ident (rev_id)                              VALUES ((SELECT rev.id FROM rev))                              RETURNING id )              INSERT INTO release_edit (editgroup_id, ident_id, rev_id) VALUES -                ($13, (SELECT ident.id FROM ident), (SELECT rev.id FROM rev)) +                ($15, (SELECT ident.id FROM ident), (SELECT rev.id FROM rev))              RETURNING *",          ).bind::<diesel::sql_types::Text, _>(entity.title)              .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(entity.release_type) +            .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(entity.release_status)              .bind::<diesel::sql_types::Nullable<diesel::sql_types::Date>, _>( -                entity.date.map(|v| v.naive_utc().date())) +                entity.release_date.map(|v| v.naive_utc().date()))              .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(entity.doi)              .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(entity.isbn13)              .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(entity.volume) @@ -611,6 +627,7 @@ impl Server {              .bind::<diesel::sql_types::Uuid, _>(work_id)              .bind::<diesel::sql_types::Nullable<diesel::sql_types::Uuid>, _>(container_id)              .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(entity.publisher) +            .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(entity.language)              .bind::<diesel::sql_types::Nullable<diesel::sql_types::Json>, _>(entity.extra)              .bind::<diesel::sql_types::BigInt, _>(editgroup_id)              .get_result(conn)?; @@ -629,7 +646,12 @@ impl Server {                                  .clone()                                  .map(|v| uuid::Uuid::parse_str(&v).expect("valid UUID")),                              index: r.index, -                            stub: r.stub.clone(), +                            key: r.key.clone(), +                            container_title: r.container_title.clone(), +                            year: r.year, +                            title: r.title.clone(), +                            locator: r.locator.clone(), +                            raw: r.raw.clone(),                          })                          .collect();                      let ref_rows: Vec<ReleaseRefRow> = insert_into(release_ref::table) @@ -656,7 +678,7 @@ impl Server {                                  .map(|v| uuid::Uuid::parse_str(&v).expect("valid UUID")),                              index: c.index,                              role: c.role.clone(), -                            stub: c.creator_stub.clone(), +                            raw: c.raw.clone(),                          })                          .collect();                      let contrib_rows: Vec<ReleaseContribRow> = insert_into(release_contrib::table) diff --git a/rust/src/database_models.rs b/rust/src/database_models.rs index b62492ab..2d72795e 100644 --- a/rust/src/database_models.rs +++ b/rust/src/database_models.rs @@ -111,7 +111,9 @@ entity_structs!(  pub struct CreatorRevRow {      pub id: i64,      pub extra_json: Option<serde_json::Value>, -    pub full_name: String, +    pub display_name: String, +    pub given_name: Option<String>, +    pub surname: Option<String>,      pub orcid: Option<String>,  } @@ -129,8 +131,10 @@ pub struct FileRevRow {      pub extra_json: Option<serde_json::Value>,      pub size: Option<i64>,      pub sha1: Option<String>, +    pub sha256: Option<String>,      pub md5: Option<String>,      pub url: Option<String>, +    pub mimetype: Option<String>,  }  entity_structs!("file_edit", FileEditRow, "file_ident", FileIdentRow); @@ -144,13 +148,15 @@ pub struct ReleaseRevRow {      pub container_ident_id: Option<Uuid>,      pub title: String,      pub release_type: Option<String>, -    pub date: Option<chrono::NaiveDate>, +    pub release_status: Option<String>, +    pub release_date: Option<chrono::NaiveDate>,      pub doi: Option<String>,      pub isbn13: Option<String>,      pub volume: Option<String>,      pub pages: Option<String>,      pub issue: Option<String>,      pub publisher: Option<String>, +    pub language: Option<String>,  }  entity_structs!( @@ -179,7 +185,7 @@ pub struct ReleaseContribRow {      pub creator_ident_id: Option<Uuid>,      pub role: Option<String>,      pub index: Option<i64>, -    pub stub: Option<String>, +    pub raw: Option<String>,  }  #[derive(Debug, Insertable)] @@ -189,7 +195,7 @@ pub struct ReleaseContribNewRow {      pub creator_ident_id: Option<Uuid>,      pub role: Option<String>,      pub index: Option<i64>, -    pub stub: Option<String>, +    pub raw: Option<String>,  }  #[derive(Debug, Queryable, Identifiable, Associations, AsChangeset)] @@ -199,7 +205,12 @@ pub struct ReleaseRefRow {      pub release_rev: i64,      pub target_release_ident_id: Option<Uuid>,      pub index: Option<i64>, -    pub stub: Option<String>, +    pub key: Option<String>, +    pub raw: Option<String>, +    pub container_title: Option<String>, +    pub year: Option<i64>, +    pub title: Option<String>, +    pub locator: Option<String>,  }  #[derive(Debug, Insertable, AsChangeset)] @@ -208,7 +219,12 @@ pub struct ReleaseRefNewRow {      pub release_rev: i64,      pub target_release_ident_id: Option<Uuid>,      pub index: Option<i64>, -    pub stub: Option<String>, +    pub key: Option<String>, +    pub raw: Option<String>, +    pub container_title: Option<String>, +    pub year: Option<i64>, +    pub title: Option<String>, +    pub locator: Option<String>,  }  #[derive(Debug, Queryable, Insertable, Associations, AsChangeset)] diff --git a/rust/src/database_schema.rs b/rust/src/database_schema.rs index 2541bcd8..d60bb6ee 100644 --- a/rust/src/database_schema.rs +++ b/rust/src/database_schema.rs @@ -62,7 +62,9 @@ table! {      creator_rev (id) {          id -> Int8,          extra_json -> Nullable<Json>, -        full_name -> Text, +        display_name -> Text, +        given_name -> Nullable<Text>, +        surname -> Nullable<Text>,          orcid -> Nullable<Text>,      }  } @@ -118,8 +120,10 @@ table! {          extra_json -> Nullable<Json>,          size -> Nullable<Int8>,          sha1 -> Nullable<Text>, +        sha256 -> Nullable<Text>,          md5 -> Nullable<Text>,          url -> Nullable<Text>, +        mimetype -> Nullable<Text>,      }  } @@ -130,7 +134,7 @@ table! {          creator_ident_id -> Nullable<Uuid>,          role -> Nullable<Text>,          index -> Nullable<Int8>, -        stub -> Nullable<Text>, +        raw -> Nullable<Text>,      }  } @@ -160,7 +164,12 @@ table! {          release_rev -> Int8,          target_release_ident_id -> Nullable<Uuid>,          index -> Nullable<Int8>, -        stub -> Nullable<Text>, +        key -> Nullable<Text>, +        raw -> Nullable<Text>, +        container_title -> Nullable<Text>, +        year -> Nullable<Int8>, +        title -> Nullable<Text>, +        locator -> Nullable<Text>,      }  } @@ -172,13 +181,15 @@ table! {          container_ident_id -> Nullable<Uuid>,          title -> Text,          release_type -> Nullable<Text>, -        date -> Nullable<Date>, +        release_status -> Nullable<Text>, +        release_date -> Nullable<Date>,          doi -> Nullable<Text>,          isbn13 -> Nullable<Text>,          volume -> Nullable<Text>,          pages -> Nullable<Text>,          issue -> Nullable<Text>,          publisher -> Nullable<Text>, +        language -> Nullable<Text>,      }  } diff --git a/rust/tests/test_api_server.rs b/rust/tests/test_api_server.rs index 36605661..9393c09b 100644 --- a/rust/tests/test_api_server.rs +++ b/rust/tests/test_api_server.rs @@ -186,7 +186,7 @@ fn test_post_creator() {          request::post(              "http://localhost:9411/v0/creator",              headers, -            r#"{"full_name": "some person"}"#, +            r#"{"display_name": "some person"}"#,              &router,          ),          status::Created, @@ -215,7 +215,10 @@ fn test_post_file() {              headers,              r#"{"size": 76543,                  "sha1": "f013d66c7f6817d08b7eb2a93e6d0440c1f3e7f8", +                "md5": "f013d66c7f6817d08b7eb2a93e6d0440c1f3e7f8", +                "sha256": "f013d66c7f6817d08b7eb2a93e6d0440c1f3e7f8",                  "url": "http://archive.org/asdf.txt", +                "mimetype": "application/pdf",                  "releases": [                      "00000000-0000-0000-4444-000000000001",                      "00000000-0000-0000-4444-000000000002" @@ -263,17 +266,17 @@ fn test_post_release() {                  "container_id": "00000000-0000-0000-1111-000000000001",                  "refs": [{                          "index": 3, -                        "stub": "just a string" +                        "raw": "just a string"                      },{ -                        "stub": "just a string" +                        "raw": "just a string"                      }],                  "contribs": [{                          "index": 1, -                        "creator_stub": "textual description of contributor (aka, name)", +                        "raw": "textual description of contributor (aka, name)",                          "creator_id": "00000000-0000-0000-2222-000000000001",                          "contrib_type": "author"                      },{ -                        "creator_stub": "shorter" +                        "raw": "shorter"                      }],                  "extra": { "source": "speculation" }                  }"#, | 
