Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 90 additions & 0 deletions src/controllers/eventController.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,25 @@ const getEvents = async (req, res) => {
}
};

const getEventById = async (req, res) => {
const { id } = req.params;

try {
const event = await Event.findById(id).populate('resources.userID');
if (!event) {
return res.status(404).json({ error: 'Event not found' });
}
event.status = updateEventStatus(event);

res.json(event);
} catch (error) {
res.status(500).json({
error: 'Failed to fetch event',
details: error.message,
});
}
};

const getEventLocations = async (req, res) => {
try {
const locations = await Event.distinct('location', { isActive: true });
Expand Down Expand Up @@ -79,9 +98,80 @@ const createEvent = async (req, res) => {
}
};

const registerForEvent = async (req, res) => {
const { id } = req.params;
const { name, userId, profilePic, location } = req.body;

if (!name || !userId) {
return res.status(400).json({ error: 'name and userID are required' });
}

try {
const event = await Event.findById(id);
if (!event) {
return res.status(404).json({ error: 'Event not found' });
}
if (!event.isActive) {
return res.status(400).json({ error: 'Event is no longer active' });
}
if (event.currentAttendees >= event.maxAttendees) {
return res.status(400).json({ error: 'Event is full' });
}

const alreadyRegistered = event.resources.some((r) => r.userID?.toString() === userId);
if (alreadyRegistered) {
return res.status(409).json({ error: 'User is already registered for this event' });
}

const newAttendees = event.currentAttendees + 1;
const newStatus = updateEventStatus({ ...event.toObject(), currentAttendees: newAttendees });

const updatedEvent = await Event.findByIdAndUpdate(
id,
{
$push: { resources: { name, userID: userId, profilePic, location } },
$inc: { currentAttendees: 1 },
$set: { status: newStatus },
},
{ new: true },
);
res.status(200).json(updatedEvent);
} catch (error) {
res.status(500).json({ error: 'Failed to register for event', details: error.message });
}
};

const unregisterFromEvent = async (req, res) => {
const { id, userId } = req.params;

try {
const event = await Event.findById(id);
if (!event) {
return res.status(404).json({ error: 'Event not found' });
}

const registrantIndex = event.resources.findIndex((r) => r.userID?.toString() === userId);
if (registrantIndex === -1) {
return res.status(404).json({ error: 'User is not registered for this event' });
}

event.resources.splice(registrantIndex, 1);
event.currentAttendees -= 1;
event.status = updateEventStatus(event);

const updatedEvent = await event.save();
res.status(200).json(updatedEvent);
} catch (error) {
res.status(500).json({ error: 'Failed to unregister from event', details: error.message });
}
};

module.exports = {
getEvents,
getEventById,
getEventLocations,
getEventTypes,
createEvent,
registerForEvent,
unregisterFromEvent,
};
4 changes: 2 additions & 2 deletions src/models/event.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const EventSchema = new Schema(
},
location: {
type: String,
enum: ['Virtual', 'In person'],
enum: ['Virtual', 'In person', 'TBD'],
required: true,
},
startTime: {
Expand Down Expand Up @@ -45,7 +45,7 @@ const EventSchema = new Schema(
name: { type: String, required: true },
userID: { type: mongoose.SchemaTypes.ObjectId, ref: User },
profilePic: { type: String },
location: { type: String, enum: ['Virtual', 'In person'] },
location: { type: String, enum: ['Virtual', 'In person', 'TBD'], default: 'TBD' },
},
],
coverImage: { type: String },
Expand Down
3 changes: 3 additions & 0 deletions src/routes/eventRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@ const eventsController = require('../controllers/eventController');
const eventRouter = express.Router();

eventRouter.get('/events', eventsController.getEvents);
eventRouter.get('/events/:id', eventsController.getEventById);
eventRouter.get('/events/types', eventsController.getEventTypes);
eventRouter.get('/events/locations', eventsController.getEventLocations);
eventRouter.post('/events', eventsController.createEvent);
eventRouter.post('/events/:id/register', eventsController.registerForEvent);
eventRouter.delete('/events/:id/register/:userId', eventsController.unregisterFromEvent);

module.exports = eventRouter;
Loading