use db::conn::sea_orm::*; use db::issue::issue_label as label_entity; use time::OffsetDateTime; use uuid::Uuid; use crate::error::{IssueError, IssueResult}; use crate::features::IssueService; use super::super::{CreateLabelOption, LabelView}; use super::helpers::require_authenticated; pub async fn create_label( svc: &IssueService, actor: Uuid, channel_id: Uuid, input: CreateLabelOption, ) -> IssueResult { require_authenticated(actor)?; let name = input.name.trim().to_string(); if name.is_empty() || name.len() > svc.config.max_label_name_len { return Err(IssueError::BadRequest(format!( "label name length must be in 1..={}", svc.config.max_label_name_len ))); } if input.color.len() > svc.config.max_label_color_len { return Err(IssueError::BadRequest(format!( "label color too long (max {})", svc.config.max_label_color_len ))); } let db = svc.db.writer(); let now = OffsetDateTime::now_utc(); let id = Uuid::new_v4(); let active: label_entity::ActiveModel = label_entity::ActiveModel::builder() .set_id(id) .set_channel_id(channel_id) .set_name(name) .set_exclusive(input.exclusive.unwrap_or(false)) .set_exclusive_order(input.exclusive_order.unwrap_or(0)) .set_description(input.description) .set_color(input.color) .set_is_archived(false) .set_created_at(now) .set_updated_at(None) .into(); let saved = active.insert(&db).await?; Ok(LabelView::from(saved)) }