use ::session::Session; use config::AppConfig; use export::AppState; use git::service::GitService; use models::pull_request::pull_requests; use models::repo::repos; use sea_orm::ActiveValue::Set; use sea_orm::{ ActiveModelTrait, ColumnTrait, DatabaseConnection, EntityTrait, PaginatorTrait, QueryFilter, }; use uuid::Uuid; use crate::errors::PullError; #[derive(Clone)] pub struct PullService { pub state: AppState, pub git: GitService, } impl PullService { pub fn new(state: AppState) -> Self { let git = GitService::new(state.clone()); Self { state, git } } pub fn config(&self) -> &AppConfig { &self.state.config } pub fn db_read(&self) -> &DatabaseConnection { self.state.database.read() } pub fn db_write(&self) -> &DatabaseConnection { self.state.database.write() } pub fn uid(session: &Session) -> Result { session.uid().ok_or(PullError::Unauthorized) } /// 开放 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?; let repo = repos::ActiveModel { id: Set(repo_id), nums_pr: Set(open.cast_signed() as i32), ..Default::default() }; repo.update(self.db_write()).await?; Ok(()) } }