'use strict'; const express = require('express'); const { db } = require('../db'); const { log } = require('../lib/audit'); const { parseInputDate } = require('../lib/dates'); const { requireAuth, requireAdmin } = require('../middleware/auth'); const router = express.Router(); const PAGE = 'Version Control'; // ---- Read: administrators only ---------------------------------------- router.get('/', requireAuth, requireAdmin, (req, res) => { const entries = db.prepare( `SELECT id, version, title, released_on, notes, sort_order, created_at, updated_at FROM version_entries ORDER BY sort_order DESC, COALESCE(released_on, '') DESC, id DESC` ).all(); res.json({ entries }); }); // ---- Write: administrators only --------------------------------------- function clean(body) { return { version: String((body && body.version) || '').trim(), title: String((body && body.title) || '').trim(), released_on: parseInputDate((body && body.released_on) || ''), released_on_raw: String((body && body.released_on) || '').trim(), notes: String((body && body.notes) || '').trim(), sort_order: Number.isFinite(Number(body && body.sort_order)) ? Number(body.sort_order) : 0, }; } router.post('/', requireAuth, requireAdmin, (req, res) => { const v = clean(req.body); if (!v.version) return res.status(400).json({ error: 'A version is required.' }); if (v.released_on_raw && !v.released_on) { return res.status(400).json({ error: 'Release date must be a valid date in DD-MM-YYYY format.' }); } const info = db.prepare( `INSERT INTO version_entries (version, title, released_on, notes, sort_order, created_by) VALUES (?, ?, ?, ?, ?, ?)` ).run(v.version, v.title || null, v.released_on || null, v.notes || null, v.sort_order, req.session.user.id); log(req, 'VERSION_ENTRY_CREATED', 'Data Management', `Added version entry "${v.version}"`); res.json({ ok: true, entry: db.prepare('SELECT * FROM version_entries WHERE id = ?').get(info.lastInsertRowid) }); }); router.patch('/:id', requireAuth, requireAdmin, (req, res) => { const id = Number(req.params.id); const existing = db.prepare('SELECT * FROM version_entries WHERE id = ?').get(id); if (!existing) return res.status(404).json({ error: 'Entry not found.' }); const v = clean(req.body); if (!v.version) return res.status(400).json({ error: 'A version is required.' }); if (v.released_on_raw && !v.released_on) { return res.status(400).json({ error: 'Release date must be a valid date in DD-MM-YYYY format.' }); } db.prepare( `UPDATE version_entries SET version = ?, title = ?, released_on = ?, notes = ?, sort_order = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?` ).run(v.version, v.title || null, v.released_on || null, v.notes || null, v.sort_order, id); log(req, 'VERSION_ENTRY_UPDATED', 'Data Management', `Updated version entry "${v.version}"`); res.json({ ok: true, entry: db.prepare('SELECT * FROM version_entries WHERE id = ?').get(id) }); }); router.delete('/:id', requireAuth, requireAdmin, (req, res) => { const id = Number(req.params.id); const existing = db.prepare('SELECT * FROM version_entries WHERE id = ?').get(id); if (!existing) return res.status(404).json({ error: 'Entry not found.' }); db.prepare('DELETE FROM version_entries WHERE id = ?').run(id); log(req, 'VERSION_ENTRY_DELETED', 'Data Management', `Deleted version entry "${existing.version}"`); res.json({ ok: true }); }); module.exports = router;