Skip to content
Clone
main
54 lines 1.5 KB Rust
use db::AppDatabase;
use git::facade::GitService;
use models::pull_request::pull_requests;
use sea_orm::{ColumnTrait, DatabaseConnection, EntityTrait, PaginatorTrait, QueryFilter};
use std::sync::Arc;
use uuid::Uuid;
use crate::errors::PullError;
#[derive(Clone)]
pub struct PullService {
pub(crate) database: Arc<AppDatabase>,
pub(crate) actors: crate::services::actors::Actors,
pub git: GitService,
pub issues: issues::services::service::IssueService,
}
impl PullService {
pub fn new(
database: Arc<AppDatabase>,
git: GitService,
issues: issues::services::service::IssueService,
actors: crate::services::actors::Actors,
) -> Self {
Self {
database,
git,
issues,
actors,
}
}
pub fn db_read(&self) -> &db::DbConn {
self.database.read()
}
pub fn db_write(&self) -> &DatabaseConnection {
self.database.write()
}
/// 开放 PR 数量回填 `repos.nums_pr`,状态变更后调用。
pub async fn recount_open(&self, repo_id: Uuid) -> Result<(), PullError> {
let open = pull_requests::Entity::find()
.filter(pull_requests::Column::RepoId.eq(repo_id))
.filter(pull_requests::Column::HasMerged.eq(false))
.filter(pull_requests::Column::ClosedAt.is_null())
.count(self.db_write())
.await?;
self.git
.set_pull_count(repo_id, open.cast_signed() as i32)
.await?;
Ok(())
}
}