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;