Skip to content

Commit 6cdec37

Browse files
Merge pull request #27 from call-0f-code/minor-fixes
Minor fixes
2 parents 4bd12e7 + 4a54c93 commit 6cdec37

3 files changed

Lines changed: 71 additions & 38 deletions

File tree

src/controllers/member.controller.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,17 +82,18 @@ export const updateAMember =
8282
const oldData = await memberService.getDetails(memberId);
8383
const oldImage = oldData?.profilePhoto;
8484

85-
if(oldImage) await deleteImage(supabase, oldImage);
85+
if(oldImage) await uploadImage(supabase, req.file, "members", oldImage);
8686

8787
const imageUrl = await uploadImage(supabase, req.file, "members");
8888
body.profilePhoto = imageUrl;
8989
}
9090

9191
await memberService.updateMember(memberId, body);
9292

93+
const updatedData = await memberService.getDetails(memberId);
9394
res
9495
.status(200)
95-
.json({ success: true, message: "Updated member details successfully" });
96+
.json({ success: true, user: updatedData });
9697
};
9798

9899
// Get all unapproved members

src/routes/members.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@ export default function membersRouter(
1010
) {
1111
const router = express.Router();
1212

13+
/**
14+
* @api {get} /members/unapproved Get unapproved members
15+
* @apiName GetUnapprovedMembers
16+
* @apiGroup Member
17+
*
18+
* @apiSuccess {Object[]} unapprovedMembers List of unapproved members.
19+
*/
20+
router.get("/unapproved", memberCtrl.getUnapprovedMembers);
21+
1322
/**
1423
* @api {get} /members/:memberId Get a member's details
1524
* @apiName GetUserDetails
@@ -89,15 +98,6 @@ export default function membersRouter(
8998
memberCtrl.updateAMember(supabase),
9099
);
91100

92-
/**
93-
* @api {get} /members/unapproved Get unapproved members
94-
* @apiName GetUnapprovedMembers
95-
* @apiGroup Member
96-
*
97-
* @apiSuccess {Object[]} unapprovedMembers List of unapproved members.
98-
*/
99-
router.get("/unapproved", memberCtrl.getUnapprovedMembers);
100-
101101
/**
102102
* @api {patch} /members/approve/:memberId Approve/reject a member
103103
* @apiName UpdateApprovalRequest
@@ -113,37 +113,37 @@ export default function membersRouter(
113113
router.patch("/approve/:memberId", memberCtrl.updateRequest);
114114

115115
/**
116-
* @api {get} /members/achievements/:memberId Get member's achievements
116+
* @api {get} /members/:memberId/achievements Get member's achievements
117117
* @apiName GetUserAchievements
118118
* @apiGroup Member
119119
*
120120
* @apiParam (URL Params) {String} memberId Member ID.
121121
*
122122
* @apiSuccess {Object[]} achievements List of achievements.
123123
*/
124-
router.get("/achievements/:memberId", memberCtrl.getUserAchievements);
124+
router.get("/:memberId/achievements", memberCtrl.getUserAchievements);
125125

126126
/**
127-
* @api {get} /api/members/projects/:memberId Get member's projects
127+
* @api {get} /api/members/:memberId/projects Get member's projects
128128
* @apiName GetUserProjects
129129
* @apiGroup Member
130130
*
131131
* @apiParam (URL Params) {String} memberId Member ID.
132132
*
133133
* @apiSuccess {Object[]} projects List of projects.
134134
*/
135-
router.get("/projects/:memberId", memberCtrl.getUserProjects);
135+
router.get("/:memberId/projects", memberCtrl.getUserProjects);
136136

137137
/**
138-
* @api {get} /members/interviews/:memberId Get member's interviews
138+
* @api {get} /members/:memberId/interviews Get member's interviews
139139
* @apiName GetUserInterviews
140140
* @apiGroup Member
141141
*
142142
* @apiParam (URL Params) {String} memberId Member ID.
143143
*
144144
* @apiSuccess {Object[]} interviews List of interviews.
145145
*/
146-
router.get("/interviews/:memberId", memberCtrl.getUserInterviews);
146+
router.get("/:memberId/interviews", memberCtrl.getUserInterviews);
147147

148148
return router;
149149
}

tests/Member.test.ts

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { createAMember, updateAMember } from '../src/controllers/member.controll
33
import * as memberService from '../src/services/member.service';
44
import { ApiError } from '../src/utils/apiError';
55
import { SupabaseClient } from '@supabase/supabase-js';
6-
import { uploadImage } from '../src/utils/imageUtils';
6+
import { uploadImage, deleteImage } from '../src/utils/imageUtils';
77

88
jest.mock('../src/db/client', () => ({
99
prisma: {
@@ -68,7 +68,7 @@ describe('Member Controller - updateAMember', () => {
6868
jest.clearAllMocks();
6969
});
7070

71-
it('should update member and respond with 200', async () => {
71+
it('should update member and return updated data (no image)', async () => {
7272
const req = {
7373
params: { memberId: 'abc-123' },
7474
body: { github: 'https://github.com/shrutii' },
@@ -77,14 +77,14 @@ describe('Member Controller - updateAMember', () => {
7777

7878
const res = mockResponse();
7979

80-
const mockMember = {
80+
const updatedMember = {
8181
id: '123',
8282
name: 'Test User',
8383
email: 'test@example.com',
8484
phone: null,
8585
bio: null,
8686
profilePhoto: null,
87-
github: 'testgithub',
87+
github: 'https://github.com/shrutii',
8888
linkedin: null,
8989
twitter: null,
9090
leetcode: null,
@@ -100,38 +100,38 @@ describe('Member Controller - updateAMember', () => {
100100
updatedAt: new Date(),
101101
};
102102

103-
const spy = jest.spyOn(memberService, 'updateMember').mockResolvedValue(mockMember);
103+
const spyUpdate = jest.spyOn(memberService, 'updateMember').mockResolvedValue(updatedMember);
104+
const spyGet = jest.spyOn(memberService, 'getDetails').mockResolvedValue(updatedMember);
104105

105106
const handler = updateAMember(mockSupabase);
106107
await handler(req, res);
107108

108-
expect(spy).toHaveBeenCalledWith('abc-123', req.body);
109+
expect(spyUpdate).toHaveBeenCalledWith('abc-123', req.body);
110+
expect(spyGet).toHaveBeenCalledTimes(1);
109111
expect(res.status).toHaveBeenCalledWith(200);
110112
expect(res.json).toHaveBeenCalledWith({
111113
success: true,
112-
message: 'Updated member details successfully',
114+
user: updatedMember,
113115
});
114116
});
115117

116-
it('should upload image and update profilePhoto', async () => {
118+
it('should upload new image, handle old image, update member, and return updated data', async () => {
117119
const req = {
118120
params: { memberId: 'abc-123' },
119121
body: {},
120-
file: { buffer: Buffer.from('data') },
122+
file: { buffer: Buffer.from('fake-image-data') },
121123
} as unknown as Request;
122124

123125
const res = mockResponse();
124126

125-
(uploadImage as jest.Mock).mockResolvedValue('http://image.url');
126-
127-
const mockMember = {
127+
const oldMember = {
128128
id: '123',
129-
name: 'Test User',
130-
email: 'test@example.com',
129+
name: 'Old User',
130+
email: 'old@example.com',
131131
phone: null,
132132
bio: null,
133-
profilePhoto: 'http://image.url',
134-
github: 'testgithub',
133+
profilePhoto: 'https://old.url/image.png',
134+
github: null,
135135
linkedin: null,
136136
twitter: null,
137137
leetcode: null,
@@ -147,17 +147,49 @@ describe('Member Controller - updateAMember', () => {
147147
updatedAt: new Date(),
148148
};
149149

150-
const spy = jest.spyOn(memberService, 'updateMember').mockResolvedValue(mockMember);
150+
const updatedMember = {
151+
...oldMember,
152+
profilePhoto: 'https://new.url/image.png',
153+
};
154+
155+
(uploadImage as jest.Mock)
156+
.mockResolvedValueOnce(undefined)
157+
.mockResolvedValueOnce('https://new.url/image.png');
158+
159+
jest.spyOn(memberService, 'getDetails')
160+
.mockResolvedValueOnce(oldMember)
161+
.mockResolvedValueOnce(updatedMember);
162+
163+
const spyUpdate = jest
164+
.spyOn(memberService, 'updateMember')
165+
.mockResolvedValue(updatedMember);
151166

152167
const handler = updateAMember(mockSupabase);
153168
await handler(req, res);
154169

155-
expect(uploadImage).toHaveBeenCalled();
156-
expect(spy).toHaveBeenCalledWith('abc-123', { profilePhoto: 'http://image.url' });
170+
expect(uploadImage).toHaveBeenNthCalledWith(
171+
1,
172+
mockSupabase,
173+
req.file,
174+
'members',
175+
'https://old.url/image.png'
176+
);
177+
178+
expect(uploadImage).toHaveBeenNthCalledWith(
179+
2,
180+
mockSupabase,
181+
req.file,
182+
'members'
183+
);
184+
185+
expect(spyUpdate).toHaveBeenCalledWith('abc-123', {
186+
profilePhoto: 'https://new.url/image.png',
187+
});
188+
157189
expect(res.status).toHaveBeenCalledWith(200);
158190
expect(res.json).toHaveBeenCalledWith({
159191
success: true,
160-
message: 'Updated member details successfully',
192+
user: updatedMember,
161193
});
162194
});
163-
});
195+
});

0 commit comments

Comments
 (0)