/**
* @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" });
}
};