Files
analiticaNucleo/nuxt4-app/server/api/notifications/list.get.ts
josedario87 b6dc08e599
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 48s
Feat: Implementar sistema de notificaciones con historial por usuario
- Crear composable useNotifications con gestión por localStorage
  - Almacenamiento separado por usuario usando UID de Authentik
  - Auto-limpieza de notificaciones mayores a 30 días
  - Sincronización automática entre pestañas
  - Filtrado por tipo, búsqueda y gestión completa

- Crear wrapper useToast para guardar toasts automáticamente
  - Intercepta todos los toasts de la aplicación
  - Guarda historial sin afectar funcionalidad existente

- Implementar endpoints de API para notificaciones del backend
  - POST /api/notifications/send para enviar notificaciones
  - GET /api/notifications/list para obtener pendientes

- Actualizar página de notificaciones con funcionalidad real
  - Búsqueda y filtros por tipo (info, warning, success, error)
  - Eliminar individual o todas las notificaciones
  - Marcar como leídas individual o todas
  - Badges de origen (toast, backend, manual)
  - Estados vacíos con mensajes informativos

- Actualizar badge del sidebar con contador dinámico
  - Muestra número real de notificaciones no leídas
  - Se oculta cuando no hay notificaciones

- Inicializar sistema en app.vue
  - Auto-inicialización al montar la app
  - Limpieza automática de notificaciones antiguas
2025-10-30 18:03:37 -06:00

72 lines
2.0 KiB
TypeScript

/**
* Endpoint para obtener notificaciones pendientes para el usuario actual
*
* Este endpoint permite al cliente hacer polling para obtener notificaciones
* generadas por el backend que aún no han sido entregadas.
*
* Casos de uso:
* - Polling periódico para obtener nuevas notificaciones
* - Sincronización inicial al cargar la aplicación
*/
// En memoria: cola de notificaciones por usuario
// Nota: En producción, esto debería estar en Redis o una BD
const notificationQueue = new Map<string, any[]>()
export default defineEventHandler(async (event) => {
try {
// Leer el usuario actual de los headers de Authentik
const headers = getHeaders(event)
const userId = headers['x-authentik-uid']
const username = headers['x-authentik-username']
// Verificar que el usuario esté autenticado
if (!userId) {
throw createError({
statusCode: 401,
statusMessage: 'Usuario no autenticado'
})
}
// Obtener notificaciones pendientes para este usuario
const pendingNotifications = notificationQueue.get(userId) || []
// Limpiar la cola después de entregarlas
notificationQueue.delete(userId)
return {
success: true,
notifications: pendingNotifications,
count: pendingNotifications.length,
user: {
uid: userId,
username
}
}
} catch (error: any) {
console.error('Error al obtener notificaciones:', error)
// Si ya es un error de H3, relanzarlo
if (error.statusCode) {
throw error
}
// Error genérico
throw createError({
statusCode: 500,
statusMessage: 'Error al obtener notificaciones'
})
}
})
/**
* Función helper para agregar una notificación a la cola de un usuario
* Esta función puede ser llamada desde otros endpoints del servidor
*/
export function queueNotification(userId: string, notification: any) {
if (!notificationQueue.has(userId)) {
notificationQueue.set(userId, [])
}
notificationQueue.get(userId)!.push(notification)
}