// @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