Source: Router/persons/controller.js

// @ts-check
/**
 * @import {ExpressRequestAuthorized, ExpressResponse} from '../../types.js'
 */

import paginateList from '../../utils/paginateList.js';
import { errorLoggerRead } from '../../utils/requestLogger.js';
import {
    getListing,
    getPersonsByUIDs,
    getPersonsByGroups,
    getAddedPersons,
    getRemovedPersons,
    getEnteredPersons,
    getExitedPersons,
    checkIsMember,
} from './service.js';

// ---------------------------------------------------------------------------
// GET /:UID  (paginated)
// ---------------------------------------------------------------------------

/**
 * Return a paginated list of persons belonging to a group.
 * Only invoked when `__page` query parameter is present.
 *
 * @param {ExpressRequestAuthorized} req
 * @param {ExpressResponse} res
 * @param {import('express').NextFunction} next
 */
export const getListingPaginatedController = async (req, res, next) => {
    if (!req.query.__page) {
        next();
        return;
    }
    try {
        res.json(await paginateList(req, getListing));
    } catch (error) {
        errorLoggerRead(error);
        res.status(500).json({ success: false, message: error.message });
    }
};

// ---------------------------------------------------------------------------
// GET /:UID  (full list)
// ---------------------------------------------------------------------------

/**
 * Return the full list of persons belonging to a group / object.
 *
 * @param {ExpressRequestAuthorized} req
 * @param {ExpressResponse} res
 */
export const getListingController = async (req, res) => {
    try {
        const result = await getListing(req);
        res.json({ success: true, result });
    } catch (error) {
        errorLoggerRead(error);
        res.status(500).json({ success: false, message: error.message });
    }
};

// ---------------------------------------------------------------------------
// POST /
// ---------------------------------------------------------------------------

/**
 * Return persons matching an array of UIDs supplied in the request body.
 *
 * @param {ExpressRequestAuthorized} req
 * @param {ExpressResponse} res
 */
export const getPersonsByUIDsController = async (req, res) => {
    try {
        const result = await getPersonsByUIDs(req);
        res.json(result);
    } catch (error) {
        errorLoggerRead(error);
        res.status(500).json({ success: false, message: error.message });
    }
};

// ---------------------------------------------------------------------------
// POST /groups/
// ---------------------------------------------------------------------------

/**
 * Return persons belonging to one or more groups supplied as UUID array in body.
 *
 * @param {ExpressRequestAuthorized} req
 * @param {ExpressResponse} res
 */
export const getPersonsByGroupsController = async (req, res) => {
    try {
        const result = await getPersonsByGroups(req);
        res.json(result);
    } catch (error) {
        errorLoggerRead(error);
        res.status(500).json({ success: false, message: error.message });
    }
};

// ---------------------------------------------------------------------------
// GET /added/:UID/:timestamp
// ---------------------------------------------------------------------------

/**
 * Return persons added to a group after the given timestamp.
 *
 * @param {ExpressRequestAuthorized} req
 * @param {ExpressResponse} res
 */
export const getAddedPersonsController = async (req, res) => {
    try {
        const result = await getAddedPersons(req);
        res.json(result);
    } catch (error) {
        errorLoggerRead(error);
        res.status(500).json({ success: false, message: error.message });
    }
};

// ---------------------------------------------------------------------------
// GET /removed/:UID/:timestamp
// ---------------------------------------------------------------------------

/**
 * Return persons removed from a group after the given timestamp.
 *
 * @param {ExpressRequestAuthorized} req
 * @param {ExpressResponse} res
 */
export const getRemovedPersonsController = async (req, res) => {
    try {
        const result = await getRemovedPersons(req);
        res.json(result);
    } catch (error) {
        errorLoggerRead(error);
        res.status(500).json({ success: false, message: error.message });
    }
};

// ---------------------------------------------------------------------------
// GET /entered/:UID/:timestamp
// ---------------------------------------------------------------------------

/**
 * Return persons who transitioned from extern to person (entered) after the timestamp.
 *
 * @param {ExpressRequestAuthorized} req
 * @param {ExpressResponse} res
 */
export const getEnteredPersonsController = async (req, res) => {
    try {
        const result = await getEnteredPersons(req);
        res.json(result);
    } catch (error) {
        errorLoggerRead(error);
        res.status(500).json({ success: false, message: error.message });
    }
};

// ---------------------------------------------------------------------------
// GET /exited/:UID/:timestamp
// ---------------------------------------------------------------------------

/**
 * Return persons who transitioned from person to extern (exited) after the timestamp.
 *
 * @param {ExpressRequestAuthorized} req
 * @param {ExpressResponse} res
 */
export const getExitedPersonsController = async (req, res) => {
    try {
        const result = await getExitedPersons(req);
        res.json(result);
    } catch (error) {
        errorLoggerRead(error);
        res.status(500).json({ success: false, message: error.message });
    }
};

// ---------------------------------------------------------------------------
// GET /isMember/:UID/:person
// ---------------------------------------------------------------------------

/**
 * Check whether a person is currently a member of a group.
 *
 * @param {ExpressRequestAuthorized} req
 * @param {ExpressResponse} res
 */
export const checkIsMemberController = async (req, res) => {
    try {
        const result = await checkIsMember(req.params.person, req.params.UID);
        res.json(result);
    } catch (error) {
        errorLoggerRead(error);
        res.status(500).json({ success: false, message: error.message });
    }
};