MovixOpenSource/API/Mainapi/routes/sessions.js
Movix 1401dc20f3 tird release
mon compte github a été détecté comme du spam je crois
2026-04-28 17:55:00 +02:00

95 lines
3.2 KiB
JavaScript

/**
* Session management routes.
* Extracted from server.js -- user session listing and deletion.
* Mount point: app.use('/api/sessions', router)
*/
const express = require('express');
const router = express.Router();
const { getAuthIfValid } = require('../middleware/auth');
const { getPool } = require('../mysqlPool');
// === Routes ===
// GET / - Get user sessions (JWT required, MySQL)
router.get('/', async (req, res) => {
try {
const auth = await getAuthIfValid(req);
if (!auth) {
return res.status(401).json({ success: false, error: 'Unauthorized' });
}
const { userType, userId } = auth;
// Only allow sessions for oauth, bip39 users
if (!['oauth', 'bip39'].includes(userType)) {
return res.status(400).json({ success: false, error: 'Type d\'utilisateur non supporté pour les sessions' });
}
const pool = getPool();
if (!pool) {
return res.status(503).json({ success: false, error: 'Service temporairement indisponible' });
}
// Get sessions from MySQL
const [rows] = await pool.execute(
'SELECT id, user_agent as userAgent, created_at as createdAt, accessed_at as accessedAt FROM user_sessions WHERE user_id = ? AND user_type = ? ORDER BY accessed_at DESC',
[userId, userType]
);
const sessions = rows.map(row => ({
id: row.id,
userId: userId,
userAgent: row.userAgent,
createdAt: row.createdAt ? new Date(row.createdAt).toISOString() : null,
accessedAt: row.accessedAt ? new Date(row.accessedAt).toISOString() : null
}));
res.status(200).json({ success: true, data: { count: sessions.length, items: sessions } });
} catch (error) {
console.error('Error getting sessions:', error);
res.status(500).json({ success: false, error: 'Erreur lors de la récupération des sessions' });
}
});
// POST /delete - Delete a specific session (JWT required; user can only delete own session, MySQL)
router.post('/delete', async (req, res) => {
try {
const auth = await getAuthIfValid(req);
if (!auth) {
return res.status(401).json({ success: false, error: 'Unauthorized' });
}
const { userType, userId } = auth;
const { sessionId } = req.body;
if (!sessionId) {
return res.status(400).json({ success: false, error: 'ID de session requis' });
}
if (!['oauth', 'bip39'].includes(userType)) {
return res.status(400).json({ success: false, error: 'Type d\'utilisateur non supporté pour les sessions' });
}
const pool = getPool();
if (!pool) {
return res.status(503).json({ success: false, error: 'Service temporairement indisponible' });
}
// Delete session from MySQL
const [result] = await pool.execute(
'DELETE FROM user_sessions WHERE id = ? AND user_id = ? AND user_type = ?',
[sessionId, userId, userType]
);
if (result.affectedRows === 0) {
return res.status(404).json({ success: false, error: 'Session non trouvée' });
}
res.status(200).json({ success: true, message: 'Session supprimée avec succès' });
} catch (error) {
console.error('Error deleting session:', error);
res.status(500).json({ success: false, error: 'Erreur lors de la suppression de la session' });
}
});
module.exports = router;