CentralBackend/services/matrix/MatrixService.js
2025-10-16 16:34:56 +02:00

84 lines
2.1 KiB
JavaScript

const MatrixRepository = require('../../repositories/matrix/MatrixRepository');
const Matrix = require('../../models/Matrix');
function isAdmin(user) {
return !!user && ['admin', 'super_admin'].includes(user.role);
}
function isValidEmail(s) {
return typeof s === 'string' && /\S+@\S+\.\S+/.test(s);
}
async function create({ name, topNodeEmail, force = false, actorUser }) {
if (!actorUser) {
const err = new Error('Unauthorized');
err.status = 401;
throw err;
}
if (!isAdmin(actorUser)) {
const err = new Error('Forbidden: Admins only');
err.status = 403;
throw err;
}
const trimmedName = (name || '').trim();
if (!trimmedName) {
const err = new Error('Matrix name is required');
err.status = 400;
throw err;
}
if (trimmedName.length > 255) {
const err = new Error('Matrix name is too long');
err.status = 400;
throw err;
}
const email = (topNodeEmail || '').trim().toLowerCase();
if (!isValidEmail(email)) {
const err = new Error('Valid top node email is required');
err.status = 400;
throw err;
}
const res = await MatrixRepository.createMatrix({ name: trimmedName, topNodeEmail: email, force });
return new Matrix({
name: res.name,
masterTopUserId: res.masterTopUserId,
masterTopUserEmail: res.masterTopUserEmail
});
}
async function getStats({ actorUser }) {
if (!actorUser) {
const err = new Error('Unauthorized');
err.status = 401;
throw err;
}
if (!isAdmin(actorUser)) {
const err = new Error('Forbidden: Admins only');
err.status = 403;
throw err;
}
const stats = await MatrixRepository.getMatrixStats();
// Keep the response shape straightforward for the dashboard
return {
activeMatrices: stats.activeMatrices,
totalMatrices: stats.totalMatrices,
totalUsersSubscribed: stats.totalUsersSubscribed,
matrices: stats.matrices.map(m => ({
rootUserId: m.rootUserId,
name: m.name,
isActive: !!m.isActive,
usersCount: m.usersCount,
createdAt: m.createdAt, // equals ego_activated_at
topNodeEmail: m.topNodeEmail
}))
};
}
module.exports = {
create,
getStats
};