From 8499636209c45a66ab6325665ce347cf90a8fe01 Mon Sep 17 00:00:00 2001 From: itsscb Date: Wed, 12 Mar 2025 22:36:54 +0100 Subject: [PATCH] feat: implement API versioning and health check endpoints --- Cargo.toml | 10 ++++++---- src/api.rs | 13 +++++++++++++ src/api/v1.rs | 5 +++++ src/api/v1/health.rs | 5 +++++ src/api/v1/version.rs | 10 ++++++++++ src/lib.rs | 13 +++++++++++++ src/main.rs | 9 +-------- 7 files changed, 53 insertions(+), 12 deletions(-) create mode 100644 src/api.rs create mode 100644 src/api/v1.rs create mode 100644 src/api/v1/health.rs create mode 100644 src/api/v1/version.rs create mode 100644 src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index e1123a9..8305f65 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,13 @@ [package] name = "digitaler-frieden" -version = "0.1.0" -edition = "2021" +version = "0.1.1" +edition = "2024" [dependencies] axum = "0.8.1" -shuttle-axum = "0.52.0" -shuttle-runtime = "0.52.0" +serde_json = "1.0.140" +shuttle-axum = "0.53.0" +shuttle-runtime = "0.53.0" tokio = "1.28.2" tower-http = { version = "0.6.2", features = ["fs"] } +tracing = "0.1.41" diff --git a/src/api.rs b/src/api.rs new file mode 100644 index 0000000..b08a27d --- /dev/null +++ b/src/api.rs @@ -0,0 +1,13 @@ +use crate::api::v1::{get_version, health_check}; +use axum::{routing, Router}; + +pub mod v1; + +pub fn new() -> Router { + Router::new().nest( + "/v1", + Router::new() + .route("/version", routing::get(get_version)) + .route("/health", routing::get(health_check)), + ) +} diff --git a/src/api/v1.rs b/src/api/v1.rs new file mode 100644 index 0000000..620bdb0 --- /dev/null +++ b/src/api/v1.rs @@ -0,0 +1,5 @@ +mod health; +mod version; + +pub use health::health_check; +pub use version::get_version; diff --git a/src/api/v1/health.rs b/src/api/v1/health.rs new file mode 100644 index 0000000..3a8af19 --- /dev/null +++ b/src/api/v1/health.rs @@ -0,0 +1,5 @@ +use axum::response::IntoResponse; + +pub async fn health_check() -> impl IntoResponse { + "OK" +} diff --git a/src/api/v1/version.rs b/src/api/v1/version.rs new file mode 100644 index 0000000..63da14b --- /dev/null +++ b/src/api/v1/version.rs @@ -0,0 +1,10 @@ +use crate::VERSION; +use axum::response::IntoResponse; +use axum::Json; +use serde_json; +use tracing::instrument; + +#[instrument()] +pub async fn get_version() -> impl IntoResponse { + Json(serde_json::json!({ "version": VERSION })) +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..5eb8b5b --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,13 @@ +mod api; + +use axum::Router; +use tower_http::services::{ServeDir, ServeFile}; + +const VERSION: &str = env!("CARGO_PKG_VERSION"); + +pub fn new() -> Router { + Router::new().nest("/api", api::new()).fallback_service( + ServeDir::new("frontend/dist/frontend/browser") + .not_found_service(ServeFile::new("frontend/dist/frontend/browser/index.html")), + ) +} diff --git a/src/main.rs b/src/main.rs index a67ea98..ac9ca1a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,6 @@ -use axum::Router; -use tower_http::services::{ServeDir, ServeFile}; - #[shuttle_runtime::main] #[allow(clippy::unused_async)] async fn main() -> shuttle_axum::ShuttleAxum { - let router = Router::new().fallback_service( - ServeDir::new("frontend/dist/frontend/browser") - .not_found_service(ServeFile::new("frontend/dist/frontend/browser/index.html")), - ); - + let router = digitaler_frieden::new(); Ok(router.into()) }