diff --git a/crates/context_aware_config/src/api.rs b/crates/context_aware_config/src/api.rs index 11c521bc..575df409 100644 --- a/crates/context_aware_config/src/api.rs +++ b/crates/context_aware_config/src/api.rs @@ -1,5 +1,6 @@ pub mod audit_log; pub mod config; +pub mod config_versions; pub mod context; pub mod default_config; pub mod dimension; diff --git a/crates/context_aware_config/src/api/config_versions.rs b/crates/context_aware_config/src/api/config_versions.rs new file mode 100644 index 00000000..e87b7d56 --- /dev/null +++ b/crates/context_aware_config/src/api/config_versions.rs @@ -0,0 +1,2 @@ +mod handlers; +pub use handlers::endpoints; diff --git a/crates/context_aware_config/src/api/config_versions/handlers.rs b/crates/context_aware_config/src/api/config_versions/handlers.rs new file mode 100644 index 00000000..2c957092 --- /dev/null +++ b/crates/context_aware_config/src/api/config_versions/handlers.rs @@ -0,0 +1,47 @@ +use crate::{ + db::{models::ConfigVersion, schema::config_versions}, + types::QueryFilters, +}; + +extern crate base64; +use service_utils::service::types::DbConnection; + +use superposition_types::result as superposition; + +use actix_web::{get, web::Query, HttpResponse, Scope}; +use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl}; +use serde_json::json; + +pub fn endpoints() -> Scope { + Scope::new("").service(get) +} + +#[get("")] +async fn get( + db_conn: DbConnection, + filters: Query, +) -> superposition::Result { + let DbConnection(mut conn) = db_conn; + + let n_version: i64 = config_versions::dsl::config_versions + .count() + .get_result(&mut conn)?; + let mut builder = config_versions::dsl::config_versions + .into_boxed() + .order(config_versions::dsl::created_at.desc()); + if let Some(limit) = filters.count { + builder = builder.limit(limit); + } + if let Some(page) = filters.page { + let offset = (page - 1) * filters.count.unwrap_or(10); + builder = builder.offset(offset); + } + let limit = filters.count.unwrap_or(10); + let config_versions: Vec = builder.load(&mut conn)?; + let total_pages = (n_version as f64 / limit as f64).ceil() as u64; + Ok(HttpResponse::Ok().json(json!({ + "total_pages": total_pages, + "total_items": n_version, + "data": config_versions + }))) +} diff --git a/crates/context_aware_config/src/lib.rs b/crates/context_aware_config/src/lib.rs index c3971d3a..38285c71 100644 --- a/crates/context_aware_config/src/lib.rs +++ b/crates/context_aware_config/src/lib.rs @@ -2,4 +2,5 @@ pub mod api; pub mod db; pub mod helpers; pub mod middlewares; +pub mod types; pub mod validation_functions; diff --git a/crates/context_aware_config/src/types.rs b/crates/context_aware_config/src/types.rs new file mode 100644 index 00000000..245a97f4 --- /dev/null +++ b/crates/context_aware_config/src/types.rs @@ -0,0 +1,7 @@ +use serde::Deserialize; + +#[derive(Debug, Clone, Deserialize)] +pub struct QueryFilters { + pub count: Option, + pub page: Option, +} diff --git a/crates/superposition/src/main.rs b/crates/superposition/src/main.rs index 97c482d7..2bec5a22 100644 --- a/crates/superposition/src/main.rs +++ b/crates/superposition/src/main.rs @@ -245,6 +245,11 @@ async fn main() -> Result<()> { .wrap(AppExecutionScopeMiddlewareFactory::new(AppScope::CAC)) .service(type_templates::endpoints()), ) + .service( + scope("/config-versions") + .wrap(AppExecutionScopeMiddlewareFactory::new(AppScope::CAC)) + .service(config_versions::endpoints()), + ) .service( experiments::endpoints(scope("/experiments")).wrap( AppExecutionScopeMiddlewareFactory::new(AppScope::EXPERIMENTATION),