use async_trait::async_trait;
use aa_core::ApprovalKind;
use super::routing_config::TeamRoutingConfig;
pub const DEFAULT_ESCALATION_TIMEOUT_SECS: u64 = 1800;
pub const DEFAULT_ESCALATION_ROLE: &str = "OrgAdmin";
#[derive(Debug, thiserror::Error)]
pub enum RepoError {
#[error("approval routing repo database error: {0}")]
Database(#[from] sqlx::Error),
#[error("approval routing repo migration error: {0}")]
Migration(#[from] sqlx::migrate::MigrateError),
#[error("approval routing repo serialisation error: {0}")]
Json(#[from] serde_json::Error),
}
pub fn global_default(team_id: &str, approval_kind: Option<ApprovalKind>) -> TeamRoutingConfig {
TeamRoutingConfig {
team_id: team_id.to_string(),
approval_kind,
approvers: vec![DEFAULT_ESCALATION_ROLE.to_string()],
escalation_timeout_secs: DEFAULT_ESCALATION_TIMEOUT_SECS,
escalation_approvers: vec![DEFAULT_ESCALATION_ROLE.to_string()],
}
}
#[async_trait]
pub trait ApprovalRoutingRepo: Send + Sync {
async fn get(&self, team_id: &str, approval_kind: Option<&ApprovalKind>) -> Result<TeamRoutingConfig, RepoError>;
async fn upsert(&self, config: TeamRoutingConfig) -> Result<(), RepoError>;
async fn list_for_team(&self, team_id: &str) -> Result<Vec<TeamRoutingConfig>, RepoError>;
}