Source: controllers/eventController.js

/**
 * @file Controller for event-related operations.
 * @module controllers/eventController
 * @requires ../models/eventModel
 */

const Event = require("../models/eventModel");

/**
 * Fetches all events, populating the organizer's name and email.
 * @route GET /api/events
 * @access Public
 * @param {Object} req - Express request object.
 * @param {Object} res - Express response object.
 * @returns {Promise<void>}
 */
exports.getEvents = async (req, res) => {
  try {
    const events = await Event.find({}).populate("organizer", "name email");
    res.json(events);
  } catch (error) {
    res.status(500).json({ message: "Server Error" });
  }
};

/**
 * Fetches a single event by its ID, populating the organizer's name and email.
 * @route GET /api/events/:id
 * @access Public
 * @param {Object} req - Express request object (contains `params.id`).
 * @param {Object} res - Express response object.
 * @returns {Promise<void>}
 */
exports.getEventById = async (req, res) => {
  try {
    const event = await Event.findById(req.params.id).populate(
      "organizer",
      "name email"
    );
    if (event) {
      res.json(event);
    } else {
      res.status(404).json({ message: "Event not found" });
    }
  } catch (error) {
    res.status(500).json({ message: "Server Error" });
  }
};

/**
 * Creates a new event. The organizer is automatically set to the logged-in user.
 * @route POST /api/events
 * @access Private/Admin
 * @param {Object} req - Express request object (body should contain `title`, `description`, `date`, `location`; user ID available in `req.user._id`).
 * @param {Object} res - Express response object.
 * @returns {Promise<void>}
 */
exports.createEvent = async (req, res) => {
  const { title, description, date, location } = req.body;

  const event = new Event({
    title,
    description,
    date,
    location,
    organizer: req.user._id,
  });

  try {
    const createdEvent = await event.save();
    res.status(201).json(createdEvent);
  } catch (error) {
    res
      .status(400)
      .json({ message: "Invalid event data", error: error.message });
  }
};

/**
 * Updates an existing event by its ID.
 * @route PUT /api/events/:id
 * @access Private/Admin
 * @param {Object} req - Express request object (contains `params.id` and updated event data in body).
 * @param {Object} res - Express response object.
 * @returns {Promise<void>}
 */
exports.updateEvent = async (req, res) => {
  const { title, description, date, location } = req.body;

  try {
    const event = await Event.findById(req.params.id);

    if (event) {
      event.title = title || event.title;
      event.description = description || event.description;
      event.date = date || event.date;
      event.location = location || event.location;

      const updatedEvent = await event.save();
      res.json(updatedEvent);
    } else {
      res.status(404).json({ message: "Event not found" });
    }
  } catch (error) {
    res.status(400).json({ message: "Update failed", error: error.message });
  }
};

/**
 * Deletes an event by its ID.
 * @route DELETE /api/events/:id
 * @access Private/Admin
 * @param {Object} req - Express request object (contains `params.id`).
 * @param {Object} res - Express response object.
 * @returns {Promise<void>}
 */
exports.deleteEvent = async (req, res) => {
  try {
    const event = await Event.findById(req.params.id);

    if (event) {
      await event.deleteOne();
      res.json({ message: "Event removed" });
    } else {
      res.status(404).json({ message: "Event not found" });
    }
  } catch (error) {
    res.status(500).json({ message: "Server Error" });
  }
};