c3eb022
use axum::extract::State;
use export::rest::AppResponseData;
use session::Session;
use crate::errors::ApiError;
use crate::services::pulls::PullDto;
use crate::services::service::PullService;
use crate::share::authz::require_can_manage;
use crate::share::lookup::pull_handle;
use crate::share::path::PullPath;
#[utoipa::path(
put,
path = "/repos/{space_name}/{repo_name}/pulls/{pull_ref}/lock",
tag = "pulls",
description = "锁定合并请求,锁定后仅作者与管理员可再改动。",
params(PullPath),
responses(
(status = 200, description = "locked pull request", body = AppResponseData<PullDto>)
)
)]
pub async fn lock_pull(
State(service): State<PullService>,
session: Session,
path: PullPath,
) -> Result<AppResponseData<PullDto>, ApiError> {
let handle = pull_handle(
&service,
&session,
path.space_name.clone(),
path.repo_name.clone(),
path.pull_ref,
true,
)
.await?;
let caller = require_can_manage(&handle.pull, handle.caller, handle.admin)?;
let updated = service.set_lock(&handle.pull, caller, true).await?;
let users = service.pull_users(std::slice::from_ref(&updated)).await?;
Ok(AppResponseData::ok(PullService::dto(&updated, &users)))
}
#[utoipa::path(
delete,
path = "/repos/{space_name}/{repo_name}/pulls/{pull_ref}/lock",
tag = "pulls",
description = "解除合并请求锁定。",
params(PullPath),
responses(
(status = 200, description = "unlocked pull request", body = AppResponseData<PullDto>)
)
)]
pub async fn unlock_pull(
State(service): State<PullService>,
session: Session,
path: PullPath,
) -> Result<AppResponseData<PullDto>, ApiError> {
let handle = pull_handle(
&service,
&session,
path.space_name.clone(),
path.repo_name.clone(),
path.pull_ref,
true,
)
.await?;
let caller = require_can_manage(&handle.pull, handle.caller, handle.admin)?;
let updated = service.set_lock(&handle.pull, caller, false).await?;
let users = service.pull_users(std::slice::from_ref(&updated)).await?;
Ok(AppResponseData::ok(PullService::dto(&updated, &users)))
}