From ff32a06ee6f4f53380c87aad46cf9b9caf87f979 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Tue, 16 Jul 2024 00:56:33 +0900 Subject: [PATCH 01/29] =?UTF-8?q?refactor=20#218=20:=20reply=20baseEntity?= =?UTF-8?q?=20=EC=83=81=EC=86=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/prgms/locomocoserver/replies/domain/Reply.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/prgms/locomocoserver/replies/domain/Reply.java b/src/main/java/org/prgms/locomocoserver/replies/domain/Reply.java index 947b723e..4ba8d7cf 100644 --- a/src/main/java/org/prgms/locomocoserver/replies/domain/Reply.java +++ b/src/main/java/org/prgms/locomocoserver/replies/domain/Reply.java @@ -13,6 +13,7 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.prgms.locomocoserver.global.common.BaseEntity; import org.prgms.locomocoserver.inquiries.domain.Inquiry; import org.prgms.locomocoserver.user.domain.User; @@ -20,7 +21,7 @@ @Getter @Table(name = "mogakko") @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Reply { +public class Reply extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) From d825e4819a373acb7b951caa88e676f4e586a16e Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Tue, 16 Jul 2024 00:57:00 +0900 Subject: [PATCH 02/29] =?UTF-8?q?feat=20#218=20:=20reply=20report=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/domain/ReplyReport.java | 43 +++++++++++++++++++ .../report/domain/ReplyReportRepository.java | 8 ++++ 2 files changed, 51 insertions(+) create mode 100644 src/main/java/org/prgms/locomocoserver/report/domain/ReplyReport.java create mode 100644 src/main/java/org/prgms/locomocoserver/report/domain/ReplyReportRepository.java diff --git a/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReport.java b/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReport.java new file mode 100644 index 00000000..9ba528dd --- /dev/null +++ b/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReport.java @@ -0,0 +1,43 @@ +package org.prgms.locomocoserver.report.domain; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.prgms.locomocoserver.global.common.BaseEntity; +import org.prgms.locomocoserver.replies.domain.Reply; +import org.prgms.locomocoserver.user.domain.User; + +@Entity +@Getter +@Table(name = "reply_reports") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ReplyReport extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "reporter_id") + private User reporter; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "reply_id") + Reply reply; + + @Column(name = "content") + private String content; + + @Builder + public ReplyReport(User reporter, Reply reply, String content) { + this.reporter = reporter; + this.reply = reply; + this.content = content; + } + + public void updateContent(String content) { + this.content = content; + } +} diff --git a/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReportRepository.java b/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReportRepository.java new file mode 100644 index 00000000..9dc32a8b --- /dev/null +++ b/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReportRepository.java @@ -0,0 +1,8 @@ +package org.prgms.locomocoserver.report.domain; + +import jakarta.persistence.Id; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ReplyReportRepository extends JpaRepository { + +} From bf92f453e8f06a883bd85773628bed1fd6831f02 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Tue, 16 Jul 2024 00:57:24 +0900 Subject: [PATCH 03/29] =?UTF-8?q?feat=20#218=20:=20reply=20report=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20dto=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/dto/ReplyReportDto.java | 13 +++++++++++++ .../dto/request/ReplyReportCreateRequest.java | 19 +++++++++++++++++++ .../dto/request/ReplyReportUpdateRequest.java | 4 ++++ 3 files changed, 36 insertions(+) create mode 100644 src/main/java/org/prgms/locomocoserver/report/dto/ReplyReportDto.java create mode 100644 src/main/java/org/prgms/locomocoserver/report/dto/request/ReplyReportCreateRequest.java create mode 100644 src/main/java/org/prgms/locomocoserver/report/dto/request/ReplyReportUpdateRequest.java diff --git a/src/main/java/org/prgms/locomocoserver/report/dto/ReplyReportDto.java b/src/main/java/org/prgms/locomocoserver/report/dto/ReplyReportDto.java new file mode 100644 index 00000000..2af95694 --- /dev/null +++ b/src/main/java/org/prgms/locomocoserver/report/dto/ReplyReportDto.java @@ -0,0 +1,13 @@ +package org.prgms.locomocoserver.report.dto; + +import org.prgms.locomocoserver.report.domain.ReplyReport; + +public record ReplyReportDto( + Long reporter, + Long replyId, + String content +) { + public static ReplyReportDto of(ReplyReport replyReport) { + return new ReplyReportDto(replyReport.getReporter().getId(), replyReport.getId(), replyReport.getContent()); + } +} diff --git a/src/main/java/org/prgms/locomocoserver/report/dto/request/ReplyReportCreateRequest.java b/src/main/java/org/prgms/locomocoserver/report/dto/request/ReplyReportCreateRequest.java new file mode 100644 index 00000000..28f8273b --- /dev/null +++ b/src/main/java/org/prgms/locomocoserver/report/dto/request/ReplyReportCreateRequest.java @@ -0,0 +1,19 @@ +package org.prgms.locomocoserver.report.dto.request; + +import org.prgms.locomocoserver.replies.domain.Reply; +import org.prgms.locomocoserver.report.domain.ReplyReport; +import org.prgms.locomocoserver.user.domain.User; + +public record ReplyReportCreateRequest( + Long replyId, + Long userId, + String content +) { + public static ReplyReport toEntity(User reporter, Reply reply, String content) { + return ReplyReport.builder() + .reporter(reporter) + .reply(reply) + .content(content) + .build(); + } +} diff --git a/src/main/java/org/prgms/locomocoserver/report/dto/request/ReplyReportUpdateRequest.java b/src/main/java/org/prgms/locomocoserver/report/dto/request/ReplyReportUpdateRequest.java new file mode 100644 index 00000000..09350a43 --- /dev/null +++ b/src/main/java/org/prgms/locomocoserver/report/dto/request/ReplyReportUpdateRequest.java @@ -0,0 +1,4 @@ +package org.prgms.locomocoserver.report.dto.request; + +public record ReplyReportUpdateRequest() { +} From cdcc80b7727547932ac01b880aa7029274027ef8 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Tue, 16 Jul 2024 00:57:45 +0900 Subject: [PATCH 04/29] =?UTF-8?q?feat=20#218=20:=20reply=20report=20servic?= =?UTF-8?q?e=20=EC=BD=94=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/ReplyReportService.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/main/java/org/prgms/locomocoserver/report/application/ReplyReportService.java diff --git a/src/main/java/org/prgms/locomocoserver/report/application/ReplyReportService.java b/src/main/java/org/prgms/locomocoserver/report/application/ReplyReportService.java new file mode 100644 index 00000000..fa5a2662 --- /dev/null +++ b/src/main/java/org/prgms/locomocoserver/report/application/ReplyReportService.java @@ -0,0 +1,32 @@ +package org.prgms.locomocoserver.report.application; + +import lombok.RequiredArgsConstructor; +import org.prgms.locomocoserver.replies.domain.Reply; +import org.prgms.locomocoserver.replies.domain.ReplyRepository; +import org.prgms.locomocoserver.report.domain.ReplyReport; +import org.prgms.locomocoserver.report.domain.ReplyReportRepository; +import org.prgms.locomocoserver.report.dto.ReplyReportDto; +import org.prgms.locomocoserver.report.dto.request.ReplyReportCreateRequest; +import org.prgms.locomocoserver.report.exception.ReportErrorType; +import org.prgms.locomocoserver.report.exception.ReportException; +import org.prgms.locomocoserver.user.application.UserService; +import org.prgms.locomocoserver.user.domain.User; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class ReplyReportService { + + private final ReplyReportRepository replyReportRepository; + private final UserService userService; + private final ReplyRepository replyRepository; + + public ReplyReportDto create(ReplyReportCreateRequest request) { + User reporter = userService.getById(request.userId()); + Reply reply = replyRepository.findByIdAndDeletedAtIsNotNull(request.replyId()) + .orElseThrow(() -> new ReportException(ReportErrorType.REPLY_NOT_FOUND)); + ReplyReport replyReport = replyReportRepository.save(request.toEntity(reporter, reply, request.content())); + + return ReplyReportDto.of(replyReport); + } +} From 815c25f19ea32ab2a8cc5c73f9c164a62d2b2433 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Tue, 16 Jul 2024 00:58:26 +0900 Subject: [PATCH 05/29] =?UTF-8?q?feat=20#218=20:=20reply=20soft=20delete?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgms/locomocoserver/replies/domain/ReplyRepository.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/prgms/locomocoserver/replies/domain/ReplyRepository.java b/src/main/java/org/prgms/locomocoserver/replies/domain/ReplyRepository.java index c004b5bc..37df35ae 100644 --- a/src/main/java/org/prgms/locomocoserver/replies/domain/ReplyRepository.java +++ b/src/main/java/org/prgms/locomocoserver/replies/domain/ReplyRepository.java @@ -2,6 +2,8 @@ import org.springframework.data.jpa.repository.JpaRepository; -public interface ReplyRepository extends JpaRepository { +import java.util.Optional; +public interface ReplyRepository extends JpaRepository { + Optional findByIdAndDeletedAtIsNotNull(Long id); } From 7da1be1785150b6fa625e5524316d711d7f20a49 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Tue, 16 Jul 2024 00:58:49 +0900 Subject: [PATCH 06/29] =?UTF-8?q?feat=20#218=20:=20reply=20report=20custom?= =?UTF-8?q?=20exception=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/exception/ReportErrorType.java | 16 ++++++++++++++++ .../report/exception/ReportException.java | 12 ++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/main/java/org/prgms/locomocoserver/report/exception/ReportErrorType.java create mode 100644 src/main/java/org/prgms/locomocoserver/report/exception/ReportException.java diff --git a/src/main/java/org/prgms/locomocoserver/report/exception/ReportErrorType.java b/src/main/java/org/prgms/locomocoserver/report/exception/ReportErrorType.java new file mode 100644 index 00000000..78de0ed1 --- /dev/null +++ b/src/main/java/org/prgms/locomocoserver/report/exception/ReportErrorType.java @@ -0,0 +1,16 @@ +package org.prgms.locomocoserver.report.exception; + +import org.springframework.http.HttpStatus; + +public enum ReportErrorType { + REPLY_NOT_FOUND(HttpStatus.NOT_FOUND, "신고할 댓글을 찾을 수 없습니다.") + ; + + private final HttpStatus httpStatus; + private final String message; + + ReportErrorType(HttpStatus httpStatus, String message) { + this.httpStatus = httpStatus; + this.message = message; + } +} diff --git a/src/main/java/org/prgms/locomocoserver/report/exception/ReportException.java b/src/main/java/org/prgms/locomocoserver/report/exception/ReportException.java new file mode 100644 index 00000000..d7e4ef32 --- /dev/null +++ b/src/main/java/org/prgms/locomocoserver/report/exception/ReportException.java @@ -0,0 +1,12 @@ +package org.prgms.locomocoserver.report.exception; + +import lombok.Getter; + +@Getter +public class ReportException extends RuntimeException{ + private final ReportErrorType errorType; + + public ReportException(ReportErrorType errorType) { + this.errorType = errorType; + } +} From 2313d4c63ea0ec05282aaa9027bef638cf84a3da Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Tue, 16 Jul 2024 01:01:09 +0900 Subject: [PATCH 07/29] =?UTF-8?q?feat=20#218=20:=20=EB=8C=93=EA=B8=80?= =?UTF-8?q?=EC=8B=A0=EA=B3=A0=20create=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ReplyReportController.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/main/java/org/prgms/locomocoserver/report/presentation/ReplyReportController.java diff --git a/src/main/java/org/prgms/locomocoserver/report/presentation/ReplyReportController.java b/src/main/java/org/prgms/locomocoserver/report/presentation/ReplyReportController.java new file mode 100644 index 00000000..7225efd0 --- /dev/null +++ b/src/main/java/org/prgms/locomocoserver/report/presentation/ReplyReportController.java @@ -0,0 +1,29 @@ +package org.prgms.locomocoserver.report.presentation; + +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.prgms.locomocoserver.report.application.ReplyReportService; +import org.prgms.locomocoserver.report.dto.ReplyReportDto; +import org.prgms.locomocoserver.report.dto.request.ReplyReportCreateRequest; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Tag(name = "Reply Report Controller", description = "댓글 신고 컨트롤러") +@RestController +@RequestMapping("/api/v1") +@RequiredArgsConstructor +public class ReplyReportController { + + private final ReplyReportService replyReportService; + + @PostMapping("/reply/reports") + public ResponseEntity create(@Valid @RequestBody ReplyReportCreateRequest request) { + ReplyReportDto replyReportDto = replyReportService.create(request); + return ResponseEntity.status(HttpStatus.CREATED).body(replyReportDto); + } +} From 23681484c6f77117beebce0d1fbcda9e95c413eb Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:17:34 +0900 Subject: [PATCH 08/29] =?UTF-8?q?feat=20#218=20:=20=EB=8C=93=EA=B8=80=20?= =?UTF-8?q?=EC=8B=A0=EA=B3=A0=20=EC=88=98=EC=A0=95=20api=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ReplyReportController.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/prgms/locomocoserver/report/presentation/ReplyReportController.java b/src/main/java/org/prgms/locomocoserver/report/presentation/ReplyReportController.java index 7225efd0..51f799c0 100644 --- a/src/main/java/org/prgms/locomocoserver/report/presentation/ReplyReportController.java +++ b/src/main/java/org/prgms/locomocoserver/report/presentation/ReplyReportController.java @@ -1,17 +1,16 @@ package org.prgms.locomocoserver.report.presentation; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.prgms.locomocoserver.report.application.ReplyReportService; import org.prgms.locomocoserver.report.dto.ReplyReportDto; import org.prgms.locomocoserver.report.dto.request.ReplyReportCreateRequest; +import org.prgms.locomocoserver.report.dto.request.ReplyReportUpdateRequest; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @Tag(name = "Reply Report Controller", description = "댓글 신고 컨트롤러") @RestController @@ -21,9 +20,18 @@ public class ReplyReportController { private final ReplyReportService replyReportService; - @PostMapping("/reply/reports") + @Operation(summary = "댓글 신고 생성", description = "댓글 신고를 생성합니다.") + @PostMapping("/reports/reply") public ResponseEntity create(@Valid @RequestBody ReplyReportCreateRequest request) { ReplyReportDto replyReportDto = replyReportService.create(request); return ResponseEntity.status(HttpStatus.CREATED).body(replyReportDto); } + + @Operation(summary = "댓글 신고 수정", description = "댓글 신고를 수정합니다.") + @PatchMapping("/reports/reply/{id}") + public ResponseEntity update(@PathVariable("reportId") Long id, + @Valid @RequestBody ReplyReportUpdateRequest request) { + ReplyReportDto replyReportDto = replyReportService.update(id, request); + return ResponseEntity.ok(replyReportDto); + } } From 6621e69295d80bf4d18877dc6d01074b61c881df Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:17:52 +0900 Subject: [PATCH 09/29] =?UTF-8?q?feat=20#218=20:=20=EB=8C=93=EA=B8=80?= =?UTF-8?q?=EC=8B=A0=EA=B3=A0=20=EC=88=98=EC=A0=95=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EC=BD=94=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/application/ReplyReportService.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/org/prgms/locomocoserver/report/application/ReplyReportService.java b/src/main/java/org/prgms/locomocoserver/report/application/ReplyReportService.java index fa5a2662..219213ae 100644 --- a/src/main/java/org/prgms/locomocoserver/report/application/ReplyReportService.java +++ b/src/main/java/org/prgms/locomocoserver/report/application/ReplyReportService.java @@ -5,13 +5,16 @@ import org.prgms.locomocoserver.replies.domain.ReplyRepository; import org.prgms.locomocoserver.report.domain.ReplyReport; import org.prgms.locomocoserver.report.domain.ReplyReportRepository; +import org.prgms.locomocoserver.report.domain.Report; import org.prgms.locomocoserver.report.dto.ReplyReportDto; import org.prgms.locomocoserver.report.dto.request.ReplyReportCreateRequest; +import org.prgms.locomocoserver.report.dto.request.ReplyReportUpdateRequest; import org.prgms.locomocoserver.report.exception.ReportErrorType; import org.prgms.locomocoserver.report.exception.ReportException; import org.prgms.locomocoserver.user.application.UserService; import org.prgms.locomocoserver.user.domain.User; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @@ -29,4 +32,17 @@ public ReplyReportDto create(ReplyReportCreateRequest request) { return ReplyReportDto.of(replyReport); } + + @Transactional + public ReplyReportDto update(Long id, ReplyReportUpdateRequest request) { + ReplyReport replyReport = getById(id); + replyReport.updateContent(request.content()); + + return ReplyReportDto.of(replyReport); + } + + private ReplyReport getById(Long id) { + return replyReportRepository.findById(id) + .orElseThrow(() -> new ReportException(ReportErrorType.REPORT_NOT_FOUND)); + } } From e56e695bbe85ea0759e94b9bcd204c25d10cf7d7 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:18:09 +0900 Subject: [PATCH 10/29] =?UTF-8?q?feat=20#218=20:=20=EB=8C=93=EA=B8=80=20?= =?UTF-8?q?=EC=8B=A0=EA=B3=A0=20=EC=A1=B0=ED=9A=8C=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../locomocoserver/report/domain/ReplyReportRepository.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReportRepository.java b/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReportRepository.java index 9dc32a8b..57b458d7 100644 --- a/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReportRepository.java +++ b/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReportRepository.java @@ -3,6 +3,8 @@ import jakarta.persistence.Id; import org.springframework.data.jpa.repository.JpaRepository; -public interface ReplyReportRepository extends JpaRepository { +import java.util.Optional; +public interface ReplyReportRepository extends JpaRepository { + Optional findById(Long id); } From 9f6d9e98930716bf4e888e7a608100bd33784eac Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:18:33 +0900 Subject: [PATCH 11/29] =?UTF-8?q?feat=20#218=20:=20=EB=8C=93=EA=B8=80=20?= =?UTF-8?q?=EC=8B=A0=EA=B3=A0=20update=20dto=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/dto/request/ReplyReportUpdateRequest.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/prgms/locomocoserver/report/dto/request/ReplyReportUpdateRequest.java b/src/main/java/org/prgms/locomocoserver/report/dto/request/ReplyReportUpdateRequest.java index 09350a43..cbfeb133 100644 --- a/src/main/java/org/prgms/locomocoserver/report/dto/request/ReplyReportUpdateRequest.java +++ b/src/main/java/org/prgms/locomocoserver/report/dto/request/ReplyReportUpdateRequest.java @@ -1,4 +1,9 @@ package org.prgms.locomocoserver.report.dto.request; -public record ReplyReportUpdateRequest() { +import jakarta.validation.constraints.NotBlank; + +public record ReplyReportUpdateRequest( + @NotBlank + String content +) { } From 4d123a628e515189278b5057b4048d337a35146a Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:18:51 +0900 Subject: [PATCH 12/29] =?UTF-8?q?feat=20#218=20:=20=EC=8B=A0=EA=B3=A0=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=ED=83=80=EC=9E=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgms/locomocoserver/report/exception/ReportErrorType.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/prgms/locomocoserver/report/exception/ReportErrorType.java b/src/main/java/org/prgms/locomocoserver/report/exception/ReportErrorType.java index 78de0ed1..f54e679f 100644 --- a/src/main/java/org/prgms/locomocoserver/report/exception/ReportErrorType.java +++ b/src/main/java/org/prgms/locomocoserver/report/exception/ReportErrorType.java @@ -3,7 +3,8 @@ import org.springframework.http.HttpStatus; public enum ReportErrorType { - REPLY_NOT_FOUND(HttpStatus.NOT_FOUND, "신고할 댓글을 찾을 수 없습니다.") + REPLY_NOT_FOUND(HttpStatus.NOT_FOUND, "신고할 댓글을 찾을 수 없습니다."), + REPORT_NOT_FOUND(HttpStatus.NOT_FOUND, "신고를 찾을 수 없습니다.") ; private final HttpStatus httpStatus; From 8fb739f0a8aa14714d6e7e789de7b7b1efffd231 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:34:13 +0900 Subject: [PATCH 13/29] =?UTF-8?q?feat=20#218=20:=20=EB=8C=93=EA=B8=80=20?= =?UTF-8?q?=EC=8B=A0=EA=B3=A0=20=EC=A1=B0=ED=9A=8C,=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=BD=94=EB=93=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/ReplyReportService.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/org/prgms/locomocoserver/report/application/ReplyReportService.java b/src/main/java/org/prgms/locomocoserver/report/application/ReplyReportService.java index 219213ae..f9468ce1 100644 --- a/src/main/java/org/prgms/locomocoserver/report/application/ReplyReportService.java +++ b/src/main/java/org/prgms/locomocoserver/report/application/ReplyReportService.java @@ -16,6 +16,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + @Service @RequiredArgsConstructor public class ReplyReportService { @@ -36,11 +38,28 @@ public ReplyReportDto create(ReplyReportCreateRequest request) { @Transactional public ReplyReportDto update(Long id, ReplyReportUpdateRequest request) { ReplyReport replyReport = getById(id); + + if(!replyReport.getReporter().getId().equals(request.reporterId())) { + throw new ReportException(ReportErrorType.AUTH_NOT_ALLOWED); + } replyReport.updateContent(request.content()); return ReplyReportDto.of(replyReport); } + @Transactional(readOnly = true) + public List getAllReplyReports(Long cursor, int pageSize) { + return replyReportRepository.findAllByDeletedAtIsNull(cursor, pageSize).stream() + .map(replyReport -> ReplyReportDto.of(replyReport)) + .toList(); + } + + @Transactional + public void delete(Long id) { + ReplyReport replyReport = getById(id); + replyReport.delete(); + } + private ReplyReport getById(Long id) { return replyReportRepository.findById(id) .orElseThrow(() -> new ReportException(ReportErrorType.REPORT_NOT_FOUND)); From 21f4f89c2213b6934034c699a14cc81c0cdcf02f Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:34:40 +0900 Subject: [PATCH 14/29] =?UTF-8?q?feat=20#218=20:=20=EB=8C=93=EA=B8=80=20?= =?UTF-8?q?=EC=8B=A0=EA=B3=A0=20=ED=8E=98=EC=9D=B4=EC=A7=80=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=A1=B0=ED=9A=8C=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EB=B0=8F=20=EC=BF=BC=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../locomocoserver/report/domain/ReplyReportRepository.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReportRepository.java b/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReportRepository.java index 57b458d7..ed191cd1 100644 --- a/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReportRepository.java +++ b/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReportRepository.java @@ -2,9 +2,13 @@ import jakarta.persistence.Id; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import java.util.List; import java.util.Optional; public interface ReplyReportRepository extends JpaRepository { Optional findById(Long id); + @Query(value = "SELECT * FROM reply_reports r WHERE r.deleted_at IS NULL AND r.id > :cursor ORDER BY r.id limit :pageSize", nativeQuery = true) + List findAllByDeletedAtIsNull(Long cursor, int pageSize); } From bf03301d49cae4ebe8d36b5e2206178d66cf213f Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:35:06 +0900 Subject: [PATCH 15/29] =?UTF-8?q?refactor=20#218=20:=20update=20dto=20repo?= =?UTF-8?q?rterId=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/dto/request/ReplyReportUpdateRequest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/prgms/locomocoserver/report/dto/request/ReplyReportUpdateRequest.java b/src/main/java/org/prgms/locomocoserver/report/dto/request/ReplyReportUpdateRequest.java index cbfeb133..6bb7a3af 100644 --- a/src/main/java/org/prgms/locomocoserver/report/dto/request/ReplyReportUpdateRequest.java +++ b/src/main/java/org/prgms/locomocoserver/report/dto/request/ReplyReportUpdateRequest.java @@ -1,8 +1,11 @@ package org.prgms.locomocoserver.report.dto.request; +import jakarta.annotation.Nonnull; import jakarta.validation.constraints.NotBlank; public record ReplyReportUpdateRequest( + @Nonnull + Long reporterId, @NotBlank String content ) { From 1dc75138e30804b72d128ee0ca3b9ea67fd110e3 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:35:30 +0900 Subject: [PATCH 16/29] =?UTF-8?q?feat=20#218=20:=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=8B=9C=20=EA=B6=8C=ED=95=9C=20=ED=99=95=EC=9D=B8=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=ED=83=80=EC=9E=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgms/locomocoserver/report/exception/ReportErrorType.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/prgms/locomocoserver/report/exception/ReportErrorType.java b/src/main/java/org/prgms/locomocoserver/report/exception/ReportErrorType.java index f54e679f..3ecba45f 100644 --- a/src/main/java/org/prgms/locomocoserver/report/exception/ReportErrorType.java +++ b/src/main/java/org/prgms/locomocoserver/report/exception/ReportErrorType.java @@ -4,7 +4,8 @@ public enum ReportErrorType { REPLY_NOT_FOUND(HttpStatus.NOT_FOUND, "신고할 댓글을 찾을 수 없습니다."), - REPORT_NOT_FOUND(HttpStatus.NOT_FOUND, "신고를 찾을 수 없습니다.") + REPORT_NOT_FOUND(HttpStatus.NOT_FOUND, "신고를 찾을 수 없습니다."), + AUTH_NOT_ALLOWED(HttpStatus.UNAUTHORIZED, "작성자만 수정가능합니다.") ; private final HttpStatus httpStatus; From 3a56246aa51a1954eb2edc1689f7eed89529e3d5 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:35:50 +0900 Subject: [PATCH 17/29] =?UTF-8?q?feat=20#218=20:=20=EB=8C=93=EA=B8=80=20?= =?UTF-8?q?=EC=8B=A0=EA=B3=A0=20=EC=A1=B0=ED=9A=8C,=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?=20api=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ReplyReportController.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/org/prgms/locomocoserver/report/presentation/ReplyReportController.java b/src/main/java/org/prgms/locomocoserver/report/presentation/ReplyReportController.java index 51f799c0..fc970a36 100644 --- a/src/main/java/org/prgms/locomocoserver/report/presentation/ReplyReportController.java +++ b/src/main/java/org/prgms/locomocoserver/report/presentation/ReplyReportController.java @@ -12,6 +12,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; + @Tag(name = "Reply Report Controller", description = "댓글 신고 컨트롤러") @RestController @RequestMapping("/api/v1") @@ -34,4 +36,19 @@ public ResponseEntity update(@PathVariable("reportId") Long id, ReplyReportDto replyReportDto = replyReportService.update(id, request); return ResponseEntity.ok(replyReportDto); } + + @Operation(summary = "댓글 신고 조회", description = "전체 댓글 신고 목록을 조회합니다.") + @GetMapping("/reports/reply") + public ResponseEntity> getAllReplyReports(@RequestParam(required = false, defaultValue = "0") Long cursor, + @RequestParam(defaultValue = "10") int pageSize) { + List replyReportDtos = replyReportService.getAllReplyReports(cursor, pageSize); + return ResponseEntity.ok(replyReportDtos); + } + + @Operation(summary = "댓글 신고 삭제", description = "댓글 신고를 삭제합니다.") + @DeleteMapping("/reports/reply/{id}") + public ResponseEntity delete(@PathVariable("reportId") Long id) { + replyReportService.delete(id); + return ResponseEntity.noContent().build(); + } } From 8a71fecb4ab51ee4486c3cea8065dcf24dc08a02 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Wed, 17 Jul 2024 23:50:21 +0900 Subject: [PATCH 18/29] =?UTF-8?q?fix=20#218=20:=20reply=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/prgms/locomocoserver/replies/domain/Reply.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/prgms/locomocoserver/replies/domain/Reply.java b/src/main/java/org/prgms/locomocoserver/replies/domain/Reply.java index 4ba8d7cf..061339ee 100644 --- a/src/main/java/org/prgms/locomocoserver/replies/domain/Reply.java +++ b/src/main/java/org/prgms/locomocoserver/replies/domain/Reply.java @@ -19,7 +19,7 @@ @Entity @Getter -@Table(name = "mogakko") +@Table(name = "replies") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Reply extends BaseEntity { From 141711a1489fceb26d8d2b36c2aa5f3c1bbce7d5 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Wed, 17 Jul 2024 23:50:38 +0900 Subject: [PATCH 19/29] =?UTF-8?q?fix=20#218=20:=20soft=20delete=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/ReplyReportServiceTest.java | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 src/test/java/org/prgms/locomocoserver/report/application/ReplyReportServiceTest.java diff --git a/src/test/java/org/prgms/locomocoserver/report/application/ReplyReportServiceTest.java b/src/test/java/org/prgms/locomocoserver/report/application/ReplyReportServiceTest.java new file mode 100644 index 00000000..72083111 --- /dev/null +++ b/src/test/java/org/prgms/locomocoserver/report/application/ReplyReportServiceTest.java @@ -0,0 +1,122 @@ +package org.prgms.locomocoserver.report.application; + +import org.junit.jupiter.api.*; +import org.prgms.locomocoserver.chat.domain.ChatRoomRepository; +import org.prgms.locomocoserver.global.TestFactory; +import org.prgms.locomocoserver.image.domain.ImageRepository; +import org.prgms.locomocoserver.inquiries.domain.Inquiry; +import org.prgms.locomocoserver.inquiries.domain.InquiryRepository; +import org.prgms.locomocoserver.mogakkos.domain.Mogakko; +import org.prgms.locomocoserver.mogakkos.domain.MogakkoRepository; +import org.prgms.locomocoserver.replies.domain.Reply; +import org.prgms.locomocoserver.replies.domain.ReplyRepository; +import org.prgms.locomocoserver.report.domain.ReplyReportRepository; +import org.prgms.locomocoserver.report.dto.ReplyReportDto; +import org.prgms.locomocoserver.report.dto.request.ReplyReportCreateRequest; +import org.prgms.locomocoserver.report.dto.request.ReplyReportUpdateRequest; +import org.prgms.locomocoserver.report.exception.ReportException; +import org.prgms.locomocoserver.user.domain.User; +import org.prgms.locomocoserver.user.domain.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class ReplyReportServiceTest { + + @Autowired + private ReplyReportService replyReportService; + + @Autowired + private UserRepository userRepository; + @Autowired + private ImageRepository imageRepository; + @Autowired + private ReplyRepository replyRepository; + @Autowired + private MogakkoRepository mogakkoRepository; + @Autowired + private InquiryRepository inquiryRepository; + @Autowired + private ReplyReportRepository replyReportRepository; + @Autowired + private ChatRoomRepository chatRoomRepository; + + private User user; + private Reply reply; + private Inquiry inquiry; + private Mogakko mogakko; + + @BeforeEach + void setUp() { + User newUser = TestFactory.createUser(); + imageRepository.save(newUser.getProfileImage()); + user = userRepository.save(newUser); + + mogakko = mogakkoRepository.save(TestFactory.createMogakko(user)); + inquiry = inquiryRepository.save(TestFactory.createInquiry(user, mogakko)); + reply = replyRepository.save(TestFactory.createReply(user, inquiry)); + } + + @AfterEach + void tearDown() { + replyReportRepository.deleteAll(); + replyRepository.deleteAll(); + inquiryRepository.deleteAll(); + chatRoomRepository.deleteAll(); + mogakkoRepository.deleteAll(); + userRepository.deleteAll(); + imageRepository.deleteAll(); + } + + @Test + @DisplayName("댓글을 신고할 수 있습니다.") + void testCreateReplyReport() { + ReplyReportCreateRequest request = new ReplyReportCreateRequest(reply.getId(), user.getId(), "Test content"); + ReplyReportDto replyReportDto = replyReportService.create(request); + + assertNotNull(replyReportDto); + assertEquals("Test content", replyReportDto.content()); + } + + @Test + @DisplayName("댓글을 신고한 내용을 수정할 수 있습니다.") + void testUpdateReplyReport() { + ReplyReportCreateRequest createRequest = new ReplyReportCreateRequest(reply.getId(), user.getId(), "Initial content"); + ReplyReportDto createdReport = replyReportService.create(createRequest); + + ReplyReportUpdateRequest updateRequest = new ReplyReportUpdateRequest(user.getId(), "Updated content"); + ReplyReportDto updatedReport = replyReportService.update(createdReport.replyId(), updateRequest); + + assertNotNull(updatedReport); + assertEquals("Updated content", updatedReport.content()); + } + + @Test + @DisplayName("댓글 신고 목록을 조회할 수 있습니다.") + void testGetReplyReport() { + ReplyReportCreateRequest request = new ReplyReportCreateRequest(reply.getId(), user.getId(), "Test content"); + replyReportService.create(request); + + List replyReports = replyReportService.getAllReplyReports(0L, 10); + + assertNotNull(replyReports); + assertEquals(1, replyReports.size()); + } + + @Test + @DisplayName("댓글 신고한 내역을 삭제할 수 있습니다.") + void testDeleteReplyReport() { + ReplyReportCreateRequest request = new ReplyReportCreateRequest(reply.getId(), user.getId(), "Test content"); + ReplyReportDto createdReport = replyReportService.create(request); + + replyReportService.delete(createdReport.id()); + + assertThrows(ReportException.class, () -> replyReportService.getById(createdReport.id())); + } +} From e0ca89029f9ab61614354ca3e7a88382513c75a1 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Wed, 17 Jul 2024 23:51:19 +0900 Subject: [PATCH 20/29] =?UTF-8?q?feat=20#218=20:=20TestFactory=20inquiry,?= =?UTF-8?q?=20reply=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../locomocoserver/global/TestFactory.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/test/java/org/prgms/locomocoserver/global/TestFactory.java b/src/test/java/org/prgms/locomocoserver/global/TestFactory.java index 87135d52..cdba225f 100644 --- a/src/test/java/org/prgms/locomocoserver/global/TestFactory.java +++ b/src/test/java/org/prgms/locomocoserver/global/TestFactory.java @@ -5,7 +5,9 @@ import org.prgms.locomocoserver.categories.domain.CategoryType; import org.prgms.locomocoserver.chat.domain.ChatRoom; import org.prgms.locomocoserver.image.domain.Image; +import org.prgms.locomocoserver.inquiries.domain.Inquiry; import org.prgms.locomocoserver.mogakkos.domain.Mogakko; +import org.prgms.locomocoserver.replies.domain.Reply; import org.prgms.locomocoserver.tags.domain.Tag; import org.prgms.locomocoserver.user.domain.User; import org.prgms.locomocoserver.user.domain.enums.Gender; @@ -72,4 +74,20 @@ public static Mogakko createMogakko(User creator) { .likeCount(0) .build(); } + + public static Inquiry createInquiry(User user, Mogakko mogakko) { + return Inquiry.builder() + .user(user) + .content("test inqury content") + .mogakko(mogakko) + .build(); + } + + public static Reply createReply(User user, Inquiry inquiry) { + return Reply.builder() + .user(user) + .inquiry(inquiry) + .content("test reply content") + .build(); + } } From 7d3ed74ab9b600890859173d5146e76807d4f653 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Wed, 17 Jul 2024 23:52:10 +0900 Subject: [PATCH 21/29] =?UTF-8?q?refactor=20#218=20:=20replyReportDto=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20id=EA=B0=92?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/prgms/locomocoserver/report/dto/ReplyReportDto.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/prgms/locomocoserver/report/dto/ReplyReportDto.java b/src/main/java/org/prgms/locomocoserver/report/dto/ReplyReportDto.java index 2af95694..ff602513 100644 --- a/src/main/java/org/prgms/locomocoserver/report/dto/ReplyReportDto.java +++ b/src/main/java/org/prgms/locomocoserver/report/dto/ReplyReportDto.java @@ -3,11 +3,12 @@ import org.prgms.locomocoserver.report.domain.ReplyReport; public record ReplyReportDto( + Long id, Long reporter, Long replyId, String content ) { public static ReplyReportDto of(ReplyReport replyReport) { - return new ReplyReportDto(replyReport.getReporter().getId(), replyReport.getId(), replyReport.getContent()); + return new ReplyReportDto(replyReport.getId(), replyReport.getReporter().getId(), replyReport.getId(), replyReport.getContent()); } } From 478f43414af24ba7cf999b0e1c2436e04e1835b6 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Wed, 17 Jul 2024 23:52:55 +0900 Subject: [PATCH 22/29] =?UTF-8?q?fix=20#218=20:=20soft=20delete=20?= =?UTF-8?q?=EC=9E=98=EB=AA=BB=20=EB=93=A4=EC=96=B4=EA=B0=84=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/prgms/locomocoserver/report/domain/ReplyReport.java | 3 ++- .../locomocoserver/report/domain/ReplyReportRepository.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReport.java b/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReport.java index 9ba528dd..8878c10b 100644 --- a/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReport.java +++ b/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReport.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; import org.prgms.locomocoserver.global.common.BaseEntity; import org.prgms.locomocoserver.replies.domain.Reply; import org.prgms.locomocoserver.user.domain.User; @@ -25,7 +26,7 @@ public class ReplyReport extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "reply_id") - Reply reply; + private Reply reply; @Column(name = "content") private String content; diff --git a/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReportRepository.java b/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReportRepository.java index ed191cd1..d99075e3 100644 --- a/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReportRepository.java +++ b/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReportRepository.java @@ -8,7 +8,7 @@ import java.util.Optional; public interface ReplyReportRepository extends JpaRepository { - Optional findById(Long id); + Optional findByIdAndDeletedAtIsNull(Long id); @Query(value = "SELECT * FROM reply_reports r WHERE r.deleted_at IS NULL AND r.id > :cursor ORDER BY r.id limit :pageSize", nativeQuery = true) List findAllByDeletedAtIsNull(Long cursor, int pageSize); } From 5c7a9f987fe3cb6c7e40c0d72938f6343166083d Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Wed, 17 Jul 2024 23:53:42 +0900 Subject: [PATCH 23/29] =?UTF-8?q?fix=20#218=20:=20soft=20delete=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../locomocoserver/replies/domain/ReplyRepository.java | 2 +- .../report/application/ReplyReportService.java | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/prgms/locomocoserver/replies/domain/ReplyRepository.java b/src/main/java/org/prgms/locomocoserver/replies/domain/ReplyRepository.java index 37df35ae..f01cb89c 100644 --- a/src/main/java/org/prgms/locomocoserver/replies/domain/ReplyRepository.java +++ b/src/main/java/org/prgms/locomocoserver/replies/domain/ReplyRepository.java @@ -5,5 +5,5 @@ import java.util.Optional; public interface ReplyRepository extends JpaRepository { - Optional findByIdAndDeletedAtIsNotNull(Long id); + Optional findByIdAndDeletedAtIsNull(Long id); } diff --git a/src/main/java/org/prgms/locomocoserver/report/application/ReplyReportService.java b/src/main/java/org/prgms/locomocoserver/report/application/ReplyReportService.java index f9468ce1..7cd58381 100644 --- a/src/main/java/org/prgms/locomocoserver/report/application/ReplyReportService.java +++ b/src/main/java/org/prgms/locomocoserver/report/application/ReplyReportService.java @@ -28,7 +28,7 @@ public class ReplyReportService { public ReplyReportDto create(ReplyReportCreateRequest request) { User reporter = userService.getById(request.userId()); - Reply reply = replyRepository.findByIdAndDeletedAtIsNotNull(request.replyId()) + Reply reply = replyRepository.findByIdAndDeletedAtIsNull(request.replyId()) .orElseThrow(() -> new ReportException(ReportErrorType.REPLY_NOT_FOUND)); ReplyReport replyReport = replyReportRepository.save(request.toEntity(reporter, reply, request.content())); @@ -60,8 +60,9 @@ public void delete(Long id) { replyReport.delete(); } - private ReplyReport getById(Long id) { - return replyReportRepository.findById(id) + @Transactional(readOnly = true) + public ReplyReport getById(Long id) { + return replyReportRepository.findByIdAndDeletedAtIsNull(id) .orElseThrow(() -> new ReportException(ReportErrorType.REPORT_NOT_FOUND)); } } From 646a31d03383c0033cd83bfe3ce9177e8c05bc90 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:34:46 +0900 Subject: [PATCH 24/29] =?UTF-8?q?refactor=20#219=20:=20Report=20=EC=B6=94?= =?UTF-8?q?=EC=83=81=ED=99=94=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/common/BaseEntity.java | 1 + .../locomocoserver/report/domain/Report.java | 48 ++++++++++++++----- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/prgms/locomocoserver/global/common/BaseEntity.java b/src/main/java/org/prgms/locomocoserver/global/common/BaseEntity.java index c052668a..b3f1e9b5 100644 --- a/src/main/java/org/prgms/locomocoserver/global/common/BaseEntity.java +++ b/src/main/java/org/prgms/locomocoserver/global/common/BaseEntity.java @@ -4,6 +4,7 @@ import jakarta.persistence.EntityListeners; import jakarta.persistence.MappedSuperclass; import lombok.Getter; +import lombok.experimental.SuperBuilder; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; diff --git a/src/main/java/org/prgms/locomocoserver/report/domain/Report.java b/src/main/java/org/prgms/locomocoserver/report/domain/Report.java index cae3b473..8e08c552 100644 --- a/src/main/java/org/prgms/locomocoserver/report/domain/Report.java +++ b/src/main/java/org/prgms/locomocoserver/report/domain/Report.java @@ -5,14 +5,21 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; import org.prgms.locomocoserver.global.common.BaseEntity; import org.prgms.locomocoserver.user.domain.User; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDate; +import java.time.LocalDateTime; -@Entity @Getter -@Table(name = "reports") +@SuperBuilder +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Report extends BaseEntity { +public abstract class Report { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -20,22 +27,41 @@ public class Report extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "reporter_id") - User reporter; - - @Column(name = "reported_id") - Long reportedId; + private User reporter; @Column(name = "content") - String content; + private String content; + + @CreatedDate + @Column(name = "created_at") + private LocalDateTime createdAt; - @Builder - public Report(User reporter, Long reportedId, String content) { + @Column(name = "updated_at") + private LocalDateTime updatedAt; + + @Column(name = "deleted_at") + private LocalDateTime deletedAt; + + public Report(User reporter, String content) { this.reporter = reporter; - this.reportedId = reportedId; this.content = content; } + public boolean isDeleted() { + return this.deletedAt != null; + } + + public void delete() { + if (isDeleted()) throw new IllegalArgumentException("이미 삭제된 엔티티 입니다."); + this.deletedAt = LocalDateTime.now(); + } + + public void updateUpdatedAt() { + this.updatedAt = LocalDateTime.now(); + } + public void updateContent(String content) { this.content = content; + this.updateUpdatedAt(); } } From 2dc1b89e0d7169f3b25701e7322f8d31b084a0b8 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:35:19 +0900 Subject: [PATCH 25/29] =?UTF-8?q?refactor=20#219=20:=20=EA=B8=B0=EC=A1=B4?= =?UTF-8?q?=20report=20=EB=8F=84=EB=A9=94=EC=9D=B8=20UserReport=20?= =?UTF-8?q?=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/domain/UserReport.java | 27 +++++++++++++++++++ ...ository.java => UserReportRepository.java} | 6 ++--- 2 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/prgms/locomocoserver/report/domain/UserReport.java rename src/main/java/org/prgms/locomocoserver/report/domain/{ReportRepository.java => UserReportRepository.java} (62%) diff --git a/src/main/java/org/prgms/locomocoserver/report/domain/UserReport.java b/src/main/java/org/prgms/locomocoserver/report/domain/UserReport.java new file mode 100644 index 00000000..4f1ebfd1 --- /dev/null +++ b/src/main/java/org/prgms/locomocoserver/report/domain/UserReport.java @@ -0,0 +1,27 @@ +package org.prgms.locomocoserver.report.domain; + +import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.prgms.locomocoserver.user.domain.User; + +@Entity +@Getter +@SuperBuilder +@Table(name = "user_reports") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class UserReport extends Report { + + @ManyToOne + @JoinColumn(name = "reported_id") + private User reportedUser; + + public UserReport(User reportedUser) { + this.reportedUser = reportedUser; + } +} diff --git a/src/main/java/org/prgms/locomocoserver/report/domain/ReportRepository.java b/src/main/java/org/prgms/locomocoserver/report/domain/UserReportRepository.java similarity index 62% rename from src/main/java/org/prgms/locomocoserver/report/domain/ReportRepository.java rename to src/main/java/org/prgms/locomocoserver/report/domain/UserReportRepository.java index 5972e62e..a23eb4d3 100644 --- a/src/main/java/org/prgms/locomocoserver/report/domain/ReportRepository.java +++ b/src/main/java/org/prgms/locomocoserver/report/domain/UserReportRepository.java @@ -6,8 +6,8 @@ import java.util.List; import java.util.Optional; -public interface ReportRepository extends JpaRepository { - Optional findByIdAndDeletedAtIsNull(Long id); +public interface UserReportRepository extends JpaRepository { + Optional findByIdAndDeletedAtIsNull(Long id); @Query(value = "SELECT * FROM reports r WHERE r.deleted_at IS NULL AND r.id > :cursor ORDER BY r.id limit :pageSize", nativeQuery = true) - List findAllByDeletedAtIsNull(Long cursor, int pageSize); + List findAllByDeletedAtIsNull(Long cursor, int pageSize); } From 2e79b9ff07a29d16b22c7ec44e9f30b7b2fac24b Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:37:10 +0900 Subject: [PATCH 26/29] =?UTF-8?q?refactor=20#219=20:=20replyReport=20?= =?UTF-8?q?=EC=83=81=EC=86=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/domain/ReplyReport.java | 30 +++++-------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReport.java b/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReport.java index 8878c10b..ee0617b4 100644 --- a/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReport.java +++ b/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReport.java @@ -1,44 +1,28 @@ package org.prgms.locomocoserver.report.domain; -import jakarta.persistence.*; +import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import lombok.AccessLevel; -import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; -import org.prgms.locomocoserver.global.common.BaseEntity; import org.prgms.locomocoserver.replies.domain.Reply; import org.prgms.locomocoserver.user.domain.User; @Entity @Getter +@SuperBuilder @Table(name = "reply_reports") @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class ReplyReport extends BaseEntity { +public class ReplyReport extends Report { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "reporter_id") - private User reporter; - - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne @JoinColumn(name = "reply_id") private Reply reply; - @Column(name = "content") - private String content; - - @Builder public ReplyReport(User reporter, Reply reply, String content) { - this.reporter = reporter; this.reply = reply; - this.content = content; - } - - public void updateContent(String content) { - this.content = content; } } From 6f8452d750b7198808e40d164338603d0d3a5c16 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:37:37 +0900 Subject: [PATCH 27/29] =?UTF-8?q?refactor=20#219=20:=20=EA=B8=B0=EC=A1=B4?= =?UTF-8?q?=20dto=20=ED=95=84=EB=93=9C=EA=B0=92=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/prgms/locomocoserver/report/dto/ReportDto.java | 2 -- .../report/dto/request/ReportCreateRequest.java | 7 ++++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/prgms/locomocoserver/report/dto/ReportDto.java b/src/main/java/org/prgms/locomocoserver/report/dto/ReportDto.java index f2573875..134ac1e5 100644 --- a/src/main/java/org/prgms/locomocoserver/report/dto/ReportDto.java +++ b/src/main/java/org/prgms/locomocoserver/report/dto/ReportDto.java @@ -7,7 +7,6 @@ public record ReportDto( @Schema(description = "신고 id") Long reportId, @Schema(description = "신고자 id") Long reporterId, - @Schema(description = "신고 당한 사람 id") Long reportedId, @Schema(description = "신고 당한 사람 닉네임") String reportedNickname, @Schema(description = "신고 내용") String content ) { @@ -15,7 +14,6 @@ public static ReportDto of(Report report, User reported) { return new ReportDto( report.getId(), report.getReporter().getId(), - report.getReportedId(), reported.getNickname(), report.getContent() ); diff --git a/src/main/java/org/prgms/locomocoserver/report/dto/request/ReportCreateRequest.java b/src/main/java/org/prgms/locomocoserver/report/dto/request/ReportCreateRequest.java index 44a4b0b7..796b3339 100644 --- a/src/main/java/org/prgms/locomocoserver/report/dto/request/ReportCreateRequest.java +++ b/src/main/java/org/prgms/locomocoserver/report/dto/request/ReportCreateRequest.java @@ -3,6 +3,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.NonNull; import org.prgms.locomocoserver.report.domain.Report; +import org.prgms.locomocoserver.report.domain.UserReport; import org.prgms.locomocoserver.user.domain.User; public record ReportCreateRequest( @@ -13,10 +14,10 @@ public record ReportCreateRequest( @Schema(description = "신고 내용") String content ) { - public Report toEntity(User reporter) { - return Report.builder() + public UserReport toEntity(User reporter, User reported) { + return UserReport.builder() .reporter(reporter) - .reportedId(reportedId) + .reportedUser(reported) .content(content).build(); } } From b4f7fb5f052773ee80725d6adeb8b462724e0052 Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:38:19 +0900 Subject: [PATCH 28/29] =?UTF-8?q?refactor=20#219=20:=20=EA=B8=B0=EC=A1=B4?= =?UTF-8?q?=20Report=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/application/ReportService.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/prgms/locomocoserver/report/application/ReportService.java b/src/main/java/org/prgms/locomocoserver/report/application/ReportService.java index dd61135e..5d65f3e7 100644 --- a/src/main/java/org/prgms/locomocoserver/report/application/ReportService.java +++ b/src/main/java/org/prgms/locomocoserver/report/application/ReportService.java @@ -2,7 +2,8 @@ import lombok.RequiredArgsConstructor; import org.prgms.locomocoserver.report.domain.Report; -import org.prgms.locomocoserver.report.domain.ReportRepository; +import org.prgms.locomocoserver.report.domain.UserReport; +import org.prgms.locomocoserver.report.domain.UserReportRepository; import org.prgms.locomocoserver.report.dto.ReportDto; import org.prgms.locomocoserver.report.dto.request.ReportCreateRequest; import org.prgms.locomocoserver.report.dto.request.ReportUpdateRequest; @@ -20,23 +21,23 @@ @RequiredArgsConstructor public class ReportService { - private final ReportRepository reportRepository; + private final UserReportRepository userReportRepository; private final UserService userService; private final UserRepository userRepository; public ReportDto create(ReportCreateRequest request) { User reporter = userService.getById(request.reporterId()); User reported = userService.getById(request.reportedId()); - Report report = reportRepository.save(request.toEntity(reporter)); + Report report = userReportRepository.save(request.toEntity(reporter, reported)); return ReportDto.of(report, reported); } @Transactional public ReportDto update(Long id, ReportUpdateRequest request) { - Report report = getById(id); + UserReport report = getById(id); report.updateContent(request.content()); - User reported = userService.getById(report.getReportedId()); + User reported = userService.getById(report.getReportedUser().getId()); return ReportDto.of(report, reported); } @@ -44,9 +45,9 @@ public ReportDto update(Long id, ReportUpdateRequest request) { @Transactional(readOnly = true) public List getAllReports(Long cursor, int pageSize) { if (cursor == null) cursor = 0L; - return reportRepository.findAllByDeletedAtIsNull(cursor, pageSize).stream() + return userReportRepository.findAllByDeletedAtIsNull(cursor, pageSize).stream() .map(report -> { - User reported = userRepository.findById(report.getReportedId()) + User reported = userRepository.findById(report.getReportedUser().getId()) .orElseThrow(() -> new UserException(UserErrorType.USER_NOT_FOUND)); return ReportDto.of(report, reported); }) @@ -54,12 +55,12 @@ public List getAllReports(Long cursor, int pageSize) { } public void delete(Long id) { - Report report = getById(id); - reportRepository.delete(report); + UserReport report = getById(id); + userReportRepository.delete(report); } - private Report getById(Long id) { - return reportRepository.findByIdAndDeletedAtIsNull(id) + private UserReport getById(Long id) { + return userReportRepository.findByIdAndDeletedAtIsNull(id) .orElseThrow(() -> new IllegalArgumentException("Report Not Found [id]: " + id)); } } From aff3ed304c2804e1307f49fe3c3662fb19607c5a Mon Sep 17 00:00:00 2001 From: eugene <81062608+eugene225@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:38:57 +0900 Subject: [PATCH 29/29] =?UTF-8?q?docs=20#219=20:=20import=20=EA=B5=AC?= =?UTF-8?q?=EB=AC=B8=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/application/ReplyReportServiceTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/prgms/locomocoserver/report/application/ReplyReportServiceTest.java b/src/test/java/org/prgms/locomocoserver/report/application/ReplyReportServiceTest.java index 72083111..cb651c10 100644 --- a/src/test/java/org/prgms/locomocoserver/report/application/ReplyReportServiceTest.java +++ b/src/test/java/org/prgms/locomocoserver/report/application/ReplyReportServiceTest.java @@ -19,7 +19,6 @@ import org.prgms.locomocoserver.user.domain.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.transaction.annotation.Transactional; import java.util.List;