Skip to content

Commit bcca73f

Browse files
authored
Merge pull request #62 from codeit-moving/release
Release -> main 20241223 17:58 V 1.2.0
2 parents 48d1a77 + 2e26a8a commit bcca73f

File tree

7 files changed

+106
-61
lines changed

7 files changed

+106
-61
lines changed

data/mover.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,17 @@ export const movers = [
5151
createAt: "2024-11-27T10:15:00.000Z",
5252
updateAt: "2024-11-27T10:15:00.000Z",
5353
},
54+
{
55+
id: 5,
56+
nickname: "배진수",
57+
services: [1, 3],
58+
regions: [82032, 82033],
59+
career: 6,
60+
description:
61+
"6년 경력의 이사 전문가, 안전하고 신속한 이사로 고객 만족을 최우선으로 생각합니다.",
62+
introduction: "안전하고 빠른 이사를 보장하는 전문가입니다.",
63+
userId: 10,
64+
createAt: "2024-11-27T10:15:00.000Z",
65+
updateAt: "2024-11-27T10:15:00.000Z",
66+
},
5467
];

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "1.1.0",
2+
"version": "1.2.0",
33
"dependencies": {
44
"@aws-sdk/s3-request-presigner": "^3.691.0",
55
"@prisma/client": "^5.20.0",

src/controllers/moverController.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,28 @@ router.post(
131131
try {
132132
const { customerId } = req.user as { customerId: number };
133133
const { id: moverId } = req.params;
134-
const { favorite = "true" } = req.query;
135-
const mover = await moverService.toggleFavorite(
134+
const mover = await moverService.moverFavorite(
136135
customerId,
137-
parseInt(moverId),
138-
checkBoolean(favorite as string)
136+
parseInt(moverId)
137+
);
138+
return res.status(200).send(mover);
139+
} catch (error) {
140+
next(error);
141+
}
142+
})
143+
);
144+
145+
//기사 찜 취소
146+
router.delete(
147+
"/:id/favorite",
148+
passport.authenticate("jwt", { session: false }),
149+
asyncHandle(async (req, res, next) => {
150+
try {
151+
const { customerId } = req.user as { customerId: number };
152+
const { id: moverId } = req.params;
153+
const mover = await moverService.moverFavoriteCancel(
154+
customerId,
155+
parseInt(moverId)
139156
);
140157
return res.status(200).send(mover);
141158
} catch (error) {

src/controllers/movingRequestController.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,9 @@ router.post(
152152
passport.authenticate("jwt", { session: false }),
153153
asyncHandle(async (req, res, next) => {
154154
try {
155-
const { id: movingRequestId } = req.params;
156-
const { moverId } = req.query;
155+
const { id: moverId } = req.params;
157156
const { customerId } = req.user as { customerId: number };
158157
const remainingCount = await movingRequestService.designateMover(
159-
parseInt(movingRequestId),
160158
parseInt(moverId as string),
161159
customerId
162160
);
@@ -176,11 +174,11 @@ router.delete(
176174
passport.authenticate("jwt", { session: false }),
177175
asyncHandle(async (req, res, next) => {
178176
try {
179-
const { id: movingRequestId } = req.params;
180-
const { moverId } = req.query;
177+
const { id: moverId } = req.params;
178+
const { customerId } = req.user as { customerId: number };
181179
const remainingCount = await movingRequestService.cancelDesignateMover(
182-
parseInt(movingRequestId),
183-
parseInt(moverId as string)
180+
parseInt(moverId as string),
181+
customerId
184182
);
185183
return res.status(200).send({
186184
message: "지정 요청 취소",

src/repositorys/moverRepository.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,20 @@ const getRatingsByMoverIds = async (moverIds: number[]) => {
143143
return ratings;
144144
};
145145

146-
const toggleFavorite = async (moverId: number, favorite: object) => {
146+
const moverFavorite = async (customerId: number, moverId: number) => {
147147
return prismaClient.mover.update({
148148
where: { id: moverId },
149-
data: { favorite },
149+
data: { favorite: { connect: { id: customerId } } },
150+
select: {
151+
id: true,
152+
},
153+
});
154+
};
155+
156+
const moverFavoriteCancel = async (customerId: number, moverId: number) => {
157+
return prismaClient.mover.update({
158+
where: { id: moverId },
159+
data: { favorite: { disconnect: { id: customerId } } },
150160
select: {
151161
id: true,
152162
},
@@ -202,7 +212,8 @@ export default {
202212
getMoverList,
203213
getRatingsByMoverIds,
204214
getMoverById,
205-
toggleFavorite,
215+
moverFavorite,
216+
moverFavoriteCancel,
206217
getMoverByFavorite,
207218
createMoverProfile,
208219
};

src/services/moverService.ts

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -201,23 +201,22 @@ const getMoverDetail = async (customerId: number | null, moverId: number) => {
201201
};
202202

203203
//찜 토글
204-
const toggleFavorite = async (
205-
customerId: number,
206-
moverId: number,
207-
favorite: boolean | undefined
208-
) => {
209-
const favoriteData: FavoriteData = {};
210-
if (favorite) {
211-
favoriteData.connect = {
212-
id: customerId,
213-
};
214-
} else {
215-
favoriteData.disconnect = {
216-
id: customerId,
204+
const moverFavorite = async (customerId: number, moverId: number) => {
205+
const mover = await moverRepository.moverFavorite(customerId, moverId);
206+
if (!mover) {
207+
const error: CustomError = new Error("Not Found");
208+
error.status = 404;
209+
error.data = {
210+
message: "기사 정보를 찾을 수 없습니다.",
217211
};
212+
throw error;
218213
}
219214

220-
const mover = await moverRepository.toggleFavorite(moverId, favoriteData);
215+
return { ...mover, isFavorite: true };
216+
};
217+
218+
const moverFavoriteCancel = async (customerId: number, moverId: number) => {
219+
const mover = await moverRepository.moverFavoriteCancel(customerId, moverId);
221220
if (!mover) {
222221
const error: CustomError = new Error("Not Found");
223222
error.status = 404;
@@ -226,8 +225,7 @@ const toggleFavorite = async (
226225
};
227226
throw error;
228227
}
229-
230-
return { ...mover, isFavorite: favorite };
228+
return { ...mover, isFavorite: false };
231229
};
232230

233231
const getMover = async (moverId: number) => {
@@ -298,7 +296,8 @@ const createMoverProfile = async (profile: Profile) => {
298296
export default {
299297
getMoverList,
300298
getMoverDetail,
301-
toggleFavorite,
299+
moverFavorite,
300+
moverFavoriteCancel,
302301
getMoverByFavorite,
303302
getMover,
304303
updateMoverProfile,

src/services/movingRequestService.ts

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -380,26 +380,32 @@ const createMovingRequest = async (
380380
};
381381

382382
//이사요청 지정
383-
const designateMover = async (
384-
movingRequestId: number,
385-
moverId: number,
386-
customerId: number
387-
) => {
388-
//지정 가능 인원 조회
389-
const designateCountPromise =
390-
movingRequestRepository.getDesignateCount(movingRequestId);
383+
const designateMover = async (moverId: number, customerId: number) => {
384+
const activeRequest = await movingRequestRepository.getActiveRequest(
385+
customerId
386+
);
391387

392-
const activeRequestPromise =
393-
movingRequestRepository.getActiveRequest(customerId);
388+
if (!activeRequest) {
389+
const error: CustomError = new Error("Bad Request");
390+
error.status = 422;
391+
error.data = {
392+
message: "일반 견적 요청을 먼저 진행해 주세요.",
393+
};
394+
throw error;
395+
}
396+
397+
//지정 가능 인원 조회
398+
const designateCountPromise = movingRequestRepository.getDesignateCount(
399+
activeRequest.id
400+
);
394401

395402
const designatedMoversPromise = movingRequestRepository.getDesignatedMovers(
396-
movingRequestId,
403+
activeRequest.id,
397404
moverId
398405
);
399406

400-
const [result, activeRequest, designatedMovers] = await Promise.all([
407+
const [result, designatedMovers] = await Promise.all([
401408
designateCountPromise,
402-
activeRequestPromise,
403409
designatedMoversPromise,
404410
]);
405411

@@ -412,15 +418,6 @@ const designateMover = async (
412418
throw error;
413419
}
414420

415-
if (!activeRequest) {
416-
const error: CustomError = new Error("Bad Request");
417-
error.status = 400;
418-
error.data = {
419-
message: "일반 견적 요청을 먼저 진행해 주세요.",
420-
};
421-
throw error;
422-
}
423-
424421
//지정 가능 인원 초과 체크
425422
if (!result || result._count.mover >= 3) {
426423
const error: CustomError = new Error("Bad Request");
@@ -433,7 +430,7 @@ const designateMover = async (
433430

434431
//이사요청 지정
435432
const movingRequest = await movingRequestRepository.updateDesignated(
436-
movingRequestId,
433+
activeRequest.id,
437434
moverId
438435
);
439436

@@ -450,12 +447,22 @@ const designateMover = async (
450447
};
451448

452449
//이사요청 지정 취소
453-
const cancelDesignateMover = async (
454-
movingRequestId: number,
455-
moverId: number
456-
) => {
450+
const cancelDesignateMover = async (moverId: number, customerId: number) => {
451+
const activeRequest = await movingRequestRepository.getActiveRequest(
452+
customerId
453+
);
454+
455+
if (!activeRequest) {
456+
const error: CustomError = new Error("Bad Request");
457+
error.status = 422;
458+
error.data = {
459+
message: "일반 견적 요청을 먼저 진행해 주세요.",
460+
};
461+
throw error;
462+
}
463+
457464
const designatedMovers = await movingRequestRepository.getDesignatedMovers(
458-
movingRequestId,
465+
activeRequest.id,
459466
moverId
460467
);
461468

@@ -470,7 +477,7 @@ const cancelDesignateMover = async (
470477

471478
//이사요청 지정 취소
472479
const movingRequest = await movingRequestRepository.updateDesignatedCancel(
473-
movingRequestId,
480+
activeRequest.id,
474481
moverId
475482
);
476483

0 commit comments

Comments
 (0)