feat(issues): add label usecase create
zhenyi committed
Added lib/issues/features/label/usecase/create.rs lib/issues/features/label/usecase/create.rs +51 −0 View lib/issues/features/label/usecase/create.rs
@@ -0,0 +1,51 @@
1use db::conn::sea_orm::*;
2use db::issue::issue_label as label_entity;
3use time::OffsetDateTime;
4use uuid::Uuid;
5
6use crate::error::{IssueError, IssueResult};
7use crate::features::IssueService;
8
9use super::super::types::{CreateLabelOption, LabelView};
10use super::helpers::require_authenticated;
11
12pub async fn create_label(
13 svc: &IssueService,
14 actor: Uuid,
15 channel_id: Uuid,
16 input: CreateLabelOption,
17) -> IssueResult<LabelView> {
18 require_authenticated(actor)?;
19
20 let name = input.name.trim().to_string();
21 if name.is_empty() || name.len() > svc.config.max_label_name_len {
22 return Err(IssueError::BadRequest(format!(
23 "label name length must be in 1..={}",
24 svc.config.max_label_name_len
25 )));
26 }
27 if input.color.len() > svc.config.max_label_color_len {
28 return Err(IssueError::BadRequest(format!(
29 "label color too long (max {})",
30 svc.config.max_label_color_len
31 )));
32 }
33
34 let db = svc.db.writer();
35 let now = OffsetDateTime::now_utc();
36 let id = Uuid::new_v4();
37 let active: label_entity::ActiveModel = label_entity::ActiveModel::builder()
38 .set_id(id)
39 .set_channel_id(channel_id)
40 .set_name(name)
41 .set_exclusive(input.exclusive.unwrap_or(false))
42 .set_exclusive_order(input.exclusive_order.unwrap_or(0))
43 .set_description(input.description)
44 .set_color(input.color)
45 .set_is_archived(false)
46 .set_created_at(now)
47 .set_updated_at(None)
48 .into();
49 let saved = active.insert(&db).await?;
50 Ok(LabelView::from(saved))
51}
No newline at end of file