diff options
Diffstat (limited to 'rust')
-rw-r--r-- | rust/fatcat-api/README.md | 2 | ||||
-rw-r--r-- | rust/fatcat-api/api.yaml | 54 | ||||
-rw-r--r-- | rust/fatcat-api/api/swagger.yaml | 142 | ||||
-rw-r--r-- | rust/fatcat-api/examples/client.rs | 12 | ||||
-rw-r--r-- | rust/fatcat-api/examples/server.rs | 2 | ||||
-rw-r--r-- | rust/fatcat-api/examples/server_lib/server.rs | 12 | ||||
-rw-r--r-- | rust/fatcat-api/src/client.rs | 16 | ||||
-rw-r--r-- | rust/fatcat-api/src/models.rs | 87 | ||||
-rw-r--r-- | rust/fatcat-api/src/server.rs | 14 | ||||
-rw-r--r-- | rust/src/api_server.rs | 119 | ||||
-rw-r--r-- | rust/src/database_models.rs | 61 | ||||
-rw-r--r-- | rust/src/database_schema.rs | 75 | ||||
-rw-r--r-- | rust/tests/test_api_server.rs | 5 |
13 files changed, 481 insertions, 120 deletions
diff --git a/rust/fatcat-api/README.md b/rust/fatcat-api/README.md index 5ef72265..f1fbb5cc 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-07-21T02:36:21.158Z +- Build date: 2018-07-24T08:38:19.335Z 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 dde02734..94acccb3 100644 --- a/rust/fatcat-api/api.yaml +++ b/rust/fatcat-api/api.yaml @@ -113,10 +113,21 @@ definitions: type: string #format: custom example: "a77e4c11a57f1d757fca5754a8f83b5d4ece49a2d28596889127c1a2f3f28832" - url: - type: string - format: url - example: "https://example.edu/~frau/prcding.pdf" + urls: + type: array + items: + type: object + required: + - url + - rel + properties: + url: + type: string + format: url + example: "https://example.edu/~frau/prcding.pdf" + rel: + type: string + example: "webarchive" mimetype: type: string example: "application/pdf" @@ -155,6 +166,10 @@ definitions: isbn13: type: string #format: custom + pmid: + type: string + pmcid: + type: string volume: type: string issue: @@ -175,12 +190,27 @@ definitions: type: array items: $ref: "#/definitions/release_ref" + abstracts: + type: array + items: + type: object + properties: + sha1: + type: string + example: "3f242a192acc258bdfdb151943419437f440c313" + content: + type: string + example: "<jats:p>Some abstract thing goes here</jats:p>" + mimetype: + type: string + example: "application/xml+jats" + lang: + type: string + example: "en" work_entity: type: object properties: <<: *ENTITYPROPS - work_type: - type: string entity_history_entry: type: object required: @@ -212,6 +242,10 @@ definitions: type: string #format: uuid example: "86daea5b-1b6b-432a-bb67-ea97795f80fe" + prev_revision: + type: string + #format: uuid + example: "86daea5b-1b6b-432a-bb67-ea97795f80fe" redirect_ident: type: string example: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -301,8 +335,9 @@ definitions: target_release_id: type: string #format: ident - raw: - type: string + extra: + type: object + additionalProperties: {} key: type: string year: @@ -326,6 +361,9 @@ definitions: #format: ident raw: type: string + extra: + type: object + additionalProperties: {} role: type: string stats_response: diff --git a/rust/fatcat-api/api/swagger.yaml b/rust/fatcat-api/api/swagger.yaml index 75b65f4b..3a87109e 100644 --- a/rust/fatcat-api/api/swagger.yaml +++ b/rust/fatcat-api/api/swagger.yaml @@ -2031,10 +2031,10 @@ definitions: mimetype: type: "string" example: "application/pdf" - url: - type: "string" - format: "url" - example: "https://example.edu/~frau/prcding.pdf" + urls: + type: "array" + items: + $ref: "#/definitions/file_entity_urls" sha256: type: "string" example: "a77e4c11a57f1d757fca5754a8f83b5d4ece49a2d28596889127c1a2f3f28832" @@ -2073,12 +2073,16 @@ definitions: redirect: "q3nouwy3nnbsvo3h5klxsx4a7y" sha256: "a77e4c11a57f1d757fca5754a8f83b5d4ece49a2d28596889127c1a2f3f28832" ident: "q3nouwy3nnbsvo3h5klxsx4a7y" - url: "https://example.edu/~frau/prcding.pdf" releases: - "releases" - "releases" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" sha1: "f013d66c7f6817d08b7eb2a93e6d0440c1f3e7f8" + urls: + - rel: "webarchive" + url: "https://example.edu/~frau/prcding.pdf" + - rel: "webarchive" + url: "https://example.edu/~frau/prcding.pdf" size: 1048576 extra: "{}" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2091,6 +2095,10 @@ definitions: required: - "title" properties: + abstracts: + type: "array" + items: + $ref: "#/definitions/release_entity_abstracts" refs: type: "array" items: @@ -2111,6 +2119,10 @@ definitions: example: "12" volume: type: "string" + pmcid: + type: "string" + pmid: + type: "string" isbn13: type: "string" doi: @@ -2158,17 +2170,29 @@ definitions: redirect: "q3nouwy3nnbsvo3h5klxsx4a7y" work_id: "q3nouwy3nnbsvo3h5klxsx4a7y" issue: "12" + abstracts: + - sha1: "3f242a192acc258bdfdb151943419437f440c313" + mimetype: "application/xml+jats" + lang: "en" + content: "<jats:p>Some abstract thing goes here</jats:p>" + - sha1: "3f242a192acc258bdfdb151943419437f440c313" + mimetype: "application/xml+jats" + lang: "en" + content: "<jats:p>Some abstract thing goes here</jats:p>" ident: "q3nouwy3nnbsvo3h5klxsx4a7y" release_type: "book" language: "language" + pmid: "pmid" title: "title" release_status: "preprint" contribs: - role: "role" + extra: "{}" creator_id: "creator_id" index: 1 raw: "raw" - role: "role" + extra: "{}" creator_id: "creator_id" index: 1 raw: "raw" @@ -2179,16 +2203,16 @@ definitions: - target_release_id: "target_release_id" year: 6 container_title: "container_title" + extra: "{}" index: 0 - raw: "raw" title: "title" locator: "p123" key: "key" - target_release_id: "target_release_id" year: 6 container_title: "container_title" + extra: "{}" index: 0 - raw: "raw" title: "title" locator: "p123" key: "key" @@ -2198,14 +2222,13 @@ definitions: publisher: "publisher" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" state: "wip" + pmcid: "pmcid" container_id: "q3nouwy3nnbsvo3h5klxsx4a7y" doi: "10.1234/abcde.789" upperCaseName: "RELEASE_ENTITY" work_entity: type: "object" properties: - work_type: - type: "string" extra: type: "object" editgroup_id: @@ -2231,7 +2254,6 @@ definitions: redirect: "q3nouwy3nnbsvo3h5klxsx4a7y" ident: "q3nouwy3nnbsvo3h5klxsx4a7y" extra: "{}" - work_type: "work_type" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" state: "wip" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" @@ -2259,12 +2281,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" creators: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2272,12 +2296,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" files: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2285,12 +2311,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" containers: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2298,12 +2326,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" releases: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2311,12 +2341,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" description: "description" editor_id: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2327,6 +2359,7 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" changelog_entry: editgroup: @@ -2338,12 +2371,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" creators: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2351,12 +2386,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" files: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2364,12 +2401,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" containers: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2377,12 +2416,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" releases: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2390,12 +2431,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" description: "description" editor_id: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2421,6 +2464,9 @@ definitions: revision: type: "string" example: "86daea5b-1b6b-432a-bb67-ea97795f80fe" + prev_revision: + type: "string" + example: "86daea5b-1b6b-432a-bb67-ea97795f80fe" redirect_ident: type: "string" example: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2435,6 +2481,7 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" upperCaseName: "ENTITY_EDIT" editor: @@ -2478,12 +2525,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" creators: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2491,12 +2540,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" files: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2504,12 +2555,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" containers: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2517,12 +2570,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" releases: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2530,12 +2585,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" description: "description" editor_id: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2569,12 +2626,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" creators: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2582,12 +2641,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" files: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2595,12 +2656,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" containers: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2608,12 +2671,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" releases: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2621,12 +2686,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" description: "description" editor_id: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2643,8 +2710,8 @@ definitions: format: "int64" target_release_id: type: "string" - raw: - type: "string" + extra: + type: "object" key: type: "string" year: @@ -2661,8 +2728,8 @@ definitions: target_release_id: "target_release_id" year: 6 container_title: "container_title" + extra: "{}" index: 0 - raw: "raw" title: "title" locator: "p123" key: "key" @@ -2677,10 +2744,13 @@ definitions: type: "string" raw: type: "string" + extra: + type: "object" role: type: "string" example: role: "role" + extra: "{}" creator_id: "creator_id" index: 1 raw: "raw" @@ -2693,6 +2763,42 @@ definitions: example: extra: "{}" upperCaseName: "STATS_RESPONSE" + file_entity_urls: + required: + - "rel" + - "url" + properties: + url: + type: "string" + format: "url" + example: "https://example.edu/~frau/prcding.pdf" + rel: + type: "string" + example: "webarchive" + example: + rel: "webarchive" + url: "https://example.edu/~frau/prcding.pdf" + upperCaseName: "FILE_ENTITY_URLS" + release_entity_abstracts: + properties: + sha1: + type: "string" + example: "3f242a192acc258bdfdb151943419437f440c313" + content: + type: "string" + example: "<jats:p>Some abstract thing goes here</jats:p>" + mimetype: + type: "string" + example: "application/xml+jats" + lang: + type: "string" + example: "en" + example: + sha1: "3f242a192acc258bdfdb151943419437f440c313" + mimetype: "application/xml+jats" + lang: "en" + content: "<jats:p>Some abstract thing goes here</jats:p>" + upperCaseName: "RELEASE_ENTITY_ABSTRACTS" editgroup_edits: properties: containers: @@ -2722,12 +2828,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" creators: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2735,12 +2843,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" files: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2748,12 +2858,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" containers: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2761,12 +2873,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" releases: - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" @@ -2774,12 +2888,14 @@ definitions: extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" - ident: "q3nouwy3nnbsvo3h5klxsx4a7y" edit_id: 847 extra: "{}" redirect_ident: "q3nouwy3nnbsvo3h5klxsx4a7y" editgroup_id: "q3nouwy3nnbsvo3h5klxsx4a7y" + prev_revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" revision: "86daea5b-1b6b-432a-bb67-ea97795f80fe" upperCaseName: "EDITGROUP_EDITS" x-entity-props: diff --git a/rust/fatcat-api/examples/client.rs b/rust/fatcat-api/examples/client.rs index 3fa6508e..46ff0abd 100644 --- a/rust/fatcat-api/examples/client.rs +++ b/rust/fatcat-api/examples/client.rs @@ -11,11 +11,13 @@ extern crate uuid; use clap::{App, Arg}; #[allow(unused_imports)] -use fatcat::{AcceptEditgroupResponse, ApiError, ApiNoContext, ContextWrapperExt, CreateContainerBatchResponse, CreateContainerResponse, CreateCreatorBatchResponse, CreateCreatorResponse, - CreateEditgroupResponse, CreateFileBatchResponse, CreateFileResponse, CreateReleaseBatchResponse, CreateReleaseResponse, CreateWorkBatchResponse, CreateWorkResponse, - GetChangelogEntryResponse, GetChangelogResponse, GetContainerHistoryResponse, GetContainerResponse, GetCreatorHistoryResponse, GetCreatorReleasesResponse, GetCreatorResponse, - GetEditgroupResponse, GetEditorChangelogResponse, GetEditorResponse, GetFileHistoryResponse, GetFileResponse, GetReleaseFilesResponse, GetReleaseHistoryResponse, GetReleaseResponse, - GetStatsResponse, GetWorkHistoryResponse, GetWorkReleasesResponse, GetWorkResponse, LookupContainerResponse, LookupCreatorResponse, LookupFileResponse, LookupReleaseResponse}; +use fatcat::{ + AcceptEditgroupResponse, ApiError, ApiNoContext, ContextWrapperExt, CreateContainerBatchResponse, CreateContainerResponse, CreateCreatorBatchResponse, CreateCreatorResponse, + CreateEditgroupResponse, CreateFileBatchResponse, CreateFileResponse, CreateReleaseBatchResponse, CreateReleaseResponse, CreateWorkBatchResponse, CreateWorkResponse, GetChangelogEntryResponse, + GetChangelogResponse, GetContainerHistoryResponse, GetContainerResponse, GetCreatorHistoryResponse, GetCreatorReleasesResponse, GetCreatorResponse, GetEditgroupResponse, + GetEditorChangelogResponse, GetEditorResponse, GetFileHistoryResponse, GetFileResponse, GetReleaseFilesResponse, GetReleaseHistoryResponse, GetReleaseResponse, GetStatsResponse, + GetWorkHistoryResponse, GetWorkReleasesResponse, GetWorkResponse, LookupContainerResponse, LookupCreatorResponse, LookupFileResponse, LookupReleaseResponse, +}; #[allow(unused_imports)] use futures::{future, stream, Future, Stream}; diff --git a/rust/fatcat-api/examples/server.rs b/rust/fatcat-api/examples/server.rs index 612ec4b2..8d2e9b64 100644 --- a/rust/fatcat-api/examples/server.rs +++ b/rust/fatcat-api/examples/server.rs @@ -19,10 +19,10 @@ extern crate futures; extern crate error_chain; use clap::{App, Arg}; -use hyper_openssl::OpensslServer; use hyper_openssl::openssl::error::ErrorStack; use hyper_openssl::openssl::ssl::{SslAcceptorBuilder, SslMethod}; use hyper_openssl::openssl::x509::X509_FILETYPE_PEM; +use hyper_openssl::OpensslServer; use iron::{Chain, Iron}; use swagger::auth::AllowAllMiddleware; diff --git a/rust/fatcat-api/examples/server_lib/server.rs b/rust/fatcat-api/examples/server_lib/server.rs index 608d715f..a25e175f 100644 --- a/rust/fatcat-api/examples/server_lib/server.rs +++ b/rust/fatcat-api/examples/server_lib/server.rs @@ -10,11 +10,13 @@ use std::collections::HashMap; use swagger; use fatcat::models; -use fatcat::{AcceptEditgroupResponse, Api, ApiError, Context, CreateContainerBatchResponse, CreateContainerResponse, CreateCreatorBatchResponse, CreateCreatorResponse, CreateEditgroupResponse, - CreateFileBatchResponse, CreateFileResponse, CreateReleaseBatchResponse, CreateReleaseResponse, CreateWorkBatchResponse, CreateWorkResponse, GetChangelogEntryResponse, - GetChangelogResponse, GetContainerHistoryResponse, GetContainerResponse, GetCreatorHistoryResponse, GetCreatorReleasesResponse, GetCreatorResponse, GetEditgroupResponse, - GetEditorChangelogResponse, GetEditorResponse, GetFileHistoryResponse, GetFileResponse, GetReleaseFilesResponse, GetReleaseHistoryResponse, GetReleaseResponse, GetStatsResponse, - GetWorkHistoryResponse, GetWorkReleasesResponse, GetWorkResponse, LookupContainerResponse, LookupCreatorResponse, LookupFileResponse, LookupReleaseResponse}; +use fatcat::{ + AcceptEditgroupResponse, Api, ApiError, Context, CreateContainerBatchResponse, CreateContainerResponse, CreateCreatorBatchResponse, CreateCreatorResponse, CreateEditgroupResponse, + CreateFileBatchResponse, CreateFileResponse, CreateReleaseBatchResponse, CreateReleaseResponse, CreateWorkBatchResponse, CreateWorkResponse, GetChangelogEntryResponse, GetChangelogResponse, + GetContainerHistoryResponse, GetContainerResponse, GetCreatorHistoryResponse, GetCreatorReleasesResponse, GetCreatorResponse, GetEditgroupResponse, GetEditorChangelogResponse, GetEditorResponse, + GetFileHistoryResponse, GetFileResponse, GetReleaseFilesResponse, GetReleaseHistoryResponse, GetReleaseResponse, GetStatsResponse, GetWorkHistoryResponse, GetWorkReleasesResponse, + GetWorkResponse, LookupContainerResponse, LookupCreatorResponse, LookupFileResponse, LookupReleaseResponse, +}; #[derive(Copy, Clone)] pub struct Server; diff --git a/rust/fatcat-api/src/client.rs b/rust/fatcat-api/src/client.rs index b785adab..2b6fd2a6 100644 --- a/rust/fatcat-api/src/client.rs +++ b/rust/fatcat-api/src/client.rs @@ -6,14 +6,14 @@ extern crate url; use self::hyper_openssl::openssl; use self::url::percent_encoding::{utf8_percent_encode, PATH_SEGMENT_ENCODE_SET, QUERY_ENCODE_SET}; use futures; -use futures::{Future, Stream}; use futures::{future, stream}; +use futures::{Future, Stream}; use hyper; -use hyper::Url; use hyper::client::IntoUrl; use hyper::header::{ContentType, Headers}; use hyper::mime; use hyper::mime::{Attr, Mime, SubLevel, TopLevel, Value}; +use hyper::Url; use std::borrow::Cow; use std::error; use std::fmt; @@ -34,11 +34,13 @@ use swagger; use swagger::{ApiError, Context, XSpanId}; use models; -use {AcceptEditgroupResponse, Api, CreateContainerBatchResponse, CreateContainerResponse, CreateCreatorBatchResponse, CreateCreatorResponse, CreateEditgroupResponse, CreateFileBatchResponse, - CreateFileResponse, CreateReleaseBatchResponse, CreateReleaseResponse, CreateWorkBatchResponse, CreateWorkResponse, GetChangelogEntryResponse, GetChangelogResponse, GetContainerHistoryResponse, - GetContainerResponse, GetCreatorHistoryResponse, GetCreatorReleasesResponse, GetCreatorResponse, GetEditgroupResponse, GetEditorChangelogResponse, GetEditorResponse, GetFileHistoryResponse, - GetFileResponse, GetReleaseFilesResponse, GetReleaseHistoryResponse, GetReleaseResponse, GetStatsResponse, GetWorkHistoryResponse, GetWorkReleasesResponse, GetWorkResponse, - LookupContainerResponse, LookupCreatorResponse, LookupFileResponse, LookupReleaseResponse}; +use { + AcceptEditgroupResponse, Api, CreateContainerBatchResponse, CreateContainerResponse, CreateCreatorBatchResponse, CreateCreatorResponse, CreateEditgroupResponse, CreateFileBatchResponse, + CreateFileResponse, CreateReleaseBatchResponse, CreateReleaseResponse, CreateWorkBatchResponse, CreateWorkResponse, GetChangelogEntryResponse, GetChangelogResponse, GetContainerHistoryResponse, + GetContainerResponse, GetCreatorHistoryResponse, GetCreatorReleasesResponse, GetCreatorResponse, GetEditgroupResponse, GetEditorChangelogResponse, GetEditorResponse, GetFileHistoryResponse, + GetFileResponse, GetReleaseFilesResponse, GetReleaseHistoryResponse, GetReleaseResponse, GetStatsResponse, GetWorkHistoryResponse, GetWorkReleasesResponse, GetWorkResponse, + LookupContainerResponse, LookupCreatorResponse, LookupFileResponse, LookupReleaseResponse, +}; /// Convert input into a base path, e.g. "http://example:123". Also checks the scheme as it goes. fn into_base_path<T: IntoUrl>(input: T, correct_scheme: Option<&'static str>) -> Result<String, ClientInitError> { diff --git a/rust/fatcat-api/src/models.rs b/rust/fatcat-api/src/models.rs index 4ecc180c..d798fe03 100644 --- a/rust/fatcat-api/src/models.rs +++ b/rust/fatcat-api/src/models.rs @@ -258,6 +258,10 @@ pub struct EntityEdit { #[serde(skip_serializing_if = "Option::is_none")] pub revision: Option<String>, + #[serde(rename = "prev_revision")] + #[serde(skip_serializing_if = "Option::is_none")] + pub prev_revision: Option<String>, + #[serde(rename = "redirect_ident")] #[serde(skip_serializing_if = "Option::is_none")] pub redirect_ident: Option<String>, @@ -276,6 +280,7 @@ impl EntityEdit { edit_id: edit_id, ident: ident, revision: None, + prev_revision: None, redirect_ident: None, editgroup_id: editgroup_id, extra: None, @@ -327,9 +332,9 @@ pub struct FileEntity { #[serde(skip_serializing_if = "Option::is_none")] pub mimetype: Option<String>, - #[serde(rename = "url")] + #[serde(rename = "urls")] #[serde(skip_serializing_if = "Option::is_none")] - pub url: Option<String>, + pub urls: Option<Vec<models::FileEntityUrls>>, #[serde(rename = "sha256")] #[serde(skip_serializing_if = "Option::is_none")] @@ -378,7 +383,7 @@ impl FileEntity { FileEntity { releases: None, mimetype: None, - url: None, + urls: None, sha256: None, md5: None, sha1: None, @@ -394,6 +399,21 @@ impl FileEntity { } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct FileEntityUrls { + #[serde(rename = "url")] + pub url: String, + + #[serde(rename = "rel")] + pub rel: String, +} + +impl FileEntityUrls { + pub fn new(url: String, rel: String) -> FileEntityUrls { + FileEntityUrls { url: url, rel: rel } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct ReleaseContrib { #[serde(rename = "index")] #[serde(skip_serializing_if = "Option::is_none")] @@ -407,6 +427,10 @@ pub struct ReleaseContrib { #[serde(skip_serializing_if = "Option::is_none")] pub raw: Option<String>, + #[serde(rename = "extra")] + #[serde(skip_serializing_if = "Option::is_none")] + pub extra: Option<serde_json::Value>, + #[serde(rename = "role")] #[serde(skip_serializing_if = "Option::is_none")] pub role: Option<String>, @@ -418,6 +442,7 @@ impl ReleaseContrib { index: None, creator_id: None, raw: None, + extra: None, role: None, } } @@ -425,6 +450,10 @@ impl ReleaseContrib { #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct ReleaseEntity { + #[serde(rename = "abstracts")] + #[serde(skip_serializing_if = "Option::is_none")] + pub abstracts: Option<Vec<models::ReleaseEntityAbstracts>>, + #[serde(rename = "refs")] #[serde(skip_serializing_if = "Option::is_none")] pub refs: Option<Vec<models::ReleaseRef>>, @@ -454,6 +483,14 @@ pub struct ReleaseEntity { #[serde(skip_serializing_if = "Option::is_none")] pub volume: Option<String>, + #[serde(rename = "pmcid")] + #[serde(skip_serializing_if = "Option::is_none")] + pub pmcid: Option<String>, + + #[serde(rename = "pmid")] + #[serde(skip_serializing_if = "Option::is_none")] + pub pmid: Option<String>, + #[serde(rename = "isbn13")] #[serde(skip_serializing_if = "Option::is_none")] pub isbn13: Option<String>, @@ -514,6 +551,7 @@ pub struct ReleaseEntity { impl ReleaseEntity { pub fn new(title: String) -> ReleaseEntity { ReleaseEntity { + abstracts: None, refs: None, contribs: None, language: None, @@ -521,6 +559,8 @@ impl ReleaseEntity { pages: None, issue: None, volume: None, + pmcid: None, + pmid: None, isbn13: None, doi: None, release_date: None, @@ -540,6 +580,36 @@ impl ReleaseEntity { } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct ReleaseEntityAbstracts { + #[serde(rename = "sha1")] + #[serde(skip_serializing_if = "Option::is_none")] + pub sha1: Option<String>, + + #[serde(rename = "content")] + #[serde(skip_serializing_if = "Option::is_none")] + pub content: Option<String>, + + #[serde(rename = "mimetype")] + #[serde(skip_serializing_if = "Option::is_none")] + pub mimetype: Option<String>, + + #[serde(rename = "lang")] + #[serde(skip_serializing_if = "Option::is_none")] + pub lang: Option<String>, +} + +impl ReleaseEntityAbstracts { + pub fn new() -> ReleaseEntityAbstracts { + ReleaseEntityAbstracts { + sha1: None, + content: None, + mimetype: None, + lang: None, + } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct ReleaseRef { #[serde(rename = "index")] #[serde(skip_serializing_if = "Option::is_none")] @@ -549,9 +619,9 @@ pub struct ReleaseRef { #[serde(skip_serializing_if = "Option::is_none")] pub target_release_id: Option<String>, - #[serde(rename = "raw")] + #[serde(rename = "extra")] #[serde(skip_serializing_if = "Option::is_none")] - pub raw: Option<String>, + pub extra: Option<serde_json::Value>, #[serde(rename = "key")] #[serde(skip_serializing_if = "Option::is_none")] @@ -579,7 +649,7 @@ impl ReleaseRef { ReleaseRef { index: None, target_release_id: None, - raw: None, + extra: None, key: None, year: None, container_title: None, @@ -616,10 +686,6 @@ impl Success { #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct WorkEntity { - #[serde(rename = "work_type")] - #[serde(skip_serializing_if = "Option::is_none")] - pub work_type: Option<String>, - #[serde(rename = "extra")] #[serde(skip_serializing_if = "Option::is_none")] pub extra: Option<serde_json::Value>, @@ -649,7 +715,6 @@ pub struct WorkEntity { impl WorkEntity { pub fn new() -> WorkEntity { WorkEntity { - work_type: None, extra: None, editgroup_id: None, redirect: None, diff --git a/rust/fatcat-api/src/server.rs b/rust/fatcat-api/src/server.rs index e4e0bc1d..e94fd5ef 100644 --- a/rust/fatcat-api/src/server.rs +++ b/rust/fatcat-api/src/server.rs @@ -12,8 +12,8 @@ use self::iron::url::percent_encoding::percent_decode; use self::iron::{modifiers, status, BeforeMiddleware}; use self::router::Router; use self::urlencoded::UrlEncodedQuery; -use futures::Future; use futures::future; +use futures::Future; use futures::{stream, Stream}; use hyper; use hyper::header::{ContentType, Headers}; @@ -36,11 +36,13 @@ use swagger::{ApiError, Context, XSpanId}; #[allow(unused_imports)] use models; -use {AcceptEditgroupResponse, Api, CreateContainerBatchResponse, CreateContainerResponse, CreateCreatorBatchResponse, CreateCreatorResponse, CreateEditgroupResponse, CreateFileBatchResponse, - CreateFileResponse, CreateReleaseBatchResponse, CreateReleaseResponse, CreateWorkBatchResponse, CreateWorkResponse, GetChangelogEntryResponse, GetChangelogResponse, GetContainerHistoryResponse, - GetContainerResponse, GetCreatorHistoryResponse, GetCreatorReleasesResponse, GetCreatorResponse, GetEditgroupResponse, GetEditorChangelogResponse, GetEditorResponse, GetFileHistoryResponse, - GetFileResponse, GetReleaseFilesResponse, GetReleaseHistoryResponse, GetReleaseResponse, GetStatsResponse, GetWorkHistoryResponse, GetWorkReleasesResponse, GetWorkResponse, - LookupContainerResponse, LookupCreatorResponse, LookupFileResponse, LookupReleaseResponse}; +use { + AcceptEditgroupResponse, Api, CreateContainerBatchResponse, CreateContainerResponse, CreateCreatorBatchResponse, CreateCreatorResponse, CreateEditgroupResponse, CreateFileBatchResponse, + CreateFileResponse, CreateReleaseBatchResponse, CreateReleaseResponse, CreateWorkBatchResponse, CreateWorkResponse, GetChangelogEntryResponse, GetChangelogResponse, GetContainerHistoryResponse, + GetContainerResponse, GetCreatorHistoryResponse, GetCreatorReleasesResponse, GetCreatorResponse, GetEditgroupResponse, GetEditorChangelogResponse, GetEditorResponse, GetFileHistoryResponse, + GetFileResponse, GetReleaseFilesResponse, GetReleaseHistoryResponse, GetReleaseResponse, GetStatsResponse, GetWorkHistoryResponse, GetWorkReleasesResponse, GetWorkResponse, + LookupContainerResponse, LookupCreatorResponse, LookupFileResponse, LookupReleaseResponse, +}; header! { (Warning, "Warning") => [String] } diff --git a/rust/src/api_server.rs b/rust/src/api_server.rs index b260a98a..a2a3a182 100644 --- a/rust/src/api_server.rs +++ b/rust/src/api_server.rs @@ -1,19 +1,21 @@ //! API endpoint handlers -use ConnectionPool; -use api_helpers::{accept_editgroup, get_or_create_editgroup, fcid2uuid, uuid2fcid}; +use api_helpers::{accept_editgroup, fcid2uuid, get_or_create_editgroup, uuid2fcid}; use chrono; use database_models::*; -use database_schema::{changelog, container_edit, container_ident, container_rev, creator_edit, - creator_ident, creator_rev, editgroup, editor, file_edit, file_ident, - file_release, file_rev, release_contrib, release_edit, release_ident, - release_ref, release_rev, work_edit, work_ident, work_rev}; +use database_schema::{ + changelog, container_edit, container_ident, container_rev, creator_edit, creator_ident, + creator_rev, editgroup, editor, file_edit, file_ident, file_release, file_rev, file_rev_url, + release_contrib, release_edit, release_ident, release_ref, release_rev, release_rev_abstract, + work_edit, work_ident, work_rev, +}; use diesel::prelude::*; use diesel::{self, insert_into}; use errors::*; use fatcat_api::models; use fatcat_api::models::*; use uuid::Uuid; +use ConnectionPool; type DbConn = diesel::r2d2::PooledConnection<diesel::r2d2::ConnectionManager<diesel::PgConnection>>; @@ -146,8 +148,18 @@ fn file_row2entity( let releases: Vec<String> = file_release::table .filter(file_release::file_rev.eq(rev.id)) .get_results(conn)? - .iter() - .map(|r: &FileReleaseRow| uuid2fcid(&r.target_release_ident_id)) + .into_iter() + .map(|r: FileReleaseRow| uuid2fcid(&r.target_release_ident_id)) + .collect(); + + let urls: Vec<FileEntityUrls> = file_rev_url::table + .filter(file_rev_url::file_rev.eq(rev.id)) + .get_results(conn)? + .into_iter() + .map(|r: FileRevUrlRow| FileEntityUrls { + rel: r.rel, + url: r.url, + }) .collect(); Ok(FileEntity { @@ -155,7 +167,7 @@ fn file_row2entity( sha256: rev.sha256, md5: rev.md5, size: rev.size.map(|v| v as i64), - url: rev.url, + urls: Some(urls), mimetype: rev.mimetype, releases: Some(releases), state: state, @@ -186,15 +198,15 @@ fn release_row2entity( .order(release_ref::index.asc()) .get_results(conn) .expect("fetch release refs") - .iter() - .map(|r: &ReleaseRefRow| ReleaseRef { - index: r.index.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(), + .into_iter() + .map(|r: ReleaseRefRow| ReleaseRef { + index: r.index, + key: r.key, + extra: r.extra_json, + container_title: r.container_title, + year: r.year, + title: r.title, + locator: r.locator, target_release_id: r.target_release_ident_id.map(|v| uuid2fcid(&v)), }) .collect(); @@ -204,15 +216,29 @@ fn release_row2entity( .order((release_contrib::role.asc(), release_contrib::index.asc())) .get_results(conn) .expect("fetch release refs") - .iter() - .map(|c: &ReleaseContribRow| ReleaseContrib { + .into_iter() + .map(|c: ReleaseContribRow| ReleaseContrib { index: c.index, - role: c.role.clone(), - raw: c.raw.clone(), + raw: c.raw, + role: c.role, + extra: c.extra_json, creator_id: c.creator_ident_id.map(|v| uuid2fcid(&v)), }) .collect(); + // XXX: join abstracts table + let abstracts: Vec<ReleaseEntityAbstracts> = release_rev_abstract::table + .filter(release_rev_abstract::release_rev.eq(rev.id)) + .get_results(conn)? + .into_iter() + .map(|r: ReleaseRevAbstractRow| ReleaseEntityAbstracts { + sha1: Some(r.abstract_sha1), + mimetype: r.mimetype, + lang: r.lang, + content: None, + }) + .collect(); + Ok(ReleaseEntity { title: rev.title, release_type: rev.release_type, @@ -220,6 +246,8 @@ fn release_row2entity( release_date: rev.release_date .map(|v| chrono::DateTime::from_utc(v.and_hms(0, 0, 0), chrono::Utc)), doi: rev.doi, + pmid: rev.pmid, + pmcid: rev.pmcid, isbn13: rev.isbn13, volume: rev.volume, issue: rev.issue, @@ -230,6 +258,7 @@ fn release_row2entity( work_id: Some(uuid2fcid(&rev.work_ident_id)), refs: Some(refs), contribs: Some(contribs), + abstracts: Some(abstracts), state: state, ident: ident_id, revision: Some(rev.id.to_string()), @@ -249,7 +278,6 @@ fn work_row2entity(ident: Option<WorkIdentRow>, rev: WorkRevRow) -> Result<WorkE None => (None, None, None), }; Ok(WorkEntity { - work_type: rev.work_type, state: state, ident: ident_id, revision: Some(rev.id.to_string()), @@ -530,20 +558,19 @@ impl Server { let edit: FileEditRow = diesel::sql_query( - "WITH rev AS ( INSERT INTO file_rev (size, sha1, sha256, md5, url, mimetype, extra_json) - VALUES ($1, $2, $3, $4, $5, $6, $7) + "WITH rev AS ( INSERT INTO file_rev (size, sha1, sha256, md5, mimetype, extra_json) + VALUES ($1, $2, $3, $4, $5, $6) 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 - ($8, (SELECT ident.id FROM ident), (SELECT rev.id FROM rev)) + ($7, (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::Uuid, _>(editgroup_id) @@ -572,6 +599,29 @@ impl Server { } }; + let _urls: Option<Vec<FileRevUrlRow>> = match entity.urls { + None => None, + Some(url_list) => { + if url_list.len() == 0 { + Some(vec![]) + } else { + let url_rows: Vec<FileRevUrlNewRow> = url_list + .into_iter() + .map(|u| FileRevUrlNewRow { + file_rev: edit.rev_id.unwrap(), + rel: u.rel, + url: u.url, + }) + .collect(); + let url_rows: Vec<FileRevUrlRow> = insert_into(file_rev_url::table) + .values(url_rows) + .get_results(conn) + .expect("error inserting file_rev_url"); + Some(url_rows) + } + } + }; + edit.to_model() } @@ -600,7 +650,6 @@ impl Server { None => { // If a work_id wasn't passed, create a new work under the current editgroup let work_model = models::WorkEntity { - work_type: None, ident: None, revision: None, redirect: None, @@ -665,7 +714,7 @@ impl Server { year: r.year, title: r.title.clone(), locator: r.locator.clone(), - raw: r.raw.clone(), + extra_json: r.extra.clone(), }) .collect(); let ref_rows: Vec<ReleaseRefRow> = insert_into(release_ref::table) @@ -690,9 +739,10 @@ impl Server { creator_ident_id: c.creator_id .clone() .map(|v| fcid2uuid(&v).expect("valid fatcat identifier")), + raw: c.raw.clone(), index: c.index, role: c.role.clone(), - raw: c.raw.clone(), + extra_json: c.extra.clone(), }) .collect(); let contrib_rows: Vec<ReleaseContribRow> = insert_into(release_contrib::table) @@ -730,17 +780,16 @@ impl Server { let edit: WorkEditRow = diesel::sql_query( - "WITH rev AS ( INSERT INTO work_rev (work_type, extra_json) - VALUES ($1, $2) + "WITH rev AS ( INSERT INTO work_rev (extra_json) + VALUES ($1) RETURNING id ), ident AS ( INSERT INTO work_ident (rev_id) VALUES ((SELECT rev.id FROM rev)) RETURNING id ) INSERT INTO work_edit (editgroup_id, ident_id, rev_id) VALUES - ($3, (SELECT ident.id FROM ident), (SELECT rev.id FROM rev)) + ($2, (SELECT ident.id FROM ident), (SELECT rev.id FROM rev)) RETURNING *", - ).bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(entity.work_type) - .bind::<diesel::sql_types::Nullable<diesel::sql_types::Json>, _>(entity.extra) + ).bind::<diesel::sql_types::Nullable<diesel::sql_types::Json>, _>(entity.extra) .bind::<diesel::sql_types::Uuid, _>(editgroup_id) .get_result(conn)?; diff --git a/rust/src/database_models.rs b/rust/src/database_models.rs index 167d2fbe..58dc4d42 100644 --- a/rust/src/database_models.rs +++ b/rust/src/database_models.rs @@ -43,9 +43,11 @@ macro_rules! entity_structs { pub struct $edit_struct { pub id: i64, pub editgroup_id: Uuid, + pub updated: chrono::NaiveDateTime, pub ident_id: Uuid, pub rev_id: Option<Uuid>, pub redirect_id: Option<Uuid>, + pub prev_rev: Option<Uuid>, pub extra_json: Option<serde_json::Value>, } @@ -56,6 +58,7 @@ macro_rules! entity_structs { editgroup_id: uuid2fcid(&self.editgroup_id), revision: self.rev_id.map(|v| v.to_string()), redirect_ident: self.redirect_id.map(|v| uuid2fcid(&v)), + prev_revision: self.prev_rev.map(|v| v.to_string()), ident: uuid2fcid(&self.ident_id), edit_id: self.id, extra: self.extra_json, @@ -96,6 +99,7 @@ pub struct ContainerRevRow { pub name: String, pub publisher: Option<String>, pub issnl: Option<String>, + pub wikidata_qid: Option<String>, pub abbrev: Option<String>, pub coden: Option<String>, } @@ -116,6 +120,7 @@ pub struct CreatorRevRow { pub given_name: Option<String>, pub surname: Option<String>, pub orcid: Option<String>, + pub wikidata_qid: Option<String>, } entity_structs!( @@ -126,6 +131,23 @@ entity_structs!( ); #[derive(Debug, Queryable, Identifiable, Associations, AsChangeset)] +#[table_name = "file_rev_url"] +pub struct FileRevUrlRow { + pub id: i64, + pub file_rev: Uuid, + pub rel: String, + pub url: String, +} + +#[derive(Debug, Queryable, Associations, AsChangeset, Insertable)] +#[table_name = "file_rev_url"] +pub struct FileRevUrlNewRow { + pub file_rev: Uuid, + pub rel: String, + pub url: String, +} + +#[derive(Debug, Queryable, Identifiable, Associations, AsChangeset)] #[table_name = "file_rev"] pub struct FileRevRow { pub id: Uuid, @@ -134,7 +156,6 @@ pub struct FileRevRow { pub sha1: Option<String>, pub sha256: Option<String>, pub md5: Option<String>, - pub url: Option<String>, pub mimetype: Option<String>, } @@ -152,6 +173,9 @@ pub struct ReleaseRevRow { pub release_status: Option<String>, pub release_date: Option<chrono::NaiveDate>, pub doi: Option<String>, + pub pmid: Option<String>, + pub pmcid: Option<String>, + pub wikidata_qid: Option<String>, pub isbn13: Option<String>, pub volume: Option<String>, pub issue: Option<String>, @@ -172,21 +196,39 @@ entity_structs!( pub struct WorkRevRow { pub id: Uuid, pub extra_json: Option<serde_json::Value>, - pub work_type: Option<String>, - pub primary_release_id: Option<Uuid>, } entity_structs!("work_edit", WorkEditRow, "work_ident", WorkIdentRow); #[derive(Debug, Queryable, Identifiable, Associations, AsChangeset)] +#[table_name = "release_rev_abstract"] +pub struct ReleaseRevAbstractRow { + pub id: i64, + pub release_rev: Uuid, + pub abstract_sha1: String, + pub mimetype: Option<String>, + pub lang: Option<String>, +} + +#[derive(Debug, Queryable, Associations, AsChangeset, Insertable)] +#[table_name = "release_rev_abstract"] +pub struct ReleaseRevAbstractNewRow { + pub release_rev: Uuid, + pub abstract_sha1: String, + pub mimetype: Option<String>, + pub lang: Option<String>, +} + +#[derive(Debug, Queryable, Identifiable, Associations, AsChangeset)] #[table_name = "release_contrib"] pub struct ReleaseContribRow { pub id: i64, pub release_rev: Uuid, pub creator_ident_id: Option<Uuid>, + pub raw: Option<String>, pub role: Option<String>, pub index: Option<i64>, - pub raw: Option<String>, + pub extra_json: Option<serde_json::Value>, } #[derive(Debug, Insertable)] @@ -194,9 +236,10 @@ pub struct ReleaseContribRow { pub struct ReleaseContribNewRow { pub release_rev: Uuid, pub creator_ident_id: Option<Uuid>, + pub raw: Option<String>, pub role: Option<String>, pub index: Option<i64>, - pub raw: Option<String>, + pub extra_json: Option<serde_json::Value>, } #[derive(Debug, Queryable, Identifiable, Associations, AsChangeset)] @@ -207,7 +250,7 @@ pub struct ReleaseRefRow { pub target_release_ident_id: Option<Uuid>, pub index: Option<i64>, pub key: Option<String>, - pub raw: Option<String>, + pub extra_json: Option<serde_json::Value>, pub container_title: Option<String>, pub year: Option<i64>, pub title: Option<String>, @@ -221,7 +264,7 @@ pub struct ReleaseRefNewRow { pub target_release_ident_id: Option<Uuid>, pub index: Option<i64>, pub key: Option<String>, - pub raw: Option<String>, + pub extra_json: Option<serde_json::Value>, pub container_title: Option<String>, pub year: Option<i64>, pub title: Option<String>, @@ -239,8 +282,9 @@ pub struct FileReleaseRow { #[table_name = "editgroup"] pub struct EditgroupRow { pub id: Uuid, - pub extra_json: Option<serde_json::Value>, pub editor_id: Uuid, + pub created: chrono::NaiveDateTime, + pub extra_json: Option<serde_json::Value>, pub description: Option<String>, } @@ -264,6 +308,7 @@ pub struct EditorRow { pub id: Uuid, pub username: String, pub is_admin: bool, + pub registered: chrono::NaiveDateTime, pub active_editgroup_id: Option<Uuid>, } diff --git a/rust/src/database_schema.rs b/rust/src/database_schema.rs index d99fdd3f..c23e3f83 100644 --- a/rust/src/database_schema.rs +++ b/rust/src/database_schema.rs @@ -1,4 +1,11 @@ table! { + abstracts (sha1) { + sha1 -> Bpchar, + content -> Text, + } +} + +table! { changelog (id) { id -> Int8, editgroup_id -> Uuid, @@ -10,9 +17,11 @@ table! { container_edit (id) { id -> Int8, editgroup_id -> Uuid, + updated -> Timestamp, ident_id -> Uuid, rev_id -> Nullable<Uuid>, redirect_id -> Nullable<Uuid>, + prev_rev -> Nullable<Uuid>, extra_json -> Nullable<Json>, } } @@ -32,7 +41,8 @@ table! { extra_json -> Nullable<Json>, name -> Text, publisher -> Nullable<Text>, - issnl -> Nullable<Text>, + issnl -> Nullable<Bpchar>, + wikidata_qid -> Nullable<Text>, abbrev -> Nullable<Text>, coden -> Nullable<Text>, } @@ -42,9 +52,11 @@ table! { creator_edit (id) { id -> Int8, editgroup_id -> Uuid, + updated -> Timestamp, ident_id -> Uuid, rev_id -> Nullable<Uuid>, redirect_id -> Nullable<Uuid>, + prev_rev -> Nullable<Uuid>, extra_json -> Nullable<Json>, } } @@ -65,15 +77,17 @@ table! { display_name -> Text, given_name -> Nullable<Text>, surname -> Nullable<Text>, - orcid -> Nullable<Text>, + orcid -> Nullable<Bpchar>, + wikidata_qid -> Nullable<Text>, } } table! { editgroup (id) { id -> Uuid, - extra_json -> Nullable<Json>, editor_id -> Uuid, + created -> Timestamp, + extra_json -> Nullable<Json>, description -> Nullable<Text>, } } @@ -83,6 +97,7 @@ table! { id -> Uuid, username -> Text, is_admin -> Bool, + registered -> Timestamp, active_editgroup_id -> Nullable<Uuid>, } } @@ -91,9 +106,11 @@ table! { file_edit (id) { id -> Int8, editgroup_id -> Uuid, + updated -> Timestamp, ident_id -> Uuid, rev_id -> Nullable<Uuid>, redirect_id -> Nullable<Uuid>, + prev_rev -> Nullable<Uuid>, extra_json -> Nullable<Json>, } } @@ -119,22 +136,31 @@ table! { id -> Uuid, extra_json -> Nullable<Json>, size -> Nullable<Int8>, - sha1 -> Nullable<Text>, - sha256 -> Nullable<Text>, - md5 -> Nullable<Text>, - url -> Nullable<Text>, + sha1 -> Nullable<Bpchar>, + sha256 -> Nullable<Bpchar>, + md5 -> Nullable<Bpchar>, mimetype -> Nullable<Text>, } } table! { + file_rev_url (id) { + id -> Int8, + file_rev -> Uuid, + rel -> Text, + url -> Text, + } +} + +table! { release_contrib (id) { id -> Int8, release_rev -> Uuid, creator_ident_id -> Nullable<Uuid>, + raw -> Nullable<Text>, role -> Nullable<Text>, index -> Nullable<Int8>, - raw -> Nullable<Text>, + extra_json -> Nullable<Json>, } } @@ -142,9 +168,11 @@ table! { release_edit (id) { id -> Int8, editgroup_id -> Uuid, + updated -> Timestamp, ident_id -> Uuid, rev_id -> Nullable<Uuid>, redirect_id -> Nullable<Uuid>, + prev_rev -> Nullable<Uuid>, extra_json -> Nullable<Json>, } } @@ -165,7 +193,7 @@ table! { target_release_ident_id -> Nullable<Uuid>, index -> Nullable<Int8>, key -> Nullable<Text>, - raw -> Nullable<Text>, + extra_json -> Nullable<Json>, container_title -> Nullable<Text>, year -> Nullable<Int8>, title -> Nullable<Text>, @@ -184,6 +212,9 @@ table! { release_status -> Nullable<Text>, release_date -> Nullable<Date>, doi -> Nullable<Text>, + pmid -> Nullable<Text>, + pmcid -> Nullable<Text>, + wikidata_qid -> Nullable<Text>, isbn13 -> Nullable<Text>, volume -> Nullable<Text>, issue -> Nullable<Text>, @@ -194,12 +225,24 @@ table! { } table! { + release_rev_abstract (id) { + id -> Int8, + release_rev -> Uuid, + abstract_sha1 -> Bpchar, + mimetype -> Nullable<Text>, + lang -> Nullable<Text>, + } +} + +table! { work_edit (id) { id -> Int8, editgroup_id -> Uuid, + updated -> Timestamp, ident_id -> Uuid, rev_id -> Nullable<Uuid>, redirect_id -> Nullable<Uuid>, + prev_rev -> Nullable<Uuid>, extra_json -> Nullable<Json>, } } @@ -217,38 +260,34 @@ table! { work_rev (id) { id -> Uuid, extra_json -> Nullable<Json>, - work_type -> Nullable<Text>, - primary_release_id -> Nullable<Uuid>, } } joinable!(changelog -> editgroup (editgroup_id)); -joinable!(container_edit -> container_rev (rev_id)); joinable!(container_edit -> editgroup (editgroup_id)); joinable!(container_ident -> container_rev (rev_id)); -joinable!(creator_edit -> creator_rev (rev_id)); joinable!(creator_edit -> editgroup (editgroup_id)); joinable!(creator_ident -> creator_rev (rev_id)); joinable!(file_edit -> editgroup (editgroup_id)); -joinable!(file_edit -> file_rev (rev_id)); joinable!(file_ident -> file_rev (rev_id)); joinable!(file_release -> file_rev (file_rev)); joinable!(file_release -> release_ident (target_release_ident_id)); +joinable!(file_rev_url -> file_rev (file_rev)); joinable!(release_contrib -> creator_ident (creator_ident_id)); joinable!(release_contrib -> release_rev (release_rev)); joinable!(release_edit -> editgroup (editgroup_id)); -joinable!(release_edit -> release_rev (rev_id)); joinable!(release_ident -> release_rev (rev_id)); joinable!(release_ref -> release_ident (target_release_ident_id)); joinable!(release_ref -> release_rev (release_rev)); joinable!(release_rev -> container_ident (container_ident_id)); joinable!(release_rev -> work_ident (work_ident_id)); +joinable!(release_rev_abstract -> abstracts (abstract_sha1)); +joinable!(release_rev_abstract -> release_rev (release_rev)); joinable!(work_edit -> editgroup (editgroup_id)); -joinable!(work_edit -> work_rev (rev_id)); joinable!(work_ident -> work_rev (rev_id)); -joinable!(work_rev -> release_ident (primary_release_id)); allow_tables_to_appear_in_same_query!( + abstracts, changelog, container_edit, container_ident, @@ -262,11 +301,13 @@ allow_tables_to_appear_in_same_query!( file_ident, file_release, file_rev, + file_rev_url, release_contrib, release_edit, release_ident, release_ref, release_rev, + release_rev_abstract, work_edit, work_ident, work_rev, diff --git a/rust/tests/test_api_server.rs b/rust/tests/test_api_server.rs index 4c269e7f..b831f122 100644 --- a/rust/tests/test_api_server.rs +++ b/rust/tests/test_api_server.rs @@ -318,8 +318,8 @@ fn test_post_file() { headers, r#"{"size": 76543, "sha1": "f013d66c7f6817d08b7eb2a93e6d0440c1f3e7f8", - "md5": "f013d66c7f6817d08b7eb2a93e6d0440c1f3e7f8", - "sha256": "f013d66c7f6817d08b7eb2a93e6d0440c1f3e7f8", + "md5": "0b6d347b01d437a092be84c2edfce72c", + "sha256": "a77e4c11a57f1d757fca5754a8f83b5d4ece49a2d28596889127c1a2f3f28832", "url": "http://archive.org/asdf.txt", "mimetype": "application/pdf", "releases": [ @@ -415,7 +415,6 @@ fn test_post_work() { headers.clone(), // TODO: target_work_id r#"{ - "work_type": "journal-article", "extra": { "source": "speculation" } }"#, &router, |