CentralBackend/controller/admin/I18nPreferencesController.js
DeathKaioken 918deb2b69 zua
Co-authored-by: Copilot <copilot@github.com>
2026-05-03 23:46:08 +02:00

107 lines
3.8 KiB
JavaScript

const I18nPreferencesRepository = require('../../repositories/settings/I18nPreferencesRepository');
const { logger } = require('../../middleware/logger');
const repo = new I18nPreferencesRepository();
class I18nPreferencesController {
static _normalizeStringArray(values) {
if (!Array.isArray(values)) return [];
const normalized = values
.map((v) => (v == null ? '' : String(v).trim()))
.filter(Boolean);
return [...new Set(normalized)];
}
static _normalizeCategories(categories) {
if (!Array.isArray(categories)) return [];
return categories
.map((item, idx) => {
const id = String(item?.id ?? '').trim() || `category_${idx + 1}`;
const label = String(item?.label ?? id).trim() || id;
const namespaces = I18nPreferencesController._normalizeStringArray(item?.namespaces);
const isCustom = Boolean(item?.isCustom);
return { id, label, namespaces, isCustom };
});
}
static _buildResponse(preferences) {
return {
ok: true,
preferences,
categories: preferences.categories,
globalKeys: preferences.globalKeys,
};
}
static async get(req, res) {
try {
const preferences = await repo.get();
return res.status(200).json(I18nPreferencesController._buildResponse(preferences));
} catch (error) {
logger.error('i18nPreferences:get:failed', { error: error?.message });
return res.status(500).json({ ok: false, message: 'Failed to load i18n preferences' });
}
}
static async post(req, res) {
try {
const categories = I18nPreferencesController._normalizeCategories(req.body?.categories);
const globalKeys = I18nPreferencesController._normalizeStringArray(req.body?.globalKeys);
const preferences = await repo.upsert({
categories,
globalKeys,
updatedByUserId: req.user?.userId ?? req.user?.id ?? null,
});
return res.status(200).json(I18nPreferencesController._buildResponse(preferences));
} catch (error) {
logger.error('i18nPreferences:post:failed', { error: error?.message });
return res.status(500).json({ ok: false, message: 'Failed to save i18n preferences' });
}
}
static async put(req, res) {
try {
const categories = I18nPreferencesController._normalizeCategories(req.body?.categories);
const globalKeys = I18nPreferencesController._normalizeStringArray(req.body?.globalKeys);
const preferences = await repo.upsert({
categories,
globalKeys,
updatedByUserId: req.user?.userId ?? req.user?.id ?? null,
});
return res.status(200).json(I18nPreferencesController._buildResponse(preferences));
} catch (error) {
logger.error('i18nPreferences:put:failed', { error: error?.message });
return res.status(500).json({ ok: false, message: 'Failed to update i18n preferences' });
}
}
static async delete(req, res) {
try {
const hasBodyReplacement = req.body && (
Object.prototype.hasOwnProperty.call(req.body, 'categories') ||
Object.prototype.hasOwnProperty.call(req.body, 'globalKeys')
);
const preferences = hasBodyReplacement
? await repo.upsert({
categories: I18nPreferencesController._normalizeCategories(req.body?.categories),
globalKeys: I18nPreferencesController._normalizeStringArray(req.body?.globalKeys),
updatedByUserId: req.user?.userId ?? req.user?.id ?? null,
})
: await repo.clear(req.user?.userId ?? req.user?.id ?? null);
return res.status(200).json(I18nPreferencesController._buildResponse(preferences));
} catch (error) {
logger.error('i18nPreferences:delete:failed', { error: error?.message });
return res.status(500).json({ ok: false, message: 'Failed to delete i18n preferences' });
}
}
}
module.exports = I18nPreferencesController;