diff --git a/services/mam-api/src/routes/recorders.js b/services/mam-api/src/routes/recorders.js index a729f26..95618b4 100644 --- a/services/mam-api/src/routes/recorders.js +++ b/services/mam-api/src/routes/recorders.js @@ -187,6 +187,69 @@ router.get('/:id', async (req, res, next) => { } }); +// PATCH /:id - Edit recorder settings +// Blocked while recorder is actively recording to prevent config drift. +router.patch('/:id', async (req, res, next) => { + try { + const { id } = req.params; + + const recorderResult = await pool.query( + 'SELECT * FROM recorders WHERE id = $1', + [id] + ); + if (recorderResult.rows.length === 0) { + return res.status(404).json({ error: 'Recorder not found' }); + } + + const recorder = recorderResult.rows[0]; + if (recorder.status === 'recording') { + return res.status(409).json({ error: 'Cannot edit a recorder while it is recording — stop it first' }); + } + + const { + name, + source_type, + source_config, + recording_codec, + recording_resolution, + proxy_enabled, + proxy_codec, + proxy_resolution, + project_id, + } = req.body; + + const updates = []; + const params = []; + let n = 1; + + if (name !== undefined) { updates.push(`name = $${n++}`); params.push(name); } + if (source_type !== undefined) { updates.push(`source_type = $${n++}`); params.push(source_type); } + if (source_config !== undefined) { updates.push(`source_config = $${n++}`); params.push(source_config); } + if (recording_codec !== undefined) { updates.push(`recording_codec = $${n++}`); params.push(recording_codec); } + if (recording_resolution !== undefined){ updates.push(`recording_resolution = $${n++}`); params.push(recording_resolution); } + if (proxy_enabled !== undefined) { updates.push(`proxy_enabled = $${n++}`); params.push(proxy_enabled); } + if (proxy_codec !== undefined) { updates.push(`proxy_codec = $${n++}`); params.push(proxy_codec); } + if (proxy_resolution !== undefined) { updates.push(`proxy_resolution = $${n++}`); params.push(proxy_resolution); } + if (project_id !== undefined) { updates.push(`project_id = $${n++}`); params.push(project_id || null); } + + if (updates.length === 0) { + return res.status(400).json({ error: 'No fields to update' }); + } + + updates.push(`updated_at = NOW()`); + params.push(id); + + const result = await pool.query( + `UPDATE recorders SET ${updates.join(', ')} WHERE id = $${n} RETURNING *`, + params + ); + + res.json(result.rows[0]); + } catch (err) { + next(err); + } +}); + // POST /:id/start - Start recording router.post('/:id/start', async (req, res, next) => { try {