@@ -209,6 +209,57 @@ router.post("/apply", requireAuth, async (req, res) => {
209209 }
210210} )
211211
212+ router . patch ( "/me" , requireAuth , async ( req , res , next ) => {
213+ try {
214+ const { city, email } = req . body ;
215+
216+ console . log ( "Updating member" , req . session . memberId , req . body )
217+
218+ // Validate lengths
219+ if ( city && city . length > 50 ) {
220+ return res . status ( 400 ) . json ( { status : "error" , message : "city too long" } ) ;
221+ }
222+ if ( email && email . length > 50 ) {
223+ return res . status ( 400 ) . json ( { status : "error" , message : "email too long" } ) ;
224+ }
225+
226+ // Validate email format if provided
227+ if ( email && ! / ^ \S + @ \S + $ / . test ( email ) ) {
228+ return res . status ( 400 ) . json ( { status : "error" , message : "invalid email format" } ) ;
229+ }
230+
231+ // Check if email is already taken by another member
232+ if ( email ) {
233+ const existingMember = await database . UserInfo . findOne ( {
234+ "associationMembership.email" : email ,
235+ _id : { $ne : req . session . memberId }
236+ } ) ;
237+ if ( existingMember ) {
238+ return res . status ( 400 ) . json ( { status : "error" , message : "email already in use" } ) ;
239+ }
240+ }
241+
242+ // Update the member's information
243+ const updateData = { } ;
244+ if ( city ) updateData [ "associationMembership.city" ] = city ;
245+ if ( email ) updateData [ "associationMembership.email" ] = email ;
246+
247+ const member = await database . UserInfo . findOneAndUpdate (
248+ { _id : req . session . memberId } ,
249+ { $set : updateData } ,
250+ { new : true }
251+ ) ;
252+
253+ if ( ! member ) {
254+ return res . status ( 404 ) . json ( { status : "error" , message : "member not found" } ) ;
255+ }
256+
257+ res . json ( { status : "ok" } ) ;
258+ } catch ( e ) {
259+ next ( e ) ;
260+ }
261+ } ) ;
262+
212263router . get ( "/logout" , async ( req , res , next ) => {
213264 try {
214265 req . session . destroy ( )
0 commit comments