Skip to content

Commit cf88503

Browse files
Merge pull request #2152 from OneCommunityGlobal/chirag-register-users-for-events
Chirag - Fix: Add API to register for events
2 parents a54e712 + 419f0e3 commit cf88503

3 files changed

Lines changed: 74 additions & 2 deletions

File tree

src/controllers/eventController.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,74 @@ const createEvent = async (req, res) => {
132132
}
133133
};
134134

135+
const registerForEvent = async (req, res) => {
136+
const { id } = req.params;
137+
const { name, userId, profilePic, location } = req.body;
138+
139+
if (!name || !userId) {
140+
return res.status(400).json({ error: 'name and userID are required' });
141+
}
142+
143+
try {
144+
const event = await Event.findById(id);
145+
if (!event) {
146+
return res.status(404).json({ error: 'Event not found' });
147+
}
148+
if (!event.isActive) {
149+
return res.status(400).json({ error: 'Event is no longer active' });
150+
}
151+
if (event.currentAttendees >= event.maxAttendees) {
152+
return res.status(400).json({ error: 'Event is full' });
153+
}
154+
155+
const alreadyRegistered = event.resources.some((r) => r.userID?.toString() === userId);
156+
if (alreadyRegistered) {
157+
return res.status(409).json({ error: 'User is already registered for this event' });
158+
}
159+
160+
const newAttendees = event.currentAttendees + 1;
161+
const newStatus = updateEventStatus({ ...event.toObject(), currentAttendees: newAttendees });
162+
163+
const updatedEvent = await Event.findByIdAndUpdate(
164+
id,
165+
{
166+
$push: { resources: { name, userID: userId, profilePic, location } },
167+
$inc: { currentAttendees: 1 },
168+
$set: { status: newStatus },
169+
},
170+
{ new: true },
171+
);
172+
res.status(200).json(updatedEvent);
173+
} catch (error) {
174+
res.status(500).json({ error: 'Failed to register for event', details: error.message });
175+
}
176+
};
177+
178+
const unregisterFromEvent = async (req, res) => {
179+
const { id, userId } = req.params;
180+
181+
try {
182+
const event = await Event.findById(id);
183+
if (!event) {
184+
return res.status(404).json({ error: 'Event not found' });
185+
}
186+
187+
const registrantIndex = event.resources.findIndex((r) => r.userID?.toString() === userId);
188+
if (registrantIndex === -1) {
189+
return res.status(404).json({ error: 'User is not registered for this event' });
190+
}
191+
192+
event.resources.splice(registrantIndex, 1);
193+
event.currentAttendees -= 1;
194+
event.status = updateEventStatus(event);
195+
196+
const updatedEvent = await event.save();
197+
res.status(200).json(updatedEvent);
198+
} catch (error) {
199+
res.status(500).json({ error: 'Failed to unregister from event', details: error.message });
200+
}
201+
};
202+
135203
const joinWaitlist = async (req, res) => {
136204
try {
137205
const { eventId } = req.params;
@@ -250,6 +318,8 @@ module.exports = {
250318
getEventLocations,
251319
getEventTypes,
252320
createEvent,
321+
registerForEvent,
322+
unregisterFromEvent,
253323
joinWaitlist,
254324
leaveEvent,
255325
leaveWaitlist,

src/models/event.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const EventSchema = new Schema(
1414
},
1515
location: {
1616
type: String,
17-
enum: ['Virtual', 'In person'],
17+
enum: ['Virtual', 'In person', 'TBD'],
1818
required: true,
1919
},
2020
startTime: {
@@ -45,7 +45,7 @@ const EventSchema = new Schema(
4545
name: { type: String, required: true },
4646
userID: { type: mongoose.SchemaTypes.ObjectId, ref: User },
4747
profilePic: { type: String },
48-
location: { type: String, enum: ['Virtual', 'In person'] },
48+
location: { type: String, enum: ['Virtual', 'In person', 'TBD'], default: 'TBD' },
4949
},
5050
],
5151
coverImage: { type: String },

src/routes/eventRouter.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ eventRouter.get('/events/:id', eventsController.getEventById);
88
eventRouter.get('/events/types', eventsController.getEventTypes);
99
eventRouter.get('/events/locations', eventsController.getEventLocations);
1010
eventRouter.post('/events', eventsController.createEvent);
11+
eventRouter.post('/events/:id/register', eventsController.registerForEvent);
12+
eventRouter.delete('/events/:id/register/:userId', eventsController.unregisterFromEvent);
1113

1214
eventRouter.post('/events/:eventId/waitlist', eventsController.joinWaitlist);
1315
eventRouter.delete('/events/:eventId/waitlist', eventsController.leaveWaitlist);

0 commit comments

Comments
 (0)