routes/category.router.js

const multer = require("multer");
const categoryController = require("../controllers/training-category.controller");
const authJwt = require("../middlewares/auth.jwt.middleware");
const bodyValidation = require("../middlewares/body.validator");
const pagination = require("../middlewares/pagination.middleware");
const {
  createCategoryValidator,
  updateCategoryValidator,
} = require("../validators/category.validators");

const categoryRouter = require("express").Router();

/**
 * Multer configuration for the trainings covers
 */
const storage = require("../config/config.multer")("covers");
const upload = multer({ storage });

/**
 * Route for searching categories by terms.
 * @name /search/:terms
 * @function
 * @memberof module:routers/categoryRouter
 * @param {function} controller - Controller function for searching categories.
 */
categoryRouter.route("/search/:terms").get(categoryController.search);

/**
 * Route for getting all categories with pagination.
 * @name /
 * @function
 * @memberof module:routers/categoryRouter
 * @param {function} middleware - Middleware function for pagination.
 * @param {function} controller - Controller function for getting all categories.
 */
categoryRouter
  .route("/")
  .get(
    pagination({ defaultLimit: 30, maxLimit: 200 }),
    categoryController.getAll
  );

/**
 * Route for creating a new category.
 * @name /
 * @function
 * @memberof module:routers/categoryRouter
 * @param {function} middleware - Middleware function for JWT authentication and authorization.
 * @param {function} middleware - Middleware function for request body validation using the trainingValidator.
 * @param {function} controller - Controller function for creating a new category.
 */
categoryRouter.route("/").post(
  // authJwt(["Admin"]),
  bodyValidation(createCategoryValidator),
  categoryController.create
);

/**
 * Route for getting a category by its ID.
 * @name /:id
 * @function
 * @memberof module:routers/categoryRouter
 * @param {function} controller - Controller function for getting a category by its ID.
 */
categoryRouter.route("/:id").get(categoryController.getById);

/**
 * Route for updating a category by its ID.
 * @name /:id
 * @function
 * @memberof module:routers/categoryRouter
 * @param {function} middleware - Middleware function for JWT authentication and authorization.
 * @param {function} middleware - Middleware function for request body validation using the trainingValidator.
 * @param {function} controller - Controller function for updating a category by its ID.
 */
categoryRouter
  .route("/:id")
  .patch(
    authJwt(["Admin"]),
    bodyValidation(updateCategoryValidator),
    categoryController.update
  );

/**
 * Route for deleting a category by its ID.
 * @name /:id
 * @function
 * @memberof module:routers/categoryRouter
 * @param {function} middleware - Middleware function for JWT authentication and authorization.
 * @param {function} controller - Controller function for deleting a category by its ID.
 */
categoryRouter
  .route("/:id")
  .delete(/*authJwt(["Admin"]),*/ categoryController.delete);

/**
 * Route for posting a category cover.
 * @name /:id/cover
 * @function
 * @memberof module:routers/categoryRouter
 * @param {function} middleware - Middleware function for JWT authentication and authorization.
 * @param {function} middleware - Middleware function for uploading a cover file.
 * @param {function} controller - Controller function for posting or updating a category cover.
 */
categoryRouter.route("/:id/cover").post(
  // authJwt(["Admin"]),
  upload.single("cover"),
  // bodyValidation(updateCategoryValidator),
  categoryController.postCover
);

/**
 * Route for updating a category cover.
 * @name /:id/cover
 * @function
 * @memberof module:routers/categoryRouter
 * @param {function} middleware - Middleware function for JWT authentication and authorization.
 * @param {function} middleware - Middleware function for uploading a cover file.
 * @param {function} controller - Controller function for posting or updating a category cover.
 */
categoryRouter.route("/:id/cover").put(
  // authJwt(["Admin"]),
  upload.single("cover"),
  // bodyValidation(updateCategoryValidator),
  categoryController.updateCover
);

/**
 * Route for deleting a category by its ID.
 * @name /:id/cover
 * @function
 * @memberof module:routers/categoryRouter
 * @param {function} middleware - Middleware function for JWT authentication and authorization.
 * @param {function} controller - Controller function for deleting a category by its ID.
 */
categoryRouter
  .route("/:id/cover")
  .delete(/*authJwt(["Admin"]), */ categoryController.delete);

module.exports = categoryRouter;