Skip to content
Clone
58775d4
41 lines 1.2 KB Rust
use models::pull_request::pull_requests;
use crate::errors::PullError;
pub fn is_author(pull: &pull_requests::Model, uid: Option<i64>) -> bool {
uid.is_some_and(|uid| uid == pull.author_id)
}
pub fn require_open(pull: &pull_requests::Model) -> Result<(), PullError> {
if pull.has_merged {
return Err(PullError::Conflict(
"pull request already merged".to_string(),
));
}
if pull.closed_at.is_some() {
return Err(PullError::Conflict("pull request is closed".to_string()));
}
Ok(())
}
pub fn require_unlocked(pull: &pull_requests::Model) -> Result<(), PullError> {
if pull.is_locked {
return Err(PullError::Conflict(
"pull request is locked; only repository administrators may act".to_string(),
));
}
Ok(())
}
/// 作者或有写权限的管理员可以改标题/正文/关闭/合并。
pub fn require_can_manage(
pull: &pull_requests::Model,
caller: Option<i64>,
admin: bool,
) -> Result<i64, PullError> {
let uid = caller.ok_or(PullError::Unauthorized)?;
if admin || is_author(pull, Some(uid)) {
return Ok(uid);
}
Err(PullError::Forbidden)
}