diff options
author | Bryan Newbold <bnewbold@robocracy.org> | 2018-05-26 17:08:21 -0700 |
---|---|---|
committer | Bryan Newbold <bnewbold@robocracy.org> | 2018-05-26 17:08:21 -0700 |
commit | 55f8a495354d233f7a68128b2f3c21dbe7395427 (patch) | |
tree | e3afd04a58cc74abd9e15557d27d19ce47256f98 | |
parent | 82f8b4d838de3fb8eda5db9b23c5bc48ab281f9e (diff) | |
download | fatcat-55f8a495354d233f7a68128b2f3c21dbe7395427.tar.gz fatcat-55f8a495354d233f7a68128b2f3c21dbe7395427.zip |
tweak schema (api and sql)
-rw-r--r-- | rust/fatcat-api/README.md | 2 | ||||
-rw-r--r-- | rust/fatcat-api/api.yaml | 23 | ||||
-rw-r--r-- | rust/fatcat-api/api/swagger.yaml | 42 | ||||
-rw-r--r-- | rust/fatcat-api/examples/client.rs | 2 | ||||
-rw-r--r-- | rust/fatcat-api/examples/server_lib/server.rs | 4 | ||||
-rw-r--r-- | rust/fatcat-api/src/client.rs | 6 | ||||
-rw-r--r-- | rust/fatcat-api/src/lib.rs | 8 | ||||
-rw-r--r-- | rust/fatcat-api/src/models.rs | 45 | ||||
-rw-r--r-- | rust/fatcat-api/src/server.rs | 12 | ||||
-rw-r--r-- | rust/fatcat-openapi2.yml | 23 | ||||
-rw-r--r-- | rust/migrations/2018-05-12-001226_init/up.sql | 39 | ||||
-rw-r--r-- | rust/src/api_server.rs | 59 | ||||
-rw-r--r-- | rust/src/database_models.rs | 17 | ||||
-rw-r--r-- | rust/src/database_schema.rs | 11 | ||||
-rw-r--r-- | rust/tests/test_api_server.rs | 4 |
15 files changed, 198 insertions, 99 deletions
diff --git a/rust/fatcat-api/README.md b/rust/fatcat-api/README.md index 146758fb..1c409076 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-26T02:33:00.709Z +- Build date: 2018-05-27T00:04:18.431Z 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 146c11dd..585932b3 100644 --- a/rust/fatcat-api/api.yaml +++ b/rust/fatcat-api/api.yaml @@ -83,10 +83,10 @@ definitions: creator_entity: type: object required: - - name + - full_name properties: <<: *ENTITYPROPS - name: + full_name: type: string example: "Grace Hopper" orcid: @@ -105,10 +105,14 @@ definitions: publisher: type: string example: "Society of Curious Students" - issn: + issnl: type: string #format: custom example: "1234-5678" + abbrev: + type: string + coden: + type: string file_entity: type: object properties: @@ -121,6 +125,10 @@ definitions: type: string #format: custom example: "f013d66c7f6817d08b7eb2a93e6d0440c1f3e7f8" + md5: + type: string + #format: custom + example: "d41efcc592d1e40ac13905377399eb9b" url: type: string format: url @@ -155,6 +163,9 @@ definitions: type: string #format: custom example: "10.1234/abcde.789" + isbn13: + type: string + #format: custom volume: type: string pages: @@ -162,6 +173,8 @@ definitions: issue: type: string example: "12" + publisher: + type: string contribs: type: array items: @@ -271,7 +284,7 @@ definitions: #format: uuid creator_stub: type: string - contrib_type: + role: type: string x-entity-responses: &ENTITYRESPONSES @@ -359,7 +372,7 @@ paths: /container/lookup: get: parameters: - - name: issn + - name: issnl in: query type: string required: true diff --git a/rust/fatcat-api/api/swagger.yaml b/rust/fatcat-api/api/swagger.yaml index db7b0e03..e6b4b356 100644 --- a/rust/fatcat-api/api/swagger.yaml +++ b/rust/fatcat-api/api/swagger.yaml @@ -285,12 +285,12 @@ paths: /container/lookup: get: parameters: - - name: "issn" + - name: "issnl" in: "query" required: true type: "string" formatString: "\\\"{}\\\"" - example: "\"issn_example\".to_string()" + example: "\"issnl_example\".to_string()" responses: 200: description: "Found Entity" @@ -1023,12 +1023,12 @@ definitions: creator_entity: type: "object" required: - - "name" + - "full_name" properties: orcid: type: "string" example: "0000-0002-1825-0097" - name: + full_name: type: "string" example: "Grace Hopper" extra: @@ -1056,9 +1056,9 @@ definitions: - "deleted" example: redirect: "f1f046a3-45c9-4b99-adce-000000000002" + full_name: "Grace Hopper" ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" - name: "Grace Hopper" editgroup_id: 16 orcid: "0000-0002-1825-0097" state: "wip" @@ -1069,7 +1069,11 @@ definitions: required: - "name" properties: - issn: + coden: + type: "string" + abbrev: + type: "string" + issnl: type: "string" example: "1234-5678" publisher: @@ -1103,12 +1107,14 @@ definitions: type: "object" example: redirect: "f1f046a3-45c9-4b99-adce-000000000002" - issn: "1234-5678" + coden: "coden" ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" name: "Journal of Important Results" publisher: "Society of Curious Students" editgroup_id: 16 + issnl: "1234-5678" + abbrev: "abbrev" state: "wip" revision: 42 upperCaseName: "CONTAINER_ENTITY" @@ -1123,6 +1129,9 @@ definitions: type: "string" format: "url" example: "https://example.edu/~frau/prcding.pdf" + md5: + type: "string" + example: "d41efcc592d1e40ac13905377399eb9b" sha1: type: "string" example: "f013d66c7f6817d08b7eb2a93e6d0440c1f3e7f8" @@ -1165,6 +1174,7 @@ definitions: releases: - "releases" - "releases" + md5: "d41efcc592d1e40ac13905377399eb9b" revision: 42 upperCaseName: "FILE_ENTITY" release_entity: @@ -1181,6 +1191,8 @@ definitions: type: "array" items: $ref: "#/definitions/release_contrib" + publisher: + type: "string" issue: type: "string" example: "12" @@ -1188,6 +1200,8 @@ definitions: type: "string" volume: type: "string" + isbn13: + type: "string" doi: type: "string" example: "10.1234/abcde.789" @@ -1237,14 +1251,14 @@ definitions: release_type: "preprint" title: "title" contribs: - - creator_stub: "creator_stub" + - role: "role" + creator_stub: "creator_stub" creator_id: "creator_id" index: 6 - contrib_type: "contrib_type" - - creator_stub: "creator_stub" + - role: "role" + creator_stub: "creator_stub" creator_id: "creator_id" index: 6 - contrib_type: "contrib_type" revision: 42 volume: "volume" pages: "pages" @@ -1255,7 +1269,9 @@ definitions: - target_release_id: "target_release_id" stub: "stub" index: 0 + isbn13: "isbn13" extra: "{}" + publisher: "publisher" editgroup_id: 16 state: "wip" container_id: "f1f046a3-45c9-4b99-adce-000000000001" @@ -1463,13 +1479,13 @@ definitions: type: "string" creator_stub: type: "string" - contrib_type: + role: type: "string" example: + role: "role" creator_stub: "creator_stub" creator_id: "creator_id" index: 6 - contrib_type: "contrib_type" upperCaseName: "RELEASE_CONTRIB" editgroup_edits: properties: diff --git a/rust/fatcat-api/examples/client.rs b/rust/fatcat-api/examples/client.rs index 396cf3d1..f2eccb9e 100644 --- a/rust/fatcat-api/examples/client.rs +++ b/rust/fatcat-api/examples/client.rs @@ -70,7 +70,7 @@ fn main() { } Some("ContainerLookupGet") => { - let result = client.container_lookup_get("issn_example".to_string()).wait(); + let result = client.container_lookup_get("issnl_example".to_string()).wait(); println!("{:?} (X-Span-ID: {:?})", result, client.context().x_span_id.clone().unwrap_or(String::from("<none>"))); } diff --git a/rust/fatcat-api/examples/server_lib/server.rs b/rust/fatcat-api/examples/server_lib/server.rs index 68670c07..a28b9c72 100644 --- a/rust/fatcat-api/examples/server_lib/server.rs +++ b/rust/fatcat-api/examples/server_lib/server.rs @@ -24,9 +24,9 @@ impl Api for Server { Box::new(futures::failed("Generic failure".into())) } - fn container_lookup_get(&self, issn: String, context: &Context) -> Box<Future<Item = ContainerLookupGetResponse, Error = ApiError> + Send> { + fn container_lookup_get(&self, issnl: String, context: &Context) -> Box<Future<Item = ContainerLookupGetResponse, Error = ApiError> + Send> { let context = context.clone(); - println!("container_lookup_get(\"{}\") - X-Span-ID: {:?}", issn, context.x_span_id.unwrap_or(String::from("<none>")).clone()); + println!("container_lookup_get(\"{}\") - X-Span-ID: {:?}", issnl, context.x_span_id.unwrap_or(String::from("<none>")).clone()); Box::new(futures::failed("Generic failure".into())) } diff --git a/rust/fatcat-api/src/client.rs b/rust/fatcat-api/src/client.rs index 517d9705..23f6dd21 100644 --- a/rust/fatcat-api/src/client.rs +++ b/rust/fatcat-api/src/client.rs @@ -221,11 +221,11 @@ impl Api for Client { Box::new(futures::done(result)) } - fn container_lookup_get(&self, param_issn: String, context: &Context) -> Box<Future<Item = ContainerLookupGetResponse, Error = ApiError> + Send> { + fn container_lookup_get(&self, param_issnl: String, context: &Context) -> Box<Future<Item = ContainerLookupGetResponse, Error = ApiError> + Send> { // Query parameters - let query_issn = format!("issn={issn}&", issn = param_issn.to_string()); + let query_issnl = format!("issnl={issnl}&", issnl = param_issnl.to_string()); - let url = format!("{}/v0/container/lookup?{issn}", self.base_path, issn = utf8_percent_encode(&query_issn, QUERY_ENCODE_SET)); + let url = format!("{}/v0/container/lookup?{issnl}", self.base_path, issnl = utf8_percent_encode(&query_issnl, QUERY_ENCODE_SET)); let hyper_client = (self.hyper_client)(); let request = hyper_client.request(hyper::method::Method::Get, &url); diff --git a/rust/fatcat-api/src/lib.rs b/rust/fatcat-api/src/lib.rs index 94633e00..a21a0751 100644 --- a/rust/fatcat-api/src/lib.rs +++ b/rust/fatcat-api/src/lib.rs @@ -258,7 +258,7 @@ pub enum WorkPostResponse { pub trait Api { fn container_id_get(&self, id: String, context: &Context) -> Box<Future<Item = ContainerIdGetResponse, Error = ApiError> + Send>; - fn container_lookup_get(&self, issn: String, context: &Context) -> Box<Future<Item = ContainerLookupGetResponse, Error = ApiError> + Send>; + fn container_lookup_get(&self, issnl: String, context: &Context) -> Box<Future<Item = ContainerLookupGetResponse, Error = ApiError> + Send>; fn container_post(&self, body: models::ContainerEntity, context: &Context) -> Box<Future<Item = ContainerPostResponse, Error = ApiError> + Send>; @@ -299,7 +299,7 @@ pub trait Api { pub trait ApiNoContext { fn container_id_get(&self, id: String) -> Box<Future<Item = ContainerIdGetResponse, Error = ApiError> + Send>; - fn container_lookup_get(&self, issn: String) -> Box<Future<Item = ContainerLookupGetResponse, Error = ApiError> + Send>; + fn container_lookup_get(&self, issnl: String) -> Box<Future<Item = ContainerLookupGetResponse, Error = ApiError> + Send>; fn container_post(&self, body: models::ContainerEntity) -> Box<Future<Item = ContainerPostResponse, Error = ApiError> + Send>; @@ -356,8 +356,8 @@ impl<'a, T: Api> ApiNoContext for ContextWrapper<'a, T> { self.api().container_id_get(id, &self.context()) } - fn container_lookup_get(&self, issn: String) -> Box<Future<Item = ContainerLookupGetResponse, Error = ApiError> + Send> { - self.api().container_lookup_get(issn, &self.context()) + fn container_lookup_get(&self, issnl: String) -> Box<Future<Item = ContainerLookupGetResponse, Error = ApiError> + Send> { + self.api().container_lookup_get(issnl, &self.context()) } fn container_post(&self, body: models::ContainerEntity) -> Box<Future<Item = ContainerPostResponse, Error = ApiError> + Send> { diff --git a/rust/fatcat-api/src/models.rs b/rust/fatcat-api/src/models.rs index 68242058..b05c0fc1 100644 --- a/rust/fatcat-api/src/models.rs +++ b/rust/fatcat-api/src/models.rs @@ -94,9 +94,17 @@ impl ChangelogentriesInner { #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct ContainerEntity { - #[serde(rename = "issn")] + #[serde(rename = "coden")] #[serde(skip_serializing_if = "Option::is_none")] - pub issn: Option<String>, + pub coden: Option<String>, + + #[serde(rename = "abbrev")] + #[serde(skip_serializing_if = "Option::is_none")] + pub abbrev: Option<String>, + + #[serde(rename = "issnl")] + #[serde(skip_serializing_if = "Option::is_none")] + pub issnl: Option<String>, #[serde(rename = "publisher")] #[serde(skip_serializing_if = "Option::is_none")] @@ -134,7 +142,9 @@ pub struct ContainerEntity { impl ContainerEntity { pub fn new(name: String) -> ContainerEntity { ContainerEntity { - issn: None, + coden: None, + abbrev: None, + issnl: None, publisher: None, name: name, state: None, @@ -153,8 +163,8 @@ pub struct CreatorEntity { #[serde(skip_serializing_if = "Option::is_none")] pub orcid: Option<String>, - #[serde(rename = "name")] - pub name: String, + #[serde(rename = "full_name")] + pub full_name: String, #[serde(rename = "extra")] #[serde(skip_serializing_if = "Option::is_none")] @@ -183,10 +193,10 @@ pub struct CreatorEntity { } impl CreatorEntity { - pub fn new(name: String) -> CreatorEntity { + pub fn new(full_name: String) -> CreatorEntity { CreatorEntity { orcid: None, - name: name, + full_name: full_name, extra: None, editgroup_id: None, redirect: None, @@ -337,6 +347,10 @@ pub struct FileEntity { #[serde(skip_serializing_if = "Option::is_none")] pub url: Option<String>, + #[serde(rename = "md5")] + #[serde(skip_serializing_if = "Option::is_none")] + pub md5: Option<String>, + #[serde(rename = "sha1")] #[serde(skip_serializing_if = "Option::is_none")] pub sha1: Option<String>, @@ -376,6 +390,7 @@ impl FileEntity { FileEntity { releases: None, url: None, + md5: None, sha1: None, size: None, extra: None, @@ -402,9 +417,9 @@ pub struct ReleaseContrib { #[serde(skip_serializing_if = "Option::is_none")] pub creator_stub: Option<String>, - #[serde(rename = "contrib_type")] + #[serde(rename = "role")] #[serde(skip_serializing_if = "Option::is_none")] - pub contrib_type: Option<String>, + pub role: Option<String>, } impl ReleaseContrib { @@ -413,7 +428,7 @@ impl ReleaseContrib { index: None, creator_id: None, creator_stub: None, - contrib_type: None, + role: None, } } } @@ -428,6 +443,10 @@ pub struct ReleaseEntity { #[serde(skip_serializing_if = "Option::is_none")] pub contribs: Option<Vec<models::ReleaseContrib>>, + #[serde(rename = "publisher")] + #[serde(skip_serializing_if = "Option::is_none")] + pub publisher: Option<String>, + #[serde(rename = "issue")] #[serde(skip_serializing_if = "Option::is_none")] pub issue: Option<String>, @@ -440,6 +459,10 @@ pub struct ReleaseEntity { #[serde(skip_serializing_if = "Option::is_none")] pub volume: Option<String>, + #[serde(rename = "isbn13")] + #[serde(skip_serializing_if = "Option::is_none")] + pub isbn13: Option<String>, + #[serde(rename = "doi")] #[serde(skip_serializing_if = "Option::is_none")] pub doi: Option<String>, @@ -493,9 +516,11 @@ impl ReleaseEntity { ReleaseEntity { refs: None, contribs: None, + publisher: None, issue: None, pages: None, volume: None, + isbn13: None, doi: None, date: None, release_type: None, diff --git a/rust/fatcat-api/src/server.rs b/rust/fatcat-api/src/server.rs index 95829602..ed012478 100644 --- a/rust/fatcat-api/src/server.rs +++ b/rust/fatcat-api/src/server.rs @@ -190,15 +190,15 @@ where // Query parameters (note that non-required or collection query parameters will ignore garbage values, rather than causing a 400 response) let query_params = req.get::<UrlEncodedQuery>().unwrap_or_default(); - let param_issn = query_params - .get("issn") - .ok_or_else(|| Response::with((status::BadRequest, "Missing required query parameter issn".to_string())))? + let param_issnl = query_params + .get("issnl") + .ok_or_else(|| Response::with((status::BadRequest, "Missing required query parameter issnl".to_string())))? .first() - .ok_or_else(|| Response::with((status::BadRequest, "Required query parameter issn was empty".to_string())))? + .ok_or_else(|| Response::with((status::BadRequest, "Required query parameter issnl was empty".to_string())))? .parse::<String>() - .map_err(|e| Response::with((status::BadRequest, format!("Couldn't parse query parameter issn - doesn't match schema: {}", e))))?; + .map_err(|e| Response::with((status::BadRequest, format!("Couldn't parse query parameter issnl - doesn't match schema: {}", e))))?; - match api.container_lookup_get(param_issn, context).wait() { + match api.container_lookup_get(param_issnl, context).wait() { Ok(rsp) => match rsp { ContainerLookupGetResponse::FoundEntity(body) => { let body_string = serde_json::to_string(&body).expect("impossible to fail to serialize"); diff --git a/rust/fatcat-openapi2.yml b/rust/fatcat-openapi2.yml index 146c11dd..585932b3 100644 --- a/rust/fatcat-openapi2.yml +++ b/rust/fatcat-openapi2.yml @@ -83,10 +83,10 @@ definitions: creator_entity: type: object required: - - name + - full_name properties: <<: *ENTITYPROPS - name: + full_name: type: string example: "Grace Hopper" orcid: @@ -105,10 +105,14 @@ definitions: publisher: type: string example: "Society of Curious Students" - issn: + issnl: type: string #format: custom example: "1234-5678" + abbrev: + type: string + coden: + type: string file_entity: type: object properties: @@ -121,6 +125,10 @@ definitions: type: string #format: custom example: "f013d66c7f6817d08b7eb2a93e6d0440c1f3e7f8" + md5: + type: string + #format: custom + example: "d41efcc592d1e40ac13905377399eb9b" url: type: string format: url @@ -155,6 +163,9 @@ definitions: type: string #format: custom example: "10.1234/abcde.789" + isbn13: + type: string + #format: custom volume: type: string pages: @@ -162,6 +173,8 @@ definitions: issue: type: string example: "12" + publisher: + type: string contribs: type: array items: @@ -271,7 +284,7 @@ definitions: #format: uuid creator_stub: type: string - contrib_type: + role: type: string x-entity-responses: &ENTITYRESPONSES @@ -359,7 +372,7 @@ paths: /container/lookup: get: parameters: - - name: issn + - name: issnl in: query type: string required: true diff --git a/rust/migrations/2018-05-12-001226_init/up.sql b/rust/migrations/2018-05-12-001226_init/up.sql index 1f366f90..474029d0 100644 --- a/rust/migrations/2018-05-12-001226_init/up.sql +++ b/rust/migrations/2018-05-12-001226_init/up.sql @@ -37,8 +37,10 @@ CREATE TABLE creator_rev ( id BIGSERIAL PRIMARY KEY, extra_json JSON, - name TEXT NOT NULL, + full_name TEXT NOT NULL, orcid TEXT + -- TODO: aliases/alternatives + -- TODO: sortable name? ); -- Could denormalize a "is_live" flag into revision tables, to make indices @@ -68,10 +70,12 @@ CREATE TABLE container_rev ( name TEXT NOT NULL, publisher TEXT, - issn TEXT -- TODO: varchar + issnl TEXT, -- TODO: varchar + abbrev TEXT, + coden TEXT ); -CREATE INDEX container_rev_issn_idx ON container_rev(issn) WHERE issn IS NOT NULL; +CREATE INDEX container_rev_issnl_idx ON container_rev(issnl) WHERE issnl IS NOT NULL; CREATE TABLE container_ident ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), @@ -96,6 +100,7 @@ CREATE TABLE file_rev ( size BIGINT, sha1 TEXT, -- TODO: varchar or bytes + md5 TEXT, -- TODO: varchar or bytes url TEXT -- TODO: URL table ); @@ -126,9 +131,11 @@ CREATE TABLE release_rev ( release_type TEXT, -- TODO: enum date DATE, doi TEXT, + isbn13 TEXT, volume TEXT, pages TEXT, - issue TEXT + issue TEXT, + publisher TEXT -- for books, NOT if container exists -- TODO: identifier table? ); @@ -187,7 +194,7 @@ CREATE TABLE release_contrib ( id BIGSERIAL PRIMARY KEY, release_rev BIGSERIAL REFERENCES release_rev(id) NOT NULL, creator_ident_id UUID REFERENCES creator_ident(id), - contrib_type TEXT, + role TEXT, -- TODO: enum? index BIGINT, stub TEXT ); @@ -237,9 +244,9 @@ INSERT INTO changelog (editgroup_id) VALUES (4), (5); -INSERT INTO container_rev (name, issn) VALUES - ('Journal of Trivial Results', '1234-5678'), - ('MySpace Blog', null); +INSERT INTO container_rev (name, issnl, abbrev, coden) VALUES + ('Journal of Trivial Results', '1234-5678', null, null), + ('MySpace Blog', null, null, null); INSERT INTO container_ident (id, is_live, rev_id, redirect_id) VALUES ('f1f046a3-45c9-4b99-cccc-000000000001', true, 1, null), @@ -249,7 +256,7 @@ INSERT INTO container_edit (ident_id, rev_id, redirect_id, editgroup_id) VALUES ('f1f046a3-45c9-4b99-cccc-000000000001', 1, null, 4), ('f1f046a3-45c9-4b99-cccc-000000000002', 2, null, 5); -INSERT INTO creator_rev (name, orcid) VALUES +INSERT INTO creator_rev (full_name, orcid) VALUES ('Grace Hopper', null), ('Emily Noethe', null), ('Christine Moran', '0000-0003-2088-7465'); @@ -266,9 +273,9 @@ INSERT INTO creator_edit (ident_id, rev_id, redirect_id, editgroup_id) VALUES ('f1f046a3-45c9-4b99-adce-000000000003', 3, null, 3), ('f1f046a3-45c9-4b99-adce-000000000004', 2, null, 4); -INSERT INTO file_rev (size, sha1, url) VALUES - (null, null, null), - (4321, '7d97e98f8af710c7e7fe703abc8f639e0ee507c4', 'http://archive.org/robots.txt'); +INSERT INTO file_rev (size, sha1, md5, url) VALUES + (null, null, null, null), + (4321, '7d97e98f8af710c7e7fe703abc8f639e0ee507c4', null, 'http://archive.org/robots.txt'); INSERT INTO file_ident (id, is_live, rev_id, redirect_id) VALUES ('f1f046a3-45c9-4b99-ffff-000000000001', true, 1, null), @@ -290,9 +297,9 @@ INSERT INTO work_edit (ident_id, rev_id, redirect_id, editgroup_id) VALUES ('f1f046a3-45c9-4b99-3333-000000000001', 1, null, 4), ('f1f046a3-45c9-4b99-3333-000000000002', 2, null, 5); -INSERT INTO release_rev (work_ident_id, container_ident_id, title, release_type, date, doi, volume, pages, issue) VALUES - ('f1f046a3-45c9-4b99-3333-000000000001', null, 'example title', null, null, null, null, null, null), - ('f1f046a3-45c9-4b99-3333-000000000002', 'f1f046a3-45c9-4b99-cccc-000000000001', 'bigger example', 'journal-article', '2018-01-01', '10.123/abc', '12', '5-9', 'IV'); +INSERT INTO release_rev (work_ident_id, container_ident_id, title, release_type, date, doi, isbn13, volume, pages, issue, publisher) VALUES + ('f1f046a3-45c9-4b99-3333-000000000001', null, 'example title', null, null, null, null, null, null, null, null), + ('f1f046a3-45c9-4b99-3333-000000000002', 'f1f046a3-45c9-4b99-cccc-000000000001', 'bigger example', 'journal-article', '2018-01-01', null, '10.123/abc', '12', '5-9', 'IV', null); INSERT INTO release_ident (id, is_live, rev_id, redirect_id) VALUES ('f1f046a3-45c9-4b99-4444-000000000001', true, 1, null), @@ -302,7 +309,7 @@ INSERT INTO release_edit (ident_id, rev_id, redirect_id, editgroup_id) VALUES ('f1f046a3-45c9-4b99-4444-000000000001', 1, null, 4), ('f1f046a3-45c9-4b99-4444-000000000002', 2, null, 5); -INSERT INTO release_contrib (release_rev, creator_ident_id, stub, contrib_type, index) VALUES +INSERT INTO release_contrib (release_rev, creator_ident_id, stub, role, index) VALUES (2, null, null, null, null), (2, 'f1f046a3-45c9-4b99-adce-000000000002', 'some contrib', 'editor', 4); diff --git a/rust/src/api_server.rs b/rust/src/api_server.rs index 8311896f..42c69c00 100644 --- a/rust/src/api_server.rs +++ b/rust/src/api_server.rs @@ -94,9 +94,11 @@ impl Server { }; let entity = ContainerEntity { - issn: rev.issn, + issnl: rev.issnl, publisher: rev.publisher, name: rev.name, + abbrev: rev.abbrev, + coden: rev.coden, state: Some(ident.state().unwrap().shortname()), ident: Some(ident.id.to_string()), revision: ident.rev_id, @@ -107,13 +109,13 @@ impl Server { Ok(Some(entity)) } - fn container_lookup_get_handler(&self, issn: String) -> Result<Option<ContainerEntity>> { + fn container_lookup_get_handler(&self, issnl: String) -> Result<Option<ContainerEntity>> { let conn = self.db_pool.get().expect("db_pool error"); let res: ::std::result::Result<(ContainerIdentRow, ContainerRevRow), _> = container_ident::table .inner_join(container_rev::table) - .filter(container_rev::issn.eq(&issn)) + .filter(container_rev::issnl.eq(&issnl)) .filter(container_ident::is_live.eq(true)) .filter(container_ident::redirect_id.is_null()) .first(&conn); @@ -125,9 +127,11 @@ impl Server { }; let entity = ContainerEntity { - issn: rev.issn, + issnl: rev.issnl, publisher: rev.publisher, name: rev.name, + abbrev: rev.abbrev, + coden: rev.coden, state: Some(ident.state().unwrap().shortname()), ident: Some(ident.id.to_string()), revision: ident.rev_id, @@ -154,7 +158,7 @@ impl Server { }; let entity = CreatorEntity { - name: rev.name, + full_name: rev.full_name, orcid: rev.orcid, state: Some(ident.state().unwrap().shortname()), ident: Some(ident.id.to_string()), @@ -183,7 +187,7 @@ impl Server { }; let entity = CreatorEntity { - name: rev.name, + full_name: rev.full_name, orcid: rev.orcid, state: Some(ident.state().unwrap().shortname()), ident: Some(ident.id.to_string()), @@ -220,6 +224,7 @@ impl Server { let entity = FileEntity { sha1: rev.sha1, + md5: rev.md5, size: rev.size.map(|v| v as i64), url: rev.url, releases: Some(releases), @@ -260,6 +265,7 @@ impl Server { let entity = FileEntity { sha1: rev.sha1, + md5: rev.md5, size: rev.size.map(|v| v as i64), url: rev.url, releases: Some(releases), @@ -334,7 +340,7 @@ impl Server { .iter() .map(|c: &ReleaseContribRow| ReleaseContrib { index: c.index, - contrib_type: c.contrib_type.clone(), + role: c.role.clone(), creator_stub: c.stub.clone(), creator_id: c.creator_ident_id.map(|v| v.to_string()), }) @@ -346,10 +352,12 @@ impl Server { date: rev.date .map(|v| chrono::DateTime::from_utc(v.and_hms(0, 0, 0), chrono::Utc)), doi: rev.doi, + isbn13: rev.isbn13, volume: rev.volume, pages: rev.pages, issue: rev.issue, container_id: rev.container_ident_id.map(|u| u.to_string()), + publisher: rev.publisher, work_id: rev.work_ident_id.to_string(), refs: Some(refs), contribs: Some(contribs), @@ -398,7 +406,7 @@ impl Server { .iter() .map(|c: &ReleaseContribRow| ReleaseContrib { index: c.index, - contrib_type: c.contrib_type.clone(), + role: c.role.clone(), creator_stub: c.stub.clone(), creator_id: c.creator_ident_id.map(|v| v.to_string()), }) @@ -410,10 +418,12 @@ impl Server { date: rev.date .map(|v| chrono::DateTime::from_utc(v.and_hms(0, 0, 0), chrono::Utc)), doi: rev.doi, + isbn13: rev.isbn13, volume: rev.volume, pages: rev.pages, issue: rev.issue, container_id: rev.container_ident_id.map(|u| u.to_string()), + publisher: rev.publisher, work_id: rev.work_ident_id.to_string(), refs: Some(refs), contribs: Some(contribs), @@ -594,7 +604,7 @@ impl Api for Server { container_lookup_get, container_lookup_get_handler, ContainerLookupGetResponse, - issn, + issnl, String ); wrap_lookup_handler!( @@ -632,18 +642,20 @@ impl Api for Server { }; let edit: ContainerEditRow = diesel::sql_query( - "WITH rev AS ( INSERT INTO container_rev (name, publisher, issn, extra_json) - VALUES ($1, $2, $3, $4) + "WITH rev AS ( INSERT INTO container_rev (name, publisher, issnl, abbrev, coden, extra_json) + VALUES ($1, $2, $3, $4, $5, $6) RETURNING id ), ident AS ( INSERT INTO container_ident (rev_id) VALUES ((SELECT rev.id FROM rev)) RETURNING id ) INSERT INTO container_edit (editgroup_id, ident_id, rev_id) VALUES - ($5, (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::Text, _>(body.name) .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(body.publisher) - .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(body.issn) + .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(body.issnl) + .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(body.abbrev) + .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(body.coden) .bind::<diesel::sql_types::Nullable<diesel::sql_types::Json>, _>(body.extra) .bind::<diesel::sql_types::BigInt, _>(editgroup_id) .get_result(&conn) @@ -676,7 +688,7 @@ impl Api for Server { }; let edit: CreatorEditRow = diesel::sql_query( - "WITH rev AS ( INSERT INTO creator_rev (name, orcid, extra_json) + "WITH rev AS ( INSERT INTO creator_rev (full_name, orcid, extra_json) VALUES ($1, $2, $3) RETURNING id ), ident AS ( INSERT INTO creator_ident (rev_id) @@ -685,7 +697,7 @@ impl Api for Server { INSERT INTO creator_edit (editgroup_id, ident_id, rev_id) VALUES ($4, (SELECT ident.id FROM ident), (SELECT rev.id FROM rev)) RETURNING *", - ).bind::<diesel::sql_types::Text, _>(body.name) + ).bind::<diesel::sql_types::Text, _>(body.full_name) .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(body.orcid) .bind::<diesel::sql_types::Nullable<diesel::sql_types::Json>, _>(body.extra) .bind::<diesel::sql_types::BigInt, _>(editgroup_id) @@ -720,17 +732,18 @@ impl Api for Server { let edit: FileEditRow = diesel::sql_query( - "WITH rev AS ( INSERT INTO file_rev (size, sha1, url, extra_json) - VALUES ($1, $2, $3, $4) + "WITH rev AS ( INSERT INTO file_rev (size, sha1, md5, url, extra_json) + VALUES ($1, $2, $3, $4, $5) 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 - ($5, (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::Nullable<diesel::sql_types::Int8>, _>(body.size) .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(body.sha1) + .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(body.md5) .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(body.url) .bind::<diesel::sql_types::Nullable<diesel::sql_types::Json>, _>(body.extra) .bind::<diesel::sql_types::BigInt, _>(editgroup_id) @@ -835,24 +848,26 @@ impl Api for Server { }; let edit: ReleaseEditRow = diesel::sql_query( - "WITH rev AS ( INSERT INTO release_rev (title, release_type, date, doi, volume, pages, issue, work_ident_id, container_ident_id, extra_json) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) + "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) 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 - ($11, (SELECT ident.id FROM ident), (SELECT rev.id FROM rev)) + ($13, (SELECT ident.id FROM ident), (SELECT rev.id FROM rev)) RETURNING *", ).bind::<diesel::sql_types::Text, _>(body.title) .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(body.release_type) .bind::<diesel::sql_types::Nullable<diesel::sql_types::Date>, _>(body.date.map(|v| v.naive_utc().date())) .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(body.doi) + .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(body.isbn13) .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(body.volume) .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(body.pages) .bind::<diesel::sql_types::Nullable<diesel::sql_types::Text>, _>(body.issue) .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>, _>(body.publisher) .bind::<diesel::sql_types::Nullable<diesel::sql_types::Json>, _>(body.extra) .bind::<diesel::sql_types::BigInt, _>(editgroup_id) .get_result(&conn) @@ -899,7 +914,7 @@ impl Api for Server { .clone() .map(|v| uuid::Uuid::parse_str(&v).expect("valid UUID")), index: c.index, - contrib_type: c.contrib_type.clone(), + role: c.role.clone(), stub: c.creator_stub.clone(), }) .collect(); diff --git a/rust/src/database_models.rs b/rust/src/database_models.rs index b27bca3f..9913b7e2 100644 --- a/rust/src/database_models.rs +++ b/rust/src/database_models.rs @@ -75,7 +75,9 @@ pub struct ContainerRevRow { pub extra_json: Option<serde_json::Value>, pub name: String, pub publisher: Option<String>, - pub issn: Option<String>, + pub issnl: Option<String>, + pub abbrev: Option<String>, + pub coden: Option<String>, } entity_structs!( @@ -90,7 +92,7 @@ entity_structs!( pub struct CreatorRevRow { pub id: i64, pub extra_json: Option<serde_json::Value>, - pub name: String, + pub full_name: String, pub orcid: Option<String>, } @@ -108,6 +110,7 @@ pub struct FileRevRow { pub extra_json: Option<serde_json::Value>, pub size: Option<i64>, pub sha1: Option<String>, + pub md5: Option<String>, pub url: Option<String>, } @@ -124,9 +127,11 @@ pub struct ReleaseRevRow { pub release_type: Option<String>, pub 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>, } entity_structs!( @@ -153,9 +158,9 @@ pub struct ReleaseContribRow { pub id: i64, pub release_rev: i64, pub creator_ident_id: Option<Uuid>, - pub stub: Option<String>, + pub role: Option<String>, pub index: Option<i64>, - pub contrib_type: Option<String>, + pub stub: Option<String>, } #[derive(Debug, Insertable)] @@ -163,9 +168,9 @@ pub struct ReleaseContribRow { pub struct ReleaseContribNewRow { pub release_rev: i64, pub creator_ident_id: Option<Uuid>, - pub stub: Option<String>, + pub role: Option<String>, pub index: Option<i64>, - pub contrib_type: Option<String>, + pub stub: Option<String>, } #[derive(Debug, Queryable, Identifiable, Associations, AsChangeset)] diff --git a/rust/src/database_schema.rs b/rust/src/database_schema.rs index 7d8ff4e1..2541bcd8 100644 --- a/rust/src/database_schema.rs +++ b/rust/src/database_schema.rs @@ -32,7 +32,9 @@ table! { extra_json -> Nullable<Json>, name -> Text, publisher -> Nullable<Text>, - issn -> Nullable<Text>, + issnl -> Nullable<Text>, + abbrev -> Nullable<Text>, + coden -> Nullable<Text>, } } @@ -60,7 +62,7 @@ table! { creator_rev (id) { id -> Int8, extra_json -> Nullable<Json>, - name -> Text, + full_name -> Text, orcid -> Nullable<Text>, } } @@ -116,6 +118,7 @@ table! { extra_json -> Nullable<Json>, size -> Nullable<Int8>, sha1 -> Nullable<Text>, + md5 -> Nullable<Text>, url -> Nullable<Text>, } } @@ -125,7 +128,7 @@ table! { id -> Int8, release_rev -> Int8, creator_ident_id -> Nullable<Uuid>, - contrib_type -> Nullable<Text>, + role -> Nullable<Text>, index -> Nullable<Int8>, stub -> Nullable<Text>, } @@ -171,9 +174,11 @@ table! { release_type -> Nullable<Text>, date -> Nullable<Date>, doi -> Nullable<Text>, + isbn13 -> Nullable<Text>, volume -> Nullable<Text>, pages -> Nullable<Text>, issue -> Nullable<Text>, + publisher -> Nullable<Text>, } } diff --git a/rust/tests/test_api_server.rs b/rust/tests/test_api_server.rs index 8eedfa2f..a973b333 100644 --- a/rust/tests/test_api_server.rs +++ b/rust/tests/test_api_server.rs @@ -117,7 +117,7 @@ fn test_lookups() { check_response( request::get( - "http://localhost:9411/v0/container/lookup?issn=1234-5678", + "http://localhost:9411/v0/container/lookup?issnl=1234-5678", headers.clone(), &router, ), @@ -170,7 +170,7 @@ fn test_post_creator() { request::post( "http://localhost:9411/v0/creator", headers, - r#"{"name": "some person"}"#, + r#"{"full_name": "some person"}"#, &router, ), status::Created, |