controllers/course.controller.js

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

/**
 * Controller for course-related operations.
 * @module controllers/courseController
 */
module.exports = {
  /**
   * Search for courses based on the provided search terms.
   * @memberof module:controllers/courseController
   * @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 { courses, count } = await courseService.search(terms);
    res.status(200).json(new SuccessArrayResponse(courses, count));
  },

  /**
   * Get all courses with pagination.
   * @memberof module:controllers/courseController
   * @param {Request} req - The request object.
   * @param {Response} res - The response object.
   * @returns {Promise<void>}
   */
  getAll: async (req, res) => {
    console.log("GET ALL", req.query);
    // ?studentId=1&details=true
    const studentId = req.query.studentId;
    const teacherId = req.query.teacherId;
    const details = req.query.details;
    console.log(studentId, teacherId, details);
    const { offset, limit } = req.pagination;
    // Switch between request params
    console.log("Controller query: ", req.query);
    const { courses, count } = await courseService.getAll(offset, limit);
    res.status(200).json(new SuccessArrayResponse(courses, count));
  },

  /**
   * Get a course by its ID.
   * @memberof module:controllers/courseController
   * @param {Request} req - The request object.
   * @param {Response} res - The response object.
   * @returns {Promise<void>}
   */
  getById: async (req, res) => {
    const { id } = req.params;
    const course = await courseService.getById(id);
    if (!course) {
      res.sendStatus(404);
      return;
    }
    res.status(200).json(new SuccessResponse(course));
  },

  /**
   * Create a new course.
   * @memberof module:controllers/courseController
   * @param {Request} req - The request object.
   * @param {Response} res - The response object.
   * @returns {Promise<void>}
   */
  create: async (req, res) => {
    console.log("Controller Create Course: ", req.body);
    const data = req.body;
    const course = await courseService.create(data);
    res.location("/courses/" + course.id);
    res.status(201).json(new SuccessResponse(course, 201));
  },

  /**
   * Update a course.
   * @memberof module:controllers/courseController
   * @param {Request} req - The request object.
   * @param {Response} res - The response object.
   * @returns {Promise<void>}
   */
  update: async (req, res) => {
    const { id } = req.params;
    const data = req.body;
    const updated = await courseService.update(id, data);
    console.log("Controller updated: ", updated);
    if (!updated) {
      res.sendStatus(404);
      return;
    }
    res.sendStatus(204);
  },

  /**
   * Delete a course
   * @memberof module:controllers/courseController
   * @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 courseService.delete(id);
    if (!deleted) {
      res.sendStatus(404);
      return;
    }
    res.sendStatus(204);
  },

  /**
   * Delete a Course
   * @param {Request} req
   * @param {Response} res
   */
  getDates: async (req, res) => {
    const { id } = req.params;
    const dates = await courseService.getDates(id);
    res.status(201).json(new SuccessResponse(dates, 201));
  },

  getMaterials: async (req, res) => {
    const { id } = req.params;
    const dates = await courseService.getDates(id);
    res.status(201).json(new SuccessResponse(dates, 201));
  },
};