diff options
Diffstat (limited to 'rust/src/api_server.rs')
-rw-r--r-- | rust/src/api_server.rs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/rust/src/api_server.rs b/rust/src/api_server.rs index aaf3d9a7..efe40165 100644 --- a/rust/src/api_server.rs +++ b/rust/src/api_server.rs @@ -129,6 +129,31 @@ macro_rules! wrap_lookup_handler { } } +macro_rules! wrap_history_handler { + ($get_fn:ident, $get_handler:ident, $get_resp:ident) => { + fn $get_fn( + &self, + id: String, + limit: Option<i64>, + _context: &Context, + ) -> Box<Future<Item = $get_resp, Error = ApiError> + Send> { + let ret = match self.$get_handler(id.clone(), limit) { + Ok(history) => + $get_resp::FoundEntityHistory(history), + Err(Error(ErrorKind::Diesel(::diesel::result::Error::NotFound), _)) => + $get_resp::NotFound(ErrorResponse { message: format!("No such entity {}: {}", stringify!($model), id) }), + Err(Error(ErrorKind::Uuid(e), _)) => + $get_resp::BadRequest(ErrorResponse { message: e.to_string() }), + Err(e) => { + error!("{}", e); + $get_resp::GenericError(ErrorResponse { message: e.to_string() }) + }, + }; + Box::new(futures::done(Ok(ret))) + } + } +} + macro_rules! count_entity { ($table:ident, $conn:expr) => {{ let count: i64 = $table::table @@ -350,6 +375,32 @@ impl Server { container_row2entity(Some(ident), rev) } + fn get_container_history_handler( + &self, + id: String, + limit: Option<i64>, + ) -> Result<Vec<EntityHistoryEntry>> { + let conn = self.db_pool.get().expect("db_pool error"); + let id = uuid::Uuid::parse_str(&id)?; + let limit = limit.unwrap_or(50); + + let rows: Vec<(EditgroupRow, ChangelogRow, ContainerEditRow)> = editgroup::table + .inner_join(changelog::table) + .inner_join(container_edit::table) + .filter(container_edit::ident_id.eq(id)) + .limit(limit) + .get_results(&conn)?; + + let history: Vec<EntityHistoryEntry> = rows.into_iter() + .map(|(eg_row, cl_row, ce_row)| EntityHistoryEntry { + edit: ce_row.to_model().expect("edit row to model"), + editgroup: eg_row.to_model_partial(), + changelog_entry: cl_row.to_model(), + }) + .collect(); + Ok(history) + } + fn get_creator_handler(&self, id: String) -> Result<CreatorEntity> { let conn = self.db_pool.get().expect("db_pool error"); let id = uuid::Uuid::parse_str(&id)?; @@ -1084,6 +1135,11 @@ impl Api for Server { doi, String ); + wrap_history_handler!( + get_container_history, + get_container_history_handler, + GetContainerHistoryResponse + ); // Rename "wrap_lookup_handler"? wrap_lookup_handler!( |