controllers/teacher.controller.js

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

/**
 * Controller for teacher-related operations.
 * @module controllers/teacherController
 * @see {@link module:services/teacher}
 */
module.exports = {
  /**
   * Search for teachers based on the provided search terms.
   * @memberof module:controllers/teacherController
   * @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 { teachers: teachers, count } = await teacherService.search(terms);
    res.status(200).json(new SuccessArrayResponse(teachers, count));
  },

  /**
   * Get all teachers with pagination.
   * @memberof module:controllers/teacherController
   * @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 { teachers, count } = await teacherService.getAll(offset, limit);
    res.status(200).json(new SuccessArrayResponse(teachers, count));
  },

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

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

  /**
   * Update a teacher.
   * @memberof module:controllers/teacherController
   * @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 teacherService.update(data, id);
    if (!updated) {
      res.sendStatus(404);
      return;
    }
    res.sendStatus(204);
  },

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