Signed-off-by: Omar Sánchez Pizarro <omar.sanchez@pistacero.net>
This commit is contained in:
Omar Sánchez Pizarro
2026-01-21 10:31:06 +01:00
parent c72ef29319
commit 7289ad6c26
10 changed files with 977 additions and 71 deletions

View File

@@ -1101,6 +1101,30 @@ export async function getSession(token) {
}
}
// Actualizar actividad de una sesión
export async function updateSessionActivity(token, isActive = true) {
if (!db) {
return false;
}
try {
const sessionsCollection = db.collection('sessions');
await sessionsCollection.updateOne(
{ token },
{
$set: {
lastActivity: new Date(),
isActive: isActive,
},
}
);
return true;
} catch (error) {
console.error('Error actualizando actividad de sesión:', error.message);
return false;
}
}
export async function deleteSession(token) {
if (!db) {
return false;
@@ -1139,21 +1163,63 @@ export async function getAllSessions() {
try {
const sessionsCollection = db.collection('sessions');
const sessions = await sessionsCollection.find({}).toArray();
return sessions.map(session => ({
token: session.token,
username: session.username,
fingerprint: session.fingerprint || null,
deviceInfo: session.deviceInfo || null,
createdAt: session.createdAt,
expiresAt: session.expiresAt,
isExpired: session.expiresAt ? new Date(session.expiresAt) < new Date() : false,
}));
const now = new Date();
const INACTIVE_TIMEOUT = 5 * 60 * 1000; // 5 minutos
return sessions.map(session => {
const isExpired = session.expiresAt ? new Date(session.expiresAt) < now : false;
const timeSinceActivity = session.lastActivity ? now - new Date(session.lastActivity) : null;
const isActive = session.isActive && timeSinceActivity && timeSinceActivity < INACTIVE_TIMEOUT;
return {
token: session.token,
username: session.username,
fingerprint: session.fingerprint || null,
deviceInfo: session.deviceInfo || null,
createdAt: session.createdAt,
expiresAt: session.expiresAt,
lastActivity: session.lastActivity || null,
isActive: isActive || false,
isExpired: isExpired,
};
});
} catch (error) {
console.error('Error obteniendo todas las sesiones:', error.message);
return [];
}
}
// Obtener sesiones activas (usuarios conectados)
export async function getActiveSessions() {
if (!db) {
return [];
}
try {
const sessionsCollection = db.collection('sessions');
const now = new Date();
const INACTIVE_TIMEOUT = 5 * 60 * 1000; // 5 minutos
const recentTime = new Date(now - INACTIVE_TIMEOUT);
// Buscar sesiones activas (con actividad reciente)
const sessions = await sessionsCollection.find({
isActive: true,
lastActivity: { $gte: recentTime },
expiresAt: { $gt: now }
}).toArray();
return sessions.map(session => ({
username: session.username,
lastActivity: session.lastActivity,
deviceInfo: session.deviceInfo || null,
fingerprint: session.fingerprint || null,
}));
} catch (error) {
console.error('Error obteniendo sesiones activas:', error.message);
return [];
}
}
// Funciones para artículos
export async function getArticle(platform, id, currentUsername = null) {
if (!db) {