CentralBackend/controller/admin/DashboardPlatformsController.js
2026-03-15 18:33:52 +01:00

121 lines
4.5 KiB
JavaScript

const { v4: uuidv4 } = require('uuid');
const DashboardPlatformsRepository = require('../../repositories/settings/DashboardPlatformsRepository');
const repo = new DashboardPlatformsRepository();
function toBool(value, fallback) {
if (value === undefined) return fallback;
if (value === true || value === false) return value;
if (value === 'true') return true;
if (value === 'false') return false;
return fallback;
}
function toNullableString(value) {
if (value === undefined) return undefined;
if (value === null) return null;
const s = String(value);
return s;
}
function requireNonEmptyString(value, field) {
const s = typeof value === 'string' ? value.trim() : '';
if (!s) {
const err = new Error(`${field} is required`);
err.status = 400;
throw err;
}
return s;
}
class DashboardPlatformsController {
// Public endpoint (no auth): only returns active platforms (state=true)
static async listPublic(req, res) {
const list = await repo.listPublic();
return res.json(list);
}
static async list(req, res) {
const list = await repo.list();
return res.json(list);
}
static async create(req, res) {
try {
const title = requireNonEmptyString(req.body.title, 'title');
const href = requireNonEmptyString(req.body.href, 'href');
const platform = {
id: uuidv4(),
title,
description: toNullableString(req.body.description) ?? '',
href,
icon: toNullableString(req.body.icon) ?? '',
color: toNullableString(req.body.color) ?? '',
state: toBool(req.body.state, true),
disabled: toBool(req.body.disabled, false),
disabledText: toNullableString(req.body.disabledText) ?? null,
sortOrder: Number.isFinite(Number(req.body.sortOrder)) ? Number(req.body.sortOrder) : 0,
};
const created = await repo.create(platform);
return res.status(201).json(created || platform);
} catch (err) {
const status = err?.status || 500;
return res.status(status).json({ error: err.message || 'Failed to create dashboard platform' });
}
}
static async update(req, res) {
try {
const id = String(req.params.id || '').trim();
if (!id) return res.status(400).json({ error: 'id is required' });
const existing = await repo.getById(id);
if (!existing) return res.status(404).json({ error: 'Not found' });
const next = {
...existing,
title: req.body.title === undefined ? existing.title : String(req.body.title),
description: req.body.description === undefined ? existing.description : String(req.body.description || ''),
href: req.body.href === undefined ? existing.href : String(req.body.href),
icon: req.body.icon === undefined ? existing.icon : String(req.body.icon || ''),
color: req.body.color === undefined ? existing.color : String(req.body.color || ''),
disabled: req.body.disabled === undefined ? existing.disabled : toBool(req.body.disabled, existing.disabled),
disabledText: req.body.disabledText === undefined ? existing.disabledText : (req.body.disabledText === null ? null : String(req.body.disabledText)),
sortOrder: req.body.sortOrder === undefined ? existing.sortOrder : (Number.isFinite(Number(req.body.sortOrder)) ? Number(req.body.sortOrder) : existing.sortOrder),
};
// If title/href were provided, require non-empty
if (req.body.title !== undefined) requireNonEmptyString(next.title, 'title');
if (req.body.href !== undefined) requireNonEmptyString(next.href, 'href');
const updated = await repo.update(id, next);
if (!updated) return res.status(404).json({ error: 'Not found' });
return res.json(updated);
} catch (err) {
const status = err?.status || 500;
return res.status(status).json({ error: err.message || 'Failed to update dashboard platform' });
}
}
static async setState(req, res) {
try {
const id = String(req.params.id || '').trim();
if (!id) return res.status(400).json({ error: 'id is required' });
const state = toBool(req.body.state, undefined);
if (state === undefined) return res.status(400).json({ error: 'state must be boolean' });
const updated = await repo.setState(id, state);
if (!updated) return res.status(404).json({ error: 'Not found' });
return res.json(updated);
} catch (err) {
const status = err?.status || 500;
return res.status(status).json({ error: err.message || 'Failed to update state' });
}
}
}
module.exports = DashboardPlatformsController;