use models::pull_request::pull_requests; use crate::errors::PullError; pub fn is_author(pull: &pull_requests::Model, uid: Option) -> 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, admin: bool, ) -> Result { let uid = caller.ok_or(PullError::Unauthorized)?; if admin || is_author(pull, Some(uid)) { return Ok(uid); } Err(PullError::Forbidden) }