use dashmap::DashMap;
use std::sync::Arc;
use tokio::sync::Mutex;
use crate::config::Config;
use crate::hooks::HookQueue;
use crate::maintenance::MaintenanceScheduler;
pub type RepoLock = Arc<Mutex<()>>;
#[derive(Clone)]
pub struct AppState {
pub config: Arc<Config>,
pub hook_queue: Arc<HookQueue>,
pub maintenance: Arc<MaintenanceScheduler>,
repo_locks: Arc<DashMap<String, RepoLock>>,
}
impl AppState {
pub fn new(config: Config) -> Self {
let config = Arc::new(config);
Self {
hook_queue: Arc::new(HookQueue::new(config.clone())),
maintenance: Arc::new(MaintenanceScheduler::new(config.clone())),
config,
repo_locks: Arc::new(DashMap::new()),
}
}
pub fn get_repo_lock(&self, tenant_id: &str) -> RepoLock {
self.repo_locks
.entry(tenant_id.to_string())
.or_insert_with(|| Arc::new(Mutex::new(())))
.clone()
}
}