Skip to content
Clone

feat(issues): add issues usecase create

zhenyi committed
parent b154920 commit ce7be7f Browse files

1 file changed

+42 −0

Added lib/issues/features/issues/usecase/create.rs View lib/issues/features/issues/usecase/create.rs
@@ -0,0 +1,42 @@
1use db::conn::sea_orm::*;
2use db::issue::issues as issues_entity;
3use time::OffsetDateTime;
4use uuid::Uuid;
5
6use crate::error::{IssueError, IssueResult};
7use crate::features::IssueService;
8
9use super::super::types::{CollectionView, CreateCollectionOption};
10use super::helpers::require_authenticated;
11
12pub async fn create_collection(
13 svc: &IssueService,
14 actor: Uuid,
15 input: CreateCollectionOption,
16) -> IssueResult<CollectionView> {
17 require_authenticated(actor)?;
18
19 let name = input.name.trim().to_string();
20 if name.is_empty() || name.len() > svc.config.max_collection_name_len {
21 return Err(IssueError::BadRequest(format!(
22 "collection name length must be in 1..={}",
23 svc.config.max_collection_name_len
24 )));
25 }
26
27 let db = svc.db.writer();
28 let now = OffsetDateTime::now_utc();
29 let collection_id = Uuid::new_v4();
30
31 let active: issues_entity::ActiveModel = issues_entity::ActiveModel::builder()
32 .set_id(collection_id)
33 .set_channel_id(input.channel_id)
34 .set_name(name)
35 .set_icon(input.icon)
36 .set_description(input.description)
37 .set_created_at(now)
38 .set_updated_at(None)
39 .into();
40 let saved = active.insert(&db).await?;
41 Ok(CollectionView::from(saved))
42}
No newline at end of file