activity
Signed-off-by: Omar Sánchez Pizarro <omar.sanchez@pistacero.net>
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
import express from 'express';
|
||||
import bcrypt from 'bcrypt';
|
||||
import { getDB, getUser, createUser, deleteUser as deleteUserFromDB, getAllUsers, updateUserPassword } from '../services/mongodb.js';
|
||||
import { getDB, getUser, createUser, deleteUser as deleteUserFromDB, getAllUsers, updateUserPassword, getActiveSessions } from '../services/mongodb.js';
|
||||
import { basicAuthMiddleware, createSession, invalidateSession, invalidateUserSessions } from '../middlewares/auth.js';
|
||||
import { adminAuthMiddleware } from '../middlewares/adminAuth.js';
|
||||
import { combineFingerprint } from '../utils/fingerprint.js';
|
||||
import { getActiveUsers } from '../services/websocket.js';
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
@@ -375,5 +376,71 @@ router.delete('/:username', basicAuthMiddleware, adminAuthMiddleware, async (req
|
||||
}
|
||||
});
|
||||
|
||||
// Obtener usuarios activos/conectados (requiere autenticación)
|
||||
router.get('/active', basicAuthMiddleware, async (req, res) => {
|
||||
try {
|
||||
const db = getDB();
|
||||
if (!db) {
|
||||
return res.status(500).json({ error: 'MongoDB no está disponible' });
|
||||
}
|
||||
|
||||
// Obtener usuarios activos del WebSocket
|
||||
const activeUsersWS = getActiveUsers();
|
||||
|
||||
// Obtener sesiones activas de la base de datos
|
||||
const activeSessions = await getActiveSessions();
|
||||
|
||||
// Combinar información y eliminar duplicados
|
||||
const userMap = new Map();
|
||||
|
||||
// Añadir usuarios del WebSocket
|
||||
for (const user of activeUsersWS) {
|
||||
if (!userMap.has(user.username)) {
|
||||
userMap.set(user.username, {
|
||||
username: user.username,
|
||||
role: user.role,
|
||||
status: user.status,
|
||||
lastActivity: user.lastActivity,
|
||||
connectedViaWebSocket: true
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Añadir usuarios de sesiones activas (que podrían no estar en WebSocket)
|
||||
for (const session of activeSessions) {
|
||||
if (!userMap.has(session.username)) {
|
||||
const user = await getUser(session.username);
|
||||
userMap.set(session.username, {
|
||||
username: session.username,
|
||||
role: user?.role || 'user',
|
||||
status: 'active',
|
||||
lastActivity: session.lastActivity?.toISOString() || null,
|
||||
connectedViaWebSocket: false,
|
||||
deviceInfo: session.deviceInfo
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Convertir a array
|
||||
const activeUsers = Array.from(userMap.values());
|
||||
|
||||
// Ordenar por última actividad (más recientes primero)
|
||||
activeUsers.sort((a, b) => {
|
||||
const dateA = a.lastActivity ? new Date(a.lastActivity).getTime() : 0;
|
||||
const dateB = b.lastActivity ? new Date(b.lastActivity).getTime() : 0;
|
||||
return dateB - dateA;
|
||||
});
|
||||
|
||||
res.json({
|
||||
activeUsers,
|
||||
total: activeUsers.length,
|
||||
timestamp: new Date().toISOString()
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Error obteniendo usuarios activos:', error);
|
||||
res.status(500).json({ error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user