Source: Router/achievement/controller.js

// @ts-check
/**
 * @import {ExpressRequestAuthorized, ExpressResponse} from './../../types.js'
 */
/**
 * Achievement Controller
 * 
 * Contains all the business logic for achievement operations:
 * - Creating and updating achievements
 * - Deleting achievements  
 * - Renewing/expiring achievements
 * - Fetching achievement information
 * - Listing achievements for persons
 * 
 * All functions handle proper authorization checks and data validation.
 */

import { UUID2hex } from '@commtool/sql-query';
import { errorLoggerUpdate } from '../../utils/requestLogger.js';
import { insertOrUpdateAchievement as _insertOrUpdateAchievement } from './insertOrUpdate.js';
import { deleteAchievement as _deleteAchievement } from './delete.js';
import { expireAchievements } from './utilities.js';
import { getAchievement as _getAchievement, listAchievementsPerson as _listAchievementsPerson } from './select.js';

// @ts-check
import './../../types.js';
/**
 * Handles the insertion or update of an achievement for a member
 * @param {Object} req - Express request object
 * @param {Object} res - Express response object
 */
export const insertOrUpdateAchievement = _insertOrUpdateAchievement;

/**
 * Deletes an achievement from the database
 * @param {Object} req - Express request object
 * @param {Object} res - Express response object
 */
export const deleteAchievement = _deleteAchievement;

/**
 * Retrieves a specific achievement by UID
 * @param {Object} req - Express request object
 * @param {Object} res - Express response object
 */
export const getAchievement = _getAchievement;

/**
 * Lists all achievements for a specific person
 * @param {Object} req - Express request object
 * @param {Object} res - Express response object
 */
export const listAchievementsPerson = _listAchievementsPerson;

/**
 * Maintenance endpoint to check renewal of achievements
 * @param {Object} req - Express request object
 * @param {Object} res - Express response object
 */
export const renewalMaintenance = async (req, res) => {
    try {
        await expireAchievements(UUID2hex(req.session.root), req.query.complete);
        res.json({ success: true });
    } catch (e) {
        errorLoggerUpdate(e);
        res.status(500).json({ success: false, message: 'Internal server error' });
    }
};