Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
ff32a06
refactor #218 : reply baseEntity 상속
eugene225 Jul 15, 2024
d825e48
feat #218 : reply report 도메인 생성
eugene225 Jul 15, 2024
bf92f45
feat #218 : reply report 관련 dto 생성
eugene225 Jul 15, 2024
cdcc80b
feat #218 : reply report service 코드 구현
eugene225 Jul 15, 2024
815c25f
feat #218 : reply soft delete 조회 메서드 추가
eugene225 Jul 15, 2024
7da1be1
feat #218 : reply report custom exception 구현
eugene225 Jul 15, 2024
2313d4c
feat #218 : 댓글신고 create 컨트롤러 코드 작성
eugene225 Jul 15, 2024
2368148
feat #218 : 댓글 신고 수정 api 추가
eugene225 Jul 17, 2024
6621e69
feat #218 : 댓글신고 수정 서비스 코드 구현
eugene225 Jul 17, 2024
e56e695
feat #218 : 댓글 신고 조회 메서드 추가
eugene225 Jul 17, 2024
9f6d9e9
feat #218 : 댓글 신고 update dto 추가
eugene225 Jul 17, 2024
4d123a6
feat #218 : 신고 에러타입 추가
eugene225 Jul 17, 2024
8fb739f
feat #218 : 댓글 신고 조회, 삭제 서비스 코드 구현
eugene225 Jul 17, 2024
21f4f89
feat #218 : 댓글 신고 페이지네이션 조회 메서드 및 쿼리 추가
eugene225 Jul 17, 2024
bf03301
refactor #218 : update dto reporterId 추가
eugene225 Jul 17, 2024
1dc7513
feat #218 : 수정시 권한 확인 에러타입 추가
eugene225 Jul 17, 2024
3a56246
feat #218 : 댓글 신고 조회, 삭제 api 추가
eugene225 Jul 17, 2024
8a71fec
fix #218 : reply 테이블 명 수정
eugene225 Jul 17, 2024
141711a
fix #218 : soft delete 메서드 수정
eugene225 Jul 17, 2024
e0ca890
feat #218 : TestFactory inquiry, reply 메서드 추가
eugene225 Jul 17, 2024
7d3ed74
refactor #218 : replyReportDto 반환 데이터 id값 추가
eugene225 Jul 17, 2024
478f434
fix #218 : soft delete 잘못 들어간 메서드 수정
eugene225 Jul 17, 2024
5c7a9f9
fix #218 : soft delete 메서드 수정
eugene225 Jul 17, 2024
646a31d
refactor #219 : Report 추상화 클래스 생성
eugene225 Jul 19, 2024
2dc1b89
refactor #219 : 기존 report 도메인 UserReport 변환
eugene225 Jul 19, 2024
2e79b9f
refactor #219 : replyReport 상속 변경
eugene225 Jul 19, 2024
6f8452d
refactor #219 : 기존 dto 필드값 수정
eugene225 Jul 19, 2024
b4f7fb5
refactor #219 : 기존 Report 엔티티 변경사항 적용
eugene225 Jul 19, 2024
aff3ed3
docs #219 : import 구문 정리
eugene225 Jul 19, 2024
d362a64
Merge branch 'develop' into 218-댓글-신고-crud
eugene225 Aug 12, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

@Entity
@Getter
@Table(name = "mogakko")
@Table(name = "replies")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Reply extends BaseEntity {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import org.springframework.data.jpa.repository.JpaRepository;

public interface ReplyRepository extends JpaRepository<Reply, Long> {
import java.util.Optional;

public interface ReplyRepository extends JpaRepository<Reply, Long> {
Optional<Reply> findByIdAndDeletedAtIsNull(Long id);
}
Original file line number Diff line number Diff line change
@@ -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<ReplyReportDto> 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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -20,46 +21,46 @@
@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);
}

@Transactional(readOnly = true)
public List<ReportDto> 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);
})
.toList();
}

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));
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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<ReplyReport, Id> {
Optional<ReplyReport> 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<ReplyReport> findAllByDeletedAtIsNull(Long cursor, int pageSize);
}
47 changes: 36 additions & 11 deletions src/main/java/org/prgms/locomocoserver/report/domain/Report.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,36 +5,61 @@
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)
private Long id;

@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();
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
import java.util.List;
import java.util.Optional;

public interface ReportRepository extends JpaRepository<Report, Long> {
Optional<Report> findByIdAndDeletedAtIsNull(Long id);
public interface UserReportRepository extends JpaRepository<UserReport, Long> {
Optional<UserReport> 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<Report> findAllByDeletedAtIsNull(Long cursor, int pageSize);
List<UserReport> findAllByDeletedAtIsNull(Long cursor, int pageSize);
}
Original file line number Diff line number Diff line change
@@ -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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,13 @@
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
) {
public static ReportDto of(Report report, User reported) {
return new ReportDto(
report.getId(),
report.getReporter().getId(),
report.getReportedId(),
reported.getNickname(),
report.getContent()
);
Expand Down
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -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
) {
}
Loading