pub mod link_issue_pull; pub mod list_issue_pulls; pub mod unlink_issue_pull; use issues::services::issues::IssuePath; use crate::errors::{ApiError, PullError}; use crate::services::service::PullService; /// 校验空间成员与看板/工单可读性,返回工单与其所属空间。 pub(crate) async fn resolve_issue( service: &PullService, session: &jwt::Session, path: &IssuePath, ) -> Result<(uuid::Uuid, uuid::Uuid, uuid::Uuid), ApiError> { let caller = PullService::uid(session).map_err(ApiError::from)?; let issues = issues::services::service::IssueService::new(service.state.clone()); let space = issues::share::lookup::lookup_space_by_name(&issues, &path.space_name) .await .map_err(PullError::from)?; issues::share::lookup::require_member(&issues, &space, caller) .await .map_err(PullError::from)?; let board = issues::share::lookup::lookup_board(&issues, &space, path.board_id, caller) .await .map_err(PullError::from)?; let issue = issues::share::lookup::lookup_issue_by_ref(&issues, &board, &path.issue_id) .await .map_err(PullError::from)?; Ok((space.id, board.id, issue.id)) }