aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBryan Newbold <bnewbold@robocracy.org>2018-05-26 17:08:21 -0700
committerBryan Newbold <bnewbold@robocracy.org>2018-05-26 17:08:21 -0700
commit55f8a495354d233f7a68128b2f3c21dbe7395427 (patch)
treee3afd04a58cc74abd9e15557d27d19ce47256f98
parent82f8b4d838de3fb8eda5db9b23c5bc48ab281f9e (diff)
downloadfatcat-55f8a495354d233f7a68128b2f3c21dbe7395427.tar.gz
fatcat-55f8a495354d233f7a68128b2f3c21dbe7395427.zip
tweak schema (api and sql)
-rw-r--r--rust/fatcat-api/README.md2
-rw-r--r--rust/fatcat-api/api.yaml23
-rw-r--r--rust/fatcat-api/api/swagger.yaml42
-rw-r--r--rust/fatcat-api/examples/client.rs2
-rw-r--r--rust/fatcat-api/examples/server_lib/server.rs4
-rw-r--r--rust/fatcat-api/src/client.rs6
-rw-r--r--rust/fatcat-api/src/lib.rs8
-rw-r--r--rust/fatcat-api/src/models.rs45
-rw-r--r--rust/fatcat-api/src/server.rs12
-rw-r--r--rust/fatcat-openapi2.yml23
-rw-r--r--rust/migrations/2018-05-12-001226_init/up.sql39
-rw-r--r--rust/src/api_server.rs59
-rw-r--r--rust/src/database_models.rs17
-rw-r--r--rust/src/database_schema.rs11
-rw-r--r--rust/tests/test_api_server.rs4
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,