diff options
-rw-r--r-- | rust/src/api_server.rs | 18 | ||||
-rw-r--r-- | rust/src/database_models.rs | 37 |
2 files changed, 46 insertions, 9 deletions
diff --git a/rust/src/api_server.rs b/rust/src/api_server.rs index 3b052a6c..18a3ff32 100644 --- a/rust/src/api_server.rs +++ b/rust/src/api_server.rs @@ -96,7 +96,7 @@ impl Server { issn: rev.issn, publisher: rev.publisher, name: rev.name, - state: None, // TODO: + state: Some(ident.state().unwrap().shortname()), ident: Some(ident.id.to_string()), revision: ident.rev_id.map(|v| v as isize), redirect: ident.redirect_id.map(|u| u.to_string()), @@ -126,7 +126,7 @@ impl Server { issn: rev.issn, publisher: rev.publisher, name: rev.name, - state: None, // TODO: + state: Some(ident.state().unwrap().shortname()), ident: Some(ident.id.to_string()), revision: ident.rev_id.map(|v| v as isize), redirect: ident.redirect_id.map(|u| u.to_string()), @@ -153,7 +153,7 @@ impl Server { let entity = CreatorEntity { name: rev.name, orcid: rev.orcid, - state: None, // TODO: + state: Some(ident.state().unwrap().shortname()), ident: Some(ident.id.to_string()), revision: ident.rev_id.map(|v| v as isize), redirect: ident.redirect_id.map(|u| u.to_string()), @@ -181,7 +181,7 @@ impl Server { let entity = CreatorEntity { name: rev.name, orcid: rev.orcid, - state: None, // TODO: + state: Some(ident.state().unwrap().shortname()), ident: Some(ident.id.to_string()), revision: ident.rev_id.map(|v| v as isize), redirect: ident.redirect_id.map(|u| u.to_string()), @@ -209,7 +209,7 @@ impl Server { sha1: rev.sha1, size: rev.size.map(|v| v as isize), url: rev.url, - state: None, // TODO: + state: Some(ident.state().unwrap().shortname()), ident: Some(ident.id.to_string()), revision: ident.rev_id.map(|v| v as isize), redirect: ident.redirect_id.map(|u| u.to_string()), @@ -238,7 +238,7 @@ impl Server { sha1: rev.sha1, size: rev.size.map(|v| v as isize), url: rev.url, - state: None, // TODO: + state: Some(ident.state().unwrap().shortname()), ident: Some(ident.id.to_string()), revision: ident.rev_id.map(|v| v as isize), redirect: ident.redirect_id.map(|u| u.to_string()), @@ -264,7 +264,7 @@ impl Server { let entity = WorkEntity { work_type: rev.work_type, - state: None, // TODO: + state: Some(ident.state().unwrap().shortname()), ident: Some(ident.id.to_string()), revision: ident.rev_id.map(|v| v as isize), redirect: ident.redirect_id.map(|u| u.to_string()), @@ -298,7 +298,7 @@ impl Server { issue: rev.issue, container_id: None, // TODO work_id: rev.work_ident_id.to_string(), - state: None, // TODO: + state: Some(ident.state().unwrap().shortname()), ident: Some(ident.id.to_string()), revision: ident.rev_id.map(|v| v as isize), redirect: ident.redirect_id.map(|u| u.to_string()), @@ -333,7 +333,7 @@ impl Server { issue: rev.issue, container_id: None, // TODO work_id: rev.work_ident_id.to_string(), - state: None, // TODO: + state: Some(ident.state().unwrap().shortname()), ident: Some(ident.id.to_string()), revision: ident.rev_id.map(|v| v as isize), redirect: ident.redirect_id.map(|u| u.to_string()), diff --git a/rust/src/database_models.rs b/rust/src/database_models.rs index 9aebb0f9..0e138439 100644 --- a/rust/src/database_models.rs +++ b/rust/src/database_models.rs @@ -2,10 +2,33 @@ use chrono; //use serde_json; use database_schema::*; use uuid::Uuid; +use errors::*; // Ugh. I thought the whole point was to *not* do this, but: // https://github.com/diesel-rs/diesel/issues/1589 +pub enum EntityState { + WorkInProgress, + Active(i64), + Redirect(Uuid, i64), + Deleted, +} + +impl EntityState { + pub fn shortname(&self) -> String { + match self { + EntityState::WorkInProgress => "wip", + EntityState::Active(_) => "active", + EntityState::Redirect(_,_) => "redirect", + EntityState::Deleted => "deleted", + }.to_string() + } +} + +pub trait EntityIdentRow { + fn state(&self) -> Result<EntityState>; +} + // Helper for constructing tables macro_rules! entity_structs { ($edit_table:expr, $edit_struct:ident, $ident_table:expr, $ident_struct:ident) => { @@ -28,6 +51,20 @@ macro_rules! entity_structs { pub rev_id: Option<i64>, pub redirect_id: Option<Uuid>, } + + impl EntityIdentRow for $ident_struct { + fn state(&self) -> Result<EntityState> { + if !self.is_live { + return Ok(EntityState::WorkInProgress); + } + match (self.redirect_id, self.rev_id) { + (None, None) => Ok(EntityState::Deleted), + (Some(redir), Some(rev)) => Ok(EntityState::Redirect(redir, rev)), + (None, Some(rev)) => Ok(EntityState::Active(rev)), + _ => bail!("Invalid EntityIdentRow state") + } + } + } }; } |