use crate::config::Config;
use crate::core::budget::UnifiedBudgetLimits;
use crate::core::keys::{DatabaseKeyRepository, KeyManager};
use crate::core::teams::TeamManager;
use crate::services::pricing::PricingService;
use crate::storage::database::SeaOrmTeamRepository;
use crate::utils::sync::AtomicValue;
use std::sync::Arc;
#[derive(Clone)]
pub struct AppState {
pub config: AtomicValue<Config>,
pub auth: Arc<crate::auth::AuthSystem>,
pub unified_router: Arc<crate::core::router::UnifiedRouter>,
pub storage: Arc<crate::storage::StorageLayer>,
pub pricing: Arc<PricingService>,
pub budget_limits: Arc<UnifiedBudgetLimits>,
pub team_manager: Arc<TeamManager>,
pub key_manager: KeyManager,
}
impl AppState {
pub fn new_with_unified_router(
config: Config,
auth: crate::auth::AuthSystem,
unified_router: crate::core::router::UnifiedRouter,
storage: crate::storage::StorageLayer,
pricing: Arc<PricingService>,
) -> Self {
let storage = Arc::new(storage);
let key_manager = KeyManager::new(DatabaseKeyRepository::new(storage.clone()))
.with_hmac_secret(config.gateway.auth.api_key_hmac_secret.clone());
let team_manager = Arc::new(TeamManager::new(Arc::new(SeaOrmTeamRepository::new(
storage.database.clone(),
))));
Self {
config: AtomicValue::new(config),
auth: Arc::new(auth),
unified_router: Arc::new(unified_router),
storage,
pricing,
budget_limits: Arc::new(UnifiedBudgetLimits::new()),
team_manager,
key_manager,
}
}
pub fn config(&self) -> Arc<Config> {
self.config.load()
}
}