import path from 'node:path'; import fs from 'node:fs'; import { uploadsDir } from '../../middleware/upload.js'; import * as repo from './repository.js'; async function unlinkQuiet(filename) { await fs.promises.unlink(path.join(uploadsDir, filename)).catch(() => {}); } // Borra la fila y el archivo en disco. Unico lugar que hace esto — reutilizado tanto por el borrado // individual (controller) como por el borrado en cascada al eliminar la entidad duena. export async function removeAttachment(attachment) { await repo.remove(attachment.id); await unlinkQuiet(attachment.filename); } // Usado al borrar la entidad duena (actividad, proyecto): limpia sus adjuntos (fila + archivo) de // paso, ya que no hay FK fisica cruzada (entity_type/entity_id es polimorfico) que lo haga por cascada. export async function removeAllForEntity(entityType, entityId) { const files = await repo.findByEntity(entityType, entityId); for (const file of files) await removeAttachment(file); }