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, pub(crate) actors: crate::services::actors::Actors, pub git: GitService, pub issues: issues::services::service::IssueService, } impl PullService { pub fn new( database: Arc, 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(()) } }