use crate::errors::PullError; use api::users::UserDto; use auth::Accounts; use cache::AppRedis; use config::quota::QuotaConfig; use std::collections::HashMap; #[derive(Clone)] pub struct Actors { accounts: Accounts, quotas: AppRedis, limits: QuotaConfig, } impl Actors { pub fn new(accounts: Accounts, quotas: AppRedis, limits: QuotaConfig) -> Self { Self { accounts, quotas, limits, } } pub async fn briefs(&self, ids: &[i64]) -> Result, PullError> { Ok(auth::users::load_user_briefs(&self.accounts, ids).await?) } pub async fn resolve(&self, reference: &str) -> Result { let reference = reference.trim(); if let Ok(uid) = reference.parse::() { return Ok(uid); } let user = auth::users::find_by_username(&self.accounts, reference) .await? .ok_or_else(|| PullError::BadRequest(format!("user `{reference}` not found")))?; Ok(user.user_id) } pub async fn allow_pull(&self, user: i64) -> Result<(), PullError> { if self .quotas .quota_allow( &format!("quota:pull_create:{user}"), self.limits.pull_create_per_day, 86_400, ) .await { Ok(()) } else { Err(PullError::RateLimited( "pull request creation quota exceeded, retry tomorrow".to_owned(), )) } } pub async fn allow_comment(&self, user: i64) -> Result<(), PullError> { if self .quotas .quota_allow( &format!("quota:comment_create:{user}"), self.limits.comment_create_per_day, 86_400, ) .await { Ok(()) } else { Err(PullError::RateLimited( "comment creation quota exceeded, retry tomorrow".to_owned(), )) } } }