diff options
Diffstat (limited to 'rust/src')
| -rw-r--r-- | rust/src/api_server.rs | 59 | ||||
| -rw-r--r-- | rust/src/lib.rs | 2 | 
2 files changed, 58 insertions, 3 deletions
| diff --git a/rust/src/api_server.rs b/rust/src/api_server.rs index 44f266a4..7c84ad81 100644 --- a/rust/src/api_server.rs +++ b/rust/src/api_server.rs @@ -114,6 +114,17 @@ macro_rules! wrap_lookup_handler {      }  } +macro_rules! count_entity { +    ($table:ident, $conn:expr) => {{ +        let count: i64 = $table::table +            .filter($table::is_live.eq(true)) +            .filter($table::redirect_id.is_null()) +            .select(diesel::dsl::count($table::id)) +            .first($conn)?; +        count +    }}; +} +  #[derive(Clone)]  pub struct Server {      pub db_pool: ConnectionPool, @@ -363,7 +374,8 @@ impl Server {              .load(&conn)?;          rows.into_iter() -            .map(|(rev, ident, _)| release_row2entity(Some(ident), rev, &conn)).collect() +            .map(|(rev, ident, _)| release_row2entity(Some(ident), rev, &conn)) +            .collect()      }      fn get_file_handler(&self, id: String) -> Result<FileEntity> { @@ -429,7 +441,8 @@ impl Server {              .load(&conn)?;          rows.into_iter() -            .map(|(rev, ident, _)| file_row2entity(Some(ident), rev, &conn)).collect() +            .map(|(rev, ident, _)| file_row2entity(Some(ident), rev, &conn)) +            .collect()      }      fn get_work_handler(&self, id: String) -> Result<WorkEntity> { @@ -456,7 +469,8 @@ impl Server {              .load(&conn)?;          rows.into_iter() -            .map(|(rev, ident)| release_row2entity(Some(ident), rev, &conn)).collect() +            .map(|(rev, ident)| release_row2entity(Some(ident), rev, &conn)) +            .collect()      }      fn create_container_handler( @@ -875,6 +889,31 @@ impl Server {              .collect();          Ok(entries)      } + +    fn get_stats_handler(&self, _more: Option<String>) -> Result<StatsResponse> { +        let conn = self.db_pool.get().expect("db_pool error"); + +        let merged_editgroups: i64 = changelog::table +            .select(diesel::dsl::count(changelog::id)) +            .first(&conn)?; + +        let val = json!({ +            "entity_counts": { +                "container": count_entity!(container_ident, &conn), +                "creator": count_entity!(creator_ident, &conn), +                "file": count_entity!(file_ident, &conn), +                "release": count_entity!(release_ident, &conn), +                "work": count_entity!(work_ident, &conn), +            }, +            "merged_editgroups": merged_editgroups, +            // TODO: "release_with_file": , +            // TODO: "release_with_doi": , +            // TODO: "creator_with_orcid": , +            // TODO: "files_with_release": , +            // TODO: "container_with_issnl": , +        }); +        Ok(StatsResponse { extra: Some(val) }) +    }  }  impl Api for Server { @@ -1089,4 +1128,18 @@ impl Api for Server {          };          Box::new(futures::done(Ok(ret)))      } + +    fn get_stats( +        &self, +        more: Option<String>, +        _context: &Context, +    ) -> Box<Future<Item = GetStatsResponse, Error = ApiError> + Send> { +        let ret = match self.get_stats_handler(more.clone()) { +            Ok(stats) => GetStatsResponse::Success(stats), +            Err(e) => GetStatsResponse::GenericError(ErrorResponse { +                message: e.to_string(), +            }), +        }; +        Box::new(futures::done(Ok(ret))) +    }  } diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 8ec850c5..8334b3a5 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -12,6 +12,7 @@ extern crate hyper;  #[macro_use]  extern crate error_chain;  extern crate iron; +#[macro_use]  extern crate serde_json;  pub mod api_helpers; @@ -27,6 +28,7 @@ mod errors {                          R2d2(::diesel::r2d2::Error);                          Uuid(::uuid::ParseError);                          Io(::std::io::Error) #[cfg(unix)]; +                        Serde(::serde_json::Error);          }      }  } | 
