Skip to content
Clone
a06673b
51 lines 1.6 KB Rust
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<LabelView> {
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))
}