Source: RouterEvents/eventJobTemplate.js

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

/**
 * Event Job Template Router
 * 
 * Manages job templates for events. Job templates define roles/functions
 * that can be assigned to people in events, including qualifications,
 * permissions, and display settings.
 * 
 * @swagger
 * components:
 *   schemas:
 *     EventJobTemplate:
 *       type: object
 *       properties:
 *         UID:
 *           type: string
 *           format: uuid
 *         Display:
 *           type: string
 *         SortName:
 *           type: string
 *         Data:
 *           type: object
 *           properties:
 *             name:
 *               type: string
 *             qualification:
 *               type: object
 *             responsible:
 *               type: boolean
 *             visible:
 *               type: boolean
 *             role:
 *               type: boolean
 *             mandatory:
 *               type: boolean
 * 
 * tags:
 *   - name: Event Job Templates
 *     description: Event job template management
 */

import express from 'express';
import { checkAdmin } from '../utils/authChecks.js';
import * as eventJobTemplateController from './eventJobTemplate/controller.js';

/** @type {express.Express} */
const api = express();

// Export helper functions for use by other modules
export { extractAchievements } from './eventJobTemplate/service.js';

/**
 * @swagger
 * /api/eventJobTemplate/{UIDeventTemplate}:
 *   put:
 *     summary: Create or update a job template
 *     description: Creates or updates a job template for an event template. Includes qualification requirements and role settings.
 *     tags:
 *       - Event Job Templates
 *     security:
 *       - bearerAuth: []
 *     parameters:
 *       - in: path
 *         name: UIDeventTemplate
 *         required: true
 *         schema:
 *           type: string
 *           format: uuid
 *         description: Event template UID
 *       - in: query
 *         name: requalify
 *         schema:
 *           type: string
 *           enum: ['0', '1']
 *         description: Whether to requalify existing jobs (1=yes, 0=no)
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             type: object
 *             required:
 *               - name
 *             properties:
 *               name:
 *                 type: string
 *                 description: Job template name
 *               qualification:
 *                 type: object
 *                 description: Qualification filter object
 *               responsible:
 *                 type: boolean
 *                 description: Is this a responsible/admin role
 *               visible:
 *                 type: boolean
 *                 description: Is this role visible to all
 *               role:
 *                 type: boolean
 *                 description: Is this a role assignment
 *               mandatory:
 *                 type: boolean
 *                 description: Is this a mandatory job
 *     responses:
 *       200:
 *         description: Job template created or updated successfully
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 success:
 *                   type: boolean
 *                 result:
 *                   $ref: '#/components/schemas/EventJobTemplate'
 */
// @ts-ignore
api.put('/:UIDeventTemplate', checkAdmin, eventJobTemplateController.createOrUpdateJobTemplateController);

/**
 * @swagger
 * /api/eventJobTemplate/{UID}:
 *   delete:
 *     summary: Delete a job template
 *     description: Deletes a job template and all associated qualification links
 *     tags:
 *       - Event Job Templates
 *     security:
 *       - bearerAuth: []
 *     parameters:
 *       - in: path
 *         name: UID
 *         required: true
 *         schema:
 *           type: string
 *           format: uuid
 *         description: Job template UID to delete
 *     responses:
 *       200:
 *         description: Job template deleted successfully
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 success:
 *                   type: boolean
 */
// @ts-ignore
api.delete('/:UID', checkAdmin, eventJobTemplateController.deleteJobTemplateController);

/**
 * @swagger
 * /api/eventJobTemplate/eventJobs/{UID}:
 *   get:
 *     summary: Get all jobs for a function template
 *     description: Retrieves all job assignments based on a specific function template
 *     tags:
 *       - Event Job Templates
 *     security:
 *       - bearerAuth: []
 *     parameters:
 *       - in: path
 *         name: UID
 *         required: true
 *         schema:
 *           type: string
 *           format: uuid
 *         description: Function template UID
 *       - in: query
 *         name: Timestamp
 *         schema:
 *           type: string
 *           format: date-time
 *         description: Historical timestamp for temporal queries
 *       - in: query
 *         name: Data
 *         schema:
 *           type: string
 *         description: JSON array of data fields to retrieve (path and alias)
 *       - in: query
 *         name: groupBanner
 *         schema:
 *           type: boolean
 *         description: Include group banner in results
 *     responses:
 *       200:
 *         description: Jobs retrieved successfully
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 success:
 *                   type: boolean
 *                 result:
 *                   type: array
 *                   items:
 *                     type: object
 */
// @ts-ignore
api.get('/eventJobs/:UID', eventJobTemplateController.getEventJobsController);

/**
 * @swagger
 * /api/eventJobTemplate/{UID}:
 *   get:
 *     summary: Get all function template names and UIDs
 *     description: Retrieves basic information (UID, Display, SortName) for all job templates of an event template
 *     tags:
 *       - Event Job Templates
 *     security:
 *       - bearerAuth: []
 *     parameters:
 *       - in: path
 *         name: UID
 *         required: true
 *         schema:
 *           type: string
 *           format: uuid
 *         description: Event template UID
 *     responses:
 *       200:
 *         description: Template list retrieved successfully
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 success:
 *                   type: boolean
 *                 result:
 *                   type: array
 *                   items:
 *                     type: object
 *                     properties:
 *                       UID:
 *                         type: string
 *                         format: uuid
 *                       Display:
 *                         type: string
 *                       SortName:
 *                         type: string
 */
// @ts-ignore
api.get('/:UID', eventJobTemplateController.getJobTemplatesController);

/**
 * @swagger
 * /api/eventJobTemplate/Data/{UID}:
 *   get:
 *     summary: Get all function templates with full data
 *     description: Retrieves complete information including Data field for all job templates of an event template
 *     tags:
 *       - Event Job Templates
 *     security:
 *       - bearerAuth: []
 *     parameters:
 *       - in: path
 *         name: UID
 *         required: true
 *         schema:
 *           type: string
 *           format: uuid
 *         description: Event template UID
 *     responses:
 *       200:
 *         description: Templates with data retrieved successfully
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 success:
 *                   type: boolean
 *                 result:
 *                   type: array
 *                   items:
 *                     $ref: '#/components/schemas/EventJobTemplate'
 */
// @ts-ignore
api.get('/Data/:UID', eventJobTemplateController.getJobTemplatesWithDataController);

export default api;