Skip to content

Commit 9fbd554

Browse files
committed
feat: 리팩토링
1 parent de587b9 commit 9fbd554

File tree

6 files changed

+109
-20
lines changed

6 files changed

+109
-20
lines changed

src/main/java/nextstep/qna/domain/Answer.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package nextstep.qna.domain;
22

3+
import nextstep.qna.CannotDeleteException;
34
import nextstep.qna.NotFoundException;
45
import nextstep.qna.UnAuthorizedException;
56
import nextstep.users.domain.NsUser;
67

78
import java.time.LocalDateTime;
9+
import java.util.List;
810

911
public class Answer {
1012
private Long id;
@@ -72,8 +74,21 @@ public void toQuestion(Question question) {
7274
this.question = question;
7375
}
7476

77+
public void delete(NsUser loginUser) throws CannotDeleteException {
78+
if (!isOwner(loginUser)) {
79+
throw new CannotDeleteException("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다.");
80+
}
81+
deleted = true;
82+
}
83+
84+
public DeleteHistory deleteHistory() {
85+
return new DeleteHistory(ContentType.ANSWER, id, writer, LocalDateTime.now());
86+
}
87+
7588
@Override
7689
public String toString() {
7790
return "Answer [id=" + getId() + ", writer=" + writer + ", contents=" + contents + "]";
7891
}
92+
93+
7994
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package nextstep.qna.domain;
2+
3+
import nextstep.qna.CannotDeleteException;
4+
import nextstep.users.domain.NsUser;
5+
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
public class Answers {
10+
private List<Answer> answers;
11+
12+
public Answers(List<Answer> answers) {
13+
this.answers = answers;
14+
}
15+
16+
public void add(Answer answer) {
17+
answers.add(answer);
18+
}
19+
20+
public void delete(NsUser loginUser) throws CannotDeleteException {
21+
for(Answer answer : answers) {
22+
answer.delete(loginUser);
23+
}
24+
}
25+
26+
public List<DeleteHistory> deleteHistories() {
27+
List<DeleteHistory> deleteHistories = new ArrayList<>();
28+
for(Answer answer : answers) {
29+
deleteHistories.add(answer.deleteHistory());
30+
}
31+
return deleteHistories;
32+
}
33+
}

src/main/java/nextstep/qna/domain/Question.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package nextstep.qna.domain;
22

3+
import nextstep.qna.CannotDeleteException;
34
import nextstep.users.domain.NsUser;
45

56
import java.time.LocalDateTime;
@@ -15,7 +16,7 @@ public class Question {
1516

1617
private NsUser writer;
1718

18-
private List<Answer> answers = new ArrayList<>();
19+
private Answers answers = new Answers(new ArrayList<>());
1920

2021
private boolean deleted = false;
2122

@@ -81,12 +82,29 @@ public boolean isDeleted() {
8182
return deleted;
8283
}
8384

84-
public List<Answer> getAnswers() {
85+
public Answers getAnswers() {
8586
return answers;
8687
}
8788

8889
@Override
8990
public String toString() {
9091
return "Question [id=" + getId() + ", title=" + title + ", contents=" + contents + ", writer=" + writer + "]";
9192
}
93+
94+
public void delete(NsUser loginUser) throws CannotDeleteException {
95+
if (!isOwner(loginUser)) {
96+
throw new CannotDeleteException("질문을 삭제할 권한이 없습니다.");
97+
}
98+
this.deleted = true;
99+
answers.delete(loginUser);
100+
}
101+
102+
public List<DeleteHistory> deleteHistories() {
103+
List<DeleteHistory> deleteHistories = new ArrayList<>();
104+
deleteHistories.add(new DeleteHistory(ContentType.QUESTION, id, writer, LocalDateTime.now()));
105+
deleteHistories.addAll(answers.deleteHistories());
106+
107+
return deleteHistories;
108+
}
109+
92110
}

src/main/java/nextstep/qna/service/QnAService.java

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,24 +26,8 @@ public class QnAService {
2626
@Transactional
2727
public void deleteQuestion(NsUser loginUser, long questionId) throws CannotDeleteException {
2828
Question question = questionRepository.findById(questionId).orElseThrow(NotFoundException::new);
29-
if (!question.isOwner(loginUser)) {
30-
throw new CannotDeleteException("질문을 삭제할 권한이 없습니다.");
31-
}
32-
33-
List<Answer> answers = question.getAnswers();
34-
for (Answer answer : answers) {
35-
if (!answer.isOwner(loginUser)) {
36-
throw new CannotDeleteException("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다.");
37-
}
38-
}
39-
40-
List<DeleteHistory> deleteHistories = new ArrayList<>();
41-
question.setDeleted(true);
42-
deleteHistories.add(new DeleteHistory(ContentType.QUESTION, questionId, question.getWriter(), LocalDateTime.now()));
43-
for (Answer answer : answers) {
44-
answer.setDeleted(true);
45-
deleteHistories.add(new DeleteHistory(ContentType.ANSWER, answer.getId(), answer.getWriter(), LocalDateTime.now()));
46-
}
29+
question.delete(loginUser);
30+
List<DeleteHistory> deleteHistories = question.deleteHistories();
4731
deleteHistoryService.saveAll(deleteHistories);
4832
}
4933
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,28 @@
11
package nextstep.qna.domain;
22

3+
import nextstep.qna.CannotDeleteException;
34
import nextstep.users.domain.NsUserTest;
5+
import org.junit.jupiter.api.Test;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
49

510
public class AnswerTest {
611
public static final Answer A1 = new Answer(NsUserTest.JAVAJIGI, QuestionTest.Q1, "Answers Contents1");
712
public static final Answer A2 = new Answer(NsUserTest.SANJIGI, QuestionTest.Q1, "Answers Contents2");
13+
14+
@Test
15+
void 글쓴이_로그인유저_같을때() throws CannotDeleteException {
16+
A1.delete(NsUserTest.JAVAJIGI);
17+
assertThat(A1.isDeleted()).isTrue();
18+
}
19+
20+
@Test
21+
void 글쓴이_로그인유저_다를때() {
22+
assertThatThrownBy(() -> {
23+
A1.delete(NsUserTest.SANJIGI);
24+
}).isInstanceOf(CannotDeleteException.class)
25+
.hasMessage("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다.");
26+
}
827
}
28+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,27 @@
11
package nextstep.qna.domain;
22

3+
import nextstep.qna.CannotDeleteException;
34
import nextstep.users.domain.NsUserTest;
5+
import org.junit.jupiter.api.Test;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
49

510
public class QuestionTest {
611
public static final Question Q1 = new Question(NsUserTest.JAVAJIGI, "title1", "contents1");
712
public static final Question Q2 = new Question(NsUserTest.SANJIGI, "title2", "contents2");
13+
14+
@Test
15+
void 글쓴이_로그인유저_같을때() throws CannotDeleteException {
16+
Q1.delete(NsUserTest.JAVAJIGI);
17+
assertThat(Q1.isDeleted()).isTrue();
18+
}
19+
20+
@Test
21+
void 글쓴이_로그인유저_다를때() {
22+
assertThatThrownBy(() -> {
23+
Q1.delete(NsUserTest.SANJIGI);
24+
}).isInstanceOf(CannotDeleteException.class)
25+
.hasMessage("질문을 삭제할 권한이 없습니다.");
26+
}
827
}

0 commit comments

Comments
 (0)