Skip to content

Commit fa1ff1d

Browse files
authored
Merge pull request #32 from call-0f-code/main
updating prod
2 parents 6cdec37 + fbe6d98 commit fa1ff1d

7 files changed

Lines changed: 33 additions & 37 deletions

File tree

src/controllers/member.controller.ts

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { Request, Response } from "express";
22
import * as memberService from "../services/member.service";
33
import { ApiError } from "../utils/apiError";
4-
import { deleteImage, uploadImage } from "../utils/imageUtils";
4+
import { uploadImage } from "../utils/imageUtils";
55
import { SupabaseClient } from "@supabase/supabase-js";
66

77
// List all approved members
88
export const listAllApprovedMembers = async (req: Request, res: Response) => {
99

10-
const {email, password} = req.query;
10+
const {email} = req.query;
1111

12-
if(email && password) {
12+
if(email) {
1313

1414
const user = await memberService.getUserByEmail(email as string);
1515

@@ -58,10 +58,10 @@ export const createAMember =
5858
const user = await memberService.createMember(
5959
email,
6060
name,
61+
provider,
6162
password,
6263
passoutYear,
6364
imageUrl,
64-
provider,
6565
);
6666

6767
if (!user) throw new ApiError("Error creating user", 500);
@@ -72,29 +72,31 @@ export const createAMember =
7272
// Update an existing member
7373
export const updateAMember =
7474
(supabase: SupabaseClient) => async (req: Request, res: Response) => {
75-
const { memberId } = req.params;
75+
76+
const { memberId } = req.params;
7677

7778
if(!memberId) throw new ApiError("No memberId provided", 400);
7879

79-
const body = req.body;
80+
const parsedBody = JSON.parse(req.body.memberData);
81+
let imageUrl: undefined | string;
8082

8183
if (req.file) {
8284
const oldData = await memberService.getDetails(memberId);
8385
const oldImage = oldData?.profilePhoto;
8486

8587
if(oldImage) await uploadImage(supabase, req.file, "members", oldImage);
86-
87-
const imageUrl = await uploadImage(supabase, req.file, "members");
88-
body.profilePhoto = imageUrl;
88+
else imageUrl = await uploadImage(supabase, req.file, "members");
8989
}
90+
if (imageUrl) parsedBody.profilePhoto = imageUrl;
9091

91-
await memberService.updateMember(memberId, body);
92+
await memberService.updateMember(memberId, parsedBody);
9293

9394
const updatedData = await memberService.getDetails(memberId);
9495
res
9596
.status(200)
9697
.json({ success: true, user: updatedData });
97-
};
98+
};
99+
98100

99101
// Get all unapproved members
100102
export const getUnapprovedMembers = async (req: Request, res: Response) => {

src/routes/achievements.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import express from 'express';
22
import * as acheivementsCtrl from '../controllers/achievement.controller';
3-
import { supabase } from '../app';
43
import { Multer } from 'multer';
54
import { SupabaseClient } from '@supabase/supabase-js';
65

src/routes/members.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import express from "express";
22
import * as memberCtrl from "../controllers/member.controller";
33
import { Multer } from "multer";
4-
import { supabase } from "../app";
54
import { SupabaseClient } from "@supabase/supabase-js";
65

76
export default function membersRouter(

src/routes/progress.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,17 @@ export default function progressRouter() {
1515
* @apiParam {String} memberId ID of the member to retrieve completed questions for.
1616
*
1717
* @apiSuccess {String="SUCCESS"} status Response status.
18-
* @apiSuccess {Object[]} completedQuestion List of completed questions.
19-
* @apiSuccess {Number} completedQuestion.questionId Id of the completed question.
18+
* @apiSuccess {Object[]} completedQuestion List of questions inside the topic.
19+
* @apiSuccess {Object} completedQuestion[].question Question object.
20+
* @apiSuccess {Number} completedQuestion[].question.id Question ID.
21+
* @apiSuccess {String} completedQuestion[].question.questionName Name of the question.
22+
* @apiSuccess {String} completedQuestion[].question.link Link to the question.
23+
* @apiSuccess {String="Easy","Medium","Hard"} completedQuestion[].question.difficulty Difficulty level of the question.
24+
* @apiSuccess {Number} completedQuestion[].question.topicId Topic ID associated with the question.
25+
* @apiSuccess {Number} completedQuestion[].question.createdAt Timestamp when the question was created (Unix timestamp).
26+
* @apiSuccess {Number} completedQuestion[].question.updatedAt Timestamp when the question was last updated (Unix timestamp).
27+
* @apiSuccess {String} completedQuestion[].question.createdById ID of the user who created the question.
28+
* @apiSuccess {String} completedQuestion[].question.updatedById ID of the user who last updated the question.
2029
*
2130
* @apiError (Error 400) BadRequest Missing required fields.
2231
* @apiError (Error 500) InternalServerError Error while fetching completed questions.

src/services/member.service.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ export const getUserByEmail = async(email: string) => {
1111
isApproved: true,
1212
isManager: true,
1313
accounts: {
14-
where: {
15-
provider: 'credentials',
16-
},
1714
select: {
1815
password: true
1916
}
@@ -42,9 +39,9 @@ export const createMember = async (
4239
email: string,
4340
name: string,
4441
provider: "google" | "github" | "credentials",
42+
password?: string,
4543
passoutYear?: number,
4644
imageUrl?: string,
47-
password?: string
4845
) => {
4946
const newMember = await prisma.member.create({
5047
data: {

src/types/members.d.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,5 @@ declare global {
1515
leetcode?: string;
1616
codechef?: string;
1717
codeforces?: string;
18-
isApproved?: boolean;
19-
approvedBy?: string;
2018
}
21-
}
19+
}

tests/Member.test.ts

Lines changed: 7 additions & 15 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, deleteImage } from '../src/utils/imageUtils';
6+
import { uploadImage } from '../src/utils/imageUtils';
77

88
jest.mock('../src/db/client', () => ({
99
prisma: {
@@ -71,7 +71,7 @@ describe('Member Controller - updateAMember', () => {
7171
it('should update member and return updated data (no image)', async () => {
7272
const req = {
7373
params: { memberId: 'abc-123' },
74-
body: { github: 'https://github.com/shrutii' },
74+
body: { memberData: JSON.stringify({ github: 'https://github.com/shrutii' }) },
7575
file: undefined,
7676
} as unknown as Request;
7777

@@ -106,7 +106,7 @@ describe('Member Controller - updateAMember', () => {
106106
const handler = updateAMember(mockSupabase);
107107
await handler(req, res);
108108

109-
expect(spyUpdate).toHaveBeenCalledWith('abc-123', req.body);
109+
expect(spyUpdate).toHaveBeenCalledWith('abc-123', { github: 'https://github.com/shrutii' });
110110
expect(spyGet).toHaveBeenCalledTimes(1);
111111
expect(res.status).toHaveBeenCalledWith(200);
112112
expect(res.json).toHaveBeenCalledWith({
@@ -118,7 +118,7 @@ describe('Member Controller - updateAMember', () => {
118118
it('should upload new image, handle old image, update member, and return updated data', async () => {
119119
const req = {
120120
params: { memberId: 'abc-123' },
121-
body: {},
121+
body: { memberData: JSON.stringify({}) },
122122
file: { buffer: Buffer.from('fake-image-data') },
123123
} as unknown as Request;
124124

@@ -153,7 +153,6 @@ describe('Member Controller - updateAMember', () => {
153153
};
154154

155155
(uploadImage as jest.Mock)
156-
.mockResolvedValueOnce(undefined)
157156
.mockResolvedValueOnce('https://new.url/image.png');
158157

159158
jest.spyOn(memberService, 'getDetails')
@@ -167,23 +166,16 @@ describe('Member Controller - updateAMember', () => {
167166
const handler = updateAMember(mockSupabase);
168167
await handler(req, res);
169168

170-
expect(uploadImage).toHaveBeenNthCalledWith(
171-
1,
169+
expect(uploadImage).toHaveBeenCalledWith(
172170
mockSupabase,
173171
req.file,
174172
'members',
175173
'https://old.url/image.png'
176174
);
177175

178-
expect(uploadImage).toHaveBeenNthCalledWith(
179-
2,
180-
mockSupabase,
181-
req.file,
182-
'members'
183-
);
184176

185177
expect(spyUpdate).toHaveBeenCalledWith('abc-123', {
186-
profilePhoto: 'https://new.url/image.png',
178+
187179
});
188180

189181
expect(res.status).toHaveBeenCalledWith(200);
@@ -192,4 +184,4 @@ describe('Member Controller - updateAMember', () => {
192184
user: updatedMember,
193185
});
194186
});
195-
});
187+
});

0 commit comments

Comments
 (0)