use std::sync::Arc; use cache::redis::RedisCache; use db::conn::Db; use jwt::JwtState; use crate::cache::ProjectCache; use crate::config::{ProjectConfig, SharedProjectConfig}; #[derive(Clone)] pub struct ProjectService { pub db: Db, pub kv: Arc, pub cache: ProjectCache, pub config: SharedProjectConfig, pub jwt: JwtState, } impl ProjectService { pub fn new(db: Db, kv: Arc, jwt: JwtState) -> Self { let cache = ProjectCache::new(kv.clone()); Self { db, kv, cache, config: Arc::new(ProjectConfig::default()), jwt, } } pub fn with_config(mut self, config: SharedProjectConfig) -> Self { self.config = config; self } } impl jwt::HasJwtState for ProjectService { fn jwt_state(&self) -> &JwtState { &self.jwt } fn access_blacklist(&self) -> Option> { Some(Arc::new(rate_limit::AccessTokenBlacklist::new(self.kv.clone()))) } } impl rate_limit::RateLimitProvider for ProjectService { fn rate_limit_kv(&self) -> Arc { self.kv.clone() } fn rate_limit_settings(&self) -> Arc { Arc::new(rate_limit::RateLimitConfig::default()) } }