Skip to content

Commit eb64cec

Browse files
committed
feat: question power delete
1 parent 48f2dae commit eb64cec

File tree

4 files changed

+23
-10
lines changed

4 files changed

+23
-10
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-- DropForeignKey
2+
ALTER TABLE "Reply" DROP CONSTRAINT "Reply_question_id_fkey";
3+
4+
-- AddForeignKey
5+
ALTER TABLE "Reply" ADD CONSTRAINT "Reply_question_id_fkey" FOREIGN KEY ("question_id") REFERENCES "Question"("question_id") ON DELETE CASCADE ON UPDATE CASCADE;

apps/server/prisma/schema.prisma

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ model Reply {
8181
deleted Boolean @default(false)
8282
8383
session Session @relation("SessionReplies", fields: [sessionId], references: [sessionId])
84-
question Question @relation("QuestionReplies", fields: [questionId], references: [questionId])
84+
question Question @relation("QuestionReplies", fields: [questionId], references: [questionId], onDelete: Cascade)
8585
createUserTokenEntity UserSessionToken @relation("TokenReplies", fields: [createUserToken], references: [token])
8686
replyLikes ReplyLike[] @relation("ReplyLikes")
8787
}

apps/server/src/questions/questions.controller.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,10 @@ export class QuestionsController {
9292

9393
@Delete(':questionId')
9494
@DeleteQuestionSwagger()
95-
@UseGuards(SessionTokenValidationGuard, QuestionExistenceGuard, QuestionOwnershipGuard)
95+
@UseGuards(SessionTokenValidationGuard, QuestionExistenceGuard)
9696
async deleteQuestion(@Param('questionId', ParseIntPipe) questionId: number, @Query() data: BaseDto, @Req() req: any) {
97-
await this.questionsService.deleteQuestion(questionId, req.question);
9897
const { sessionId, token } = data;
98+
await this.questionsService.deleteQuestion(questionId, req.question, data);
9999
const resultForOther = { questionId };
100100
this.socketGateway.broadcastQuestionDelete(sessionId, token, resultForOther);
101101
return {};

apps/server/src/questions/questions.service.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { CreateQuestionDto } from './dto/create-question.dto';
55
import { GetQuestionDto } from './dto/get-question.dto';
66
import { QuestionsRepository } from './questions.repository';
77

8+
import { BaseDto } from '@common/base.dto';
89
import {
910
UpdateQuestionBodyDto,
1011
UpdateQuestionClosedDto,
@@ -127,13 +128,20 @@ export class QuestionsService {
127128
return await this.questionRepository.updateBody(questionId, body);
128129
}
129130

130-
async deleteQuestion(questionId: number, question: Question) {
131-
const isReplied = await this.repliesRepository.findReplyByQuestionId(questionId);
132-
if (isReplied) {
133-
throw new ForbiddenException('답변이 달린 질문은 삭제할 수 없습니다.');
134-
}
135-
if (question.closed) {
136-
throw new ForbiddenException('이미 완료된 답변은 삭제할 수 없습니다.');
131+
async deleteQuestion(questionId: number, question: Question, { token }: BaseDto) {
132+
const { isHost } = await this.sessionAuthRepository.findByToken(token);
133+
134+
if (!isHost) {
135+
if (question.createUserToken !== token) {
136+
throw new ForbiddenException('권한이 없습니다.');
137+
}
138+
const isReplied = await this.repliesRepository.findReplyByQuestionId(questionId);
139+
if (isReplied) {
140+
throw new ForbiddenException('답변이 달린 질문은 삭제할 수 없습니다.');
141+
}
142+
if (question.closed) {
143+
throw new ForbiddenException('이미 완료된 답변은 삭제할 수 없습니다.');
144+
}
137145
}
138146
return await this.questionRepository.deleteQuestion(questionId);
139147
}

0 commit comments

Comments
 (0)