Files
yourpart3/backend/services/dashboardService.js

60 lines
2.2 KiB
JavaScript

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<Array<{ id: number, label: string, endpoint: string, description: string|null, orderId: number }>>}
*/
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();