d5939db
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<DependencyView> {
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))
}