BillTracker/routes/settings.js

58 lines
1.9 KiB
JavaScript

'use strict';
const express = require('express');
const router = express.Router();
const { getDb, getSetting, setSetting } = require('../db/database');
const { seedDemoData } = require('../scripts/seedDemoData');
// Keys a regular user is allowed to read and write.
// Admin/SMTP/backup/auth settings are excluded — they are only readable through
// their respective admin endpoints and never exposed here.
const USER_SETTING_KEYS = [
'currency', 'date_format', 'grace_period_days', 'notify_days_before',
];
// GET /api/settings — returns only user-facing app preferences
router.get('/', (req, res) => {
const db = getDb();
const settings = {};
for (const key of USER_SETTING_KEYS) {
const row = db.prepare('SELECT value FROM settings WHERE key = ?').get(key);
if (row) settings[key] = row.value;
}
res.json(settings);
});
// PUT /api/settings — updates only allowed user-facing keys; silently ignores others
router.put('/', (req, res) => {
for (const [key, value] of Object.entries(req.body)) {
if (USER_SETTING_KEYS.includes(key)) setSetting(key, value);
}
const db = getDb();
const settings = {};
for (const key of USER_SETTING_KEYS) {
const row = db.prepare('SELECT value FROM settings WHERE key = ?').get(key);
if (row) settings[key] = row.value;
}
res.json(settings);
});
// POST /api/settings/seed-demo-data — seeds 20 demo bills for the requesting user
router.post('/seed-demo-data', (req, res) => {
try {
const result = seedDemoData(req.user.id);
res.json({
success: true,
message: `Created ${result.billsCreated} demo bills and ${result.categoriesCreated} demo categories`,
billsCreated: result.billsCreated,
categoriesCreated: result.categoriesCreated,
});
} catch (err) {
const status = err.status || 500;
res.status(status).json({ error: status === 500 ? 'Seed operation failed' : err.message });
}
});
module.exports = router;