aboutsummaryrefslogtreecommitdiffstats
path: root/crates/api-base/src
diff options
context:
space:
mode:
authorrtkay123 <dev@kanjala.com>2026-04-03 14:43:54 +0200
committerrtkay123 <dev@kanjala.com>2026-04-03 14:43:54 +0200
commit41d90f42c37df06dabfd717d19f3dc72b5ba2d11 (patch)
tree2da259062cbdb459a2958d0be46eed20642b355a /crates/api-base/src
parent898a2966975c7397e35d8df6b72df42147bf18bd (diff)
downloadsellershut-41d90f42c37df06dabfd717d19f3dc72b5ba2d11.tar.bz2
sellershut-41d90f42c37df06dabfd717d19f3dc72b5ba2d11.zip
feat: openapi
Diffstat (limited to 'crates/api-base/src')
-rw-r--r--crates/api-base/src/health/apidoc.rs12
-rw-r--r--crates/api-base/src/health/mod.rs27
-rw-r--r--crates/api-base/src/lib.rs3
-rw-r--r--crates/api-base/src/version.rs45
4 files changed, 87 insertions, 0 deletions
diff --git a/crates/api-base/src/health/apidoc.rs b/crates/api-base/src/health/apidoc.rs
new file mode 100644
index 0000000..45b8754
--- /dev/null
+++ b/crates/api-base/src/health/apidoc.rs
@@ -0,0 +1,12 @@
+use utoipa::OpenApi;
+
+use crate::Version;
+
+#[derive(OpenApi)]
+#[openapi(
+ tags(
+ (name = "sellershut", description = "API health check"),
+ ),
+ components(schemas(Version))
+)]
+pub struct ApiDocBase;
diff --git a/crates/api-base/src/health/mod.rs b/crates/api-base/src/health/mod.rs
new file mode 100644
index 0000000..a84dc85
--- /dev/null
+++ b/crates/api-base/src/health/mod.rs
@@ -0,0 +1,27 @@
+#[cfg(feature = "utoipa")]
+mod apidoc;
+
+#[cfg(feature = "utoipa")]
+pub use apidoc::*;
+
+#[derive(Default)]
+pub struct BaseService;
+
+impl HealthDriver for BaseService {}
+
+pub trait HealthDriver: Send + Sync {
+ fn health(&self, app: &str, version: &str) -> String {
+ format!("{app} v{version} is live")
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use crate::health::{BaseService, HealthDriver};
+
+ #[test]
+ fn health() {
+ let app = BaseService.health(env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"));
+ assert!(app.contains("is live"));
+ }
+}
diff --git a/crates/api-base/src/lib.rs b/crates/api-base/src/lib.rs
new file mode 100644
index 0000000..9c632e0
--- /dev/null
+++ b/crates/api-base/src/lib.rs
@@ -0,0 +1,3 @@
+pub mod health;
+mod version;
+pub use version::*;
diff --git a/crates/api-base/src/version.rs b/crates/api-base/src/version.rs
new file mode 100644
index 0000000..0652c6e
--- /dev/null
+++ b/crates/api-base/src/version.rs
@@ -0,0 +1,45 @@
+#[derive(Debug)]
+#[cfg_attr(
+ feature = "utoipa",
+ derive(utoipa::ToSchema, serde::Deserialize, serde::Serialize),
+ schema(example = "v0"),
+ serde(rename_all = "lowercase")
+)]
+pub enum Version {
+ V0,
+}
+
+#[cfg(feature = "axum")]
+mod request {
+ use super::*;
+ use axum::RequestPartsExt;
+ use axum::extract::{FromRequestParts, Path};
+ use axum::http::StatusCode;
+ use axum::http::request::Parts;
+ use axum::response::{IntoResponse, Response};
+ use std::collections::HashMap;
+
+ impl<S> FromRequestParts<S> for Version
+ where
+ S: Send + Sync,
+ {
+ type Rejection = Response;
+
+ async fn from_request_parts(
+ parts: &mut Parts,
+ _state: &S,
+ ) -> Result<Self, Self::Rejection> {
+ let params: Path<HashMap<String, String>> =
+ parts.extract().await.map_err(IntoResponse::into_response)?;
+
+ let version = params
+ .get("apiVersion")
+ .ok_or_else(|| (StatusCode::NOT_FOUND, "version param missing").into_response())?;
+
+ match version.as_str() {
+ "v0" => Ok(Version::V0),
+ _ => Err((StatusCode::NOT_FOUND, "unknown version").into_response()),
+ }
+ }
+ }
+}