use db::conn::sea_orm::*; use db::issue::issue_dependency as dep_entity; use time::OffsetDateTime; use uuid::Uuid; use crate::error::{IssueError, IssueResult}; use crate::features::IssueService; use super::super::{CreateDependencyOption, DependencyView}; use super::helpers::require_authenticated; pub async fn create_dependency( svc: &IssueService, actor: Uuid, channel_id: Uuid, issue_id: Uuid, input: CreateDependencyOption, ) -> IssueResult { require_authenticated(actor)?; crate::features::issue::usecase::load_issue(svc, channel_id, issue_id).await?; if input.dependency_id == issue_id { return Err(IssueError::BadRequest( "issue cannot depend on itself".into(), )); } let db = svc.db.writer(); let id = Uuid::new_v4(); let active: dep_entity::ActiveModel = dep_entity::ActiveModel::builder() .set_id(id) .set_issue_id(issue_id) .set_dependency_id(input.dependency_id) .set_created_at(OffsetDateTime::now_utc()) .into(); match dep_entity::Entity::insert(active) .on_conflict_do_nothing() .exec(&db) .await? { TryInsertResult::Inserted(_) | TryInsertResult::Empty => {} TryInsertResult::Conflicted => { return Err(IssueError::Conflict("dependency already exists".into())); } } let saved = dep_entity::Entity::find_by_id(id) .one(&db) .await? .ok_or_else(|| IssueError::Internal("dependency not found after insert".into()))?; Ok(DependencyView::from(saved)) }