server/controllers/ticket.controller.js

const Ticket = require('../models/ticket.model');
const escape = require('escape-html');
const {
    createNotification,
} = require('../controllers/notification.controller');

/** @module ticket_controller */

/**
 * This function creates a ticket.
 *
 *
 * @function
 * @async
 * @param {Object} req - Express request object
 * @param {Object} res - Express response object
 * @returns {Object} - Created ticket
 */
exports.createTicket = async (req, res) => {
    const newTicket = {
        type: escape(req.body.type),
        message: escape(req.body.message),
        resolved: false,
        user: req.user,
        site: req.user.site,
    };

    try {
        const ticket = await Ticket.create(newTicket);
        return res.status(200).json(ticket);
    } catch (err) {
        return res.status(400).json(err.message);
    }
};

/**
 * This function gets unresolved tickets.
 *
 *
 * @function
 * @async
 * @param {Object} req - Express request object
 * @param {Object} res - Express response object
 * @returns {Object[]} - Unresolved tickets
 */
exports.getUnresolvedTickets = async (req, res) => {
    const site = req.user.site;

    try {
        const tickets = await Ticket.find({ site, resolved: false })
            .lean()
            .populate('user', 'firstName lastName email phone');
        return res.status(200).json(tickets);
    } catch (err) {
        return res.status(400).json(err.message);
    }
};

/**
 * This function gets resolved tickets.
 *
 *
 * @function
 * @async
 * @param {Object} req - Express request object
 * @param {Object} res - Express response object
 * @returns {Object[]} - Resolved tickets
 */
exports.getResolvedTickets = async (req, res) => {
    const site = req.user.site;

    try {
        const tickets = await Ticket.find({ site, resolved: true })
            .lean()
            .populate('user', 'firstName lastName email phone');
        return res.status(200).json(tickets);
    } catch (err) {
        return res.status(400).json(err.message);
    }
};

/**
 * This function resolves a ticket.
 *
 *
 * @function
 * @async
 * @param {Object} req - Express request object
 * @param {Object} res - Express response object
 * @returns {Object} - Ticket resolved
 */
exports.resolveTicket = async (req, res) => {
    const ticketId = escape(req.params.ticketId);

    try {
        const ticket = await Ticket.findByIdAndUpdate(
            ticketId,
            { resolved: true },
            { new: true }
        ).populate('user', 'firstName lastName email phone');

        if (ticket.type == 1) {
            createNotification(ticket.user, null, `Payroll`, ticket);
        } else {
            createNotification(ticket.user, null, `TimeOff`, ticket);
        }

        return res.status(200).json(ticket);
    } catch (err) {
        return res.status(400).json(err.message);
    }
};

/**
 * This function unresolves a ticket.
 *
 *
 * @function
 * @async
 * @param {Object} req - Express request object
 * @param {Object} res - Express response object
 * @returns {Object} - Ticket unresolved
 */
exports.unresolveTicket = async (req, res) => {
    const ticketId = escape(req.params.ticketId);

    try {
        const ticket = await Ticket.findByIdAndUpdate(
            ticketId,
            { resolved: false },
            { new: true }
        ).populate('user', 'firstName lastName email phone');
        return res.status(200).json(ticket);
    } catch (err) {
        return res.status(400).json(err.message);
    }
};