107 lines
3.8 KiB
JavaScript
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;
|