use db::attachment::attachments::OwnerType; use db::conn::sea_orm::*; use object_store::path::Path; use uuid::Uuid; use crate::error::IssueResult; use crate::features::IssueService; use super::helpers::{load_attachment, require_authenticated}; pub async fn delete_attachment( svc: &IssueService, actor: Uuid, channel_id: Uuid, owner_type: OwnerType, owner_id: Uuid, att_id: Uuid, ) -> IssueResult<()> { require_authenticated(actor)?; crate::features::issue::usecase::load_issue(svc, channel_id, owner_id).await?; let cur = load_attachment(svc, owner_type, owner_id, att_id).await?; let obj_path = Path::parse(cur.url.clone()).map_err(|e| { crate::error::IssueError::Internal(format!("invalid stored path {}: {e}", cur.url)) })?; let _ = svc.storage.delete(&obj_path).await; let db = svc.db.writer(); let active: db::attachment::attachments::ActiveModel = cur.into(); active.delete(&db).await?; Ok(()) }