aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrtkay123 <dev@kanjala.com>2026-03-29 16:36:13 +0200
committerrtkay123 <dev@kanjala.com>2026-03-29 16:36:13 +0200
commitff3b9fbaf400c344cae67ef9bdc9ba7d5f27b976 (patch)
treece417252c6ea56c540e4c78f43c9ad4af9b76c64
parent57c4a5251c30d3dc2b78059fd208d8948d999056 (diff)
downloadwarden-ff3b9fbaf400c344cae67ef9bdc9ba7d5f27b976.tar.bz2
warden-ff3b9fbaf400c344cae67ef9bdc9ba7d5f27b976.zip
refactor: move state to core
-rw-r--r--Cargo.lock15
-rw-r--r--Cargo.toml1
-rw-r--r--lib/api-config/Cargo.toml26
-rw-r--r--lib/api-config/src/error.rs13
-rw-r--r--lib/api-config/src/lib.rs3
-rw-r--r--lib/api-config/src/schema/create.rs15
-rw-r--r--lib/api-config/src/schema/mod.rs33
-rw-r--r--lib/warden-core/src/lib.rs1
-rw-r--r--lib/warden-core/src/state/database.rs (renamed from warden/src/state/database.rs)4
-rw-r--r--lib/warden-core/src/state/mod.rs (renamed from warden/src/state/mod.rs)9
-rw-r--r--warden/Cargo.toml4
-rw-r--r--warden/src/main.rs8
-rw-r--r--warden/src/server/mod.rs2
-rw-r--r--warden/src/server/routes/config/logs.rs6
-rw-r--r--warden/src/server/routes/config/mod.rs3
-rw-r--r--warden/src/server/routes/config/schema/create.rs16
-rw-r--r--warden/src/server/routes/transaction_monitoring/mod.rs3
-rw-r--r--warden/src/server/routes/transaction_monitoring/monitor.rs10
18 files changed, 137 insertions, 35 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 7b78797..a5fadec 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -94,6 +94,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
[[package]]
+name = "api-config"
+version = "0.1.0"
+dependencies = [
+ "serde",
+ "serde_json",
+ "sqlx",
+ "thiserror 2.0.18",
+ "time",
+ "tracing",
+ "utoipa",
+ "warden-core",
+]
+
+[[package]]
name = "arbitrary"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3041,6 +3055,7 @@ name = "warden"
version = "0.1.0"
dependencies = [
"anyhow",
+ "api-config",
"axum",
"clap",
"jsonschema",
diff --git a/Cargo.toml b/Cargo.toml
index 2bdad55..05332e0 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -21,6 +21,7 @@ time = { version = "0.3.47", default-features = false }
tracing = "0.1.44"
tracing-subscriber = { version = "0.3.23", features = ["env-filter"] }
url = "2.5.8"
+utoipa = "5.4.0"
uuid = "1.23.0"
warden-core = { path = "lib/warden-core" }
diff --git a/lib/api-config/Cargo.toml b/lib/api-config/Cargo.toml
new file mode 100644
index 0000000..ec31262
--- /dev/null
+++ b/lib/api-config/Cargo.toml
@@ -0,0 +1,26 @@
+[package]
+name = "api-config"
+version = "0.1.0"
+edition = "2024"
+license.workspace = true
+readme.workspace = true
+documentation.workspace = true
+homepage.workspace = true
+publish.workspace = true
+
+[dependencies]
+serde.workspace = true
+serde_json.workspace = true
+thiserror.workspace = true
+time = { workspace = true, features = ["serde"] }
+tracing.workspace = true
+utoipa = { workspace = true, optional = true }
+warden-core.workspace = true
+
+[features]
+default = []
+utoipa = ["dep:utoipa", "utoipa/time"]
+
+[dependencies.sqlx]
+workspace = true
+features = ["json", "runtime-tokio-rustls", "time"]
diff --git a/lib/api-config/src/error.rs b/lib/api-config/src/error.rs
new file mode 100644
index 0000000..6f7b099
--- /dev/null
+++ b/lib/api-config/src/error.rs
@@ -0,0 +1,13 @@
+use thiserror::Error;
+
+#[derive(Error, Debug)]
+pub enum ConfigurationError {
+ #[error("data store disconnected")]
+ Disconnect(#[from] sqlx::Error),
+ #[error("the data for key `{0}` is not available")]
+ Redaction(String),
+ #[error("invalid header (expected {expected:?}, found {found:?})")]
+ InvalidHeader { expected: String, found: String },
+ #[error("unknown data store error")]
+ Unknown,
+}
diff --git a/lib/api-config/src/lib.rs b/lib/api-config/src/lib.rs
new file mode 100644
index 0000000..84366c1
--- /dev/null
+++ b/lib/api-config/src/lib.rs
@@ -0,0 +1,3 @@
+mod error;
+pub mod schema;
+pub use error::ConfigurationError;
diff --git a/lib/api-config/src/schema/create.rs b/lib/api-config/src/schema/create.rs
new file mode 100644
index 0000000..5c91f64
--- /dev/null
+++ b/lib/api-config/src/schema/create.rs
@@ -0,0 +1,15 @@
+use serde::{Deserialize, Serialize};
+
+#[derive(Deserialize, Serialize)]
+#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
+/// Transaction to monitor
+pub struct CreateSchema {
+ #[serde(rename = "type")]
+ /// Transaction schema type
+ pub kind: String,
+ /// The schema's version
+ pub version: String,
+ /// Transaction data
+ #[serde(rename = "json_schema")]
+ pub schema: serde_json::Value,
+}
diff --git a/lib/api-config/src/schema/mod.rs b/lib/api-config/src/schema/mod.rs
new file mode 100644
index 0000000..654e6ad
--- /dev/null
+++ b/lib/api-config/src/schema/mod.rs
@@ -0,0 +1,33 @@
+pub mod create;
+
+use serde::{Deserialize, Serialize};
+use time::OffsetDateTime;
+
+use crate::ConfigurationError;
+
+/// Transaction to monitor
+#[derive(Deserialize, Serialize)]
+#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
+pub struct TransactionSchema {
+ #[serde(rename = "type")]
+ /// Transaction schema type
+ pub kind: String,
+ /// The schema's version
+ pub version: String,
+ /// JSON schema for transcation
+ #[serde(rename = "json_schema")]
+ pub schema: serde_json::Value,
+ #[serde(with = "time::serde::rfc3339")]
+ pub created_at: OffsetDateTime,
+ #[serde(with = "time::serde::rfc3339")]
+ pub updated_at: OffsetDateTime,
+}
+
+pub trait SchemaDriver {
+ fn create(
+ &self,
+ name: impl AsRef<str>,
+ version: impl AsRef<str>,
+ schema: serde_json::Value,
+ ) -> impl std::future::Future<Output = Result<TransactionSchema, ConfigurationError>> + Send + Sync;
+}
diff --git a/lib/warden-core/src/lib.rs b/lib/warden-core/src/lib.rs
index f200ba1..413087b 100644
--- a/lib/warden-core/src/lib.rs
+++ b/lib/warden-core/src/lib.rs
@@ -1,3 +1,4 @@
mod error;
pub use error::WardenError;
pub mod config;
+pub mod state;
diff --git a/warden/src/state/database.rs b/lib/warden-core/src/state/database.rs
index 08f9483..cf34484 100644
--- a/warden/src/state/database.rs
+++ b/lib/warden-core/src/state/database.rs
@@ -1,9 +1,9 @@
use sqlx::PgPool;
use tracing::{debug, error};
-use crate::config::cli::database::Database;
+use crate::{WardenError, config::cli::database::Database};
-pub async fn connect(config: &Database) -> anyhow::Result<PgPool> {
+pub async fn connect(config: &Database) -> Result<PgPool, WardenError> {
let url = config.get_url()?;
let host = url.host_str();
debug!(host = host, "connecting to database");
diff --git a/warden/src/state/mod.rs b/lib/warden-core/src/state/mod.rs
index eae1c43..f4692c2 100644
--- a/warden/src/state/mod.rs
+++ b/lib/warden-core/src/state/mod.rs
@@ -1,7 +1,10 @@
-pub mod database;
+pub(crate) mod database;
use sqlx::PgPool;
+use tracing_subscriber::EnvFilter;
-use crate::{config::Configuration, logging::LogHandle};
+use crate::{WardenError, config::Configuration};
+
+pub type LogHandle = tracing_subscriber::reload::Handle<EnvFilter, tracing_subscriber::Registry>;
#[derive(Debug, Clone)]
pub struct AppState {
@@ -10,7 +13,7 @@ pub struct AppState {
}
impl AppState {
- pub async fn new(log_handle: LogHandle, config: &Configuration) -> anyhow::Result<Self> {
+ pub async fn new(log_handle: LogHandle, config: &Configuration) -> Result<Self, WardenError> {
let database = database::connect(&config.database).await?;
Ok(Self {
diff --git a/warden/Cargo.toml b/warden/Cargo.toml
index b3c3ef1..d0d008d 100644
--- a/warden/Cargo.toml
+++ b/warden/Cargo.toml
@@ -30,6 +30,10 @@ utoipa-swagger-ui = { version = "9.0.2", optional = true }
uuid = { workspace = true, features = ["v7"] }
warden-core.workspace = true
+[dependencies.api-config]
+path = "../lib/api-config"
+features = ["utoipa"]
+
[dependencies.sqlx]
workspace = true
features = ["json", "runtime-tokio-rustls", "time"]
diff --git a/warden/src/main.rs b/warden/src/main.rs
index ab37e41..7daad57 100644
--- a/warden/src/main.rs
+++ b/warden/src/main.rs
@@ -8,16 +8,12 @@ use tokio::net::TcpListener;
use anyhow::Context as _;
use clap::Parser as _;
use tracing::info;
-use warden_core::config;
+use warden_core::{config, state::AppState};
-use crate::{
- config::{Commands, Configuration},
- state::AppState,
-};
+use crate::config::{Commands, Configuration};
mod logging;
mod server;
-mod state;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
diff --git a/warden/src/server/mod.rs b/warden/src/server/mod.rs
index fe93352..c9bab23 100644
--- a/warden/src/server/mod.rs
+++ b/warden/src/server/mod.rs
@@ -13,6 +13,7 @@ use tower_http::{
};
use utoipa::OpenApi;
use utoipa_axum::router::OpenApiRouter;
+use warden_core::state::AppState;
use crate::{
config::Configuration,
@@ -20,7 +21,6 @@ use crate::{
middleware::request_id::{REQUEST_ID_HEADER, middleware_request_id},
routes::{ApiDoc, config::ConfigDoc, transaction_monitoring::MonitoringDoc},
},
- state::AppState,
};
pub mod api;
diff --git a/warden/src/server/routes/config/logs.rs b/warden/src/server/routes/config/logs.rs
index e541b98..1173603 100644
--- a/warden/src/server/routes/config/logs.rs
+++ b/warden/src/server/routes/config/logs.rs
@@ -3,11 +3,9 @@ use std::sync::Arc;
use axum::{extract::State, http::StatusCode};
use serde::Deserialize;
use utoipa::ToSchema;
+use warden_core::state::AppState;
-use crate::{
- server::{api::SafeJson, routes::config::CONFIG},
- state::AppState,
-};
+use crate::server::{api::SafeJson, routes::config::CONFIG};
#[derive(Deserialize, Debug, Clone, ToSchema)]
pub struct LogLevel {
diff --git a/warden/src/server/routes/config/mod.rs b/warden/src/server/routes/config/mod.rs
index f5dd56e..d80c36b 100644
--- a/warden/src/server/routes/config/mod.rs
+++ b/warden/src/server/routes/config/mod.rs
@@ -4,8 +4,7 @@ use std::sync::Arc;
use utoipa::OpenApi;
use utoipa_axum::router::OpenApiRouter;
-
-use crate::state::AppState;
+use warden_core::state::AppState;
const CONFIG: &str = "Configuration";
diff --git a/warden/src/server/routes/config/schema/create.rs b/warden/src/server/routes/config/schema/create.rs
index e2ad580..d655a2b 100644
--- a/warden/src/server/routes/config/schema/create.rs
+++ b/warden/src/server/routes/config/schema/create.rs
@@ -7,17 +7,15 @@ use axum::{
response::IntoResponse,
};
use tracing::{debug, info, trace};
+use warden_core::state::AppState;
-use crate::{
- server::{
- api::{
- schema::{CreateSchema, TransactionSchema},
- version::Version,
- },
- error::AppError,
- routes::config::CONFIG,
+use crate::server::{
+ api::{
+ schema::{CreateSchema, TransactionSchema},
+ version::Version,
},
- state::AppState,
+ error::AppError,
+ routes::config::CONFIG,
};
#[utoipa::path(
diff --git a/warden/src/server/routes/transaction_monitoring/mod.rs b/warden/src/server/routes/transaction_monitoring/mod.rs
index da923d4..459d75d 100644
--- a/warden/src/server/routes/transaction_monitoring/mod.rs
+++ b/warden/src/server/routes/transaction_monitoring/mod.rs
@@ -2,8 +2,7 @@ use std::sync::Arc;
use utoipa::OpenApi;
use utoipa_axum::router::OpenApiRouter;
-
-use crate::state::AppState;
+use warden_core::state::AppState;
pub mod monitor;
diff --git a/warden/src/server/routes/transaction_monitoring/monitor.rs b/warden/src/server/routes/transaction_monitoring/monitor.rs
index 22c2864..8fb51cd 100644
--- a/warden/src/server/routes/transaction_monitoring/monitor.rs
+++ b/warden/src/server/routes/transaction_monitoring/monitor.rs
@@ -1,13 +1,11 @@
use std::sync::Arc;
-use crate::{
- server::{
- api::{transaction::Transaction, version::Version},
- middleware::extractors::transaction::ValidatedTransaction,
- },
- state::AppState,
+use crate::server::{
+ api::{transaction::Transaction, version::Version},
+ middleware::extractors::transaction::ValidatedTransaction,
};
use axum::{extract::State, http::StatusCode};
+use warden_core::state::AppState;
#[utoipa::path(
post,