d5939db
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<PinView> {
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))
}