Skip to content

Commit 2df8897

Browse files
committed
탈퇴
1 parent d4093d3 commit 2df8897

File tree

6 files changed

+207
-23
lines changed

6 files changed

+207
-23
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
-- DropForeignKey
2+
ALTER TABLE `Announcement` DROP FOREIGN KEY `Announcement_writer_id_fkey`;
3+
4+
-- DropForeignKey
5+
ALTER TABLE `Message` DROP FOREIGN KEY `Message_receiver_id_fkey`;
6+
7+
-- DropForeignKey
8+
ALTER TABLE `Message` DROP FOREIGN KEY `Message_sender_id_fkey`;
9+
10+
-- DropForeignKey
11+
ALTER TABLE `Notification` DROP FOREIGN KEY `Notification_actor_id_fkey`;
12+
13+
-- DropForeignKey
14+
ALTER TABLE `Notification` DROP FOREIGN KEY `Notification_user_id_fkey`;
15+
16+
-- DropForeignKey
17+
ALTER TABLE `NotificationSubscription` DROP FOREIGN KEY `NotificationSubscription_prompter_id_fkey`;
18+
19+
-- DropForeignKey
20+
ALTER TABLE `NotificationSubscription` DROP FOREIGN KEY `NotificationSubscription_user_id_fkey`;
21+
22+
-- DropForeignKey
23+
ALTER TABLE `Prompt` DROP FOREIGN KEY `Prompt_user_id_fkey`;
24+
25+
-- DropForeignKey
26+
ALTER TABLE `PromptLike` DROP FOREIGN KEY `PromptLike_user_id_fkey`;
27+
28+
-- DropForeignKey
29+
ALTER TABLE `PromptReport` DROP FOREIGN KEY `PromptReport_reporter_id_fkey`;
30+
31+
-- DropForeignKey
32+
ALTER TABLE `Purchase` DROP FOREIGN KEY `Purchase_user_id_fkey`;
33+
34+
-- DropForeignKey
35+
ALTER TABLE `Review` DROP FOREIGN KEY `Review_user_id_fkey`;
36+
37+
-- DropForeignKey
38+
ALTER TABLE `Settlement` DROP FOREIGN KEY `Settlement_user_id_fkey`;
39+
40+
-- DropForeignKey
41+
ALTER TABLE `Tip` DROP FOREIGN KEY `Tip_writer_id_fkey`;
42+
43+
-- DropForeignKey
44+
ALTER TABLE `UserConsent` DROP FOREIGN KEY `UserConsent_user_id_fkey`;
45+
46+
-- DropForeignKey
47+
ALTER TABLE `UserSNS` DROP FOREIGN KEY `UserSNS_user_id_fkey`;
48+
49+
-- DropForeignKey
50+
ALTER TABLE `WithdrawRequest` DROP FOREIGN KEY `WithdrawRequest_user_id_fkey`;
51+
52+
-- AddForeignKey
53+
ALTER TABLE `UserConsent` ADD CONSTRAINT `UserConsent_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
54+
55+
-- AddForeignKey
56+
ALTER TABLE `UserSNS` ADD CONSTRAINT `UserSNS_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
57+
58+
-- AddForeignKey
59+
ALTER TABLE `PromptLike` ADD CONSTRAINT `PromptLike_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
60+
61+
-- AddForeignKey
62+
ALTER TABLE `Announcement` ADD CONSTRAINT `Announcement_writer_id_fkey` FOREIGN KEY (`writer_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
63+
64+
-- AddForeignKey
65+
ALTER TABLE `Tip` ADD CONSTRAINT `Tip_writer_id_fkey` FOREIGN KEY (`writer_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
66+
67+
-- AddForeignKey
68+
ALTER TABLE `NotificationSubscription` ADD CONSTRAINT `NotificationSubscription_prompter_id_fkey` FOREIGN KEY (`prompter_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
69+
70+
-- AddForeignKey
71+
ALTER TABLE `NotificationSubscription` ADD CONSTRAINT `NotificationSubscription_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
72+
73+
-- AddForeignKey
74+
ALTER TABLE `Notification` ADD CONSTRAINT `Notification_actor_id_fkey` FOREIGN KEY (`actor_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
75+
76+
-- AddForeignKey
77+
ALTER TABLE `Notification` ADD CONSTRAINT `Notification_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
78+
79+
-- AddForeignKey
80+
ALTER TABLE `Message` ADD CONSTRAINT `Message_receiver_id_fkey` FOREIGN KEY (`receiver_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
81+
82+
-- AddForeignKey
83+
ALTER TABLE `Message` ADD CONSTRAINT `Message_sender_id_fkey` FOREIGN KEY (`sender_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
84+
85+
-- AddForeignKey
86+
ALTER TABLE `WithdrawRequest` ADD CONSTRAINT `WithdrawRequest_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
87+
88+
-- AddForeignKey
89+
ALTER TABLE `Prompt` ADD CONSTRAINT `Prompt_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
90+
91+
-- AddForeignKey
92+
ALTER TABLE `PromptReport` ADD CONSTRAINT `PromptReport_reporter_id_fkey` FOREIGN KEY (`reporter_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
93+
94+
-- AddForeignKey
95+
ALTER TABLE `Purchase` ADD CONSTRAINT `Purchase_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
96+
97+
-- AddForeignKey
98+
ALTER TABLE `Settlement` ADD CONSTRAINT `Settlement_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
99+
100+
-- AddForeignKey
101+
ALTER TABLE `Review` ADD CONSTRAINT `Review_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;

prisma/schema.prisma

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ model UserConsent {
5353
is_agreed Boolean
5454
created_at DateTime @default(now())
5555
updated_at DateTime @updatedAt
56-
user User @relation(fields: [user_id], references: [user_id])
56+
user User @relation(fields: [user_id], references: [user_id], onDelete: Cascade)
5757
5858
@@unique([user_id, consent_type])
5959
}
@@ -82,7 +82,7 @@ model UserSNS {
8282
description String
8383
created_at DateTime @default(now())
8484
updated_at DateTime @updatedAt
85-
user User @relation(fields: [user_id], references: [user_id])
85+
user User @relation(fields: [user_id], references: [user_id], onDelete: Cascade)
8686
8787
@@index([user_id], map: "UserSNS_user_id_fkey")
8888
}
@@ -105,7 +105,7 @@ model PromptLike {
105105
created_at DateTime @default(now())
106106
updated_at DateTime @updatedAt
107107
prompt Prompt @relation(fields: [prompt_id], references: [prompt_id])
108-
user User @relation(fields: [user_id], references: [user_id])
108+
user User @relation(fields: [user_id], references: [user_id], onDelete: Cascade)
109109
110110
@@unique([user_id, prompt_id])
111111
@@index([prompt_id], map: "PromptLike_prompt_id_fkey")
@@ -120,7 +120,7 @@ model Announcement {
120120
file_url String? @db.VarChar(255)
121121
created_at DateTime @default(now())
122122
updated_at DateTime @updatedAt
123-
writer User @relation(fields: [writer_id], references: [user_id])
123+
writer User @relation(fields: [writer_id], references: [user_id], onDelete: Cascade)
124124
125125
@@index([writer_id], map: "Announcement_writer_id_fkey")
126126
}
@@ -134,7 +134,7 @@ model Tip {
134134
created_at DateTime @default(now())
135135
updated_at DateTime @updatedAt
136136
file_url String? @db.VarChar(255)
137-
writer User @relation(fields: [writer_id], references: [user_id])
137+
writer User @relation(fields: [writer_id], references: [user_id], onDelete: Cascade)
138138
139139
@@index([writer_id], map: "Tip_writer_id_fkey")
140140
}
@@ -145,8 +145,8 @@ model NotificationSubscription {
145145
prompter_id Int
146146
created_at DateTime @default(now())
147147
updated_at DateTime @updatedAt
148-
prompter User @relation("NotificationTargetPrompter", fields: [prompter_id], references: [user_id])
149-
user User @relation("NotificationSubscriber", fields: [user_id], references: [user_id])
148+
prompter User @relation("NotificationTargetPrompter", fields: [prompter_id], references: [user_id], onDelete: Cascade)
149+
user User @relation("NotificationSubscriber", fields: [user_id], references: [user_id], onDelete: Cascade)
150150
151151
@@unique([user_id, prompter_id])
152152
@@index([prompter_id], map: "NotificationSubscription_prompter_id_fkey")
@@ -161,8 +161,8 @@ model Notification {
161161
actor_id Int?
162162
link_url String?
163163
type NotificationType
164-
actor User? @relation("ActorNotifications", fields: [actor_id], references: [user_id])
165-
user User? @relation("UserNotifications", fields: [user_id], references: [user_id])
164+
actor User? @relation("ActorNotifications", fields: [actor_id], references: [user_id], onDelete: Cascade)
165+
user User? @relation("UserNotifications", fields: [user_id], references: [user_id], onDelete: Cascade)
166166
167167
@@index([user_id], map: "Notification_user_id_fkey")
168168
@@index([type])
@@ -190,8 +190,8 @@ model Message {
190190
is_deleted Boolean @default(false)
191191
created_at DateTime @default(now())
192192
updated_at DateTime @updatedAt
193-
receiver User @relation("ReceivedMessages", fields: [receiver_id], references: [user_id])
194-
sender User @relation("SentMessages", fields: [sender_id], references: [user_id])
193+
receiver User @relation("ReceivedMessages", fields: [receiver_id], references: [user_id], onDelete: Cascade)
194+
sender User @relation("SentMessages", fields: [sender_id], references: [user_id], onDelete: Cascade)
195195
196196
@@index([receiver_id], map: "Message_receiver_id_fkey")
197197
@@index([sender_id], map: "Message_sender_id_fkey")
@@ -231,7 +231,7 @@ model WithdrawRequest {
231231
status Status
232232
created_at DateTime @default(now())
233233
updated_at DateTime @updatedAt
234-
user User @relation(fields: [user_id], references: [user_id])
234+
user User @relation(fields: [user_id], references: [user_id], onDelete: Cascade)
235235
236236
@@index([user_id], map: "WithdrawRequest_user_id_fkey")
237237
}
@@ -254,7 +254,7 @@ model Prompt {
254254
created_at DateTime @default(now())
255255
updated_at DateTime @updatedAt
256256
inactive_date DateTime?
257-
user User @relation(fields: [user_id], references: [user_id])
257+
user User @relation(fields: [user_id], references: [user_id], onDelete: Cascade)
258258
images PromptImage[]
259259
prompt_likes PromptLike[]
260260
models PromptModel[]
@@ -361,7 +361,7 @@ model PromptReport {
361361
reporter_id Int
362362
is_read Boolean @default(false)
363363
prompt Prompt @relation("PromptReport", fields: [prompt_id], references: [prompt_id])
364-
reporter User @relation("UserReport", fields: [reporter_id], references: [user_id])
364+
reporter User @relation("UserReport", fields: [reporter_id], references: [user_id], onDelete: Cascade)
365365
366366
@@index([prompt_id], map: "PromptReport_prompt_id_fkey")
367367
@@index([reporter_id], map: "PromptReport_reporter_id_fkey")
@@ -377,7 +377,7 @@ model Purchase {
377377
updated_at DateTime @updatedAt
378378
payment Payment?
379379
prompt Prompt @relation(fields: [prompt_id], references: [prompt_id])
380-
user User @relation(fields: [user_id], references: [user_id])
380+
user User @relation(fields: [user_id], references: [user_id], onDelete: Cascade)
381381
382382
@@index([prompt_id], map: "Purchase_prompt_id_fkey")
383383
@@index([user_id], map: "Purchase_user_id_fkey")
@@ -406,7 +406,7 @@ model Settlement {
406406
updated_at DateTime @updatedAt
407407
user_id Int
408408
payment Payment @relation(fields: [payment_id], references: [payment_id])
409-
user User @relation("UserSettlements", fields: [user_id], references: [user_id])
409+
user User @relation("UserSettlements", fields: [user_id], references: [user_id], onDelete: Cascade)
410410
411411
@@index([user_id])
412412
}
@@ -420,7 +420,7 @@ model Review {
420420
user_id Int
421421
prompt_id Int
422422
prompt Prompt @relation(fields: [prompt_id], references: [prompt_id])
423-
user User @relation(fields: [user_id], references: [user_id])
423+
user User @relation(fields: [user_id], references: [user_id], onDelete: Cascade)
424424
425425
@@index([prompt_id], map: "Review_prompt_id_fkey")
426426
@@index([user_id], map: "Review_user_id_fkey")

src/members/controllers/member.controller.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -713,4 +713,27 @@ export class MemberController {
713713
next(error);
714714
}
715715
}
716+
717+
public async adminUnBanUser(
718+
req: Request,
719+
res: Response,
720+
next: NextFunction
721+
): Promise<void> {
722+
try {
723+
const memberId = parseInt(req.params.memberId, 10);
724+
725+
if (isNaN(memberId)) {
726+
throw new AppError("유효하지 않은 멤버 ID입니다.", 400, "BadRequest");
727+
}
728+
729+
await this.memberService.adminUnBanUser(memberId);
730+
731+
res.status(200).json({
732+
message: "회원 정지 취소 처리 완료",
733+
statusCode: 200,
734+
});
735+
} catch (error) {
736+
next(error);
737+
}
738+
}
716739
}

src/members/repositories/member.repository.ts

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,36 @@ export class MemberRepository {
150150
}
151151

152152
async deactivateUser(userId: number) {
153-
await prisma.$executeRawUnsafe(
154-
"UPDATE `User` SET status = 0, inactive_date = NOW() WHERE user_id = ?",
155-
userId
156-
);
157-
return prisma.user.findUnique({
153+
const freePrompts = await prisma.prompt.findMany({
154+
where: {
155+
purchases: {
156+
some: {
157+
is_free: false,
158+
payment: {
159+
is: {
160+
settlement: {
161+
is: {
162+
user_id: userId,
163+
},
164+
},
165+
},
166+
},
167+
},
168+
},
169+
},
170+
});
171+
if (freePrompts.length == 0) {
172+
try {
173+
const deletedUser = await prisma.user.delete({
158174
where: { user_id: userId },
159175
});
176+
console.log('사용자 및 관련 데이터 삭제 성공:', deletedUser);
177+
return deletedUser;
178+
} catch (error) {
179+
console.error('사용자 삭제 중 오류 발생:', error);
180+
throw error;
181+
}
182+
}
160183
}
161184

162185
async findPurchasesByUserId(userId: number) {
@@ -455,6 +478,13 @@ export class MemberRepository {
455478
data: { userstatus: userStatus.banned },
456479
});
457480
}
481+
482+
async UnBanUser(memberId: number) {
483+
return prisma.user.update({
484+
where: { user_id: memberId },
485+
data: { userstatus: userStatus.active },
486+
});
487+
}
458488
}
459489

460490
export const getMemberPromptsRepo = async (

src/members/routes/admin-member.route.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,20 @@ router.patch(
2020
isAdmin,
2121
memberController.adminBanUser.bind(memberController)
2222
);
23-
23+
24+
router.patch(
25+
"/admin/:memberId/unban",
26+
authenticateJwt,
27+
isAdmin,
28+
memberController.adminUnBanUser.bind(memberController)
29+
);
30+
31+
router.delete(
32+
"/admin/:memberId/delete",
33+
authenticateJwt,
34+
isAdmin,
35+
memberController.adminUnBanUser.bind(memberController)
36+
);
37+
38+
2439
export default router;

src/members/services/member.service.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import eventBus from "../../config/eventBus";
1313
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
1414
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
1515
import { v4 as uuidv4 } from "uuid";
16+
import { userStatus } from "@prisma/client";
1617

1718
@Service()
1819
export class MemberService {
@@ -437,7 +438,21 @@ export class MemberService {
437438
const member = await this.memberRepository.findUserById(memberId);
438439
if (!member) {
439440
throw new AppError("해당 회원을 찾을 수 없습니다.", 404, "NotFound");
441+
}
442+
if (member.userstatus === userStatus.banned) {
443+
throw new AppError("해당 회원은 이미 정지 상태입니다.", 400, "BadRequest");
440444
}
441445
return this.memberRepository.BanUser(memberId);
442446
}
447+
448+
async adminUnBanUser(memberId: number) {
449+
const member = await this.memberRepository.findUserById(memberId);
450+
if (!member) {
451+
throw new AppError("해당 회원을 찾을 수 없습니다.", 404, "NotFound");
452+
}
453+
if (member.userstatus === userStatus.active) {
454+
throw new AppError("해당 회원은 이미 활동 가능 상태입니다.", 400, "BadRequest");
455+
}
456+
return this.memberRepository.UnBanUser(memberId);
457+
}
443458
}

0 commit comments

Comments
 (0)