diff --git a/api/src/main/java/org/yapp/domain/report/application/ReportService.java b/api/src/main/java/org/yapp/domain/report/application/ReportService.java new file mode 100644 index 0000000..d125849 --- /dev/null +++ b/api/src/main/java/org/yapp/domain/report/application/ReportService.java @@ -0,0 +1,32 @@ +package org.yapp.domain.report.application; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.yapp.domain.report.Report; +import org.yapp.domain.report.dao.ReportRepository; +import org.yapp.domain.report.dto.request.UserReportRequest; +import org.yapp.domain.user.User; +import org.yapp.domain.user.application.UserService; + +@Service +@RequiredArgsConstructor +public class ReportService { + + private final ReportRepository reportRepository; + private final UserService userService; + + /** + * 유저 신고 기능 + * + * @param reporterId 신고하는 유저의 아이디 + * @param userReportRequest 신고 요청 + * @return 신고 객체 + */ + public Report reportUser(Long reporterId, UserReportRequest userReportRequest) { + User reporter = userService.getUserById(reporterId); + User reportedUser = userService.getUserById(userReportRequest.getReportedUserId()); + Report report = Report.builder().reporter(reporter).reportedUser(reportedUser) + .reason(userReportRequest.getReason()).build(); + return reportRepository.save(report); + } +} diff --git a/api/src/main/java/org/yapp/domain/report/controller/ReportController.java b/api/src/main/java/org/yapp/domain/report/controller/ReportController.java new file mode 100644 index 0000000..7e4a9af --- /dev/null +++ b/api/src/main/java/org/yapp/domain/report/controller/ReportController.java @@ -0,0 +1,33 @@ +package org.yapp.domain.report.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.yapp.domain.report.application.ReportService; +import org.yapp.domain.report.dto.request.UserReportRequest; +import org.yapp.util.CommonResponse; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/reports") +public class ReportController { + + public final ReportService reportService; + + @PostMapping() + @Operation(summary = "유저 신고", description = "유저를 신고합니다.", tags = { + "신고"}) + @ApiResponse(responseCode = "200", description = "유저를 성공적으로 신고하였습니다.") + public ResponseEntity> reportUser(@AuthenticationPrincipal Long userId, + @RequestBody @Valid UserReportRequest request) { + reportService.reportUser(userId, request); + return ResponseEntity.ok(CommonResponse.createSuccessWithNoContent()); + } +} diff --git a/api/src/main/java/org/yapp/domain/report/dao/ReportRepository.java b/api/src/main/java/org/yapp/domain/report/dao/ReportRepository.java new file mode 100644 index 0000000..2000ada --- /dev/null +++ b/api/src/main/java/org/yapp/domain/report/dao/ReportRepository.java @@ -0,0 +1,10 @@ +package org.yapp.domain.report.dao; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.yapp.domain.report.Report; +import org.yapp.domain.user.User; + +public interface ReportRepository extends JpaRepository { + + boolean existsReportByReporterAndReportedUser(User reporter, User reportedUser); +} diff --git a/api/src/main/java/org/yapp/domain/report/dto/request/UserReportRequest.java b/api/src/main/java/org/yapp/domain/report/dto/request/UserReportRequest.java new file mode 100644 index 0000000..0aaff2c --- /dev/null +++ b/api/src/main/java/org/yapp/domain/report/dto/request/UserReportRequest.java @@ -0,0 +1,17 @@ +package org.yapp.domain.report.dto.request; + +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +@NoArgsConstructor +@Getter +public class UserReportRequest { + + @NotNull + private Long reportedUserId; + @NotNull + @Length(min = 1, max = 100) + private String reason; +} diff --git a/common/src/main/java/org/yapp/error/dto/ReportErrorCode.java b/common/src/main/java/org/yapp/error/dto/ReportErrorCode.java new file mode 100644 index 0000000..e9372b4 --- /dev/null +++ b/common/src/main/java/org/yapp/error/dto/ReportErrorCode.java @@ -0,0 +1,15 @@ +package org.yapp.error.dto; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; + +@Getter +@RequiredArgsConstructor +public enum ReportErrorCode implements ErrorCode { + ALREADY_REPORTED(HttpStatus.BAD_REQUEST, "이미 신고한 유저입니다."), + ; + + private final HttpStatus httpStatus; + private final String message; +}