diff --git a/src/main/java/nextstep/qna/domain/Answer.java b/src/main/java/nextstep/qna/domain/Answer.java index cf681811e..afea5fe78 100644 --- a/src/main/java/nextstep/qna/domain/Answer.java +++ b/src/main/java/nextstep/qna/domain/Answer.java @@ -1,10 +1,12 @@ package nextstep.qna.domain; +import nextstep.qna.CannotDeleteException; import nextstep.qna.NotFoundException; import nextstep.qna.UnAuthorizedException; import nextstep.users.domain.NsUser; import java.time.LocalDateTime; +import java.util.List; public class Answer { private Long id; @@ -72,8 +74,21 @@ public void toQuestion(Question question) { this.question = question; } + public void delete(NsUser loginUser) throws CannotDeleteException { + if (!isOwner(loginUser)) { + throw new CannotDeleteException("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다."); + } + deleted = true; + } + + public DeleteHistory deleteHistory() { + return new DeleteHistory(ContentType.ANSWER, id, writer, LocalDateTime.now()); + } + @Override public String toString() { return "Answer [id=" + getId() + ", writer=" + writer + ", contents=" + contents + "]"; } + + } diff --git a/src/main/java/nextstep/qna/domain/Answers.java b/src/main/java/nextstep/qna/domain/Answers.java new file mode 100644 index 000000000..2c2320ef6 --- /dev/null +++ b/src/main/java/nextstep/qna/domain/Answers.java @@ -0,0 +1,33 @@ +package nextstep.qna.domain; + +import nextstep.qna.CannotDeleteException; +import nextstep.users.domain.NsUser; + +import java.util.ArrayList; +import java.util.List; + +public class Answers { + private List answers; + + public Answers(List answers) { + this.answers = answers; + } + + public void add(Answer answer) { + answers.add(answer); + } + + public void delete(NsUser loginUser) throws CannotDeleteException { + for(Answer answer : answers) { + answer.delete(loginUser); + } + } + + public List deleteHistories() { + List deleteHistories = new ArrayList<>(); + for(Answer answer : answers) { + deleteHistories.add(answer.deleteHistory()); + } + return deleteHistories; + } +} diff --git a/src/main/java/nextstep/qna/domain/Question.java b/src/main/java/nextstep/qna/domain/Question.java index b623c52c7..328fca3ff 100644 --- a/src/main/java/nextstep/qna/domain/Question.java +++ b/src/main/java/nextstep/qna/domain/Question.java @@ -1,5 +1,6 @@ package nextstep.qna.domain; +import nextstep.qna.CannotDeleteException; import nextstep.users.domain.NsUser; import java.time.LocalDateTime; @@ -15,7 +16,7 @@ public class Question { private NsUser writer; - private List answers = new ArrayList<>(); + private Answers answers = new Answers(new ArrayList<>()); private boolean deleted = false; @@ -81,7 +82,7 @@ public boolean isDeleted() { return deleted; } - public List getAnswers() { + public Answers getAnswers() { return answers; } @@ -89,4 +90,21 @@ public List getAnswers() { public String toString() { return "Question [id=" + getId() + ", title=" + title + ", contents=" + contents + ", writer=" + writer + "]"; } + + public void delete(NsUser loginUser) throws CannotDeleteException { + if (!isOwner(loginUser)) { + throw new CannotDeleteException("질문을 삭제할 권한이 없습니다."); + } + this.deleted = true; + answers.delete(loginUser); + } + + public List deleteHistories() { + List deleteHistories = new ArrayList<>(); + deleteHistories.add(new DeleteHistory(ContentType.QUESTION, id, writer, LocalDateTime.now())); + deleteHistories.addAll(answers.deleteHistories()); + + return deleteHistories; + } + } diff --git a/src/main/java/nextstep/qna/service/QnAService.java b/src/main/java/nextstep/qna/service/QnAService.java index 5741c84d6..c8f975bed 100644 --- a/src/main/java/nextstep/qna/service/QnAService.java +++ b/src/main/java/nextstep/qna/service/QnAService.java @@ -26,24 +26,8 @@ public class QnAService { @Transactional public void deleteQuestion(NsUser loginUser, long questionId) throws CannotDeleteException { Question question = questionRepository.findById(questionId).orElseThrow(NotFoundException::new); - if (!question.isOwner(loginUser)) { - throw new CannotDeleteException("질문을 삭제할 권한이 없습니다."); - } - - List answers = question.getAnswers(); - for (Answer answer : answers) { - if (!answer.isOwner(loginUser)) { - throw new CannotDeleteException("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다."); - } - } - - List deleteHistories = new ArrayList<>(); - question.setDeleted(true); - deleteHistories.add(new DeleteHistory(ContentType.QUESTION, questionId, question.getWriter(), LocalDateTime.now())); - for (Answer answer : answers) { - answer.setDeleted(true); - deleteHistories.add(new DeleteHistory(ContentType.ANSWER, answer.getId(), answer.getWriter(), LocalDateTime.now())); - } + question.delete(loginUser); + List deleteHistories = question.deleteHistories(); deleteHistoryService.saveAll(deleteHistories); } } diff --git a/src/test/java/nextstep/qna/domain/AnswerTest.java b/src/test/java/nextstep/qna/domain/AnswerTest.java index 8e80ffb42..f4e07699a 100644 --- a/src/test/java/nextstep/qna/domain/AnswerTest.java +++ b/src/test/java/nextstep/qna/domain/AnswerTest.java @@ -1,8 +1,28 @@ package nextstep.qna.domain; +import nextstep.qna.CannotDeleteException; import nextstep.users.domain.NsUserTest; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class AnswerTest { public static final Answer A1 = new Answer(NsUserTest.JAVAJIGI, QuestionTest.Q1, "Answers Contents1"); public static final Answer A2 = new Answer(NsUserTest.SANJIGI, QuestionTest.Q1, "Answers Contents2"); + + @Test + void 글쓴이_로그인유저_같을때() throws CannotDeleteException { + A1.delete(NsUserTest.JAVAJIGI); + assertThat(A1.isDeleted()).isTrue(); + } + + @Test + void 글쓴이_로그인유저_다를때() { + assertThatThrownBy(() -> { + A1.delete(NsUserTest.SANJIGI); + }).isInstanceOf(CannotDeleteException.class) + .hasMessage("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다."); + } } + diff --git a/src/test/java/nextstep/qna/domain/QuestionTest.java b/src/test/java/nextstep/qna/domain/QuestionTest.java index 3b8782396..bf84a639e 100644 --- a/src/test/java/nextstep/qna/domain/QuestionTest.java +++ b/src/test/java/nextstep/qna/domain/QuestionTest.java @@ -1,8 +1,27 @@ package nextstep.qna.domain; +import nextstep.qna.CannotDeleteException; import nextstep.users.domain.NsUserTest; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class QuestionTest { public static final Question Q1 = new Question(NsUserTest.JAVAJIGI, "title1", "contents1"); public static final Question Q2 = new Question(NsUserTest.SANJIGI, "title2", "contents2"); + + @Test + void 글쓴이_로그인유저_같을때() throws CannotDeleteException { + Q1.delete(NsUserTest.JAVAJIGI); + assertThat(Q1.isDeleted()).isTrue(); + } + + @Test + void 글쓴이_로그인유저_다를때() { + assertThatThrownBy(() -> { + Q1.delete(NsUserTest.SANJIGI); + }).isInstanceOf(CannotDeleteException.class) + .hasMessage("질문을 삭제할 권한이 없습니다."); + } }