vex_api/
state.rs

1//! Application State
2//!
3//! Centralizes access to DB, Queue, and Auth/Monitoring services.
4
5use crate::auth::JwtAuth;
6use std::sync::Arc;
7use vex_llm::{Metrics, RateLimiter};
8use vex_persist::StorageBackend;
9use vex_queue::{QueueBackend, WorkerPool};
10
11/// Application state shared across handlers
12#[derive(Clone)]
13pub struct AppState {
14    jwt_auth: JwtAuth,
15    rate_limiter: Arc<RateLimiter>,
16    metrics: Arc<Metrics>,
17    db: Arc<dyn StorageBackend>,
18    queue: Arc<WorkerPool<dyn QueueBackend>>,
19}
20
21impl AppState {
22    /// Create new application state
23    pub fn new(
24        jwt_auth: JwtAuth,
25        rate_limiter: Arc<RateLimiter>,
26        metrics: Arc<Metrics>,
27        db: Arc<dyn StorageBackend>,
28        queue: Arc<WorkerPool<dyn QueueBackend>>,
29    ) -> Self {
30        Self {
31            jwt_auth,
32            rate_limiter,
33            metrics,
34            db,
35            queue,
36        }
37    }
38
39    /// Get JWT auth service
40    pub fn jwt_auth(&self) -> &JwtAuth {
41        &self.jwt_auth
42    }
43
44    /// Get rate limiter (cloned Arc for sharing)
45    pub fn rate_limiter(&self) -> Arc<RateLimiter> {
46        self.rate_limiter.clone()
47    }
48
49    /// Get metrics collector (cloned Arc for sharing)
50    pub fn metrics(&self) -> Arc<Metrics> {
51        self.metrics.clone()
52    }
53
54    /// Get database backend (cloned Arc for sharing)
55    pub fn db(&self) -> Arc<dyn StorageBackend> {
56        self.db.clone()
57    }
58
59    /// Get queue worker pool (cloned Arc for sharing)
60    pub fn queue(&self) -> Arc<WorkerPool<dyn QueueBackend>> {
61        self.queue.clone()
62    }
63}