use db::conn::sea_orm::*; use db::issue::issue_relation_label as rel_entity; use time::OffsetDateTime; use uuid::Uuid; use crate::error::{IssueError, IssueResult}; use crate::features::IssueService; use crate::features::issue::usecase::load_issue; use super::helpers::{load_label, require_authenticated}; pub async fn bind_label_to_issue( svc: &IssueService, actor: Uuid, channel_id: Uuid, issue_id: Uuid, label_id: Uuid, ) -> IssueResult<()> { require_authenticated(actor)?; let _issue = load_issue(svc, channel_id, issue_id).await?; let _label = load_label(svc, channel_id, label_id).await?; let db = svc.db.reader(); let existing = rel_entity::Entity::find() .filter(rel_entity::COLUMN.issue_id.eq(issue_id)) .filter(rel_entity::COLUMN.label_id.eq(label_id)) .one(&db) .await?; if existing.is_some() { return Err(IssueError::Conflict(format!( "label {label_id} already bound to issue {issue_id}" ))); } let db = svc.db.writer(); let now = OffsetDateTime::now_utc(); let active: rel_entity::ActiveModel = rel_entity::ActiveModel::builder() .set_id(Uuid::new_v4()) .set_issue_id(issue_id) .set_label_id(label_id) .set_created_at(now) .into(); active.insert(&db).await?; Ok(()) }