CentralBackend/controller/matrix/MatrixController.js
2025-11-30 13:24:22 +01:00

213 lines
6.8 KiB
JavaScript

const MatrixService = require('../../services/matrix/MatrixService');
async function create(req, res) {
try {
const { name, email, force } = req.query; // email of the top node account
const result = await MatrixService.create({
name,
topNodeEmail: email,
force: String(force || '').toLowerCase() === 'true',
actorUser: req.user
});
return res.json({ success: true, data: result });
} catch (err) {
const status = err.status || 500;
return res.status(status).json({ success: false, message: err.message || 'Matrix creation failed' });
}
}
async function stats(req, res) {
try {
const data = await MatrixService.getStats({ actorUser: req.user });
return res.json({ success: true, data });
} catch (err) {
const status = err.status || 500;
return res.status(status).json({ success: false, message: err.message || 'Could not load matrix stats' });
}
}
// NEW: admin-only list of matrix users under a root
async function getMatrixUserforAdmin(req, res) {
try {
const { rootUserId, depth, limit, offset, includeRoot, rogueOnly } = req.query;
const matrixInstanceId = req.query.matrixInstanceId || req.query.matrixId || req.query.id;
const topNodeEmail = req.query.topNodeEmail || req.query.email;
const data = await MatrixService.getUsers({
rootUserId,
maxDepth: depth,
limit,
offset,
includeRoot,
rogueOnly: String(rogueOnly || '').toLowerCase() === 'true',
actorUser: req.user,
matrixInstanceId,
matrixId: matrixInstanceId, // backward alias
topNodeEmail
});
return res.json({ success: true, data });
} catch (err) {
const status = err.status || 500;
return res.status(status).json({ success: false, message: err.message || 'Could not load matrix users' });
}
}
// NEW: admin-only search of user candidates to add into a matrix
async function searchCandidates(req, res) {
try {
const { q, type, limit, offset, rootUserId } = req.query;
const matrixInstanceId = req.query.matrixInstanceId || req.query.matrixId || req.query.id;
const topNodeEmail = req.query.topNodeEmail || req.query.email;
const data = await MatrixService.getUserCandidates({
q,
type,
limit,
offset,
rootUserId,
matrixInstanceId,
matrixId: matrixInstanceId,
topNodeEmail,
actorUser: req.user
});
return res.json({ success: true, data });
} catch (err) {
const status = err.status || 500;
return res.status(status).json({ success: false, message: err.message || 'Could not search user candidates' });
}
}
async function addUser(req, res) {
try {
const {
rootUserId,
matrixInstanceId,
matrixId,
topNodeEmail,
childUserId,
forceParentFallback,
parentUserId
} = req.body;
const resolvedMatrixId = matrixInstanceId || matrixId;
const data = await MatrixService.addUserToMatrix({
rootUserId,
matrixInstanceId: resolvedMatrixId,
matrixId: resolvedMatrixId,
topNodeEmail,
childUserId,
forceParentFallback,
parentUserId,
actorUser: req.user
});
return res.json({ success: true, data });
} catch (err) {
const status = err.status || 500;
return res.status(status).json({ success: false, message: err.message || 'Could not add user to matrix' });
}
}
// NEW: user-facing matrix overview anchored at requester
async function getMyOverview(req, res) {
try {
const userId = req.user?.id ?? req.user?.userId;
const data = await MatrixService.getMyOverview({ userId, actorUser: req.user });
return res.json({ success: true, data });
} catch (err) {
const status = err.status || 500;
return res.status(status).json({ success: false, message: err.message || 'Could not load matrix overview' });
}
}
// NEW: admin-only deactivate a matrix instance
async function deactivate(req, res) {
try {
const matrixInstanceId =
req.params.id ||
req.body?.matrixInstanceId ||
req.body?.matrixId ||
req.query?.matrixInstanceId ||
req.query?.matrixId;
const data = await MatrixService.deactivate({
matrixInstanceId,
actorUser: req.user
});
return res.json({ success: true, data });
} catch (err) {
const status = err.status || 500;
return res.status(status).json({ success: false, message: err.message || 'Could not deactivate matrix' });
}
}
// NEW: admin-only activate a matrix instance
async function activate(req, res) {
try {
const matrixInstanceId =
req.params.id ||
req.body?.matrixInstanceId ||
req.body?.matrixId ||
req.query?.matrixInstanceId ||
req.query?.matrixId;
const data = await MatrixService.activate({
matrixInstanceId,
actorUser: req.user
});
return res.json({ success: true, data });
} catch (err) {
const status = err.status || 500;
return res.status(status).json({ success: false, message: err.message || 'Could not activate matrix' });
}
}
// NEW: list all matrices current user belongs to
async function listMyMatrices(req, res) {
try {
const userId = req.user?.id ?? req.user?.userId;
const data = await MatrixService.listMyMatrices({ userId, actorUser: req.user });
return res.json({ success: true, data });
} catch (err) {
const status = err.status || 500;
return res.status(status).json({ success: false, message: err.message || 'Could not load matrices' });
}
}
// NEW: personal overview for a specific matrix instance
async function getMyOverviewByInstance(req, res) {
try {
const userId = req.user?.id ?? req.user?.userId;
const matrixInstanceId = req.params.id || req.query?.matrixInstanceId || req.query?.matrixId;
const data = await MatrixService.getMyOverviewByInstance({ userId, matrixInstanceId, actorUser: req.user });
return res.json({ success: true, data });
} catch (err) {
const status = err.status || 500;
return res.status(status).json({ success: false, message: err.message || 'Could not load matrix overview' });
}
}
// NEW: personal matrix summary (totals and fill) for a specific instance
async function getMyMatrixSummary(req, res) {
try {
const userId = req.user?.id ?? req.user?.userId;
const matrixInstanceId = req.params.id || req.query?.matrixInstanceId || req.query?.matrixId;
const data = await MatrixService.getMyMatrixSummary({ userId, matrixInstanceId, actorUser: req.user });
return res.json({ success: true, data });
} catch (err) {
const status = err.status || 500;
return res.status(status).json({ success: false, message: err.message || 'Could not load matrix summary' });
}
}
module.exports = {
create,
stats,
getMatrixUserforAdmin,
searchCandidates,
addUser, // NEW
getMyOverview, // NEW
deactivate, // NEW
activate, // NEW
listMyMatrices, // NEW
getMyOverviewByInstance, // NEW
getMyMatrixSummary // NEW
};