/** * Endpoint para enviar notificaciones a usuarios específicos desde el backend * * Esta API permite crear notificaciones que se entregarán directamente * al cliente para ser guardadas en su localStorage. * * Casos de uso: * - Notificaciones del sistema * - Alertas generadas por procesos del backend * - Notificaciones administrativas */ export default defineEventHandler(async (event) => { try { // Leer el body de la petición const body = await readBody(event) // Validar campos requeridos if (!body.targetUserId || !body.title) { throw createError({ statusCode: 400, statusMessage: 'Faltan campos requeridos: targetUserId y title' }) } // Validar tipo de notificación const validTypes = ['info', 'warning', 'success', 'error'] const type = body.type || 'info' if (!validTypes.includes(type)) { throw createError({ statusCode: 400, statusMessage: `Tipo inválido. Debe ser uno de: ${validTypes.join(', ')}` }) } // Leer el usuario actual de los headers de Authentik const headers = getHeaders(event) const currentUserId = headers['x-authentik-uid'] const currentUsername = headers['x-authentik-username'] // Verificar que el usuario esté autenticado if (!currentUserId) { throw createError({ statusCode: 401, statusMessage: 'Usuario no autenticado' }) } // Opcional: verificar permisos (por ejemplo, solo admins pueden enviar notificaciones) // const groups = headers['x-authentik-groups']?.split('|') || [] // if (!groups.includes('admins')) { // throw createError({ // statusCode: 403, // statusMessage: 'No tienes permisos para enviar notificaciones' // }) // } // Construir la notificación const notification = { targetUserId: body.targetUserId, type: type as 'info' | 'warning' | 'success' | 'error', title: body.title, message: body.message || '', origin: 'backend' as const, metadata: { sentBy: currentUsername, sentAt: new Date().toISOString(), ...body.metadata } } // Nota: Como usamos localStorage en el cliente, no guardamos en BD // En su lugar, retornamos la notificación para que el cliente la guarde // El cliente debe hacer polling o usar SSE/WebSocket para obtener notificaciones return { success: true, notification, message: 'Notificación creada correctamente' } } catch (error: any) { console.error('Error al enviar notificación:', error) // Si ya es un error de H3, relanzarlo if (error.statusCode) { throw error } // Error genérico throw createError({ statusCode: 500, statusMessage: 'Error al procesar la notificación' }) } })