use db::conn::sea_orm::*; use db::issue::issue as issue_entity; use db::issue::issues as issues_entity; use uuid::Uuid; use crate::error::{IssueError, IssueResult}; use crate::features::IssueService; pub fn require_authenticated(actor: Uuid) -> IssueResult<()> { if actor.is_nil() { return Err(IssueError::Unauthorized("authentication required".into())); } Ok(()) } pub async fn load_collection( svc: &IssueService, channel_id: Uuid, ) -> IssueResult { use crate::features::issues::usecase::load_default_collection as outer_load; let db = svc.db.reader(); let row = issues_entity::Entity::find() .filter(issues_entity::COLUMN.channel_id.eq(channel_id)) .order_by_asc(issues_entity::COLUMN.created_at) .one(&db) .await? .ok_or_else(|| { IssueError::NotFound(format!("issues board for channel {channel_id}")) })?; let _ = outer_load; // kept to document cross-module reuse possibility Ok(row) } pub async fn load_issue( svc: &IssueService, channel_id: Uuid, issue_id: Uuid, ) -> IssueResult { let collection = load_collection(svc, channel_id).await?; let db = svc.db.reader(); let it = issue_entity::Entity::find_by_id(issue_id) .filter(issue_entity::COLUMN.collection_id.eq(collection.id)) .one(&db) .await? .ok_or_else(|| IssueError::NotFound(format!("issue {issue_id}")))?; Ok(it) }