controllers/enrollment.controller.js

const { Request, Response } = require("express");
const enrollmentService = require("../services/enrollment.service");
const trainingService = require("../services/training.service");
const { ErrorResponse } = require("../responses/error.response");
const {
  SuccessArrayResponse,
  SuccessResponse,
} = require("../responses/success.response");

/**
 * Controller for enrollment-related operations.
 * @module controllers/enrollmentController
 */
const enrollmentController = {
  /**
   * Search for enrollments based on the provided search terms.
   * @memberof module:controllers/enrollmentController
   * @param {Request} req - The request object.
   * @param {Response} res - The response object.
   * @returns {Promise<void>}
   */
  search: async (req, res) => {
    const terms = req.params.terms;
    const { enrollments: enrollments, count } = await enrollmentService.search(
      terms
    );
    res.status(200).json(new SuccessArrayResponse(enrollments, count));
  },

  /**
   * Get all enrollments with pagination.
   * @memberof module:controllers/enrollmentController
   * @param {Request} req - The request object.
   * @param {Response} res - The response object.
   * @returns {Promise<void>}
   */
  getAll: async (req, res) => {
    const { offset, limit } = req.pagination;
    const { enrollments, count } = await enrollmentService.getAll(
      offset,
      limit
    );
    res.status(200).json(new SuccessArrayResponse(enrollments, count));
  },

  /**
   * Get an enrollment by its ID.
   * @memberof module:controllers/enrollmentController
   * @param {Request} req - The request object.
   * @param {Response} res - The response object.
   * @returns {Promise<void>}
   */
  getById: async (req, res) => {
    const { id } = req.params;
    // FIXME:
    // const connectedUserRole = req.enrollment.role;
    // const connectedUserId = req.enrollment.id;
    // if (connectedUserRole !== "Admin" && connectedUserId !== parseInt(id)) {
    //   res.status(403).json(new ErrorResponse("Forbidden Access", 403));
    //   return;
    // }
    const enrollment = await enrollmentService.getById(id);
    if (!enrollment) {
      res.sendStatus(404);
      return;
    }
    res.status(200).json(new SuccessResponse(enrollment));
  },

  /**
   * Create a new enrollment.
   * @memberof module:controllers/enrollmentController
   * @param {Request} req - The request object.
   * @param {Response} res - The response object.
   * @returns {Promise<void>}
   */
  create: async (req, res) => {
    const data = req.body;
    const enrollment = await enrollmentService.create(data);
    if (!enrollment) {
      res.status(404).json("Already enrolled for this training");
      return;
    }
    res.status(200).json(new SuccessResponse(enrollment));
  },

  /**
   * Update an enrollment.
   * @memberof module:controllers/enrollmentController
   * @param {Request} req - The request object.
   * @param {Response} res - The response object.
   * @returns {Promise<void>}
   */
  update: async (req, res) => {
    const { enrollmentId } = req.params; // Enrollment id
    const { status } = req.body;
    console.log("> Enrollment update: ", enrollmentId, status);

    // Retrieves enrollment
    const enrollment = await enrollmentService.getById(enrollmentId);
    if (!enrollment) {
      res.sendStatus(404).json("Enrollment not found");
      return;
    }

    // Updates enrollment
    const updated = await enrollmentService.update(
      {
        status: status,
      },
      enrollmentId
    );
    if (!updated) {
      res.sendStatus(404).json("Update failed");
      return;
    }

    // If the enrollment is validated we add the student to the training
    if (status === "approved") {
      const added = await trainingService.addStudent(
        enrollment.student.id,
        enrollment.training.id
      );
      if (!added) {
        res.sendStatus(404).json("Add Student failed");
        return;
      }
    }

    res.sendStatus(204);
  },

  /**
   * Delete an enrollment.
   * @memberof module:controllers/enrollmentController
   * @param {Request} req - The request object.
   * @param {Response} res - The response object.
   * @returns {Promise<void>}
   */
  delete: async (req, res) => {
    const { id } = req.params;
    const deleted = await enrollmentService.delete(id);
    if (!deleted) {
      res.sendStatus(404);
      return;
    }
    res.sendStatus(204);
  },
};

module.exports = enrollmentController;