import BaseService from './BaseService.js'; import UserDashboard from '../models/community/user_dashboard.js'; import WidgetType from '../models/type/widget_type.js'; class DashboardService extends BaseService { /** * Liste aller möglichen (verfügbaren) Widget-Typen. * @returns {Promise>} */ async getAvailableWidgets() { const rows = await WidgetType.findAll({ order: [['orderId', 'ASC'], ['id', 'ASC']], attributes: ['id', 'label', 'endpoint', 'description', 'orderId'] }); return rows.map(r => ({ id: r.id, label: r.label, endpoint: r.endpoint, description: r.description ?? null, orderId: r.orderId })); } /** * @param {string} hashedUserId * @returns {Promise<{ widgets: Array<{ id: string, title: string, endpoint: string }> }>} */ async getConfig(hashedUserId) { const user = await this.getUserByHashedId(hashedUserId); const row = await UserDashboard.findOne({ where: { userId: user.id } }); const config = row?.config ?? { widgets: [] }; if (!Array.isArray(config.widgets)) config.widgets = []; return config; } /** * @param {string} hashedUserId * @param {{ widgets: Array<{ id: string, title: string, endpoint: string }> }} config */ async setConfig(hashedUserId, config) { const user = await this.getUserByHashedId(hashedUserId); const widgets = Array.isArray(config?.widgets) ? config.widgets : []; const sanitized = widgets.map(w => ({ id: String(w?.id ?? ''), title: String(w?.title ?? ''), endpoint: String(w?.endpoint ?? '') })).filter(w => w.id && (w.title || w.endpoint)); const payload = { widgets: sanitized }; const existing = await UserDashboard.findOne({ where: { userId: user.id } }); if (existing) { await existing.update({ config: payload }); } else { await UserDashboard.create({ userId: user.id, config: payload }); } return { widgets: sanitized }; } } export default new DashboardService();