Skip to content
Clone
6db412f
74 lines 2.0 KB Rust
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<HashMap<i64, UserDto>, PullError> {
Ok(auth::users::load_user_briefs(&self.accounts, ids).await?)
}
pub async fn resolve(&self, reference: &str) -> Result<i64, PullError> {
let reference = reference.trim();
if let Ok(uid) = reference.parse::<i64>() {
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(),
))
}
}
}