Skip to content

Commit 36a317a

Browse files
committed
feat: implement editing membership details
1 parent 41b02c6 commit 36a317a

2 files changed

Lines changed: 52 additions & 0 deletions

File tree

src/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ app.use((_, res, next) => {
3939
res.setHeader("Access-Control-Allow-Origin", process.env.CORS_DOMAIN)
4040
res.setHeader("Access-Control-Allow-Credentials", "true")
4141
res.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept")
42+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, PATCH, OPTIONS")
4243
next()
4344
})
4445

src/routes/membersArea.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
212263
router.get("/logout", async (req, res, next) => {
213264
try {
214265
req.session.destroy()

0 commit comments

Comments
 (0)