Source: Router/group/controller.js

// @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 * 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 });
    }
};