import { Router } from 'express'; import { authenticateToken } from '../middleware/auth.js'; import { getDb } from '../config/database.js'; import { getRecordings, deleteRecording, publishRecording, } from '../config/bbb.js'; const router = Router(); // GET /api/recordings - Get recordings for a room (by meetingID/uid) router.get('/', authenticateToken, async (req, res) => { try { const { meetingID } = req.query; const recordings = await getRecordings(meetingID || undefined); // Format recordings const formatted = recordings.map(rec => { const playback = rec.playback?.format; let formats = []; if (playback) { formats = Array.isArray(playback) ? playback : [playback]; } return { recordID: rec.recordID, meetingID: rec.meetingID, name: rec.name || 'Recording', state: rec.state, published: rec.published === 'true', startTime: rec.startTime, endTime: rec.endTime, participants: rec.participants, size: rec.size, formats: formats.map(f => ({ type: f.type, url: f.url, length: f.length, size: f.size, })), metadata: rec.metadata || {}, }; }); res.json({ recordings: formatted }); } catch (err) { console.error('Get recordings error:', err); res.status(500).json({ error: 'Recordings could not be loaded', recordings: [] }); } }); // GET /api/recordings/room/:uid - Get recordings for a specific room router.get('/room/:uid', authenticateToken, async (req, res) => { try { const db = getDb(); const room = await db.get('SELECT * FROM rooms WHERE uid = ?', [req.params.uid]); if (!room) { return res.status(404).json({ error: 'Room not found' }); } const recordings = await getRecordings(room.uid); const formatted = recordings.map(rec => { const playback = rec.playback?.format; let formats = []; if (playback) { formats = Array.isArray(playback) ? playback : [playback]; } return { recordID: rec.recordID, meetingID: rec.meetingID, name: rec.name || room.name, state: rec.state, published: rec.published === 'true', startTime: rec.startTime, endTime: rec.endTime, participants: rec.participants, size: rec.size, formats: formats.map(f => ({ type: f.type, url: f.url, length: f.length, size: f.size, })), }; }); res.json({ recordings: formatted }); } catch (err) { console.error('Get room recordings error:', err); res.status(500).json({ error: 'Recordings could not be loaded', recordings: [] }); } }); // DELETE /api/recordings/:recordID router.delete('/:recordID', authenticateToken, async (req, res) => { try { await deleteRecording(req.params.recordID); res.json({ message: 'Recording deleted' }); } catch (err) { console.error('Delete recording error:', err); res.status(500).json({ error: 'Recording could not be deleted' }); } }); // PUT /api/recordings/:recordID/publish router.put('/:recordID/publish', authenticateToken, async (req, res) => { try { const { publish } = req.body; await publishRecording(req.params.recordID, publish); res.json({ message: publish ? 'Recording published' : 'Recording unpublished' }); } catch (err) { console.error('Publish recording error:', err); res.status(500).json({ error: 'Recording could not be updated' }); } }); export default router;