All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 48s
- 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
72 lines
2.0 KiB
TypeScript
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)
|
|
}
|