mirror of
https://github.com/movixcorp/MovixOpenSource.git
synced 2026-07-26 16:32:07 +00:00
95 lines
3.2 KiB
JavaScript
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;
|