use db::conn::sea_orm::*; use db::issue::issue_pin as pin_entity; use time::OffsetDateTime; use uuid::Uuid; use crate::error::{IssueError, IssueResult}; use crate::features::IssueService; use super::super::{CreatePinOption, PinView}; use super::helpers::require_authenticated; pub async fn create_pin( svc: &IssueService, actor: Uuid, channel_id: Uuid, collection_id: Uuid, input: CreatePinOption, ) -> IssueResult { require_authenticated(actor)?; crate::features::issue::usecase::load_issue(svc, channel_id, input.issue_id).await?; let db = svc.db.reader(); let dup = pin_entity::Entity::find() .filter(pin_entity::COLUMN.collection_id.eq(collection_id)) .filter(pin_entity::COLUMN.issue_id.eq(input.issue_id)) .one(&db) .await?; if dup.is_some() { return Err(IssueError::Conflict("issue already pinned".into())); } let db = svc.db.writer(); let id = Uuid::new_v4(); let active: pin_entity::ActiveModel = pin_entity::ActiveModel::builder() .set_id(id) .set_collection_id(collection_id) .set_issue_id(input.issue_id) .set_pin_order(input.pin_order) .set_created_at(OffsetDateTime::now_utc()) .into(); let saved = active.insert(&db).await?; Ok(PinView::from(saved)) }