From b5d32ea6c57f380510dd08cff621fb5df2947ec0 Mon Sep 17 00:00:00 2001 From: hzee97 Date: Sat, 6 Jul 2024 00:46:00 +0900 Subject: [PATCH 1/8] =?UTF-8?q?:sparkles:=20=ED=9A=8C=EC=9B=90=20=EC=8B=A0?= =?UTF-8?q?=EA=B3=A0=20api=20=EA=B5=AC=ED=98=84.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiPayload/code/status/ErrorStatus.java | 6 +- .../exception/handler/ReportHandler.java | 10 + .../controller/member/ReportController.java | 100 ++++++++++ .../com/gamegoo/domain/report/Report.java | 23 ++- .../com/gamegoo/domain/report/ReportType.java | 4 + .../domain/report/ReportTypeMapping.java | 4 + .../gamegoo/dto/member/ReportRequestDTO.java | 16 ++ .../repository/member/ReportRepository.java | 9 + .../member/ReportTypeRepository.java | 10 + .../gamegoo/service/member/ReportService.java | 176 ++++++++++++++++++ .../service/member/ReportTypeService.java | 23 +++ 11 files changed, 377 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/gamegoo/apiPayload/exception/handler/ReportHandler.java create mode 100644 src/main/java/com/gamegoo/controller/member/ReportController.java create mode 100644 src/main/java/com/gamegoo/domain/report/ReportTypeMapping.java create mode 100644 src/main/java/com/gamegoo/dto/member/ReportRequestDTO.java create mode 100644 src/main/java/com/gamegoo/repository/member/ReportRepository.java create mode 100644 src/main/java/com/gamegoo/repository/member/ReportTypeRepository.java create mode 100644 src/main/java/com/gamegoo/service/member/ReportService.java create mode 100644 src/main/java/com/gamegoo/service/member/ReportTypeService.java diff --git a/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java b/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java index 27813429..643eaccc 100644 --- a/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java +++ b/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java @@ -51,7 +51,11 @@ public enum ErrorStatus implements BaseErrorCode { // 차단 관련 에러 TARGET_MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "BLOCK401", "차단 대상 회원을 찾을 수 없습니다."), ALREADY_BLOCKED(HttpStatus.BAD_REQUEST, "BLOCK402", "이미 차단한 회원입니다."), - TARGET_MEMBER_NOT_BLOCKED(HttpStatus.BAD_REQUEST, "BLOCK403", "차단 목록에 존재하지 않는 회원입니다."); + TARGET_MEMBER_NOT_BLOCKED(HttpStatus.BAD_REQUEST, "BLOCK403", "차단 목록에 존재하지 않는 회원입니다."), + + // 신고 관련 에러 + REPORT_TYPE_NOT_FOUND(HttpStatus.NOT_FOUND, "REPORT401", "신고사유를 찾을 수 없습니다."), + ALREADY_REPORTED(HttpStatus.BAD_REQUEST, "REPORT402", "이미 신고한 회원입니다."); private final HttpStatus httpStatus; private final String code; diff --git a/src/main/java/com/gamegoo/apiPayload/exception/handler/ReportHandler.java b/src/main/java/com/gamegoo/apiPayload/exception/handler/ReportHandler.java new file mode 100644 index 00000000..60e13113 --- /dev/null +++ b/src/main/java/com/gamegoo/apiPayload/exception/handler/ReportHandler.java @@ -0,0 +1,10 @@ +package com.gamegoo.apiPayload.exception.handler; + +import com.gamegoo.apiPayload.code.BaseErrorCode; +import com.gamegoo.apiPayload.exception.GeneralException; + +public class ReportHandler extends GeneralException { + public ReportHandler(BaseErrorCode code) { + super(code); + } +} diff --git a/src/main/java/com/gamegoo/controller/member/ReportController.java b/src/main/java/com/gamegoo/controller/member/ReportController.java new file mode 100644 index 00000000..17d426d5 --- /dev/null +++ b/src/main/java/com/gamegoo/controller/member/ReportController.java @@ -0,0 +1,100 @@ +package com.gamegoo.controller.member; + + +import com.gamegoo.apiPayload.ApiResponse; +import com.gamegoo.apiPayload.exception.handler.MemberHandler; +import com.gamegoo.apiPayload.exception.handler.ReportHandler; +import com.gamegoo.domain.Member; +import com.gamegoo.domain.report.Report; +import com.gamegoo.dto.member.ReportRequestDTO; +import com.gamegoo.service.member.ReportService; +import com.gamegoo.util.JWTUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Set; + +/* +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/reports") +@Slf4j +public class ReportController { + private final ReportService reportService; + + @Operation(summary = "회원 신고 API", description = "대상 회원을 신고하는 API 입니다.") + @PostMapping("/report/{reporterId}") + public ApiResponse reportMember ( + @PathVariable(name = "reporterId") Long reporterId, + @RequestParam(name = "targetId") Long targetId, + @RequestParam(name = "reportTypeId") Long reportTypeId, + @RequestParam(name = "reportContent", required = false) String reportContent) { + + Long memberId = JWTUtil.getCurrentUserId(); // 헤더에 있는 jwt 토큰에서 id를 가져오는 코드 + Member member = reportService.createReport(reporterId, targetId, reportTypeId, reportContent); + + return ApiResponse.onSuccess("회원 신고 성공"); + } +} + + +@RestController +@RequestMapping("/reports") +public class ReportController { + + private final ReportService reportService; + + public ReportController(ReportService reportService) { + this.reportService = reportService; + } + + @PostMapping("/create") + public ResponseEntity createReport( + @RequestParam String reportContent, + @RequestParam Long reporterId, + @RequestParam Long targetId, + @RequestParam Set reportTypeIds + ) { + // 예시로 MemberId는 단순히 Long 이며 구체적으로는 Member의 id일 수 있다. + Member reporter = memberService.findById(reporterId); + Member target = memberService.findById(targetId); + + Report report = reportService.createReport(reportContent, reporter, target, reportTypeIds); + + return ResponseEntity.ok("신고가 성공적으로 등록되었습니다. Report ID: " + report.getId()); + } +} + +*/ + +@RestController +@RequestMapping("/api/reports") +@Slf4j +public class ReportController { + private final ReportService reportService; + + public ReportController(ReportService reportService) { + this.reportService = reportService; + } + + @PostMapping("/create") + @Operation(summary = "회원 신고 API", description = "대상 회원을 신고하는 API 입니다.") + public ApiResponse reportMember( + @RequestParam(name = "reporterId") Long reporterId, + @RequestParam(name = "targetId") Long targetId, + @RequestParam(name = "reportTypeIds") List reportTypeIds, + @RequestParam(name = "reportContent", required = false) String reportContent) { + + reportService.createReport(reporterId, targetId, reportTypeIds, reportContent); + + return ApiResponse.onSuccess("회원 신고 성공"); + } +} diff --git a/src/main/java/com/gamegoo/domain/report/Report.java b/src/main/java/com/gamegoo/domain/report/Report.java index c3f10642..6c5c63e3 100644 --- a/src/main/java/com/gamegoo/domain/report/Report.java +++ b/src/main/java/com/gamegoo/domain/report/Report.java @@ -5,6 +5,8 @@ import lombok.*; import javax.persistence.*; +import java.util.HashSet; +import java.util.Set; @Entity @Table(name = "Report") @@ -21,9 +23,13 @@ public class Report extends BaseDateTimeEntity { @Column(name = "report_content", nullable = false, length = 1000) private String reportContent; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "report_type_id", nullable = false) - private ReportType reportType; +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "report_type_id", nullable = false) +// private ReportType reportType; + + @ManyToMany(fetch = FetchType.LAZY) + @JoinTable(name = "Report_ReportType", joinColumns = @JoinColumn(name = "report_id"), inverseJoinColumns = @JoinColumn(name = "report_type_id")) + private Set reportTypes = new HashSet<>(); @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "reporter_id", nullable = false) @@ -32,4 +38,15 @@ public class Report extends BaseDateTimeEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "target_id", nullable = false) private Member target; + + +// public void setReporterMember(Member member) { +// if (this.reporter != null) { +// this.reporter.getReportList().remove(this); // 기존 reporter의 reportList에서 제거 +// } +// this.reporter = member; +// member.getReportList().add(this); // 새로운 reporter의 reportList에 추가 +// +// } + } diff --git a/src/main/java/com/gamegoo/domain/report/ReportType.java b/src/main/java/com/gamegoo/domain/report/ReportType.java index 21f9202e..bd802009 100644 --- a/src/main/java/com/gamegoo/domain/report/ReportType.java +++ b/src/main/java/com/gamegoo/domain/report/ReportType.java @@ -4,6 +4,8 @@ import lombok.*; import javax.persistence.*; +import java.util.HashSet; +import java.util.Set; @Entity @Table(name = "ReportType") @@ -18,5 +20,7 @@ public class ReportType extends BaseDateTimeEntity { private Long id; @Column(name = "report_type_content", nullable = false) private String reportTypeContent; + @ManyToMany(mappedBy = "reportTypes") + private Set reports = new HashSet<>(); } diff --git a/src/main/java/com/gamegoo/domain/report/ReportTypeMapping.java b/src/main/java/com/gamegoo/domain/report/ReportTypeMapping.java new file mode 100644 index 00000000..5547f367 --- /dev/null +++ b/src/main/java/com/gamegoo/domain/report/ReportTypeMapping.java @@ -0,0 +1,4 @@ +package com.gamegoo.domain.report; + +public class ReportTypeMapping { +} diff --git a/src/main/java/com/gamegoo/dto/member/ReportRequestDTO.java b/src/main/java/com/gamegoo/dto/member/ReportRequestDTO.java new file mode 100644 index 00000000..becee211 --- /dev/null +++ b/src/main/java/com/gamegoo/dto/member/ReportRequestDTO.java @@ -0,0 +1,16 @@ +package com.gamegoo.dto.member; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ReportRequestDTO { + private Long reporterId; + + private Long targetId; + + private Long reportTypeId; + + private String reportContent; +} diff --git a/src/main/java/com/gamegoo/repository/member/ReportRepository.java b/src/main/java/com/gamegoo/repository/member/ReportRepository.java new file mode 100644 index 00000000..0a8456af --- /dev/null +++ b/src/main/java/com/gamegoo/repository/member/ReportRepository.java @@ -0,0 +1,9 @@ +package com.gamegoo.repository.member; + +import com.gamegoo.domain.Member; +import com.gamegoo.domain.report.Report; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ReportRepository extends JpaRepository { + boolean existsByReporterAndTarget(Member reporter, Member target); +} diff --git a/src/main/java/com/gamegoo/repository/member/ReportTypeRepository.java b/src/main/java/com/gamegoo/repository/member/ReportTypeRepository.java new file mode 100644 index 00000000..f60edb4d --- /dev/null +++ b/src/main/java/com/gamegoo/repository/member/ReportTypeRepository.java @@ -0,0 +1,10 @@ +package com.gamegoo.repository.member; + +import com.gamegoo.domain.report.ReportType; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface ReportTypeRepository extends JpaRepository { + Optional findById(Long id); +} diff --git a/src/main/java/com/gamegoo/service/member/ReportService.java b/src/main/java/com/gamegoo/service/member/ReportService.java new file mode 100644 index 00000000..80f6096c --- /dev/null +++ b/src/main/java/com/gamegoo/service/member/ReportService.java @@ -0,0 +1,176 @@ +package com.gamegoo.service.member; + +import com.gamegoo.apiPayload.code.status.ErrorStatus; +import com.gamegoo.apiPayload.exception.handler.BlockHandler; +import com.gamegoo.apiPayload.exception.handler.MemberHandler; +import com.gamegoo.apiPayload.exception.handler.ReportHandler; +import com.gamegoo.domain.Member; +import com.gamegoo.domain.report.Report; +import com.gamegoo.domain.report.ReportType; +import com.gamegoo.repository.member.MemberRepository; +import com.gamegoo.repository.member.ReportRepository; +import com.gamegoo.repository.member.ReportTypeRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.EntityNotFoundException; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/* +@Service +@RequiredArgsConstructor +@Transactional +public class ReportService { + private final MemberRepository memberRepository; + private final ReportRepository reportRepository; + + private final ReportTypeRepository reportTypeRepository; + + public Member createReport(Long reporterId, Long targetId, Long reportTypeId, String reportContent) { + + // 신고자(member)와 신고 대상(targetMember)을 조회 + Member member = memberRepository.findById(reporterId).orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); + Member targetMember = memberRepository.findById(targetId).orElseThrow(() -> new MemberHandler(ErrorStatus.TARGET_MEMBER_NOT_FOUND)); + ReportType reportType = reportTypeRepository.findById(reportTypeId).orElseThrow(() -> new ReportHandler(ErrorStatus.REPORT_TYPE_NOT_FOUND)); + + // 대상 회원의 탈퇴 여부 검증 + checkBlind(targetMember); + + // 이미 신고한 회원인지 검증 + boolean isReported = reportRepository.existsByReporterAndTarget(member, targetMember); + if (isReported) { + throw new ReportHandler(ErrorStatus.ALREADY_REPORTED); + } + + // report 엔티티 생성 및 연관관계 매핑 + Report report = Report.builder() + .target(targetMember) + .reportType(reportType) + .reportContent(reportContent) + .build(); + report.setReporterMember(member); + + reportRepository.save(report); + + return member; + } + private void checkBlind (Member member){ + if (member.getBlind()) { + throw new MemberHandler(ErrorStatus.USER_DEACTIVATED); + } + } +} +*/ + +/* +@Service +@Transactional +public class ReportService { + + private final MemberRepository memberRepository; + private final ReportRepository reportRepository; + private final ReportTypeRepository reportTypeRepository; + + @Autowired + public ReportService(MemberRepository memberRepository, ReportRepository reportRepository, ReportTypeRepository reportTypeRepository) { + this.memberRepository = memberRepository; + this.reportRepository = reportRepository; + this.reportTypeRepository = reportTypeRepository; + } + + public void createReport(Long reporterId, Long targetId, Long reportTypeId, String reportContent) { + // 신고자(member)와 신고 대상(targetMember)을 조회 + Member member = memberRepository.findById(reporterId) + .orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); + Member targetMember = memberRepository.findById(targetId) + .orElseThrow(() -> new MemberHandler(ErrorStatus.TARGET_MEMBER_NOT_FOUND)); + ReportType reportType = reportTypeRepository.findById(reportTypeId) + .orElseThrow(() -> new ReportHandler(ErrorStatus.REPORT_TYPE_NOT_FOUND)); + + // 대상 회원의 탈퇴 여부 검증 + checkBlind(targetMember); + + // 이미 신고한 회원인지 검증 + boolean isReported = reportRepository.existsByReporterAndTarget(member, targetMember); + if (isReported) { + throw new ReportHandler(ErrorStatus.ALREADY_REPORTED); + } + + // report 엔티티 생성 및 연관관계 매핑 + Report report = Report.builder() + .target(targetMember) + .reportType(reportType) + .reportContent(reportContent) + .build(); + report.setReporter(member); + + reportRepository.save(report); + } + + private void checkBlind(Member member) { + if (member.getBlind()) { + throw new MemberHandler(ErrorStatus.USER_DEACTIVATED); + } + } +} +*/ + +@Service +@Transactional +public class ReportService { + + private final ReportRepository reportRepository; + private final ReportTypeRepository reportTypeRepository; + private final MemberRepository memberRepository; + + public ReportService(ReportRepository reportRepository, ReportTypeRepository reportTypeRepository, MemberRepository memberRepository) { + this.reportRepository = reportRepository; + this.reportTypeRepository = reportTypeRepository; + this.memberRepository = memberRepository; + } + + public void createReport(Long reporterId, Long targetId, List reportTypeIds, String reportContent) { + // 신고자(reporter)와 신고 대상(targetMember), 신고 타입(reportType)을 조회 + Member reporter = memberRepository.findById(reporterId) + .orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); + Member targetMember = memberRepository.findById(targetId) + .orElseThrow(() -> new MemberHandler(ErrorStatus.TARGET_MEMBER_NOT_FOUND)); +// ReportType reportType = reportTypeRepository.findById(reportTypeId) +// .orElseThrow(() -> new ReportHandler(ErrorStatus.REPORT_TYPE_NOT_FOUND)); + + // 대상 회원의 탈퇴 여부 검증 + checkBlind(targetMember); + + // 이미 신고한 회원인지 검증 + boolean isReported = reportRepository.existsByReporterAndTarget(reporter, targetMember); + if (isReported) { + throw new ReportHandler(ErrorStatus.ALREADY_REPORTED); + } + + Set reportTypes = reportTypeIds.stream() + .map(id -> reportTypeRepository.findById(id) + .orElseThrow(() -> new ReportHandler(ErrorStatus.REPORT_TYPE_NOT_FOUND))) + .collect(Collectors.toSet()); + + Report report = Report.builder() + .reporter(reporter) + .target(targetMember) + .reportTypes(reportTypes) + .reportContent(reportContent) + .build(); + + reportRepository.save(report); + } + + public static boolean checkBlind(Member member) { + if (member.getBlind()) { + throw new MemberHandler(ErrorStatus.USER_DEACTIVATED); + } + return false; + } +} diff --git a/src/main/java/com/gamegoo/service/member/ReportTypeService.java b/src/main/java/com/gamegoo/service/member/ReportTypeService.java new file mode 100644 index 00000000..7519df74 --- /dev/null +++ b/src/main/java/com/gamegoo/service/member/ReportTypeService.java @@ -0,0 +1,23 @@ +package com.gamegoo.service.member; + +import com.gamegoo.domain.report.ReportType; +import com.gamegoo.repository.member.ReportTypeRepository; +import org.springframework.stereotype.Service; + +import javax.persistence.EntityNotFoundException; +import javax.transaction.Transactional; + +@Service +@Transactional +public class ReportTypeService { + private final ReportTypeRepository reportTypeRepository; + + public ReportTypeService(ReportTypeRepository reportTypeRepository) { + this.reportTypeRepository = reportTypeRepository; + } + + public ReportType getReportTypeById(Long id) { + return reportTypeRepository.findById(id) + .orElseThrow(() -> new EntityNotFoundException("ReportType with id " + id + " not found")); + } +} From 822d5e99092d9a30b75ab59b03a2bfa68da4cd1f Mon Sep 17 00:00:00 2001 From: Eunjin3395 Date: Sat, 6 Jul 2024 00:53:43 +0900 Subject: [PATCH 2/8] =?UTF-8?q?:sparkles:=20[Feat]:=20ReportTypeMapping=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=20=EB=B0=8F=20=EB=A7=A4=ED=95=91=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gamegoo/domain/report/Report.java | 15 ++++------- .../domain/report/ReportTypeMapping.java | 26 ++++++++++++++++++- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gamegoo/domain/report/Report.java b/src/main/java/com/gamegoo/domain/report/Report.java index 6c5c63e3..3c586fcc 100644 --- a/src/main/java/com/gamegoo/domain/report/Report.java +++ b/src/main/java/com/gamegoo/domain/report/Report.java @@ -5,8 +5,8 @@ import lombok.*; import javax.persistence.*; -import java.util.HashSet; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; @Entity @Table(name = "Report") @@ -23,14 +23,6 @@ public class Report extends BaseDateTimeEntity { @Column(name = "report_content", nullable = false, length = 1000) private String reportContent; -// @ManyToOne(fetch = FetchType.LAZY) -// @JoinColumn(name = "report_type_id", nullable = false) -// private ReportType reportType; - - @ManyToMany(fetch = FetchType.LAZY) - @JoinTable(name = "Report_ReportType", joinColumns = @JoinColumn(name = "report_id"), inverseJoinColumns = @JoinColumn(name = "report_type_id")) - private Set reportTypes = new HashSet<>(); - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "reporter_id", nullable = false) private Member reporter; @@ -39,6 +31,9 @@ public class Report extends BaseDateTimeEntity { @JoinColumn(name = "target_id", nullable = false) private Member target; + @OneToMany(mappedBy = "report", cascade = CascadeType.ALL) + private List reportTypeMappingList = new ArrayList<>(); + // public void setReporterMember(Member member) { // if (this.reporter != null) { diff --git a/src/main/java/com/gamegoo/domain/report/ReportTypeMapping.java b/src/main/java/com/gamegoo/domain/report/ReportTypeMapping.java index 5547f367..4e0f8609 100644 --- a/src/main/java/com/gamegoo/domain/report/ReportTypeMapping.java +++ b/src/main/java/com/gamegoo/domain/report/ReportTypeMapping.java @@ -1,4 +1,28 @@ package com.gamegoo.domain.report; -public class ReportTypeMapping { +import com.gamegoo.domain.common.BaseDateTimeEntity; +import lombok.*; + +import javax.persistence.*; + +@Entity +@Table(name = "ReportTypeMapping") +@Getter +@Builder +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +public class ReportTypeMapping extends BaseDateTimeEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "report_type_mapping_id") + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "report_type_id", nullable = false) + private ReportType reportType; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "report_id", nullable = false) + private Report report; + } From 46a0ae4c291e737439da23997c9be73ba14fafe5 Mon Sep 17 00:00:00 2001 From: hzee97 Date: Sat, 6 Jul 2024 01:03:34 +0900 Subject: [PATCH 3/8] =?UTF-8?q?:sparkles:=20[Feat]=20=EB=94=94=EB=A0=89?= =?UTF-8?q?=ED=84=B0=EB=A6=AC=20=EB=B3=80=EA=B2=BD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{member => report}/ReportController.java | 17 ++--------------- .../com/gamegoo/domain/report/ReportType.java | 2 -- .../{member => report}/ReportRequestDTO.java | 2 +- .../{member => report}/ReportRepository.java | 2 +- .../ReportTypeRepository.java | 2 +- .../{member => report}/ReportService.java | 11 +++-------- .../{member => report}/ReportTypeService.java | 4 ++-- 7 files changed, 10 insertions(+), 30 deletions(-) rename src/main/java/com/gamegoo/controller/{member => report}/ReportController.java (81%) rename src/main/java/com/gamegoo/dto/{member => report}/ReportRequestDTO.java (87%) rename src/main/java/com/gamegoo/repository/{member => report}/ReportRepository.java (87%) rename src/main/java/com/gamegoo/repository/{member => report}/ReportTypeRepository.java (87%) rename src/main/java/com/gamegoo/service/{member => report}/ReportService.java (94%) rename src/main/java/com/gamegoo/service/{member => report}/ReportTypeService.java (87%) diff --git a/src/main/java/com/gamegoo/controller/member/ReportController.java b/src/main/java/com/gamegoo/controller/report/ReportController.java similarity index 81% rename from src/main/java/com/gamegoo/controller/member/ReportController.java rename to src/main/java/com/gamegoo/controller/report/ReportController.java index 17d426d5..fdfb2577 100644 --- a/src/main/java/com/gamegoo/controller/member/ReportController.java +++ b/src/main/java/com/gamegoo/controller/report/ReportController.java @@ -1,26 +1,13 @@ -package com.gamegoo.controller.member; +package com.gamegoo.controller.report; import com.gamegoo.apiPayload.ApiResponse; -import com.gamegoo.apiPayload.exception.handler.MemberHandler; -import com.gamegoo.apiPayload.exception.handler.ReportHandler; -import com.gamegoo.domain.Member; -import com.gamegoo.domain.report.Report; -import com.gamegoo.dto.member.ReportRequestDTO; -import com.gamegoo.service.member.ReportService; -import com.gamegoo.util.JWTUtil; +import com.gamegoo.service.report.ReportService; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; -import java.util.Set; /* @RestController diff --git a/src/main/java/com/gamegoo/domain/report/ReportType.java b/src/main/java/com/gamegoo/domain/report/ReportType.java index bd802009..8b1bef23 100644 --- a/src/main/java/com/gamegoo/domain/report/ReportType.java +++ b/src/main/java/com/gamegoo/domain/report/ReportType.java @@ -20,7 +20,5 @@ public class ReportType extends BaseDateTimeEntity { private Long id; @Column(name = "report_type_content", nullable = false) private String reportTypeContent; - @ManyToMany(mappedBy = "reportTypes") - private Set reports = new HashSet<>(); } diff --git a/src/main/java/com/gamegoo/dto/member/ReportRequestDTO.java b/src/main/java/com/gamegoo/dto/report/ReportRequestDTO.java similarity index 87% rename from src/main/java/com/gamegoo/dto/member/ReportRequestDTO.java rename to src/main/java/com/gamegoo/dto/report/ReportRequestDTO.java index becee211..82c43a51 100644 --- a/src/main/java/com/gamegoo/dto/member/ReportRequestDTO.java +++ b/src/main/java/com/gamegoo/dto/report/ReportRequestDTO.java @@ -1,4 +1,4 @@ -package com.gamegoo.dto.member; +package com.gamegoo.dto.report; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/gamegoo/repository/member/ReportRepository.java b/src/main/java/com/gamegoo/repository/report/ReportRepository.java similarity index 87% rename from src/main/java/com/gamegoo/repository/member/ReportRepository.java rename to src/main/java/com/gamegoo/repository/report/ReportRepository.java index 0a8456af..2609328f 100644 --- a/src/main/java/com/gamegoo/repository/member/ReportRepository.java +++ b/src/main/java/com/gamegoo/repository/report/ReportRepository.java @@ -1,4 +1,4 @@ -package com.gamegoo.repository.member; +package com.gamegoo.repository.report; import com.gamegoo.domain.Member; import com.gamegoo.domain.report.Report; diff --git a/src/main/java/com/gamegoo/repository/member/ReportTypeRepository.java b/src/main/java/com/gamegoo/repository/report/ReportTypeRepository.java similarity index 87% rename from src/main/java/com/gamegoo/repository/member/ReportTypeRepository.java rename to src/main/java/com/gamegoo/repository/report/ReportTypeRepository.java index f60edb4d..d58e8e66 100644 --- a/src/main/java/com/gamegoo/repository/member/ReportTypeRepository.java +++ b/src/main/java/com/gamegoo/repository/report/ReportTypeRepository.java @@ -1,4 +1,4 @@ -package com.gamegoo.repository.member; +package com.gamegoo.repository.report; import com.gamegoo.domain.report.ReportType; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/gamegoo/service/member/ReportService.java b/src/main/java/com/gamegoo/service/report/ReportService.java similarity index 94% rename from src/main/java/com/gamegoo/service/member/ReportService.java rename to src/main/java/com/gamegoo/service/report/ReportService.java index 80f6096c..1d149125 100644 --- a/src/main/java/com/gamegoo/service/member/ReportService.java +++ b/src/main/java/com/gamegoo/service/report/ReportService.java @@ -1,22 +1,17 @@ -package com.gamegoo.service.member; +package com.gamegoo.service.report; import com.gamegoo.apiPayload.code.status.ErrorStatus; -import com.gamegoo.apiPayload.exception.handler.BlockHandler; import com.gamegoo.apiPayload.exception.handler.MemberHandler; import com.gamegoo.apiPayload.exception.handler.ReportHandler; import com.gamegoo.domain.Member; import com.gamegoo.domain.report.Report; import com.gamegoo.domain.report.ReportType; import com.gamegoo.repository.member.MemberRepository; -import com.gamegoo.repository.member.ReportRepository; -import com.gamegoo.repository.member.ReportTypeRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; +import com.gamegoo.repository.report.ReportRepository; +import com.gamegoo.repository.report.ReportTypeRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import javax.persistence.EntityNotFoundException; -import java.time.LocalDateTime; import java.util.List; import java.util.Set; import java.util.stream.Collectors; diff --git a/src/main/java/com/gamegoo/service/member/ReportTypeService.java b/src/main/java/com/gamegoo/service/report/ReportTypeService.java similarity index 87% rename from src/main/java/com/gamegoo/service/member/ReportTypeService.java rename to src/main/java/com/gamegoo/service/report/ReportTypeService.java index 7519df74..5f43e4be 100644 --- a/src/main/java/com/gamegoo/service/member/ReportTypeService.java +++ b/src/main/java/com/gamegoo/service/report/ReportTypeService.java @@ -1,7 +1,7 @@ -package com.gamegoo.service.member; +package com.gamegoo.service.report; import com.gamegoo.domain.report.ReportType; -import com.gamegoo.repository.member.ReportTypeRepository; +import com.gamegoo.repository.report.ReportTypeRepository; import org.springframework.stereotype.Service; import javax.persistence.EntityNotFoundException; From 654ffbed325eb11e3eeecfbba6acea869fe6c838 Mon Sep 17 00:00:00 2001 From: Eunjin3395 Date: Sat, 6 Jul 2024 01:14:32 +0900 Subject: [PATCH 4/8] =?UTF-8?q?:recycle:=20[Refactor]:=20DTO=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/report/ReportController.java | 13 ++++++------- .../com/gamegoo/dto/report/ReportRequest.java | 17 +++++++++++++++++ .../gamegoo/dto/report/ReportRequestDTO.java | 16 ---------------- 3 files changed, 23 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/gamegoo/dto/report/ReportRequest.java delete mode 100644 src/main/java/com/gamegoo/dto/report/ReportRequestDTO.java diff --git a/src/main/java/com/gamegoo/controller/report/ReportController.java b/src/main/java/com/gamegoo/controller/report/ReportController.java index fdfb2577..dff5a968 100644 --- a/src/main/java/com/gamegoo/controller/report/ReportController.java +++ b/src/main/java/com/gamegoo/controller/report/ReportController.java @@ -2,12 +2,14 @@ import com.gamegoo.apiPayload.ApiResponse; +import com.gamegoo.dto.report.ReportRequest; import com.gamegoo.service.report.ReportService; import io.swagger.v3.oas.annotations.Operation; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.*; - -import java.util.List; +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; /* @RestController @@ -75,10 +77,7 @@ public ReportController(ReportService reportService) { @PostMapping("/create") @Operation(summary = "회원 신고 API", description = "대상 회원을 신고하는 API 입니다.") public ApiResponse reportMember( - @RequestParam(name = "reporterId") Long reporterId, - @RequestParam(name = "targetId") Long targetId, - @RequestParam(name = "reportTypeIds") List reportTypeIds, - @RequestParam(name = "reportContent", required = false) String reportContent) { + @RequestBody ReportRequest.ReportRequestDTO request) { reportService.createReport(reporterId, targetId, reportTypeIds, reportContent); diff --git a/src/main/java/com/gamegoo/dto/report/ReportRequest.java b/src/main/java/com/gamegoo/dto/report/ReportRequest.java new file mode 100644 index 00000000..80943d0e --- /dev/null +++ b/src/main/java/com/gamegoo/dto/report/ReportRequest.java @@ -0,0 +1,17 @@ +package com.gamegoo.dto.report; + +import lombok.Getter; + +public class ReportRequest { + + @Getter + public class ReportRequestDTO { + private Long reporterId; + + private Long targetId; + + private Long reportTypeId; + + private String reportContent; + } +} diff --git a/src/main/java/com/gamegoo/dto/report/ReportRequestDTO.java b/src/main/java/com/gamegoo/dto/report/ReportRequestDTO.java deleted file mode 100644 index 82c43a51..00000000 --- a/src/main/java/com/gamegoo/dto/report/ReportRequestDTO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.gamegoo.dto.report; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class ReportRequestDTO { - private Long reporterId; - - private Long targetId; - - private Long reportTypeId; - - private String reportContent; -} From 25dd0b25e2dfd0df104c087c7f987a42be6abec1 Mon Sep 17 00:00:00 2001 From: hzee97 Date: Sat, 6 Jul 2024 16:41:02 +0900 Subject: [PATCH 5/8] =?UTF-8?q?:sparkles:=20[Feat]=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=EC=8B=A0=EA=B3=A0=20API=20=EA=B5=AC=ED=98=84.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiPayload/code/status/ErrorStatus.java | 4 +- .../controller/report/ReportController.java | 89 ++++++------------- .../com/gamegoo/domain/report/Report.java | 17 ++-- .../com/gamegoo/domain/report/ReportType.java | 3 +- .../domain/report/ReportTypeMapping.java | 9 ++ .../com/gamegoo/dto/report/ReportRequest.java | 15 ++-- .../gamegoo/dto/report/ReportResponse.java | 21 +++++ .../repository/report/ReportRepository.java | 3 +- .../report/ReportTypeMappingRepository.java | 7 ++ .../report/ReportTypeRepository.java | 2 +- .../gamegoo/service/report/ReportService.java | 77 ++++++++-------- .../service/report/ReportTypeService.java | 23 ----- 12 files changed, 126 insertions(+), 144 deletions(-) create mode 100644 src/main/java/com/gamegoo/dto/report/ReportResponse.java create mode 100644 src/main/java/com/gamegoo/repository/report/ReportTypeMappingRepository.java delete mode 100644 src/main/java/com/gamegoo/service/report/ReportTypeService.java diff --git a/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java b/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java index 643eaccc..10d803e6 100644 --- a/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java +++ b/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java @@ -54,8 +54,8 @@ public enum ErrorStatus implements BaseErrorCode { TARGET_MEMBER_NOT_BLOCKED(HttpStatus.BAD_REQUEST, "BLOCK403", "차단 목록에 존재하지 않는 회원입니다."), // 신고 관련 에러 - REPORT_TYPE_NOT_FOUND(HttpStatus.NOT_FOUND, "REPORT401", "신고사유를 찾을 수 없습니다."), - ALREADY_REPORTED(HttpStatus.BAD_REQUEST, "REPORT402", "이미 신고한 회원입니다."); + REPORT_TARGET_MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "REPORT401", "신고 대상 회원을 찾을 수 없습니다."); + private final HttpStatus httpStatus; private final String code; diff --git a/src/main/java/com/gamegoo/controller/report/ReportController.java b/src/main/java/com/gamegoo/controller/report/ReportController.java index dff5a968..c2fa17b1 100644 --- a/src/main/java/com/gamegoo/controller/report/ReportController.java +++ b/src/main/java/com/gamegoo/controller/report/ReportController.java @@ -2,85 +2,50 @@ import com.gamegoo.apiPayload.ApiResponse; +import com.gamegoo.domain.report.Report; import com.gamegoo.dto.report.ReportRequest; +import com.gamegoo.dto.report.ReportResponse; import com.gamegoo.service.report.ReportService; -import io.swagger.v3.oas.annotations.Operation; +import com.gamegoo.util.JWTUtil; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; 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 javax.validation.Valid; +import java.util.List; +import java.util.stream.Collectors; + @RestController @RequiredArgsConstructor -@RequestMapping("/api/reports") @Slf4j -public class ReportController { - private final ReportService reportService; - - @Operation(summary = "회원 신고 API", description = "대상 회원을 신고하는 API 입니다.") - @PostMapping("/report/{reporterId}") - public ApiResponse reportMember ( - @PathVariable(name = "reporterId") Long reporterId, - @RequestParam(name = "targetId") Long targetId, - @RequestParam(name = "reportTypeId") Long reportTypeId, - @RequestParam(name = "reportContent", required = false) String reportContent) { - - Long memberId = JWTUtil.getCurrentUserId(); // 헤더에 있는 jwt 토큰에서 id를 가져오는 코드 - Member member = reportService.createReport(reporterId, targetId, reportTypeId, reportContent); - - return ApiResponse.onSuccess("회원 신고 성공"); - } -} - - -@RestController -@RequestMapping("/reports") -public class ReportController { - - private final ReportService reportService; - - public ReportController(ReportService reportService) { - this.reportService = reportService; - } - - @PostMapping("/create") - public ResponseEntity createReport( - @RequestParam String reportContent, - @RequestParam Long reporterId, - @RequestParam Long targetId, - @RequestParam Set reportTypeIds - ) { - // 예시로 MemberId는 단순히 Long 이며 구체적으로는 Member의 id일 수 있다. - Member reporter = memberService.findById(reporterId); - Member target = memberService.findById(targetId); - - Report report = reportService.createReport(reportContent, reporter, target, reportTypeIds); - - return ResponseEntity.ok("신고가 성공적으로 등록되었습니다. Report ID: " + report.getId()); - } -} - -*/ - -@RestController @RequestMapping("/api/reports") -@Slf4j +@Tag(name = "Reports", description = "신고 관련 API") public class ReportController { private final ReportService reportService; - public ReportController(ReportService reportService) { - this.reportService = reportService; - } + @PostMapping("") + public ApiResponse reportInsert( + @RequestBody @Valid ReportRequest.reportInsertDTO request + ){ + Long memberId = JWTUtil.getCurrentUserId(); + + Report report = reportService.insertReport(request,memberId); - @PostMapping("/create") - @Operation(summary = "회원 신고 API", description = "대상 회원을 신고하는 API 입니다.") - public ApiResponse reportMember( - @RequestBody ReportRequest.ReportRequestDTO request) { + List reportTypeIdList = report.getReportTypeMappingList().stream() + .map(reportTypeMapping -> reportTypeMapping.getReportType().getId()) + .collect(Collectors.toList()); - reportService.createReport(reporterId, targetId, reportTypeIds, reportContent); + ReportResponse.reportInsertResultDTO result = ReportResponse.reportInsertResultDTO.builder() + .targetId(report.getTarget().getId()) + .reportId(report.getId()) + .contents(report.getReportContent()) + .reportTypeIdList(reportTypeIdList) + .build(); - return ApiResponse.onSuccess("회원 신고 성공"); + return ApiResponse.onSuccess(result); } } diff --git a/src/main/java/com/gamegoo/domain/report/Report.java b/src/main/java/com/gamegoo/domain/report/Report.java index 3c586fcc..f4b1e0cf 100644 --- a/src/main/java/com/gamegoo/domain/report/Report.java +++ b/src/main/java/com/gamegoo/domain/report/Report.java @@ -34,14 +34,13 @@ public class Report extends BaseDateTimeEntity { @OneToMany(mappedBy = "report", cascade = CascadeType.ALL) private List reportTypeMappingList = new ArrayList<>(); - -// public void setReporterMember(Member member) { -// if (this.reporter != null) { -// this.reporter.getReportList().remove(this); // 기존 reporter의 reportList에서 제거 -// } -// this.reporter = member; -// member.getReportList().add(this); // 새로운 reporter의 reportList에 추가 -// -// } + // 연관관계 메소드 + public void setReporter(Member member) { + if (this.reporter != null) { + this.reporter.getReportList().remove(this); + } + this.reporter = member; + this.reporter.getReportList().add(this); + } } diff --git a/src/main/java/com/gamegoo/domain/report/ReportType.java b/src/main/java/com/gamegoo/domain/report/ReportType.java index 8b1bef23..1b4f5e66 100644 --- a/src/main/java/com/gamegoo/domain/report/ReportType.java +++ b/src/main/java/com/gamegoo/domain/report/ReportType.java @@ -4,8 +4,6 @@ import lombok.*; import javax.persistence.*; -import java.util.HashSet; -import java.util.Set; @Entity @Table(name = "ReportType") @@ -18,6 +16,7 @@ public class ReportType extends BaseDateTimeEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "report_type_id") private Long id; + @Column(name = "report_type_content", nullable = false) private String reportTypeContent; diff --git a/src/main/java/com/gamegoo/domain/report/ReportTypeMapping.java b/src/main/java/com/gamegoo/domain/report/ReportTypeMapping.java index 4e0f8609..22b75372 100644 --- a/src/main/java/com/gamegoo/domain/report/ReportTypeMapping.java +++ b/src/main/java/com/gamegoo/domain/report/ReportTypeMapping.java @@ -25,4 +25,13 @@ public class ReportTypeMapping extends BaseDateTimeEntity { @JoinColumn(name = "report_id", nullable = false) private Report report; + // 연관관계 메소드 + public void setReport(Report report) { + if (this.report != null) { + this.report.getReportTypeMappingList().remove(this); + } + this.report = report; + this.report.getReportTypeMappingList().add(this); + } + } diff --git a/src/main/java/com/gamegoo/dto/report/ReportRequest.java b/src/main/java/com/gamegoo/dto/report/ReportRequest.java index 80943d0e..7dcd9313 100644 --- a/src/main/java/com/gamegoo/dto/report/ReportRequest.java +++ b/src/main/java/com/gamegoo/dto/report/ReportRequest.java @@ -2,16 +2,19 @@ import lombok.Getter; +import javax.validation.constraints.NotNull; +import java.util.List; + public class ReportRequest { @Getter - public class ReportRequestDTO { - private Long reporterId; - - private Long targetId; + public static class reportInsertDTO { + @NotNull + Long targetMemberId; - private Long reportTypeId; + @NotNull + List reportTypeIdList; - private String reportContent; + String contents; } } diff --git a/src/main/java/com/gamegoo/dto/report/ReportResponse.java b/src/main/java/com/gamegoo/dto/report/ReportResponse.java new file mode 100644 index 00000000..c99b65de --- /dev/null +++ b/src/main/java/com/gamegoo/dto/report/ReportResponse.java @@ -0,0 +1,21 @@ +package com.gamegoo.dto.report; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +public class ReportResponse { + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class reportInsertResultDTO{ + Long reportId; + Long targetId; + List reportTypeIdList; + String contents; + } +} diff --git a/src/main/java/com/gamegoo/repository/report/ReportRepository.java b/src/main/java/com/gamegoo/repository/report/ReportRepository.java index 2609328f..b76b6940 100644 --- a/src/main/java/com/gamegoo/repository/report/ReportRepository.java +++ b/src/main/java/com/gamegoo/repository/report/ReportRepository.java @@ -1,9 +1,8 @@ package com.gamegoo.repository.report; -import com.gamegoo.domain.Member; import com.gamegoo.domain.report.Report; import org.springframework.data.jpa.repository.JpaRepository; public interface ReportRepository extends JpaRepository { - boolean existsByReporterAndTarget(Member reporter, Member target); + } diff --git a/src/main/java/com/gamegoo/repository/report/ReportTypeMappingRepository.java b/src/main/java/com/gamegoo/repository/report/ReportTypeMappingRepository.java new file mode 100644 index 00000000..0274c365 --- /dev/null +++ b/src/main/java/com/gamegoo/repository/report/ReportTypeMappingRepository.java @@ -0,0 +1,7 @@ +package com.gamegoo.repository.report; + +import com.gamegoo.domain.report.ReportTypeMapping; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ReportTypeMappingRepository extends JpaRepository { +} diff --git a/src/main/java/com/gamegoo/repository/report/ReportTypeRepository.java b/src/main/java/com/gamegoo/repository/report/ReportTypeRepository.java index d58e8e66..1c0aaac5 100644 --- a/src/main/java/com/gamegoo/repository/report/ReportTypeRepository.java +++ b/src/main/java/com/gamegoo/repository/report/ReportTypeRepository.java @@ -6,5 +6,5 @@ import java.util.Optional; public interface ReportTypeRepository extends JpaRepository { - Optional findById(Long id); + } diff --git a/src/main/java/com/gamegoo/service/report/ReportService.java b/src/main/java/com/gamegoo/service/report/ReportService.java index 1d149125..e6d39021 100644 --- a/src/main/java/com/gamegoo/service/report/ReportService.java +++ b/src/main/java/com/gamegoo/service/report/ReportService.java @@ -3,15 +3,21 @@ import com.gamegoo.apiPayload.code.status.ErrorStatus; import com.gamegoo.apiPayload.exception.handler.MemberHandler; import com.gamegoo.apiPayload.exception.handler.ReportHandler; +import com.gamegoo.apiPayload.exception.handler.TempHandler; import com.gamegoo.domain.Member; import com.gamegoo.domain.report.Report; import com.gamegoo.domain.report.ReportType; +import com.gamegoo.domain.report.ReportTypeMapping; +import com.gamegoo.dto.report.ReportRequest; import com.gamegoo.repository.member.MemberRepository; import com.gamegoo.repository.report.ReportRepository; +import com.gamegoo.repository.report.ReportTypeMappingRepository; import com.gamegoo.repository.report.ReportTypeRepository; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -116,56 +122,53 @@ private void checkBlind(Member member) { */ @Service +@RequiredArgsConstructor @Transactional -public class ReportService { - +public class ReportService{ + private final MemberRepository memberRepository; private final ReportRepository reportRepository; private final ReportTypeRepository reportTypeRepository; - private final MemberRepository memberRepository; - - public ReportService(ReportRepository reportRepository, ReportTypeRepository reportTypeRepository, MemberRepository memberRepository) { - this.reportRepository = reportRepository; - this.reportTypeRepository = reportTypeRepository; - this.memberRepository = memberRepository; - } + private final ReportTypeMappingRepository reportTypeMappingRepository; - public void createReport(Long reporterId, Long targetId, List reportTypeIds, String reportContent) { - // 신고자(reporter)와 신고 대상(targetMember), 신고 타입(reportType)을 조회 - Member reporter = memberRepository.findById(reporterId) - .orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); - Member targetMember = memberRepository.findById(targetId) - .orElseThrow(() -> new MemberHandler(ErrorStatus.TARGET_MEMBER_NOT_FOUND)); -// ReportType reportType = reportTypeRepository.findById(reportTypeId) -// .orElseThrow(() -> new ReportHandler(ErrorStatus.REPORT_TYPE_NOT_FOUND)); + public Report insertReport(ReportRequest.reportInsertDTO request, Long memberId){ + Member member = memberRepository.findById(memberId).orElseThrow(()->new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); - // 대상 회원의 탈퇴 여부 검증 - checkBlind(targetMember); + // target 회원 존재 여부 검증. + Member targetMember = memberRepository.findById(request.getTargetMemberId()).orElseThrow(()->new MemberHandler(ErrorStatus.REPORT_TARGET_MEMBER_NOT_FOUND)); - // 이미 신고한 회원인지 검증 - boolean isReported = reportRepository.existsByReporterAndTarget(reporter, targetMember); - if (isReported) { - throw new ReportHandler(ErrorStatus.ALREADY_REPORTED); + // target 회원 탈퇴 여부 검증. + if (targetMember.getBlind()){ + throw new MemberHandler(ErrorStatus.USER_DEACTIVATED); } - Set reportTypes = reportTypeIds.stream() - .map(id -> reportTypeRepository.findById(id) - .orElseThrow(() -> new ReportHandler(ErrorStatus.REPORT_TYPE_NOT_FOUND))) - .collect(Collectors.toSet()); + // reportType이 실제 존재 여부 검증. + List reportTypeList = new ArrayList<>(); + request.getReportTypeIdList() + .forEach(reportTypeId -> { + ReportType reportType = reportTypeRepository.findById(reportTypeId).orElseThrow(() -> new TempHandler(ErrorStatus._BAD_REQUEST)); + reportTypeList.add(reportType); + }); + // report 엔티티 생성 및 연관관계 매핑. Report report = Report.builder() - .reporter(reporter) .target(targetMember) - .reportTypes(reportTypes) - .reportContent(reportContent) + .reportContent(request.getContents()) + .reportTypeMappingList(new ArrayList<>()) .build(); - reportRepository.save(report); - } + report.setReporter(member); + Report saveReport = reportRepository.save(report); - public static boolean checkBlind(Member member) { - if (member.getBlind()) { - throw new MemberHandler(ErrorStatus.USER_DEACTIVATED); - } - return false; + // reportTypeMapping 엔티티 생성 및 연관관계 매핑. + reportTypeList.forEach(reportType -> { + ReportTypeMapping reportTypeMapping = ReportTypeMapping.builder() + .reportType(reportType) + .build(); + + reportTypeMapping.setReport(saveReport); + reportTypeMappingRepository.save(reportTypeMapping); + }); + + return saveReport; } } diff --git a/src/main/java/com/gamegoo/service/report/ReportTypeService.java b/src/main/java/com/gamegoo/service/report/ReportTypeService.java deleted file mode 100644 index 5f43e4be..00000000 --- a/src/main/java/com/gamegoo/service/report/ReportTypeService.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.gamegoo.service.report; - -import com.gamegoo.domain.report.ReportType; -import com.gamegoo.repository.report.ReportTypeRepository; -import org.springframework.stereotype.Service; - -import javax.persistence.EntityNotFoundException; -import javax.transaction.Transactional; - -@Service -@Transactional -public class ReportTypeService { - private final ReportTypeRepository reportTypeRepository; - - public ReportTypeService(ReportTypeRepository reportTypeRepository) { - this.reportTypeRepository = reportTypeRepository; - } - - public ReportType getReportTypeById(Long id) { - return reportTypeRepository.findById(id) - .orElseThrow(() -> new EntityNotFoundException("ReportType with id " + id + " not found")); - } -} From 22f6dd0d34ce7aa255358d54f4ea7c789ddc2d34 Mon Sep 17 00:00:00 2001 From: hzee97 Date: Sat, 6 Jul 2024 17:47:08 +0900 Subject: [PATCH 6/8] =?UTF-8?q?:sparkles:=20[Feat]=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=EC=8B=A0=EA=B3=A0=20API=20=EA=B5=AC=ED=98=84.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gamegoo/repository/report/ReportTypeRepository.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/gamegoo/repository/report/ReportTypeRepository.java b/src/main/java/com/gamegoo/repository/report/ReportTypeRepository.java index 1c0aaac5..03483f61 100644 --- a/src/main/java/com/gamegoo/repository/report/ReportTypeRepository.java +++ b/src/main/java/com/gamegoo/repository/report/ReportTypeRepository.java @@ -3,8 +3,6 @@ import com.gamegoo.domain.report.ReportType; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.Optional; - public interface ReportTypeRepository extends JpaRepository { } From c4fbbeb2e260e4a6509d89cc14cb2e9f35746d08 Mon Sep 17 00:00:00 2001 From: hzee97 Date: Sat, 6 Jul 2024 21:25:06 +0900 Subject: [PATCH 7/8] =?UTF-8?q?:bug:=20[Fix]=20=EC=96=B4=EB=85=B8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=88=98=EC=A0=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gamegoo/dto/report/ReportRequest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gamegoo/dto/report/ReportRequest.java b/src/main/java/com/gamegoo/dto/report/ReportRequest.java index 7dcd9313..00a1c89d 100644 --- a/src/main/java/com/gamegoo/dto/report/ReportRequest.java +++ b/src/main/java/com/gamegoo/dto/report/ReportRequest.java @@ -2,6 +2,8 @@ import lombok.Getter; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.List; @@ -12,7 +14,7 @@ public static class reportInsertDTO { @NotNull Long targetMemberId; - @NotNull + @NotEmpty List reportTypeIdList; String contents; From eb62a2b1d74fccfa5de145f0537d4db1a9e27177 Mon Sep 17 00:00:00 2001 From: hzee97 Date: Sat, 6 Jul 2024 21:27:24 +0900 Subject: [PATCH 8/8] =?UTF-8?q?:sparkles:=20[Feat]=20member=20=EC=99=80=20?= =?UTF-8?q?targetMember=20=EC=9D=BC=EC=B9=98=20=EC=97=AC=EB=B6=80=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 - .../apiPayload/code/status/ErrorStatus.java | 4 +- .../gamegoo/service/report/ReportService.java | 104 +----------------- 3 files changed, 7 insertions(+), 102 deletions(-) diff --git a/build.gradle b/build.gradle index a2641581..2323bc70 100644 --- a/build.gradle +++ b/build.gradle @@ -50,7 +50,6 @@ dependencies { implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3' implementation 'org.springframework.boot:spring-boot-starter-mail' - } tasks.named('test') { diff --git a/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java b/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java index 10d803e6..b893aaa5 100644 --- a/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java +++ b/src/main/java/com/gamegoo/apiPayload/code/status/ErrorStatus.java @@ -54,8 +54,8 @@ public enum ErrorStatus implements BaseErrorCode { TARGET_MEMBER_NOT_BLOCKED(HttpStatus.BAD_REQUEST, "BLOCK403", "차단 목록에 존재하지 않는 회원입니다."), // 신고 관련 에러 - REPORT_TARGET_MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "REPORT401", "신고 대상 회원을 찾을 수 없습니다."); - + REPORT_TARGET_MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "REPORT401", "신고 대상 회원을 찾을 수 없습니다."), + MEMBER_AND_TARGET_MEMBER_SAME(HttpStatus.BAD_REQUEST, "REPORT402", "회원과 신고 대상 회원이 같습니다."); private final HttpStatus httpStatus; private final String code; diff --git a/src/main/java/com/gamegoo/service/report/ReportService.java b/src/main/java/com/gamegoo/service/report/ReportService.java index e6d39021..c17ad689 100644 --- a/src/main/java/com/gamegoo/service/report/ReportService.java +++ b/src/main/java/com/gamegoo/service/report/ReportService.java @@ -22,105 +22,6 @@ import java.util.Set; import java.util.stream.Collectors; -/* -@Service -@RequiredArgsConstructor -@Transactional -public class ReportService { - private final MemberRepository memberRepository; - private final ReportRepository reportRepository; - - private final ReportTypeRepository reportTypeRepository; - - public Member createReport(Long reporterId, Long targetId, Long reportTypeId, String reportContent) { - - // 신고자(member)와 신고 대상(targetMember)을 조회 - Member member = memberRepository.findById(reporterId).orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); - Member targetMember = memberRepository.findById(targetId).orElseThrow(() -> new MemberHandler(ErrorStatus.TARGET_MEMBER_NOT_FOUND)); - ReportType reportType = reportTypeRepository.findById(reportTypeId).orElseThrow(() -> new ReportHandler(ErrorStatus.REPORT_TYPE_NOT_FOUND)); - - // 대상 회원의 탈퇴 여부 검증 - checkBlind(targetMember); - - // 이미 신고한 회원인지 검증 - boolean isReported = reportRepository.existsByReporterAndTarget(member, targetMember); - if (isReported) { - throw new ReportHandler(ErrorStatus.ALREADY_REPORTED); - } - - // report 엔티티 생성 및 연관관계 매핑 - Report report = Report.builder() - .target(targetMember) - .reportType(reportType) - .reportContent(reportContent) - .build(); - report.setReporterMember(member); - - reportRepository.save(report); - - return member; - } - private void checkBlind (Member member){ - if (member.getBlind()) { - throw new MemberHandler(ErrorStatus.USER_DEACTIVATED); - } - } -} -*/ - -/* -@Service -@Transactional -public class ReportService { - - private final MemberRepository memberRepository; - private final ReportRepository reportRepository; - private final ReportTypeRepository reportTypeRepository; - - @Autowired - public ReportService(MemberRepository memberRepository, ReportRepository reportRepository, ReportTypeRepository reportTypeRepository) { - this.memberRepository = memberRepository; - this.reportRepository = reportRepository; - this.reportTypeRepository = reportTypeRepository; - } - - public void createReport(Long reporterId, Long targetId, Long reportTypeId, String reportContent) { - // 신고자(member)와 신고 대상(targetMember)을 조회 - Member member = memberRepository.findById(reporterId) - .orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); - Member targetMember = memberRepository.findById(targetId) - .orElseThrow(() -> new MemberHandler(ErrorStatus.TARGET_MEMBER_NOT_FOUND)); - ReportType reportType = reportTypeRepository.findById(reportTypeId) - .orElseThrow(() -> new ReportHandler(ErrorStatus.REPORT_TYPE_NOT_FOUND)); - - // 대상 회원의 탈퇴 여부 검증 - checkBlind(targetMember); - - // 이미 신고한 회원인지 검증 - boolean isReported = reportRepository.existsByReporterAndTarget(member, targetMember); - if (isReported) { - throw new ReportHandler(ErrorStatus.ALREADY_REPORTED); - } - - // report 엔티티 생성 및 연관관계 매핑 - Report report = Report.builder() - .target(targetMember) - .reportType(reportType) - .reportContent(reportContent) - .build(); - report.setReporter(member); - - reportRepository.save(report); - } - - private void checkBlind(Member member) { - if (member.getBlind()) { - throw new MemberHandler(ErrorStatus.USER_DEACTIVATED); - } - } -} -*/ - @Service @RequiredArgsConstructor @Transactional @@ -149,6 +50,11 @@ public Report insertReport(ReportRequest.reportInsertDTO request, Long memberId) reportTypeList.add(reportType); }); + // member 와 targetMember가 같은 회원인 경우. + if (member.getId().equals(targetMember.getId())){ + throw new MemberHandler(ErrorStatus.MEMBER_AND_TARGET_MEMBER_SAME); + } + // report 엔티티 생성 및 연관관계 매핑. Report report = Report.builder() .target(targetMember)