use ::session::OptionalUser; use api::http::{Path, State}; use api::rest::AppResponseData; use crate::errors::{ApiError, GitApiError}; use crate::handler::{RepoPath, resolve_reader}; use crate::service::GitService; use crate::service::repos::RepoDto; #[utoipa::path( get, path = "/repos/{space_name}/{repo_name}", tag = "repos", description = "读取仓库详情,并在已登录时附带当前用户的加星和关注状态。", params(RepoPath), responses( (status = 200, description = "get repo", body = AppResponseData) ) )] pub async fn get_repo( State(service): State, OptionalUser(viewer): OptionalUser, Path(path): Path, ) -> Result, ApiError> { let (ctx, viewer) = resolve_reader( &service, viewer, path.space_name.clone(), path.repo_name.clone(), ) .await?; let mut out = service.get_repo(&ctx).await.map_err(GitApiError::from)?; if let Some(uid) = viewer { out.me = Some( service .repo_viewer_state(ctx.model.id, uid) .await .map_err(GitApiError::from)?, ); } Ok(AppResponseData::ok(out)) }