if att.mime_type == "text/html": text = sanitize_preview(text) return {"previewable": True, "kind": "text", "content": text[:20000]} return {"previewable": False, "reason": "unsupported_kind"} @router.post("/{att_id}/delete") async def delete_attachment(att_id: int, db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), _: None = Depends(require_csrf)): att = await _get_own(db, user, att_id) att_name = att.name if att.stored_path: await asyncio.get_event_loop().run_in_executor( None, att_svc.delete_attachment_file, att) await db.delete(att) await db.commit() await log_audit(db, user.id, "attachment.delete", "attachment", att_id, {"name": att_name})