@@ -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+
135203const 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,
0 commit comments