Skip to content
Clone

feat(issues): add label usecase bind

zhenyi committed
parent ff6c808 commit e6bb5a7 Browse files

1 file changed

+45 −0

Added lib/issues/features/label/usecase/bind.rs View lib/issues/features/label/usecase/bind.rs
@@ -0,0 +1,45 @@
1use db::conn::sea_orm::*;
2use db::issue::issue_relation_label as rel_entity;
3use time::OffsetDateTime;
4use uuid::Uuid;
5
6use crate::error::{IssueError, IssueResult};
7use crate::features::IssueService;
8use crate::features::issue::usecase::load_issue;
9
10use super::helpers::{load_label, require_authenticated};
11
12pub async fn bind_label_to_issue(
13 svc: &IssueService,
14 actor: Uuid,
15 channel_id: Uuid,
16 issue_id: Uuid,
17 label_id: Uuid,
18) -> IssueResult<()> {
19 require_authenticated(actor)?;
20 let _issue = load_issue(svc, channel_id, issue_id).await?;
21 let _label = load_label(svc, channel_id, label_id).await?;
22
23 let db = svc.db.reader();
24 let existing = rel_entity::Entity::find()
25 .filter(rel_entity::COLUMN.issue_id.eq(issue_id))
26 .filter(rel_entity::COLUMN.label_id.eq(label_id))
27 .one(&db)
28 .await?;
29 if existing.is_some() {
30 return Err(IssueError::Conflict(format!(
31 "label {label_id} already bound to issue {issue_id}"
32 )));
33 }
34
35 let db = svc.db.writer();
36 let now = OffsetDateTime::now_utc();
37 let active: rel_entity::ActiveModel = rel_entity::ActiveModel::builder()
38 .set_id(Uuid::new_v4())
39 .set_issue_id(issue_id)
40 .set_label_id(label_id)
41 .set_created_at(now)
42 .into();
43 active.insert(&db).await?;
44 Ok(())
45}
No newline at end of file