feat: eliminar actividad, bloqueado si tiene tareas pendientes
No existia forma de borrar una actividad. Agregado DELETE /api/activities/:id con boton "Eliminar" en el listado (popup de confirmacion). Si tiene tareas, se bloquea con 400 y mensaje claro en vez de arrastrar todo en cascada sin avisar. De paso: la logica de borrar adjunto (fila + archivo en disco) se extrajo a un attachments/service.js reutilizable, usado tanto por el borrado individual como por el borrado en cascada de una actividad (evita archivos huerfanos). Comentarios de la actividad tambien se limpian (sin FK fisica cruzada, entity_type/entity_id es polimorfico). Probado en dev con curl (bloquea con tarea, permite sin tareas, 404 tras borrar) y Playwright (mensaje de advertencia visible). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
import * as repo from './repository.js';
|
||||
import * as projectsRepo from '../projects/repository.js';
|
||||
import * as commentsRepo from '../comments/repository.js';
|
||||
import * as attachmentsService from '../attachments/service.js';
|
||||
import { recalcProjectProgress, canWriteProject } from '../projects/service.js';
|
||||
import { HttpError } from '../../utils/http.js';
|
||||
import { logAudit } from '../../utils/audit.js';
|
||||
@@ -95,6 +97,27 @@ export async function updateActivity(id, payload, currentUser) {
|
||||
return repo.findById(id);
|
||||
}
|
||||
|
||||
// Bloquea el borrado si hay tareas pendientes (a proposito: evita perder de vista trabajo real
|
||||
// hecho/por hacer solo porque alguien borro la actividad de un clic). El usuario debe vaciar el
|
||||
// checklist primero. Comentarios/adjuntos si se limpian solos, no llevan informacion de progreso.
|
||||
export async function removeActivity(id, currentUser) {
|
||||
const activity = await repo.findById(id);
|
||||
if (!activity) throw new HttpError(404, 'Actividad no encontrada');
|
||||
const project = await getProjectOr404(activity.project_id);
|
||||
if (!(await canWriteActivity(currentUser, project, activity))) {
|
||||
throw new HttpError(403, 'No tienes permisos sobre esta actividad');
|
||||
}
|
||||
const taskCount = await repo.countTasks(id);
|
||||
if (taskCount > 0) {
|
||||
throw new HttpError(400, `Esta actividad tiene ${taskCount} tarea(s). Elimina primero las tareas antes de borrar la actividad.`);
|
||||
}
|
||||
await commentsRepo.removeByEntity('activity', id);
|
||||
await attachmentsService.removeAllForEntity('activity', id);
|
||||
await repo.remove(id);
|
||||
await logAudit({ userId: currentUser.id, action: 'delete', entityType: 'activity', entityId: id });
|
||||
await recalcProjectProgress(activity.project_id);
|
||||
}
|
||||
|
||||
export async function addDependency(activityId, dependsOnActivityId, currentUser) {
|
||||
if (activityId === dependsOnActivityId) throw new HttpError(400, 'Una actividad no puede depender de si misma');
|
||||
const activity = await repo.findById(activityId);
|
||||
|
||||
Reference in New Issue
Block a user