// @ts-check
/**
* @import {ExpressRequestAuthorized, ExpressResponse} from './../../types.js'
*/
/**
* Group Controller — HTTP Request/Response Handling
*
* Extracts request parameters and delegates all business logic to the
* service layer. Each handler catches unexpected errors, logs them, and
* returns a 500 response so the process does not crash.
*/
import { errorLoggerRead, errorLoggerUpdate } from '../../utils/requestLogger.js';
import { UUID2hex } from '@commtool/sql-query';
import { timestampCheck } from '../person/migratePerson.js';
import * as groupService from './service.js';
export { getGroupTreeGraph } from './krokiTree.js';
// ---------------------------------------------------------------------------
// Mutation handlers
// ---------------------------------------------------------------------------
/**
* PUT /:UIDparent — create or update a group under the given parent.
* @param {ExpressRequestAuthorized} req
* @param {ExpressResponse} res
*/
export const putGroup = async (req, res) => {
try {
const result = await groupService.createOrUpdateGroup(req);
res.status(result.status ?? 200).json(result);
} catch (e) {
errorLoggerUpdate(e);
res.status(500).json({ success: false, message: e.message });
}
};
/**
* POST /:UID — partial update of an existing group.
* @param {ExpressRequestAuthorized} req
* @param {ExpressResponse} res
*/
export const updateGroup = async (req, res) => {
try {
const result = await groupService.updateGroupData(req);
res.status(result.status ?? 200).json(result);
} catch (e) {
errorLoggerUpdate(e);
res.status(500).json({ success: false, message: e.message });
}
};
/**
* DELETE /:UID — delete a group if it has no remaining members.
* @param {ExpressRequestAuthorized} req
* @param {ExpressResponse} res
*/
export const deleteGroup = async (req, res) => {
try {
const result = await groupService.deleteGroupById(req);
res.status(result.status ?? 200).json(result);
} catch (e) {
errorLoggerUpdate(e);
res.status(500).json({ success: false, message: e.message });
}
};
// ---------------------------------------------------------------------------
// Read handlers
// ---------------------------------------------------------------------------
/**
* GET /:UID — fetch group details, optionally with parent and/or sibling data.
* @param {ExpressRequestAuthorized} req
* @param {ExpressResponse} res
*/
export const getGroup = async (req, res) => {
try {
const result = await groupService.getGroupById(req);
res.status(result.status ?? 200).json(result);
} catch (e) {
errorLoggerRead(e);
res.status(500).json({ success: false, message: e.message });
}
};
/**
* GET /admin/:UID — check whether the current user has admin rights for a group.
* @param {ExpressRequestAuthorized} req
* @param {ExpressResponse} res
*/
export const checkGroupAdmin = async (req, res) => {
try {
const result = await groupService.checkGroupAdminStatus(req);
res.json(result);
} catch (e) {
errorLoggerRead(e);
res.status(500).json({ success: false, message: e.message });
}
};
/**
* GET /minTimestamp/:UID — return the minimum allowed backdate timestamp (ms)
* for a group object, constrained by its latest history row.
* @param {ExpressRequestAuthorized} req
* @param {ExpressResponse} res
*/
export const minTimestamp = async (req, res) => {
try {
const groupUID = UUID2hex(req.params.UID);
const queryTimestamp = req.query.timestamp
? parseFloat(String(req.query.timestamp)) / 1000
: null;
const minSeconds = await timestampCheck(groupUID, queryTimestamp);
res.json({ success: true, result: minSeconds !== null ? minSeconds * 1000 : null });
} catch (e) {
errorLoggerRead(e);
res.status(500).json({ success: false, message: 'Internal server error' });
}
};