Skip to content

Commit f5e2a6d

Browse files
committed
Refactored update controller to handle multiple services
1 parent cd1342f commit f5e2a6d

3 files changed

Lines changed: 108 additions & 106 deletions

File tree

src/controllers/member.controller.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ export const updateAMember =
8989
}
9090
if (imageUrl) parsedBody.profilePhoto = imageUrl;
9191

92-
await memberService.updateMember(memberId, parsedBody);
92+
if(parsedBody.password) await memberService.updatePassword(memberId, parsedBody.password);
93+
else await memberService.updateMember(memberId, parsedBody);
9394

9495
const updatedData = await memberService.getDetails(memberId);
9596
res

src/routes/members.ts

Lines changed: 91 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,21 @@ export default function membersRouter(
2222
router.get("/unapproved", memberCtrl.getUnapprovedMembers);
2323

2424
/**
25-
* @api {get} /members/:memberId Get a member's details
26-
* @apiName GetUserDetails
27-
* @apiGroup Member
28-
*
29-
* @apiParam (URL Params) {String} memberId Member's unique ID.
30-
*
31-
* @apiSuccess {Object} user Member object.
32-
* @apiError (Error 400) BadRequest No memberId provided.
33-
*
34-
* @apiExample {curl} Example usage:
35-
* curl -X GET http://localhost:3000/members/123
36-
*/
25+
* @api {get} /members/:memberId Get a member's details
26+
* @apiName GetUserDetails
27+
* @apiGroup Member
28+
*
29+
* @apiParam (URL Params) {String} memberId Member's unique ID.
30+
*
31+
* @apiSuccess {Object} user Member object.
32+
* @apiError (Error 400) BadRequest No memberId provided.
33+
*
34+
* @apiExample {curl} Example usage:
35+
* curl -X GET http://localhost:3000/members/123
36+
*/
3737
router.get("/:memberId", memberCtrl.getUserDetails);
38-
39-
/**
38+
39+
/**
4040
* @api {get} /members List all approved members or get member by email
4141
* @apiName ListAllApprovedMembers
4242
* @apiGroup Member
@@ -62,85 +62,85 @@ export default function membersRouter(
6262
router.get("/", memberCtrl.listAllApprovedMembers);
6363

6464
/**
65-
* @api {post} /members Create a new member
66-
* @apiName CreateAMember
67-
* @apiGroup Member
68-
*
69-
* @apiBody {String} email Email of the member. (Required)
70-
* @apiBody {String} name Full name of the member. (Required)
71-
* @apiBody {String} password Member's password. (Required)
72-
* @apiBody {String} passoutYear Graduation year (Required, e.g., "2026").
73-
* @apiBody {String} provider Authentication provider (Required, e.g., "local", "google").
74-
* @apiBody {File} [file] Profile photo file (field name: "file").
75-
*
76-
* @apiSuccess {Boolean} success Request status.
77-
* @apiSuccess {Object} user Created member object.
78-
*
79-
* @apiError (Error 400) ApiError Required fields absent.
80-
* @apiError (Error 500) ServerError Error creating user.
81-
*
82-
* @apiExample {curl} Example usage:
83-
* curl -X POST -F "file=@profile.jpg" \
84-
* -F "email=john@example.com" \
85-
* -F "name=John Doe" \
86-
* -F "password=securePass123" \
87-
* -F "passoutYear=2026" \
88-
* -F "provider=local" \
89-
* http://localhost:3000/members
90-
*/
91-
65+
* @api {post} /members Create a new member
66+
* @apiName CreateAMember
67+
* @apiGroup Member
68+
*
69+
* @apiBody {String} email Email of the member. (Required)
70+
* @apiBody {String} name Full name of the member. (Required)
71+
* @apiBody {String} password Member's password. (Required)
72+
* @apiBody {String} passoutYear Graduation year (Required, e.g., "2026").
73+
* @apiBody {String} provider Authentication provider (Required, e.g., "local", "google").
74+
* @apiBody {File} [file] Profile photo file (field name: "file").
75+
*
76+
* @apiSuccess {Boolean} success Request status.
77+
* @apiSuccess {Object} user Created member object.
78+
*
79+
* @apiError (Error 400) ApiError Required fields absent.
80+
* @apiError (Error 500) ServerError Error creating user.
81+
*
82+
* @apiExample {curl} Example usage:
83+
* curl -X POST -F "file=@profile.jpg" \
84+
* -F "email=john@example.com" \
85+
* -F "name=John Doe" \
86+
* -F "password=securePass123" \
87+
* -F "passoutYear=2026" \
88+
* -F "provider=local" \
89+
* http://localhost:3000/members
90+
*/
9291
router.post("/", upload.single("file"), memberCtrl.createAMember(supabase));
9392

9493
/**
95-
* @api {patch} /members/:memberId Update a member
96-
* @apiName UpdateAMember
97-
* @apiGroup Member
98-
*
99-
* @apiParam {String} memberId Member's unique ID.
100-
*
101-
* @apiBody {String} memberData JSON string containing the member's updated details.
102-
* @apiBody {File} [file] Profile photo file (field name: "file").
103-
*
104-
* @apiBody (memberData fields) {String} [name] Full name of the member.
105-
* @apiBody (memberData fields) {String} [email] Email address.
106-
* @apiBody (memberData fields) {String} [phone] Phone number.
107-
* @apiBody (memberData fields) {String} [bio] Short bio.
108-
* @apiBody (memberData fields) {String} [github] GitHub handle.
109-
* @apiBody (memberData fields) {String} [linkedin] LinkedIn handle.
110-
* @apiBody (memberData fields) {String} [twitter] Twitter handle.
111-
* @apiBody (memberData fields) {String} [geeksforgeeks] GeeksforGeeks username.
112-
* @apiBody (memberData fields) {String} [leetcode] LeetCode username.
113-
* @apiBody (memberData fields) {String} [codechef] CodeChef username.
114-
* @apiBody (memberData fields) {String} [codeforces] Codeforces username.
115-
* @apiBody (memberData fields) {Date} [passoutYear] Graduation year (ISO string format).
116-
* @apiBody (memberData fields) {String} [profilePhoto] (Auto-assigned if a new file is uploaded).
117-
*
118-
* @apiSuccess {Boolean} success Request status.
119-
* @apiSuccess {Object} user Updated member object.
120-
*
121-
* @apiError (Error 400) ApiError No memberId provided or invalid request data.
122-
* @apiError (Error 404) NotFound Member not found.
123-
* @apiError (Error 500) ServerError Unexpected error occurred during update.
124-
*
125-
* @apiExample {curl} Example usage:
126-
* curl -X PATCH -F "file=@profile.jpg" \
127-
* -F 'memberData={"name":"John Doe","email":"john@example.com"}' \
128-
* http://localhost:3000/members/123
129-
*/
94+
* @api {patch} /members/:memberId Update a member
95+
* @apiName UpdateAMember
96+
* @apiGroup Member
97+
*
98+
* @apiParam {String} memberId Member's unique ID.
99+
*
100+
* @apiBody {String} memberData JSON string containing the member's updated details.
101+
* @apiBody {File} [file] Profile photo file (field name: "file").
102+
*
103+
* @apiBody (memberData fields) {String} [name] Full name of the member.
104+
* @apiBody (memberData fields) {String} [email] Email address.
105+
* @apiBody (memberData fields) {String} [phone] Phone number.
106+
* @apiBody (memberData fields) {String} [bio] Short bio.
107+
* @apiBody (memberData fields) {String} [github] GitHub handle.
108+
* @apiBody (memberData fields) {String} [linkedin] LinkedIn handle.
109+
* @apiBody (memberData fields) {String} [twitter] Twitter handle.
110+
* @apiBody (memberData fields) {String} [geeksforgeeks] GeeksforGeeks username.
111+
* @apiBody (memberData fields) {String} [leetcode] LeetCode username.
112+
* @apiBody (memberData fields) {String} [codechef] CodeChef username.
113+
* @apiBody (memberData fields) {String} [codeforces] Codeforces username.
114+
* @apiBody (memberData fields) {Date} [passoutYear] Graduation year (ISO string format).
115+
* @apiBody (memberData fields) {String} [profilePhoto] (Auto-assigned if a new file is uploaded).
116+
*
117+
* @apiSuccess {Boolean} success Request status.
118+
* @apiSuccess {Object} user Updated member object.
119+
*
120+
* @apiError (Error 400) ApiError No memberId provided or invalid request data.
121+
* @apiError (Error 404) NotFound Member not found.
122+
* @apiError (Error 500) ServerError Unexpected error occurred during update.
123+
*
124+
* @apiExample {curl} Example usage:
125+
* curl -X PATCH -F "file=@profile.jpg" \
126+
* -F 'memberData={"name":"John Doe","email":"john@example.com"}' \
127+
* http://localhost:3000/members/123
128+
*/
130129
router.patch(
131130
"/:memberId",
132131
upload.single("file"),
133132
memberCtrl.updateAMember(supabase),
134133
);
135134

136-
/**
135+
136+
/**
137137
* @api {patch} /members/approve/:memberId Approve a member
138138
* @apiName UpdateApprovalRequest
139139
* @apiGroup Member
140140
*
141141
* @apiParam (URL Params) {String} memberId Member ID.
142142
* @apiBody {Boolean} isApproved Approval status (true = approved, false = rejected).
143-
* @apiBody {String} adminId ID of the admin who approved.
143+
* @apiBody {String} adminId ID of the admin who approved/rejected.
144144
*
145145
* @apiSuccess {Object} update Approval status update result.
146146
* @apiError (Error 400) BadRequest Missing required fields.
@@ -152,18 +152,19 @@ export default function membersRouter(
152152
*/
153153
router.patch("/approve/:memberId", memberCtrl.updateRequest);
154154

155-
/**
156-
* @api {get} /members/:memberId/achievements Get member's achievements
157-
* @apiName GetUserAchievements
158-
* @apiGroup Member
159-
*
160-
* @apiParam (URL Params) {String} memberId Member ID.
161-
*
162-
* @apiSuccess {Object[]} achievements List of achievements.
163-
*
164-
* @apiExample {curl} Example usage:
165-
* curl -X GET http://localhost:3000/members/123/achievements
166-
*/
155+
156+
/**
157+
* @api {get} /members/:memberId/achievements Get member's achievements
158+
* @apiName GetUserAchievements
159+
* @apiGroup Member
160+
*
161+
* @apiParam (URL Params) {String} memberId Member ID.
162+
*
163+
* @apiSuccess {Object[]} achievements List of achievements.
164+
*
165+
* @apiExample {curl} Example usage:
166+
* curl -X GET http://localhost:3000/members/123/achievements
167+
*/
167168
router.get("/:memberId/achievements", memberCtrl.getUserAchievements);
168169

169170
/**

src/services/member.service.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -68,33 +68,33 @@ export const updateMember = async (
6868
id: string,
6969
payload: UpdateMemberPayload
7070
) => {
71-
const { name, password, ...rest } = payload;
72-
73-
if (password) {
74-
const account = await prisma.account.findFirst({
75-
where: { memberId: id },
76-
});
77-
78-
if (!account) throw new ApiError("Associated account not found", 404);
79-
80-
return await prisma.account.update({
81-
where: { id: account.id },
82-
data: { password },
83-
});
84-
}
71+
const { name, ...rest } = payload;
8572

8673
const dataToUpdate = Object.fromEntries(
8774
Object.entries({ name, ...rest }).filter(([_, v]) => v !== undefined)
8875
);
8976

90-
if (JSON.stringify(dataToUpdate) === "{}" && !password) throw new ApiError("No fields passed", 400);
77+
if (JSON.stringify(dataToUpdate) === "{}") throw new ApiError("No fields passed", 400);
9178

9279
return await prisma.member.update({
9380
where: { id },
9481
data: dataToUpdate,
9582
});
9683
};
9784

85+
export const updatePassword = async(id: string, password: string) => {
86+
const account = await prisma.account.findFirst({
87+
where: { memberId: id },
88+
});
89+
90+
if (!account) throw new ApiError("Associated account not found", 404);
91+
92+
return await prisma.account.update({
93+
where: { id: account.id },
94+
data: { password },
95+
});
96+
}
97+
9898
export const unapprovedMembers = async () => {
9999
return await prisma.member.findMany({
100100
where: { isApproved: false },

0 commit comments

Comments
 (0)