gitdataai/lib/service/git/mod.rs
2026-06-01 22:04:38 +08:00

97 lines
2.7 KiB
Rust

pub mod archive;
pub mod blame;
pub mod blob;
pub mod branch;
pub mod commit;
pub mod commit_status;
pub mod compare;
pub mod contents;
pub mod contributor;
pub mod diff;
pub mod embed;
pub mod fork;
pub mod init;
pub mod language;
pub mod protect;
pub mod readme;
pub mod refs;
pub mod release;
pub mod repo;
pub mod star;
pub mod tag;
pub mod tree;
pub mod watch;
pub mod webhook;
use db::sqlx;
use git::sync::{ReceiveSyncService, RepoReceiveSyncTask};
use model::repos::RepoModel;
use session::Session;
use crate::{AppService, error::AppError, session_user};
impl AppService {
pub async fn queue_sync(&self, repo_uid: uuid::Uuid) {
let sync_service = ReceiveSyncService::new(self.redis_pool.clone());
sync_service.send(RepoReceiveSyncTask { repo_uid }).await;
}
pub async fn repo_resolve(
&self,
wk_id: uuid::Uuid,
repo_name: &str,
) -> Result<RepoModel, AppError> {
sqlx::query_as::<_, RepoModel>(
"SELECT id, wk, name, description, default_branch, visibility, size_bytes, \
is_archived, is_template, is_mirror, created_by, storage_path, created_at, updated_at, deleted_at \
FROM repo WHERE wk = $1 AND name = $2 AND deleted_at IS NULL",
)
.bind(wk_id)
.bind(repo_name)
.fetch_optional(self.db.reader())
.await
.map_err(|e| AppError::DatabaseError(e.to_string()))?
.ok_or(AppError::RepoNotFound)
}
pub async fn git_require_member(
&self,
ctx: &Session,
wk_name: &str,
repo_name: &str,
) -> Result<RepoModel, AppError> {
let user_uid = session_user(ctx)?;
let wk = self.workspace_resolve(wk_name).await?;
self.workspace_require_member(wk.id, user_uid).await?;
self.repo_resolve(wk.id, repo_name).await
}
pub async fn git_require_admin(
&self,
ctx: &Session,
wk_name: &str,
repo_name: &str,
) -> Result<RepoModel, AppError> {
let user_uid = session_user(ctx)?;
let wk = self.workspace_resolve(wk_name).await?;
self.workspace_require_admin(wk.id, user_uid).await?;
self.repo_resolve(wk.id, repo_name).await
}
}
pub fn rpc_err(status: tonic::Status) -> AppError {
match status.code() {
tonic::Code::NotFound => {
AppError::NotFound(status.message().to_string())
}
tonic::Code::PermissionDenied => AppError::PermissionDenied,
tonic::Code::InvalidArgument => {
AppError::BadRequest(status.message().to_string())
}
tonic::Code::AlreadyExists => {
AppError::Conflict(status.message().to_string())
}
_ => AppError::GitRpcError(status.message().to_string()),
}
}