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 c29a7656..1b226309 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/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 { 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..f01cb89c 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 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 new file mode 100644 index 00000000..7cd58381 --- /dev/null +++ b/src/main/java/org/prgms/locomocoserver/report/application/ReplyReportService.java @@ -0,0 +1,68 @@ +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.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; + +import java.util.List; + +@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.findByIdAndDeletedAtIsNull(request.replyId()) + .orElseThrow(() -> new ReportException(ReportErrorType.REPLY_NOT_FOUND)); + ReplyReport replyReport = replyReportRepository.save(request.toEntity(reporter, reply, request.content())); + + return ReplyReportDto.of(replyReport); + } + + @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(); + } + + @Transactional(readOnly = true) + public ReplyReport getById(Long id) { + return replyReportRepository.findByIdAndDeletedAtIsNull(id) + .orElseThrow(() -> new ReportException(ReportErrorType.REPORT_NOT_FOUND)); + } +} 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)); } } 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..ee0617b4 --- /dev/null +++ b/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReport.java @@ -0,0 +1,28 @@ +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.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 Report { + + @ManyToOne + @JoinColumn(name = "reply_id") + private Reply reply; + + public ReplyReport(User reporter, Reply reply, String content) { + this.reply = reply; + } +} 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..d99075e3 --- /dev/null +++ b/src/main/java/org/prgms/locomocoserver/report/domain/ReplyReportRepository.java @@ -0,0 +1,14 @@ +package org.prgms.locomocoserver.report.domain; + +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 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); +} 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 85dd0d41..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,21 +27,39 @@ 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(); 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); } 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..ff602513 --- /dev/null +++ b/src/main/java/org/prgms/locomocoserver/report/dto/ReplyReportDto.java @@ -0,0 +1,14 @@ +package org.prgms.locomocoserver.report.dto; + +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.getId(), replyReport.getReporter().getId(), replyReport.getId(), replyReport.getContent()); + } +} 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/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..6bb7a3af --- /dev/null +++ b/src/main/java/org/prgms/locomocoserver/report/dto/request/ReplyReportUpdateRequest.java @@ -0,0 +1,12 @@ +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 +) { +} 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(); } } 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..3ecba45f --- /dev/null +++ b/src/main/java/org/prgms/locomocoserver/report/exception/ReportErrorType.java @@ -0,0 +1,18 @@ +package org.prgms.locomocoserver.report.exception; + +import org.springframework.http.HttpStatus; + +public enum ReportErrorType { + REPLY_NOT_FOUND(HttpStatus.NOT_FOUND, "신고할 댓글을 찾을 수 없습니다."), + REPORT_NOT_FOUND(HttpStatus.NOT_FOUND, "신고를 찾을 수 없습니다."), + AUTH_NOT_ALLOWED(HttpStatus.UNAUTHORIZED, "작성자만 수정가능합니다.") + ; + + 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; + } +} 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..fc970a36 --- /dev/null +++ b/src/main/java/org/prgms/locomocoserver/report/presentation/ReplyReportController.java @@ -0,0 +1,54 @@ +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.*; + +import java.util.List; + +@Tag(name = "Reply Report Controller", description = "댓글 신고 컨트롤러") +@RestController +@RequestMapping("/api/v1") +@RequiredArgsConstructor +public class ReplyReportController { + + private final ReplyReportService replyReportService; + + @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); + } + + @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(); + } +} diff --git a/src/test/java/org/prgms/locomocoserver/global/TestFactory.java b/src/test/java/org/prgms/locomocoserver/global/TestFactory.java index c1495e52..e2776082 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; @@ -73,4 +75,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(); + } } 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..cb651c10 --- /dev/null +++ b/src/test/java/org/prgms/locomocoserver/report/application/ReplyReportServiceTest.java @@ -0,0 +1,121 @@ +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 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())); + } +}