/** * DeleteAnnotationsByUser — soft-delete all annotation layers + annotations * created by a specific user within the given rooms. * Used when canceling/switching a user's assignment on a transmittal. * Caller should resolve room IDs via getRoomByDocument first. */ async deleteAnnotationsByUser(request: DeleteAnnotationsByUserRequest): Promise { const roomIds = request.roomIds ?? []; if (roomIds.length === 0) { return { deletedAnnotations: 0, deletedLayers: 0 }; } const hard = request.hardDelete === true; let layerResult: { count: number }; let annotationResult: { count: number }; if (hard) { // Hard-delete layers + annotations annotationResult = await this.prisma.annotations.deleteMany({ where: { layer: { room_id: { in: roomIds } }, created_by: request.userId, }, }); layerResult = await this.prisma.annotationLayers.deleteMany({ where: { room_id: { in: roomIds }, created_by: request.userId, }, }); } else { // Soft-delete const now = new Date(); annotationResult = await this.prisma.annotations.updateMany({ where: { layer: { room_id: { in: roomIds } }, created_by: request.userId, deleted_at: null, }, data: { deleted_at: now }, }); layerResult = await this.prisma.annotationLayers.updateMany({ where: { room_id: { in: roomIds }, created_by: request.userId, deleted_at: null, }, data: { deleted_at: now }, }); } this.logger.log( `${hard ? 'Hard' : 'Soft'}-deleted ${annotationResult.count} annotations / ${layerResult.count} layers ` + `for user ${request.userId} in ${roomIds.length} room(s)` ); return { deletedAnnotations: annotationResult.count, deletedLayers: layerResult.count }; }