172 lines
5.1 KiB
JavaScript
172 lines
5.1 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' });
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
create,
|
|
stats,
|
|
getMatrixUserforAdmin,
|
|
searchCandidates,
|
|
addUser, // NEW
|
|
getMyOverview, // NEW
|
|
deactivate, // NEW
|
|
activate // NEW
|
|
};
|