Source: Router/job.js

// @ts-check
/**
 * @import {ExpressRequestAuthorized, ExpressResponse} from '../types.js'
 */
/**
 * @fileoverview Router for job-related operations including creation, updates, and administrative functions.
 * @module Router/job
 * 
 * @requires express
 * @requires @commtool/sql-query
 * @requires ../utils/compileTemplates.js
 * @requires ../utils/renderTemplates.js
 * @requires ../utils/UUIDs.js
 * @requires ../tree/treeQueue/treeQueue.js
 * @requires ../server.ws.js
 * @requires ../utils/authChecks.js
 * @requires ../utils/requestLogger.js
 * @requires lodash
 * @requires ./job/utilities.js
 * @requires ./job/insert.js
 * @requires ./job/update.js
 * 
 * @exports {express.Router} - Job router
 * 
 * @example
 * // Import the job router
 * import jobRouter from './Router/job.js';
 * // Use the router in your Express app
 * app.use('/job', jobRouter);
 */
import express from 'express';


import { checkAdmin, checkObjectAdmin, isObjectAdmin ,isObjectVisible} from '../utils/authChecks.js';
import {requestUpdateLogger, readLogger, errorLoggerRead, errorLoggerUpdate} from '../utils/requestLogger.js'
import _ from 'lodash'; 

import {recreateJobsOrga,recreateJobsPerson} from './job/utilities.js'
import { insertJob } from './job/insert.js';
import { updateJob } from './job/update.js';
import { deleteJob } from './job/delete.js';

let api;

// Initialize router after imports are complete
api = express();

// *************** job

// @ts-ignore
// @ts-ignore
api.put('/:member/:group/:function', requestUpdateLogger, insertJob)

// @ts-ignore
// @ts-ignore
api.post('/:UID', checkObjectAdmin, requestUpdateLogger, updateJob)

/**
 * endpoint to delete a job
 * 
 * @param {Object} req - Express request object.
 * @param {Object} req.query - The query parameters.
 * @param {number} [req.query.timestamp] - Optional timestamp for historical data access (time travel query).
 * @param {Object} req.params - URL parameters.
 * @param {string} req.params.UID - The unique identifier of the job to delete.
 * @param {Object} req.session - Session object.
 * @param {string} req.session.root - Root user UID.
 * @param {string} req.session.user - Current user UID.
 * 
 * @param {Object} res - Express response object.
 * @param {Function} res.json - Function to send JSON response.
 * 
 * @returns {Promise<void>} - A promise that resolves when the job is deleted.
 * @throws {Error} - Any errors during the deletion process are logged via errorLoggerUpdate.
 */
// @ts-ignore
// @ts-ignore
api.delete('/:UID', requestUpdateLogger, deleteJob)



/**
 * Endpoint returning information, if a user is an admin of the job specified by the UID.
 */

/**
 * @param {import('../types.js').ExpressRequestAuthorized} req
 * @param {import('../types.js').ExpressResponse} res
 */
const getJobAdmin = async (req, res) => {
    try {
        const admin = await isObjectAdmin(req, req.params.UID)
        res.json({success: true, result: admin})
    }
    catch(e) {
        errorLoggerRead(e)
    }
}

// @ts-ignore
// @ts-ignore
api.get('/admin/:UID', getJobAdmin)


/**
 * Endpoint to recreate all jobs for an organization.
 * 
 * This function queries the database for all job objects belonging to the organization,
 * optionally as of a specific timestamp, and then recreates them. It retrieves related 
 * data such as person, function, group, and member information needed for job recreation.
 * 
 * @param {Object} req - Express request object
 * @param {Object} req.query - Query parameters
 * @param {string} [req.query.timestamp] - Optional timestamp in milliseconds for point-in-time retrieval
 * @param {Object} req.session - Session data
 * @param {string} req.session.root - Root UID of the organization
 * @param {Object} res - Express response object
 * @returns {Promise<void>} - JSON response indicating success or failure
 * @throws {Error} - Logs errors to the error logger
 */
// @ts-ignore
// @ts-ignore
api.get('/recreate', requestUpdateLogger, checkAdmin, recreateJobsOrga)


/**
 * Endpoint to recreate jobs for a specific person.
 * 
 * @async
 * @function recreateJobsPerson
 * @param {Object} req - Express request object
 * @param {Object} req.params - Request parameters
 * @param {string} req.params.UIDperson - UID of the person
 * @param {Object} req.query - Request query parameters
 * @param {number} [req.query.timestamp] - Optional timestamp for point-in-time query
 * @param {Object} res - Express response object
 * @returns {Promise<void>} - Sends JSON response indicating success or handles error
 * @throws {Error} - Logs error to error logger if query fails
 * @description Retrieves job data for a person at a specific point in time (if timestamp provided),
 *              then recreates the jobs using the recreateJobs function.
 */

/**
 * @param {import('../types.js').ExpressRequestAuthorized} req
 * @param {import('../types.js').ExpressResponse} res
 */
const recreatePersonJobs = async (req, res) => {
    try {
        return await recreateJobsPerson(req, req.params.UIDperson, req.query.timestamp)
    }
    catch(e) {
        errorLoggerUpdate(e)
    }
}

// @ts-ignore
// @ts-ignore
api.get('/recreate/:UIDperson', checkObjectAdmin, recreatePersonJobs)



export default api