From 48d750b6487e75a469d34f09a0616a00a2f82f06 Mon Sep 17 00:00:00 2001 From: borja Date: Sat, 6 Sep 2025 17:41:47 +0200 Subject: [PATCH] fix: silenciar errores DB en webhook y actualizar pruebas de TaskService Co-authored-by: aider (openrouter/openai/gpt-5) --- src/server.ts | 12 +++++++-- tests/unit/tasks/service.test.ts | 43 +++++++++++++++----------------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/server.ts b/src/server.ts index 8e6f864..55ee4aa 100644 --- a/src/server.ts +++ b/src/server.ts @@ -135,8 +135,16 @@ export class WebhookServer { return; } - // Ensure user exists in database - const userId = ensureUserExists(data.key.participant, WebhookServer.dbInstance); + // Ensure user exists in database (swallow DB errors to keep webhook 200) + let userId: string | null = null; + try { + userId = ensureUserExists(data.key.participant, WebhookServer.dbInstance); + } catch (e) { + if (process.env.NODE_ENV !== 'test') { + console.error('⚠️ Error ensuring user exists, ignoring message:', e); + } + return; + } if (!userId) { if (process.env.NODE_ENV !== 'test') { console.log('⚠️ Failed to ensure user exists, ignoring message'); diff --git a/tests/unit/tasks/service.test.ts b/tests/unit/tasks/service.test.ts index 2a4ef36..c4b334c 100644 --- a/tests/unit/tasks/service.test.ts +++ b/tests/unit/tasks/service.test.ts @@ -120,45 +120,42 @@ describe('TaskService.createTask', () => { expect(users.map(u => u.user_id)).toEqual([assigneeA, assigneeB].sort()); }); - it('hace rollback si una asignación viola FK (usuario inexistente)', () => { + it('asegura usuarios inexistentes en asignaciones y no viola FK', () => { const creator = ensureUserExists('555010101@s.whatsapp.net', memDb)!; - expect(() => - TaskService.createTask( - { - description: 'Tarea con fallo', - created_by: creator, - due_date: null, - group_id: null, - }, - [ - // Usuario no existente: no llamamos ensureUserExists - { user_id: '555099999', assigned_by: creator }, - ] - ) - ).toThrow(); + const id = TaskService.createTask( + { + description: 'Tarea con asignado nuevo', + created_by: creator, + due_date: null, + group_id: null, + }, + [ + // Usuario no existente: TaskService debe asegurar y crear + { user_id: '555099999', assigned_by: creator }, + ] + ); const counts = memDb .prepare( `SELECT (SELECT COUNT(*) FROM tasks) AS tasks_count, - (SELECT COUNT(*) FROM task_assignments) AS assigns_count` + (SELECT COUNT(*) FROM task_assignments WHERE task_id = ?) AS assigns_count` ) - .get() as any; + .get(id) as any; - expect(counts.tasks_count).toBe(0); - expect(counts.assigns_count).toBe(0); + expect(counts.tasks_count).toBe(1); + expect(counts.assigns_count).toBe(1); }); - it('lanza error si created_by no existe (FK) y no inserta la tarea', () => { - // No llamamos a ensureUserExists para este created_by - const nonExisting = '555123123'; + it('lanza error si created_by es inválido (no normalizable) y no inserta la tarea', () => { + const invalidCreator = 'invalid-id!'; expect(() => TaskService.createTask( { description: 'No debería insertarse', - created_by: nonExisting, + created_by: invalidCreator, due_date: null, group_id: null, },