From 25eb4c69e5148a2352ac13fe4a905ed58ee5d601 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Wed, 25 Sep 2024 08:26:53 +0530 Subject: [PATCH] feat: get config-versions api --- crates/context_aware_config/src/api.rs | 1 + .../src/api/config_versions.rs | 2 + .../src/api/config_versions/handlers.rs | 50 +++++++++++++++++++ crates/context_aware_config/src/lib.rs | 1 + crates/context_aware_config/src/types.rs | 14 ++++++ crates/superposition/src/main.rs | 5 ++ 6 files changed, 73 insertions(+) create mode 100644 crates/context_aware_config/src/api/config_versions.rs create mode 100644 crates/context_aware_config/src/api/config_versions/handlers.rs create mode 100644 crates/context_aware_config/src/types.rs 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..5402338c --- /dev/null +++ b/crates/context_aware_config/src/api/config_versions/handlers.rs @@ -0,0 +1,50 @@ +use crate::{ + db::{models::ConfigVersion, schema::config_versions}, + types::{PaginatedResponse, QueryFilters}, +}; + +extern crate base64; +use service_utils::service::types::DbConnection; + +use superposition_types::result as superposition; + +use actix_web::{ + get, + web::{Json, Query}, + Scope, +}; +use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl}; + +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 i64; + Ok(Json(PaginatedResponse { + 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..9cf7aa23 --- /dev/null +++ b/crates/context_aware_config/src/types.rs @@ -0,0 +1,14 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Deserialize)] +pub struct QueryFilters { + pub count: Option, + pub page: Option, +} + +#[derive(Serialize, Debug, Clone, Deserialize)] +pub struct PaginatedResponse { + pub total_pages: i64, + pub total_items: i64, + pub data: Vec, +} 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),