From 51c064c95b8c83cd56662e6ecba9c32479d6d5b6 Mon Sep 17 00:00:00 2001 From: amaran-th Date: Wed, 9 Aug 2023 11:06:49 +0900 Subject: [PATCH 01/15] =?UTF-8?q?feat:=20Report=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #245 --- .../com/emmsale/report/domain/Report.java | 37 +++++++++++++++++++ .../com/emmsale/report/domain/ReportType.java | 7 ++++ 2 files changed, 44 insertions(+) create mode 100644 backend/emm-sale/src/main/java/com/emmsale/report/domain/Report.java create mode 100644 backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportType.java diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/domain/Report.java b/backend/emm-sale/src/main/java/com/emmsale/report/domain/Report.java new file mode 100644 index 000000000..7ceb73046 --- /dev/null +++ b/backend/emm-sale/src/main/java/com/emmsale/report/domain/Report.java @@ -0,0 +1,37 @@ +package com.emmsale.report.domain; + +import com.emmsale.base.BaseEntity; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Report extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @Column(nullable = false) + private Long reporterId; + @Column(nullable = false) + private Long reportedId; + @Column(nullable = false) + private String content; + @Column(nullable = false) + private ReportType type; + + public Report(final Long reporterId, final Long reportedId, final String content, + final ReportType type) { + this.reporterId = reporterId; + this.reportedId = reportedId; + this.content = content; + this.type = type; + } +} diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportType.java b/backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportType.java new file mode 100644 index 000000000..d5feebd1c --- /dev/null +++ b/backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportType.java @@ -0,0 +1,7 @@ +package com.emmsale.report.domain; + +public enum ReportType { + COMMENT, + PARTICIPANT, + REQUEST_NOTIFICATION; +} From f3f96d80b0704f44d6c716ceb3cc9e5083aed3ff Mon Sep 17 00:00:00 2001 From: amaran-th Date: Wed, 9 Aug 2023 14:22:30 +0900 Subject: [PATCH 02/15] =?UTF-8?q?feat:=20=EB=AC=B8=EC=84=9C=ED=99=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1=20=EB=B0=8F=20?= =?UTF-8?q?=EB=BC=88=EB=8C=80=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #245 --- backend/emm-sale/src/docs/asciidoc/index.adoc | 27 ++++ .../com/emmsale/report/api/ReportApi.java | 34 +++++ .../application/ReportCommandService.java | 25 ++++ .../application/ReportQueryService.java | 34 +++++ .../report/application/dto/ReportRequest.java | 17 +++ .../application/dto/ReportResponse.java | 22 ++++ .../com/emmsale/report/domain/Report.java | 9 +- .../report/domain/ReportReasonType.java | 5 + .../domain/repository/ReportRepository.java | 8 ++ .../report/exception/ReportException.java | 20 +++ .../report/exception/ReportExceptionType.java | 38 ++++++ backend/emm-sale/src/main/resources/data.sql | 10 ++ .../emm-sale/src/main/resources/schema.sql | 20 ++- .../com/emmsale/report/api/ReportApiTest.java | 123 ++++++++++++++++++ .../application/ReportCommandServiceTest.java | 11 ++ .../application/ReportQueryServiceTest.java | 10 ++ 16 files changed, 409 insertions(+), 4 deletions(-) create mode 100644 backend/emm-sale/src/main/java/com/emmsale/report/api/ReportApi.java create mode 100644 backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java create mode 100644 backend/emm-sale/src/main/java/com/emmsale/report/application/ReportQueryService.java create mode 100644 backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportRequest.java create mode 100644 backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportResponse.java create mode 100644 backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportReasonType.java create mode 100644 backend/emm-sale/src/main/java/com/emmsale/report/domain/repository/ReportRepository.java create mode 100644 backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportException.java create mode 100644 backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java create mode 100644 backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java create mode 100644 backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java create mode 100644 backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java diff --git a/backend/emm-sale/src/docs/asciidoc/index.adoc b/backend/emm-sale/src/docs/asciidoc/index.adoc index abcfb1128..00eeb1fd2 100644 --- a/backend/emm-sale/src/docs/asciidoc/index.adoc +++ b/backend/emm-sale/src/docs/asciidoc/index.adoc @@ -355,3 +355,30 @@ include::{snippets}/find-all-notifications/response-fields.adoc[] .HTTP response include::{snippets}/find-all-notifications/http-response.adoc[] + +== Report(신고) + +=== `POST` : 특정 사용자의 게시물 신고 + +.HTTP request +include::{snippets}/add-report/http-request.adoc[] + +.HTTP request 설명 +include::{snippets}/add-report/request-fields.adoc[] + +.HTTP response +include::{snippets}/add-report/http-response.adoc[] + +.HTTP response 설명 +include::{snippets}/add-report/response-fields.adoc[] + +=== `GET` : 신고 목록 전체 조회 + +.HTTP request +include::{snippets}/find-reports/http-request.adoc[] + +.HTTP response +include::{snippets}/find-reports/http-response.adoc[] + +.HTTP response 설명 +include::{snippets}/find-reports/response-fields.adoc[] diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/api/ReportApi.java b/backend/emm-sale/src/main/java/com/emmsale/report/api/ReportApi.java new file mode 100644 index 000000000..85c544e5c --- /dev/null +++ b/backend/emm-sale/src/main/java/com/emmsale/report/api/ReportApi.java @@ -0,0 +1,34 @@ +package com.emmsale.report.api; + +import com.emmsale.member.domain.Member; +import com.emmsale.report.application.ReportCommandService; +import com.emmsale.report.application.ReportQueryService; +import com.emmsale.report.application.dto.ReportRequest; +import com.emmsale.report.application.dto.ReportResponse; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class ReportApi { + + private final ReportCommandService reportCommandService; + private final ReportQueryService reportQueryService; + + @PostMapping("/reports") + @ResponseStatus(HttpStatus.CREATED) + public ReportResponse create(@RequestBody final ReportRequest reportRequest, Member member) { + return reportCommandService.create(reportRequest); + } + + @GetMapping("/reports") + public List findReports() { + return reportQueryService.findReports(); + } +} diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java new file mode 100644 index 000000000..9a86e5f0c --- /dev/null +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java @@ -0,0 +1,25 @@ +package com.emmsale.report.application; + +import com.emmsale.report.application.dto.ReportRequest; +import com.emmsale.report.application.dto.ReportResponse; +import com.emmsale.report.domain.ReportReasonType; +import com.emmsale.report.domain.ReportType; +import com.emmsale.report.domain.repository.ReportRepository; +import java.time.LocalDateTime; +import javax.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@Transactional +@RequiredArgsConstructor +public class ReportCommandService { + + private final ReportRepository reportRepository; + + public ReportResponse create(final ReportRequest reportRequest) { + return new ReportResponse(1L, 1L, 2L, "메롱메롱", ReportReasonType.ABUSE, ReportType.COMMENT, + LocalDateTime.parse("2023-08-09T13:25:00")); + } + +} diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportQueryService.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportQueryService.java new file mode 100644 index 000000000..60e0ec533 --- /dev/null +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportQueryService.java @@ -0,0 +1,34 @@ +package com.emmsale.report.application; + +import com.emmsale.report.application.dto.ReportResponse; +import com.emmsale.report.domain.ReportReasonType; +import com.emmsale.report.domain.ReportType; +import com.emmsale.report.domain.repository.ReportRepository; +import java.time.LocalDateTime; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class ReportQueryService { + + private final ReportRepository reportRepository; + + public List findReports() { + return List.of( + new ReportResponse(1L, 1L, 2L, "메롱메롱", ReportReasonType.ABUSE, ReportType.COMMENT, + LocalDateTime.parse("2023-08-09T13:25:00")), + new ReportResponse(2L, 2L, 1L, "대충 심한 욕설", ReportReasonType.ABUSE, ReportType.PARTICIPANT, + LocalDateTime.parse("2023-08-11T13:25:00")), + new ReportResponse(3L, 1L, 3L, "사회적 물의를 일으킬 수 있는 발언", ReportReasonType.ABUSE, + ReportType.REQUEST_NOTIFICATION, + LocalDateTime.parse("2023-08-11T13:50:00")), + new ReportResponse(4L, 4L, 1L, "도배글", ReportReasonType.ABUSE, ReportType.COMMENT, + LocalDateTime.parse("2023-08-12T13:25:00")) + + ); + } +} diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportRequest.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportRequest.java new file mode 100644 index 000000000..a58a4a284 --- /dev/null +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportRequest.java @@ -0,0 +1,17 @@ +package com.emmsale.report.application.dto; + +import com.emmsale.report.domain.ReportReasonType; +import com.emmsale.report.domain.ReportType; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public class ReportRequest { + + private final Long reporterId; + private final Long reportedId; + private final String content; + private final ReportReasonType reasonType; + private final ReportType type; +} diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportResponse.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportResponse.java new file mode 100644 index 000000000..6f5ded51c --- /dev/null +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportResponse.java @@ -0,0 +1,22 @@ +package com.emmsale.report.application.dto; + +import com.emmsale.report.domain.ReportReasonType; +import com.emmsale.report.domain.ReportType; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.time.LocalDateTime; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public class ReportResponse { + + private final Long id; + private final Long reporterId; + private final Long reportedId; + private final String content; + private final ReportReasonType reasonType; + private final ReportType type; + @JsonFormat(pattern = "yyyy:MM:dd:HH:mm:ss") + private final LocalDateTime createdAt; +} diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/domain/Report.java b/backend/emm-sale/src/main/java/com/emmsale/report/domain/Report.java index 7ceb73046..ab898d6b6 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/domain/Report.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/domain/Report.java @@ -3,6 +3,8 @@ import com.emmsale.base.BaseEntity; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @@ -25,13 +27,18 @@ public class Report extends BaseEntity { @Column(nullable = false) private String content; @Column(nullable = false) + @Enumerated(EnumType.STRING) + private ReportReasonType reasonType; + @Column(nullable = false) + @Enumerated(EnumType.STRING) private ReportType type; public Report(final Long reporterId, final Long reportedId, final String content, - final ReportType type) { + final ReportReasonType reasonType, final ReportType type) { this.reporterId = reporterId; this.reportedId = reportedId; this.content = content; + this.reasonType = reasonType; this.type = type; } } diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportReasonType.java b/backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportReasonType.java new file mode 100644 index 000000000..c99785128 --- /dev/null +++ b/backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportReasonType.java @@ -0,0 +1,5 @@ +package com.emmsale.report.domain; + +public enum ReportReasonType { + ABUSE +} diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/domain/repository/ReportRepository.java b/backend/emm-sale/src/main/java/com/emmsale/report/domain/repository/ReportRepository.java new file mode 100644 index 000000000..5b1f49553 --- /dev/null +++ b/backend/emm-sale/src/main/java/com/emmsale/report/domain/repository/ReportRepository.java @@ -0,0 +1,8 @@ +package com.emmsale.report.domain.repository; + +import com.emmsale.report.domain.Report; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ReportRepository extends JpaRepository { + +} diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportException.java b/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportException.java new file mode 100644 index 000000000..2fa12aa33 --- /dev/null +++ b/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportException.java @@ -0,0 +1,20 @@ +package com.emmsale.report.exception; + +import com.emmsale.base.BaseException; +import com.emmsale.base.BaseExceptionType; + +public class ReportException extends BaseException { + + private final ReportExceptionType exceptionType; + + public ReportException(final ReportExceptionType exceptionType) { + super(exceptionType.errorMessage()); + this.exceptionType = exceptionType; + } + + @Override + public BaseExceptionType exceptionType() { + return exceptionType; + } +} + diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java b/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java new file mode 100644 index 000000000..9435dd70d --- /dev/null +++ b/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java @@ -0,0 +1,38 @@ +package com.emmsale.report.exception; + +import com.emmsale.base.BaseExceptionType; +import org.springframework.http.HttpStatus; + +public enum ReportExceptionType implements BaseExceptionType { + + NOT_FOUND_MEMBER( + HttpStatus.NOT_FOUND, + "존재하지 않는 사용자입니다." + ), + FORBIDDEN_REPORT( + HttpStatus.FORBIDDEN, + "신고 권한이 없습니다." + ), + ALREADY_EXIST_REPORT( + HttpStatus.BAD_REQUEST, + "이미 신고한 사용자입니다." + ); + + private final HttpStatus httpStatus; + private final String errorMessage; + + ReportExceptionType(final HttpStatus httpStatus, final String errorMessage) { + this.httpStatus = httpStatus; + this.errorMessage = errorMessage; + } + + @Override + public HttpStatus httpStatus() { + return httpStatus; + } + + @Override + public String errorMessage() { + return errorMessage; + } +} diff --git a/backend/emm-sale/src/main/resources/data.sql b/backend/emm-sale/src/main/resources/data.sql index 0d2585ca2..15c7ed0ab 100644 --- a/backend/emm-sale/src/main/resources/data.sql +++ b/backend/emm-sale/src/main/resources/data.sql @@ -9,6 +9,7 @@ truncate table member_tag; truncate table event_member; truncate table notification; truncate table fcm_token; +truncate table report; insert into activity(id, type, name) values (1, 'CLUB', 'YAPP'); @@ -190,3 +191,12 @@ insert into event_member (member_id, event_id, content) value (3, 1, '빈 게시 insert into event_member (member_id, event_id, content) value (1, 2, '빈 게시글 내용'); insert into event_member (member_id, event_id, content) value (2, 2, '빈 게시글 내용'); insert into event_member (member_id, event_id, content) value (3, 2, '빈 게시글 내용'); + +insert into report (id, reporter_id, reported_id, content, reason_type, type, created_at) +values (1, 1, 2, '메롱메롱', 'ABUSE', 'COMMENT', CURRENT_TIMESTAMP()); +insert into report (id, reporter_id, reported_id, content, reason_type, type, created_at) +values (2, 2, 1, '대충 심한 욕설', 'ABUSE', 'PARTICIPANT', CURRENT_TIMESTAMP()); +insert into report (id, reporter_id, reported_id, content, reason_type, type, created_at) +values (3, 1, 3, '사회적 물의를 일으킬 수 있는 발언', 'ABUSE', 'REQUEST_NOTIFICATION', CURRENT_TIMESTAMP()); +insert into report (id, reporter_id, reported_id, content, reason_type, type, created_at) +values (4, 4, 1, '도배글', 'ABUSE', 'COMMENT', CURRENT_TIMESTAMP()); \ No newline at end of file diff --git a/backend/emm-sale/src/main/resources/schema.sql b/backend/emm-sale/src/main/resources/schema.sql index a5867bd40..3e9af566c 100644 --- a/backend/emm-sale/src/main/resources/schema.sql +++ b/backend/emm-sale/src/main/resources/schema.sql @@ -9,6 +9,7 @@ drop table if exists kerdy.member_tag; drop table if exists kerdy.event_member; drop table if exists kerdy.notification; drop table if exists kerdy.fcm_token; +drop table if exists kerdy.report; create table activity ( @@ -22,11 +23,11 @@ create table event id bigint auto_increment primary key, created_at datetime(6), updated_at datetime(6), - end_date datetime(6) not null, + end_date datetime(6) not null, information_url varchar(255) not null, location varchar(255) not null, name varchar(255) not null, - start_date datetime(6) not null, + start_date datetime(6) not null, image_url varchar(255), type varchar(20) not null ); @@ -52,7 +53,7 @@ create table comment is_deleted bit not null, event_id bigint not null, member_id bigint not null, - parent_id bigint null + parent_id bigint null ); create table member_activity @@ -118,3 +119,16 @@ alter table event_member add column created_at datetime(6); alter table event_member add column updated_at datetime(6); + +-- 2023-08-09 13:10 +create table report +( + id bigint auto_increment primary key, + reporter_id bigint not null, + reported_id bigint not null, + content varchar(255) not null, + reason_type varchar(20) not null, + type varchar(20) not null, + created_at datetime(6), + updated_at datetime(6) +); \ No newline at end of file diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java new file mode 100644 index 000000000..39669f291 --- /dev/null +++ b/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java @@ -0,0 +1,123 @@ +package com.emmsale.report.api; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.emmsale.helper.MockMvcTestHelper; +import com.emmsale.report.application.ReportCommandService; +import com.emmsale.report.application.ReportQueryService; +import com.emmsale.report.application.dto.ReportRequest; +import com.emmsale.report.application.dto.ReportResponse; +import com.emmsale.report.domain.ReportReasonType; +import com.emmsale.report.domain.ReportType; +import java.time.LocalDateTime; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.restdocs.payload.JsonFieldType; +import org.springframework.restdocs.payload.RequestFieldsSnippet; +import org.springframework.restdocs.payload.ResponseFieldsSnippet; + +@WebMvcTest(ReportApi.class) +class ReportApiTest extends MockMvcTestHelper { + + @MockBean + private ReportCommandService reportCommandService; + @MockBean + private ReportQueryService reportQueryService; + + @Test + @DisplayName("특정 게시글을 신고할 수 있다.") + void addReport() throws Exception { + // given + final RequestFieldsSnippet requestFields = requestFields( + fieldWithPath("reporterId").type(JsonFieldType.NUMBER).description("신고자의 Id"), + fieldWithPath("reportedId").type(JsonFieldType.NUMBER).description("신고 대상자의 Id(당하는 사람)"), + fieldWithPath("content").type(JsonFieldType.STRING).description("신고 게시글의 내용"), + fieldWithPath("reasonType").type(JsonFieldType.STRING).description( + "신고 게시글의 신고 사유(ABUSE)"), + fieldWithPath("type").type(JsonFieldType.STRING).description( + "신고 게시글의 유형(COMMENT, PARTICIPANT, REQUEST_NOTIFICATION)") + ); + + final ResponseFieldsSnippet responseFields = responseFields( + fieldWithPath("id").type(JsonFieldType.NUMBER).description("신고 id"), + fieldWithPath("reporterId").type(JsonFieldType.NUMBER).description("신고자의 Id"), + fieldWithPath("reportedId").type(JsonFieldType.NUMBER).description("신고 대상자의 Id)"), + fieldWithPath("content").type(JsonFieldType.STRING).description("신고 게시글의 내용"), + fieldWithPath("reasonType").type(JsonFieldType.STRING) + .description("신고 게시글의 신고 사유(ABUSE)"), + fieldWithPath("type").type(JsonFieldType.STRING) + .description("신고 게시글의 유형(COMMENT, PARTICIPANT, REQUEST_NOTIFICATION)"), + fieldWithPath("createdAt").type(JsonFieldType.STRING) + .description("신고 일자(yyyy:MM:dd:HH:mm:ss)") + ); + final ReportRequest reportRequest = new ReportRequest(1L, 2L, "메롱메롱", ReportReasonType.ABUSE, + ReportType.COMMENT); + + final ReportResponse reportResponse = new ReportResponse(1L, reportRequest.getReporterId(), + reportRequest.getReportedId(), + reportRequest.getContent(), reportRequest.getReasonType(), reportRequest.getType(), + LocalDateTime.parse("2023-08-09T13:25:00")); + + when(reportCommandService.create(any())).thenReturn(reportResponse); + + // when & then + mockMvc.perform(post("/reports").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsString(reportRequest))) + .andExpect(status().isCreated()) + .andDo(document("add-report", requestFields, responseFields)); + + + } + + @Test + @DisplayName("신고 목록을 조회할 수 있다.") + void findReports() throws Exception { + // given + final ResponseFieldsSnippet responseFields = responseFields( + fieldWithPath("[].id").type(JsonFieldType.NUMBER).description("신고 id"), + fieldWithPath("[].reporterId").type(JsonFieldType.NUMBER).description("신고자의 Id"), + fieldWithPath("[].reportedId").type(JsonFieldType.NUMBER).description("신고 대상자의 Id)"), + fieldWithPath("[].content").type(JsonFieldType.STRING).description("신고 게시글의 내용"), + fieldWithPath("[].reasonType").type(JsonFieldType.STRING) + .description("신고 게시글의 신고 사유(ABUSE)"), + fieldWithPath("[].type").type(JsonFieldType.STRING) + .description("신고 게시글의 유형(COMMENT, PARTICIPANT, REQUEST_NOTIFICATION)"), + fieldWithPath("[].createdAt").type(JsonFieldType.STRING) + .description("신고 일자(yyyy:MM:dd:HH:mm:ss)") + ); + + final List reportResponses = List.of( + new ReportResponse(1L, 1L, 2L, "메롱메롱", ReportReasonType.ABUSE, ReportType.COMMENT, + LocalDateTime.parse("2023-08-09T13:25:00")), + new ReportResponse(2L, 2L, 1L, "대충 심한 욕설", ReportReasonType.ABUSE, ReportType.PARTICIPANT, + LocalDateTime.parse("2023-08-11T13:25:00")), + new ReportResponse(3L, 1L, 3L, "사회적 물의를 일으킬 수 있는 발언", ReportReasonType.ABUSE, + ReportType.REQUEST_NOTIFICATION, + LocalDateTime.parse("2023-08-11T13:50:00")), + new ReportResponse(4L, 4L, 1L, "도배글", ReportReasonType.ABUSE, ReportType.COMMENT, + LocalDateTime.parse("2023-08-12T13:25:00")) + + ); + + when(reportQueryService.findReports()).thenReturn(reportResponses); + + // when & then + mockMvc.perform(get("/reports")) + .andExpect(status().isOk()) + .andDo(document("find-reports", responseFields)); + + + } +} \ No newline at end of file diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java new file mode 100644 index 000000000..a7dc496be --- /dev/null +++ b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java @@ -0,0 +1,11 @@ +package com.emmsale.report.application; + +import com.emmsale.helper.ServiceIntegrationTestHelper; +import org.springframework.beans.factory.annotation.Autowired; + +class ReportCommandServiceTest extends ServiceIntegrationTestHelper { + + @Autowired + private ReportCommandService reportCommandService; + +} \ No newline at end of file diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java new file mode 100644 index 000000000..79234661e --- /dev/null +++ b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java @@ -0,0 +1,10 @@ +package com.emmsale.report.application; + +import com.emmsale.helper.ServiceIntegrationTestHelper; +import org.springframework.beans.factory.annotation.Autowired; + +class ReportQueryServiceTest extends ServiceIntegrationTestHelper { + + @Autowired + private ReportQueryService reportQueryService; +} \ No newline at end of file From db833cd1065e6737b057355524086fc0115579eb Mon Sep 17 00:00:00 2001 From: amaran-th Date: Wed, 9 Aug 2023 15:37:06 +0900 Subject: [PATCH 03/15] =?UTF-8?q?feat:=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=EC=9D=84=20=EC=A0=9C?= =?UTF-8?q?=EC=99=B8=ED=95=9C=20=EA=B8=B0=EB=8A=A5=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #245 --- .../com/emmsale/report/api/ReportApi.java | 2 +- .../application/ReportCommandService.java | 12 +- .../application/ReportQueryService.java | 16 +-- .../application/dto/ReportResponse.java | 15 ++ .../report/exception/ReportExceptionType.java | 4 + backend/emm-sale/src/main/resources/data.sql | 9 -- .../com/emmsale/report/api/ReportApiTest.java | 7 +- .../application/ReportCommandServiceTest.java | 129 ++++++++++++++++++ .../application/ReportQueryServiceTest.java | 37 +++++ .../emm-sale/src/test/resources/data-test.sql | 1 + 10 files changed, 199 insertions(+), 33 deletions(-) diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/api/ReportApi.java b/backend/emm-sale/src/main/java/com/emmsale/report/api/ReportApi.java index 85c544e5c..1eec3197c 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/api/ReportApi.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/api/ReportApi.java @@ -24,7 +24,7 @@ public class ReportApi { @PostMapping("/reports") @ResponseStatus(HttpStatus.CREATED) public ReportResponse create(@RequestBody final ReportRequest reportRequest, Member member) { - return reportCommandService.create(reportRequest); + return reportCommandService.create(reportRequest, member); } @GetMapping("/reports") diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java index 9a86e5f0c..092eba858 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java @@ -1,11 +1,10 @@ package com.emmsale.report.application; +import com.emmsale.member.domain.Member; import com.emmsale.report.application.dto.ReportRequest; import com.emmsale.report.application.dto.ReportResponse; -import com.emmsale.report.domain.ReportReasonType; -import com.emmsale.report.domain.ReportType; +import com.emmsale.report.domain.Report; import com.emmsale.report.domain.repository.ReportRepository; -import java.time.LocalDateTime; import javax.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -17,9 +16,10 @@ public class ReportCommandService { private final ReportRepository reportRepository; - public ReportResponse create(final ReportRequest reportRequest) { - return new ReportResponse(1L, 1L, 2L, "메롱메롱", ReportReasonType.ABUSE, ReportType.COMMENT, - LocalDateTime.parse("2023-08-09T13:25:00")); + public ReportResponse create(final ReportRequest reportRequest, final Member member) { + final Report report = new Report(reportRequest.getReporterId(), reportRequest.getReportedId(), + reportRequest.getContent(), reportRequest.getReasonType(), reportRequest.getType()); + return ReportResponse.of(reportRepository.save(report)); } } diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportQueryService.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportQueryService.java index 60e0ec533..00053bc80 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportQueryService.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportQueryService.java @@ -1,10 +1,7 @@ package com.emmsale.report.application; import com.emmsale.report.application.dto.ReportResponse; -import com.emmsale.report.domain.ReportReasonType; -import com.emmsale.report.domain.ReportType; import com.emmsale.report.domain.repository.ReportRepository; -import java.time.LocalDateTime; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -18,17 +15,6 @@ public class ReportQueryService { private final ReportRepository reportRepository; public List findReports() { - return List.of( - new ReportResponse(1L, 1L, 2L, "메롱메롱", ReportReasonType.ABUSE, ReportType.COMMENT, - LocalDateTime.parse("2023-08-09T13:25:00")), - new ReportResponse(2L, 2L, 1L, "대충 심한 욕설", ReportReasonType.ABUSE, ReportType.PARTICIPANT, - LocalDateTime.parse("2023-08-11T13:25:00")), - new ReportResponse(3L, 1L, 3L, "사회적 물의를 일으킬 수 있는 발언", ReportReasonType.ABUSE, - ReportType.REQUEST_NOTIFICATION, - LocalDateTime.parse("2023-08-11T13:50:00")), - new ReportResponse(4L, 4L, 1L, "도배글", ReportReasonType.ABUSE, ReportType.COMMENT, - LocalDateTime.parse("2023-08-12T13:25:00")) - - ); + return ReportResponse.of(reportRepository.findAll()); } } diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportResponse.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportResponse.java index 6f5ded51c..41d7c1e7e 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportResponse.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportResponse.java @@ -1,9 +1,12 @@ package com.emmsale.report.application.dto; +import com.emmsale.report.domain.Report; import com.emmsale.report.domain.ReportReasonType; import com.emmsale.report.domain.ReportType; import com.fasterxml.jackson.annotation.JsonFormat; import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -19,4 +22,16 @@ public class ReportResponse { private final ReportType type; @JsonFormat(pattern = "yyyy:MM:dd:HH:mm:ss") private final LocalDateTime createdAt; + + public static ReportResponse of(Report report) { + return new ReportResponse(report.getId(), report.getReporterId(), + report.getReportedId(), report.getContent(), report.getReasonType(), report.getType(), + report.getCreatedAt()); + } + + public static List of(List reports) { + return reports.stream() + .map(ReportResponse::of) + .collect(Collectors.toList()); + } } diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java b/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java index 9435dd70d..9e664c618 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java @@ -9,6 +9,10 @@ public enum ReportExceptionType implements BaseExceptionType { HttpStatus.NOT_FOUND, "존재하지 않는 사용자입니다." ), + REPORT_MYSELF( + HttpStatus.BAD_REQUEST, + "자기 자신은 신고할 수 없습니다." + ), FORBIDDEN_REPORT( HttpStatus.FORBIDDEN, "신고 권한이 없습니다." diff --git a/backend/emm-sale/src/main/resources/data.sql b/backend/emm-sale/src/main/resources/data.sql index 15c7ed0ab..9bfb1b07e 100644 --- a/backend/emm-sale/src/main/resources/data.sql +++ b/backend/emm-sale/src/main/resources/data.sql @@ -191,12 +191,3 @@ insert into event_member (member_id, event_id, content) value (3, 1, '빈 게시 insert into event_member (member_id, event_id, content) value (1, 2, '빈 게시글 내용'); insert into event_member (member_id, event_id, content) value (2, 2, '빈 게시글 내용'); insert into event_member (member_id, event_id, content) value (3, 2, '빈 게시글 내용'); - -insert into report (id, reporter_id, reported_id, content, reason_type, type, created_at) -values (1, 1, 2, '메롱메롱', 'ABUSE', 'COMMENT', CURRENT_TIMESTAMP()); -insert into report (id, reporter_id, reported_id, content, reason_type, type, created_at) -values (2, 2, 1, '대충 심한 욕설', 'ABUSE', 'PARTICIPANT', CURRENT_TIMESTAMP()); -insert into report (id, reporter_id, reported_id, content, reason_type, type, created_at) -values (3, 1, 3, '사회적 물의를 일으킬 수 있는 발언', 'ABUSE', 'REQUEST_NOTIFICATION', CURRENT_TIMESTAMP()); -insert into report (id, reporter_id, reported_id, content, reason_type, type, created_at) -values (4, 4, 1, '도배글', 'ABUSE', 'COMMENT', CURRENT_TIMESTAMP()); \ No newline at end of file diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java index 39669f291..ab2bfe9da 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java @@ -40,6 +40,7 @@ class ReportApiTest extends MockMvcTestHelper { @DisplayName("특정 게시글을 신고할 수 있다.") void addReport() throws Exception { // given + final String accessToken = "Bearer access_token"; final RequestFieldsSnippet requestFields = requestFields( fieldWithPath("reporterId").type(JsonFieldType.NUMBER).description("신고자의 Id"), fieldWithPath("reportedId").type(JsonFieldType.NUMBER).description("신고 대상자의 Id(당하는 사람)"), @@ -70,10 +71,12 @@ void addReport() throws Exception { reportRequest.getContent(), reportRequest.getReasonType(), reportRequest.getType(), LocalDateTime.parse("2023-08-09T13:25:00")); - when(reportCommandService.create(any())).thenReturn(reportResponse); + when(reportCommandService.create(any(), any())).thenReturn(reportResponse); // when & then - mockMvc.perform(post("/reports").contentType(MediaType.APPLICATION_JSON_VALUE) + mockMvc.perform(post("/reports") + .header("Authorization", accessToken) + .contentType(MediaType.APPLICATION_JSON_VALUE) .content(objectMapper.writeValueAsString(reportRequest))) .andExpect(status().isCreated()) .andDo(document("add-report", requestFields, responseFields)); diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java index a7dc496be..da051c905 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java @@ -1,11 +1,140 @@ package com.emmsale.report.application; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import com.emmsale.helper.ServiceIntegrationTestHelper; +import com.emmsale.member.domain.Member; +import com.emmsale.member.domain.MemberRepository; +import com.emmsale.report.application.dto.ReportRequest; +import com.emmsale.report.application.dto.ReportResponse; +import com.emmsale.report.domain.ReportReasonType; +import com.emmsale.report.domain.ReportType; +import com.emmsale.report.domain.repository.ReportRepository; +import com.emmsale.report.exception.ReportException; +import com.emmsale.report.exception.ReportExceptionType; +import org.assertj.core.api.ThrowableAssert.ThrowingCallable; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; class ReportCommandServiceTest extends ServiceIntegrationTestHelper { @Autowired private ReportCommandService reportCommandService; + @Autowired + private MemberRepository memberRepository; + @Autowired + private ReportRepository reportRepository; + + @Nested + @DisplayName("특정 게시글을 신고할 수 있다.") + class Create { + + @Test + @DisplayName("신고자와 신고 대상자, 신고 유형 등을 입력하면 특정 게시물을 정상적으로 신고할 수 있고, 게시물 작성자가 차단된다.") + void create_success() { + // given + final Long reporterId = 1L; + final Long reportedId = 2L; + final String abusingContent = "메롱메롱"; + final Member reporter = memberRepository.findById(reporterId).get(); + final ReportRequest request = new ReportRequest(reporterId, reportedId, abusingContent, + ReportReasonType.ABUSE, ReportType.COMMENT); + final ReportResponse expected = new ReportResponse(1L, reporterId, reportedId, abusingContent, + ReportReasonType.ABUSE, ReportType.COMMENT, null); + + // when + final ReportResponse actual = reportCommandService.create(request, reporter); + // TODO: 2023-08-09 신고 대상자가 차단되었는지 여부를 검증하는 로직 추가 + // then + assertThat(actual) + .usingRecursiveComparison() + .ignoringFields("id", "createdAt") + .isEqualTo(expected); + } + + @Test + @DisplayName("신고 대상자가 존재하지 않을 경우 예외를 반환한다.") + void create_fail_not_found_member() { + // given + final Long reporterId = 1L; + final Long reportedId = 9999L; + final String abusingContent = "메롱메롱"; + final Member reporter = memberRepository.findById(reporterId).get(); + final ReportRequest request = new ReportRequest(reporterId, reportedId, abusingContent, + ReportReasonType.ABUSE, ReportType.COMMENT); + + // when + final ThrowingCallable actual = () -> reportCommandService.create(request, reporter); + + // then + assertThatThrownBy(actual) + .isInstanceOf(ReportException.class) + .hasMessage(ReportExceptionType.NOT_FOUND_MEMBER.errorMessage()); + } + + @Test + @DisplayName("자신을 신고할 경우 예외를 반환한다.") + void create_fail_report_self() { + // given + final Long reporterId = 1L; + final String abusingContent = "메롱메롱"; + final Member reporter = memberRepository.findById(reporterId).get(); + final ReportRequest request = new ReportRequest(reporterId, reporterId, abusingContent, + ReportReasonType.ABUSE, ReportType.COMMENT); + + // when + final ThrowingCallable actual = () -> reportCommandService.create(request, reporter); + + // then + assertThatThrownBy(actual) + .isInstanceOf(ReportException.class) + .hasMessage(ReportExceptionType.REPORT_MYSELF.errorMessage()); + } + + @Test + @DisplayName("신고자가 자신이 아닐 경우 예외를 반환한다.") + void create_fail_forbidden_report() { + // given + final Long reporterId = 1L; + final Long otherMemberId = 2L; + final Long reportedId = 1L; + final String abusingContent = "메롱메롱"; + final Member reporter = memberRepository.findById(reporterId).get(); + final ReportRequest request = new ReportRequest(otherMemberId, reportedId, abusingContent, + ReportReasonType.ABUSE, ReportType.COMMENT); + + // when + final ThrowingCallable actual = () -> reportCommandService.create(request, reporter); + + // then + assertThatThrownBy(actual) + .isInstanceOf(ReportException.class) + .hasMessage(ReportExceptionType.FORBIDDEN_REPORT.errorMessage()); + } + + @Test + @DisplayName("이미 신고한 사용자를 한 번 더 신고할 경우 예외를 반환한다.") + void create_fail_already_exist_report() { + // given + final Long reporterId = 1L; + final Long reportedId = 2L; + final String abusingContent = "메롱메롱"; + final Member reporter = memberRepository.findById(reporterId).get(); + final ReportRequest request = new ReportRequest(reporterId, reportedId, abusingContent, + ReportReasonType.ABUSE, ReportType.COMMENT); + reportCommandService.create(request, reporter); + + // when + final ThrowingCallable actual = () -> reportCommandService.create(request, reporter); + + // then + assertThatThrownBy(actual) + .isInstanceOf(ReportException.class) + .hasMessage(ReportExceptionType.ALREADY_EXIST_REPORT.errorMessage()); + } + } } \ No newline at end of file diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java index 79234661e..6142ed54c 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java @@ -1,10 +1,47 @@ package com.emmsale.report.application; + import com.emmsale.helper.ServiceIntegrationTestHelper; +import com.emmsale.member.domain.Member; +import com.emmsale.member.domain.MemberRepository; +import com.emmsale.report.application.dto.ReportRequest; +import com.emmsale.report.application.dto.ReportResponse; +import com.emmsale.report.domain.ReportReasonType; +import com.emmsale.report.domain.ReportType; +import java.util.List; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; class ReportQueryServiceTest extends ServiceIntegrationTestHelper { @Autowired private ReportQueryService reportQueryService; + @Autowired + private ReportCommandService reportCommandService; + @Autowired + private MemberRepository memberRepository; + + @Test + @DisplayName("모든 신고 목록을 조회할 수 있다.") + void findReports() { + // given + final Long reporterId = 1L; + final Long reportedId = 2L; + final String abusingContent = "메롱메롱"; + final Member reporter = memberRepository.findById(reporterId).get(); + final ReportRequest request = new ReportRequest(reporterId, reportedId, abusingContent, + ReportReasonType.ABUSE, ReportType.COMMENT); + final List expected = List.of(reportCommandService.create(request, reporter)); + + // when + List actual = reportQueryService.findReports(); + + // then + Assertions.assertThat(actual) + .usingRecursiveComparison() + .isEqualTo(expected); + + } } \ No newline at end of file diff --git a/backend/emm-sale/src/test/resources/data-test.sql b/backend/emm-sale/src/test/resources/data-test.sql index 4fa6785ae..d4f2d836a 100644 --- a/backend/emm-sale/src/test/resources/data-test.sql +++ b/backend/emm-sale/src/test/resources/data-test.sql @@ -8,6 +8,7 @@ truncate table event_tag; truncate table member_tag; truncate table event_member; truncate table notification; +truncate table report; insert into activity(id, type, name) values (1, 'CLUB', 'YAPP'); From 1055974deab7c78eded4186c8cdc99de602044de Mon Sep 17 00:00:00 2001 From: amaran-th Date: Wed, 9 Aug 2023 16:09:07 +0900 Subject: [PATCH 04/15] =?UTF-8?q?feat:=20=EC=8B=A0=EA=B3=A0=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20API=EC=9D=98=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #245 --- .../com/emmsale/member/domain/Member.java | 11 +++++++--- .../application/ReportCommandService.java | 21 +++++++++++++++++-- .../report/application/dto/ReportRequest.java | 5 +++++ .../domain/repository/ReportRepository.java | 2 ++ .../application/ReportQueryServiceTest.java | 1 + 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/backend/emm-sale/src/main/java/com/emmsale/member/domain/Member.java b/backend/emm-sale/src/main/java/com/emmsale/member/domain/Member.java index 70d34ac70..72fffccd9 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/member/domain/Member.java +++ b/backend/emm-sale/src/main/java/com/emmsale/member/domain/Member.java @@ -79,13 +79,18 @@ private void validateDescriptionLength(final String description) { } } + public boolean isMe(final Member member) { + return isMe(member.getId()); + } + + public boolean isMe(final Long id) { + return this.id.equals((id)); + } + public boolean isNotMe(final Member member) { return isNotMe(member.getId()); } - public boolean isMe(final Member member) { - return this.id.equals(member.id); - } public boolean isNotMe(final Long id) { return !this.id.equals(id); diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java index 092eba858..61d4c4c98 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java @@ -1,10 +1,13 @@ package com.emmsale.report.application; import com.emmsale.member.domain.Member; +import com.emmsale.member.domain.MemberRepository; import com.emmsale.report.application.dto.ReportRequest; import com.emmsale.report.application.dto.ReportResponse; import com.emmsale.report.domain.Report; import com.emmsale.report.domain.repository.ReportRepository; +import com.emmsale.report.exception.ReportException; +import com.emmsale.report.exception.ReportExceptionType; import javax.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -15,10 +18,24 @@ public class ReportCommandService { private final ReportRepository reportRepository; + private final MemberRepository memberRepository; public ReportResponse create(final ReportRequest reportRequest, final Member member) { - final Report report = new Report(reportRequest.getReporterId(), reportRequest.getReportedId(), - reportRequest.getContent(), reportRequest.getReasonType(), reportRequest.getType()); + if (member.isNotMe(reportRequest.getReporterId())) { + throw new ReportException(ReportExceptionType.FORBIDDEN_REPORT); + } + if (member.isMe(reportRequest.getReportedId())) { + throw new ReportException(ReportExceptionType.REPORT_MYSELF); + } + if (!memberRepository.existsById(reportRequest.getReportedId())) { + throw new ReportException(ReportExceptionType.NOT_FOUND_MEMBER); + } + if (reportRepository.existsReportByReporterIdAndReportedId(reportRequest.getReporterId(), + reportRequest.getReportedId())) { + throw new ReportException(ReportExceptionType.ALREADY_EXIST_REPORT); + } + final Report report = reportRequest.toReport(); + return ReportResponse.of(reportRepository.save(report)); } diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportRequest.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportRequest.java index a58a4a284..92d7488a1 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportRequest.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportRequest.java @@ -1,5 +1,6 @@ package com.emmsale.report.application.dto; +import com.emmsale.report.domain.Report; import com.emmsale.report.domain.ReportReasonType; import com.emmsale.report.domain.ReportType; import lombok.Getter; @@ -14,4 +15,8 @@ public class ReportRequest { private final String content; private final ReportReasonType reasonType; private final ReportType type; + + public Report toReport() { + return new Report(reporterId, reportedId, content, reasonType, type); + } } diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/domain/repository/ReportRepository.java b/backend/emm-sale/src/main/java/com/emmsale/report/domain/repository/ReportRepository.java index 5b1f49553..9dd13c30f 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/domain/repository/ReportRepository.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/domain/repository/ReportRepository.java @@ -5,4 +5,6 @@ public interface ReportRepository extends JpaRepository { + boolean existsReportByReporterIdAndReportedId(final Long reporterId, final Long reportedId); + } diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java index 6142ed54c..2f79be7ee 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java @@ -41,6 +41,7 @@ void findReports() { // then Assertions.assertThat(actual) .usingRecursiveComparison() + .ignoringFields("createdAt") .isEqualTo(expected); } From 4eba931ee84c068ae3ca3f5dd8556db9ec4f1d61 Mon Sep 17 00:00:00 2001 From: amaran-th Date: Wed, 9 Aug 2023 20:38:14 +0900 Subject: [PATCH 05/15] =?UTF-8?q?refactor:=20=EC=8B=A0=EA=B3=A0=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20API=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20?= =?UTF-8?q?=EB=B0=8F=20ReasonType=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #245 --- .../application/ReportCommandService.java | 39 ++++++++++++++----- .../report/domain/ReportReasonType.java | 4 +- .../report/exception/ReportExceptionType.java | 2 +- .../com/emmsale/report/api/ReportApiTest.java | 6 +-- .../application/ReportCommandServiceTest.java | 2 +- 5 files changed, 37 insertions(+), 16 deletions(-) diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java index 61d4c4c98..1d14aca94 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java @@ -21,22 +21,41 @@ public class ReportCommandService { private final MemberRepository memberRepository; public ReportResponse create(final ReportRequest reportRequest, final Member member) { - if (member.isNotMe(reportRequest.getReporterId())) { - throw new ReportException(ReportExceptionType.FORBIDDEN_REPORT); + validateReportRequest(reportRequest, member); + final Report report = reportRequest.toReport(); + + return ReportResponse.of(reportRepository.save(report)); + } + + private void validateReportRequest(final ReportRequest reportRequest, final Member member) { + validateReporterMismatch(reportRequest.getReporterId(), member); + validateReportMySelf(reportRequest.getReportedId(), member); + validateExistReportedMember(reportRequest.getReportedId()); + validateAlreadyExistReport(reportRequest); + } + + private void validateReporterMismatch(final Long reporterId, final Member member) { + if (member.isNotMe(reporterId)) { + throw new ReportException(ReportExceptionType.REPORTER_MISMATCH); } - if (member.isMe(reportRequest.getReportedId())) { + } + + private void validateReportMySelf(final Long reportedId, final Member member) { + if (member.isMe(reportedId)) { throw new ReportException(ReportExceptionType.REPORT_MYSELF); } - if (!memberRepository.existsById(reportRequest.getReportedId())) { + } + + private void validateExistReportedMember(final Long reportedId) { + if (!memberRepository.existsById(reportedId)) { throw new ReportException(ReportExceptionType.NOT_FOUND_MEMBER); } - if (reportRepository.existsReportByReporterIdAndReportedId(reportRequest.getReporterId(), - reportRequest.getReportedId())) { + } + + private void validateAlreadyExistReport(final ReportRequest reportRequest) { + if (reportRepository.existsReportByReporterIdAndReportedId( + reportRequest.getReporterId(), reportRequest.getReportedId())) { throw new ReportException(ReportExceptionType.ALREADY_EXIST_REPORT); } - final Report report = reportRequest.toReport(); - - return ReportResponse.of(reportRepository.save(report)); } - } diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportReasonType.java b/backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportReasonType.java index c99785128..fc6f26c0b 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportReasonType.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportReasonType.java @@ -1,5 +1,7 @@ package com.emmsale.report.domain; public enum ReportReasonType { - ABUSE + ABUSE, + SPAM, + IMPERSONATION; } diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java b/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java index 9e664c618..32b6bb387 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java @@ -13,7 +13,7 @@ public enum ReportExceptionType implements BaseExceptionType { HttpStatus.BAD_REQUEST, "자기 자신은 신고할 수 없습니다." ), - FORBIDDEN_REPORT( + REPORTER_MISMATCH( HttpStatus.FORBIDDEN, "신고 권한이 없습니다." ), diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java index ab2bfe9da..9e7390839 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java @@ -104,12 +104,12 @@ void findReports() throws Exception { final List reportResponses = List.of( new ReportResponse(1L, 1L, 2L, "메롱메롱", ReportReasonType.ABUSE, ReportType.COMMENT, LocalDateTime.parse("2023-08-09T13:25:00")), - new ReportResponse(2L, 2L, 1L, "대충 심한 욕설", ReportReasonType.ABUSE, ReportType.PARTICIPANT, + new ReportResponse(2L, 2L, 1L, "☆★ 특가 세일 ★☆", ReportReasonType.SPAM, ReportType.PARTICIPANT, LocalDateTime.parse("2023-08-11T13:25:00")), - new ReportResponse(3L, 1L, 3L, "사회적 물의를 일으킬 수 있는 발언", ReportReasonType.ABUSE, + new ReportResponse(3L, 1L, 3L, "저는 스티브잡스입니다.", ReportReasonType.IMPERSONATION, ReportType.REQUEST_NOTIFICATION, LocalDateTime.parse("2023-08-11T13:50:00")), - new ReportResponse(4L, 4L, 1L, "도배글", ReportReasonType.ABUSE, ReportType.COMMENT, + new ReportResponse(4L, 4L, 1L, "도배글", ReportReasonType.SPAM, ReportType.COMMENT, LocalDateTime.parse("2023-08-12T13:25:00")) ); diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java index da051c905..6c7f666c8 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java @@ -112,7 +112,7 @@ void create_fail_forbidden_report() { // then assertThatThrownBy(actual) .isInstanceOf(ReportException.class) - .hasMessage(ReportExceptionType.FORBIDDEN_REPORT.errorMessage()); + .hasMessage(ReportExceptionType.REPORTER_MISMATCH.errorMessage()); } @Test From f692dbbde0fb73e83372f08ffe51f61aa9e7d032 Mon Sep 17 00:00:00 2001 From: amaran-th Date: Mon, 14 Aug 2023 14:15:22 +0900 Subject: [PATCH 06/15] =?UTF-8?q?refactor:=20Entity=20=ED=95=84=EB=93=9C?= =?UTF-8?q?=20=EB=B0=8F=20Dto=20=ED=95=84=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - reasonType 제거 - content 내용 대신 contentId 추가 #245 --- backend/emm-sale/src/docs/asciidoc/index.adoc | 2 +- .../report/application/dto/ReportRequest.java | 6 ++-- .../application/dto/ReportResponse.java | 6 ++-- .../com/emmsale/report/domain/Report.java | 14 +++----- .../report/exception/ReportExceptionType.java | 8 +++++ .../emm-sale/src/main/resources/schema.sql | 17 +++++---- .../com/emmsale/report/api/ReportApiTest.java | 30 ++++++---------- .../application/ReportCommandServiceTest.java | 35 +++++++++---------- .../application/ReportQueryServiceTest.java | 7 ++-- 9 files changed, 56 insertions(+), 69 deletions(-) diff --git a/backend/emm-sale/src/docs/asciidoc/index.adoc b/backend/emm-sale/src/docs/asciidoc/index.adoc index 00eeb1fd2..67af2212e 100644 --- a/backend/emm-sale/src/docs/asciidoc/index.adoc +++ b/backend/emm-sale/src/docs/asciidoc/index.adoc @@ -356,7 +356,7 @@ include::{snippets}/find-all-notifications/response-fields.adoc[] .HTTP response include::{snippets}/find-all-notifications/http-response.adoc[] -== Report(신고) +== Report === `POST` : 특정 사용자의 게시물 신고 diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportRequest.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportRequest.java index 92d7488a1..6da7eb6e9 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportRequest.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportRequest.java @@ -1,7 +1,6 @@ package com.emmsale.report.application.dto; import com.emmsale.report.domain.Report; -import com.emmsale.report.domain.ReportReasonType; import com.emmsale.report.domain.ReportType; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -12,11 +11,10 @@ public class ReportRequest { private final Long reporterId; private final Long reportedId; - private final String content; - private final ReportReasonType reasonType; private final ReportType type; + private final Long contentId; public Report toReport() { - return new Report(reporterId, reportedId, content, reasonType, type); + return new Report(reporterId, reportedId, type, contentId); } } diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportResponse.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportResponse.java index 41d7c1e7e..890dd2152 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportResponse.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportResponse.java @@ -1,7 +1,6 @@ package com.emmsale.report.application.dto; import com.emmsale.report.domain.Report; -import com.emmsale.report.domain.ReportReasonType; import com.emmsale.report.domain.ReportType; import com.fasterxml.jackson.annotation.JsonFormat; import java.time.LocalDateTime; @@ -17,15 +16,14 @@ public class ReportResponse { private final Long id; private final Long reporterId; private final Long reportedId; - private final String content; - private final ReportReasonType reasonType; private final ReportType type; + private final Long contentId; @JsonFormat(pattern = "yyyy:MM:dd:HH:mm:ss") private final LocalDateTime createdAt; public static ReportResponse of(Report report) { return new ReportResponse(report.getId(), report.getReporterId(), - report.getReportedId(), report.getContent(), report.getReasonType(), report.getType(), + report.getReportedId(), report.getType(), report.getContentId(), report.getCreatedAt()); } diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/domain/Report.java b/backend/emm-sale/src/main/java/com/emmsale/report/domain/Report.java index ab898d6b6..43b92854e 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/domain/Report.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/domain/Report.java @@ -25,20 +25,16 @@ public class Report extends BaseEntity { @Column(nullable = false) private Long reportedId; @Column(nullable = false) - private String content; - @Column(nullable = false) - @Enumerated(EnumType.STRING) - private ReportReasonType reasonType; - @Column(nullable = false) @Enumerated(EnumType.STRING) private ReportType type; + @Column(nullable = false) + private Long contentId; - public Report(final Long reporterId, final Long reportedId, final String content, - final ReportReasonType reasonType, final ReportType type) { + public Report(final Long reporterId, final Long reportedId, final ReportType type, + final Long contentId) { this.reporterId = reporterId; this.reportedId = reportedId; - this.content = content; - this.reasonType = reasonType; this.type = type; + this.contentId = contentId; } } diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java b/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java index 32b6bb387..7dc6dd393 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java @@ -9,6 +9,14 @@ public enum ReportExceptionType implements BaseExceptionType { HttpStatus.NOT_FOUND, "존재하지 않는 사용자입니다." ), + NOT_FOUND_CONTENT( + HttpStatus.NOT_FOUND, + "존재하지 않는 게시물입니다." + ), + REPORTED_MISMATCH_WRITER( + HttpStatus.BAD_REQUEST, + "신고한 게시물이 신고 대상자의 게시물이 아닙니다." + ), REPORT_MYSELF( HttpStatus.BAD_REQUEST, "자기 자신은 신고할 수 없습니다." diff --git a/backend/emm-sale/src/main/resources/schema.sql b/backend/emm-sale/src/main/resources/schema.sql index 3e9af566c..1c5385712 100644 --- a/backend/emm-sale/src/main/resources/schema.sql +++ b/backend/emm-sale/src/main/resources/schema.sql @@ -23,11 +23,11 @@ create table event id bigint auto_increment primary key, created_at datetime(6), updated_at datetime(6), - end_date datetime(6) not null, + end_date datetime(6) not null, information_url varchar(255) not null, location varchar(255) not null, name varchar(255) not null, - start_date datetime(6) not null, + start_date datetime(6) not null, image_url varchar(255), type varchar(20) not null ); @@ -53,7 +53,7 @@ create table comment is_deleted bit not null, event_id bigint not null, member_id bigint not null, - parent_id bigint null + parent_id bigint null ); create table member_activity @@ -120,15 +120,14 @@ alter table event_member alter table event_member add column updated_at datetime(6); --- 2023-08-09 13:10 +-- 2023-08-14 13:10 create table report ( id bigint auto_increment primary key, - reporter_id bigint not null, - reported_id bigint not null, - content varchar(255) not null, - reason_type varchar(20) not null, - type varchar(20) not null, + reporter_id bigint not null, + reported_id bigint not null, + type varchar(20) not null, + content_id bigint not null, created_at datetime(6), updated_at datetime(6) ); \ No newline at end of file diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java index 9e7390839..7052865d2 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java @@ -15,7 +15,6 @@ import com.emmsale.report.application.ReportQueryService; import com.emmsale.report.application.dto.ReportRequest; import com.emmsale.report.application.dto.ReportResponse; -import com.emmsale.report.domain.ReportReasonType; import com.emmsale.report.domain.ReportType; import java.time.LocalDateTime; import java.util.List; @@ -44,31 +43,25 @@ void addReport() throws Exception { final RequestFieldsSnippet requestFields = requestFields( fieldWithPath("reporterId").type(JsonFieldType.NUMBER).description("신고자의 Id"), fieldWithPath("reportedId").type(JsonFieldType.NUMBER).description("신고 대상자의 Id(당하는 사람)"), - fieldWithPath("content").type(JsonFieldType.STRING).description("신고 게시글의 내용"), - fieldWithPath("reasonType").type(JsonFieldType.STRING).description( - "신고 게시글의 신고 사유(ABUSE)"), fieldWithPath("type").type(JsonFieldType.STRING).description( - "신고 게시글의 유형(COMMENT, PARTICIPANT, REQUEST_NOTIFICATION)") + "신고 게시글의 유형(COMMENT, PARTICIPANT, REQUEST_NOTIFICATION)"), + fieldWithPath("contentId").type(JsonFieldType.NUMBER).description("신고 게시물의 Id") ); final ResponseFieldsSnippet responseFields = responseFields( fieldWithPath("id").type(JsonFieldType.NUMBER).description("신고 id"), fieldWithPath("reporterId").type(JsonFieldType.NUMBER).description("신고자의 Id"), fieldWithPath("reportedId").type(JsonFieldType.NUMBER).description("신고 대상자의 Id)"), - fieldWithPath("content").type(JsonFieldType.STRING).description("신고 게시글의 내용"), - fieldWithPath("reasonType").type(JsonFieldType.STRING) - .description("신고 게시글의 신고 사유(ABUSE)"), fieldWithPath("type").type(JsonFieldType.STRING) .description("신고 게시글의 유형(COMMENT, PARTICIPANT, REQUEST_NOTIFICATION)"), + fieldWithPath("contentId").type(JsonFieldType.NUMBER).description("신고 게시물의 Id"), fieldWithPath("createdAt").type(JsonFieldType.STRING) .description("신고 일자(yyyy:MM:dd:HH:mm:ss)") ); - final ReportRequest reportRequest = new ReportRequest(1L, 2L, "메롱메롱", ReportReasonType.ABUSE, - ReportType.COMMENT); + final ReportRequest reportRequest = new ReportRequest(1L, 2L, ReportType.COMMENT, 1L); final ReportResponse reportResponse = new ReportResponse(1L, reportRequest.getReporterId(), - reportRequest.getReportedId(), - reportRequest.getContent(), reportRequest.getReasonType(), reportRequest.getType(), + reportRequest.getReportedId(), reportRequest.getType(), reportRequest.getContentId(), LocalDateTime.parse("2023-08-09T13:25:00")); when(reportCommandService.create(any(), any())).thenReturn(reportResponse); @@ -92,24 +85,21 @@ void findReports() throws Exception { fieldWithPath("[].id").type(JsonFieldType.NUMBER).description("신고 id"), fieldWithPath("[].reporterId").type(JsonFieldType.NUMBER).description("신고자의 Id"), fieldWithPath("[].reportedId").type(JsonFieldType.NUMBER).description("신고 대상자의 Id)"), - fieldWithPath("[].content").type(JsonFieldType.STRING).description("신고 게시글의 내용"), - fieldWithPath("[].reasonType").type(JsonFieldType.STRING) - .description("신고 게시글의 신고 사유(ABUSE)"), fieldWithPath("[].type").type(JsonFieldType.STRING) .description("신고 게시글의 유형(COMMENT, PARTICIPANT, REQUEST_NOTIFICATION)"), + fieldWithPath("[].contentId").type(JsonFieldType.NUMBER).description("신고 게시물의 Id)"), fieldWithPath("[].createdAt").type(JsonFieldType.STRING) .description("신고 일자(yyyy:MM:dd:HH:mm:ss)") ); final List reportResponses = List.of( - new ReportResponse(1L, 1L, 2L, "메롱메롱", ReportReasonType.ABUSE, ReportType.COMMENT, + new ReportResponse(1L, 1L, 2L, ReportType.COMMENT, 3L, LocalDateTime.parse("2023-08-09T13:25:00")), - new ReportResponse(2L, 2L, 1L, "☆★ 특가 세일 ★☆", ReportReasonType.SPAM, ReportType.PARTICIPANT, + new ReportResponse(2L, 2L, 1L, ReportType.PARTICIPANT, 1L, LocalDateTime.parse("2023-08-11T13:25:00")), - new ReportResponse(3L, 1L, 3L, "저는 스티브잡스입니다.", ReportReasonType.IMPERSONATION, - ReportType.REQUEST_NOTIFICATION, + new ReportResponse(3L, 1L, 3L, ReportType.REQUEST_NOTIFICATION, 5L, LocalDateTime.parse("2023-08-11T13:50:00")), - new ReportResponse(4L, 4L, 1L, "도배글", ReportReasonType.SPAM, ReportType.COMMENT, + new ReportResponse(4L, 4L, 1L, ReportType.COMMENT, 2L, LocalDateTime.parse("2023-08-12T13:25:00")) ); diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java index 6c7f666c8..f8f5a0e0f 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java @@ -8,7 +8,6 @@ import com.emmsale.member.domain.MemberRepository; import com.emmsale.report.application.dto.ReportRequest; import com.emmsale.report.application.dto.ReportResponse; -import com.emmsale.report.domain.ReportReasonType; import com.emmsale.report.domain.ReportType; import com.emmsale.report.domain.repository.ReportRepository; import com.emmsale.report.exception.ReportException; @@ -38,12 +37,12 @@ void create_success() { // given final Long reporterId = 1L; final Long reportedId = 2L; - final String abusingContent = "메롱메롱"; + final Long abusingContentId = 1L; final Member reporter = memberRepository.findById(reporterId).get(); - final ReportRequest request = new ReportRequest(reporterId, reportedId, abusingContent, - ReportReasonType.ABUSE, ReportType.COMMENT); - final ReportResponse expected = new ReportResponse(1L, reporterId, reportedId, abusingContent, - ReportReasonType.ABUSE, ReportType.COMMENT, null); + final ReportRequest request = new ReportRequest(reporterId, reportedId, ReportType.COMMENT, + abusingContentId); + final ReportResponse expected = new ReportResponse(1L, reporterId, reportedId, + ReportType.COMMENT, abusingContentId, null); // when final ReportResponse actual = reportCommandService.create(request, reporter); @@ -61,10 +60,10 @@ void create_fail_not_found_member() { // given final Long reporterId = 1L; final Long reportedId = 9999L; - final String abusingContent = "메롱메롱"; + final Long abusingContentId = 1L; final Member reporter = memberRepository.findById(reporterId).get(); - final ReportRequest request = new ReportRequest(reporterId, reportedId, abusingContent, - ReportReasonType.ABUSE, ReportType.COMMENT); + final ReportRequest request = new ReportRequest(reporterId, reportedId, ReportType.COMMENT, + abusingContentId); // when final ThrowingCallable actual = () -> reportCommandService.create(request, reporter); @@ -80,10 +79,10 @@ void create_fail_not_found_member() { void create_fail_report_self() { // given final Long reporterId = 1L; - final String abusingContent = "메롱메롱"; + final Long abusingContentId = 1L; final Member reporter = memberRepository.findById(reporterId).get(); - final ReportRequest request = new ReportRequest(reporterId, reporterId, abusingContent, - ReportReasonType.ABUSE, ReportType.COMMENT); + final ReportRequest request = new ReportRequest(reporterId, reporterId, ReportType.COMMENT, + abusingContentId); // when final ThrowingCallable actual = () -> reportCommandService.create(request, reporter); @@ -101,10 +100,10 @@ void create_fail_forbidden_report() { final Long reporterId = 1L; final Long otherMemberId = 2L; final Long reportedId = 1L; - final String abusingContent = "메롱메롱"; + final Long abusingContentId = 1L; final Member reporter = memberRepository.findById(reporterId).get(); - final ReportRequest request = new ReportRequest(otherMemberId, reportedId, abusingContent, - ReportReasonType.ABUSE, ReportType.COMMENT); + final ReportRequest request = new ReportRequest(otherMemberId, reportedId, ReportType.COMMENT, + abusingContentId); // when final ThrowingCallable actual = () -> reportCommandService.create(request, reporter); @@ -121,10 +120,10 @@ void create_fail_already_exist_report() { // given final Long reporterId = 1L; final Long reportedId = 2L; - final String abusingContent = "메롱메롱"; + final Long abusingContentId = 1L; final Member reporter = memberRepository.findById(reporterId).get(); - final ReportRequest request = new ReportRequest(reporterId, reportedId, abusingContent, - ReportReasonType.ABUSE, ReportType.COMMENT); + final ReportRequest request = new ReportRequest(reporterId, reportedId, ReportType.COMMENT, + abusingContentId); reportCommandService.create(request, reporter); // when diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java index 2f79be7ee..72b583a74 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java @@ -6,7 +6,6 @@ import com.emmsale.member.domain.MemberRepository; import com.emmsale.report.application.dto.ReportRequest; import com.emmsale.report.application.dto.ReportResponse; -import com.emmsale.report.domain.ReportReasonType; import com.emmsale.report.domain.ReportType; import java.util.List; import org.assertj.core.api.Assertions; @@ -29,10 +28,10 @@ void findReports() { // given final Long reporterId = 1L; final Long reportedId = 2L; - final String abusingContent = "메롱메롱"; + final Long abusingContentId = 1L; final Member reporter = memberRepository.findById(reporterId).get(); - final ReportRequest request = new ReportRequest(reporterId, reportedId, abusingContent, - ReportReasonType.ABUSE, ReportType.COMMENT); + final ReportRequest request = new ReportRequest(reporterId, reportedId, ReportType.COMMENT, + abusingContentId); final List expected = List.of(reportCommandService.create(request, reporter)); // when From 252df12193d8261a74971d2aecfcaaf1d04fdc8f Mon Sep 17 00:00:00 2001 From: amaran-th Date: Mon, 14 Aug 2023 15:23:47 +0900 Subject: [PATCH 07/15] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ReportType의 PARTICIPANT를 RECRUITMENT_POST로 변경 #245 --- .../com/emmsale/report/domain/ReportType.java | 2 +- .../src/main/resources/http/report.http | 19 ++ .../com/emmsale/report/api/ReportApiTest.java | 2 +- .../application/ReportCommandServiceTest.java | 184 ++++++++++++++---- 4 files changed, 167 insertions(+), 40 deletions(-) create mode 100644 backend/emm-sale/src/main/resources/http/report.http diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportType.java b/backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportType.java index d5feebd1c..cc3ff509e 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportType.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportType.java @@ -2,6 +2,6 @@ public enum ReportType { COMMENT, - PARTICIPANT, + RECRUITMENT_POST, REQUEST_NOTIFICATION; } diff --git a/backend/emm-sale/src/main/resources/http/report.http b/backend/emm-sale/src/main/resources/http/report.http new file mode 100644 index 000000000..4af95fce1 --- /dev/null +++ b/backend/emm-sale/src/main/resources/http/report.http @@ -0,0 +1,19 @@ +### 게시물 신고 + +POST http://localhost:8080/reports +Content-Type: application/json +Authorization: bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjkwMTk2OTY5LCJleHAiOjE2OTM3OTY5Njl9.yahaEBvKBA7xelNuykx8TROhemnzJAsu1Sv5rrSfCM0 + +{ + "reporterId": 1, + "reportedId": 3, + "type": "COMMENT", + "contentId": 1 +} + +### 게시물 신고 목록 조회 + +GET http://localhost:8080/reports +Content-Type: application/json + + diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java index 7052865d2..83e1e7bc2 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java @@ -95,7 +95,7 @@ void findReports() throws Exception { final List reportResponses = List.of( new ReportResponse(1L, 1L, 2L, ReportType.COMMENT, 3L, LocalDateTime.parse("2023-08-09T13:25:00")), - new ReportResponse(2L, 2L, 1L, ReportType.PARTICIPANT, 1L, + new ReportResponse(2L, 2L, 1L, ReportType.RECRUITMENT_POST, 1L, LocalDateTime.parse("2023-08-11T13:25:00")), new ReportResponse(3L, 1L, 3L, ReportType.REQUEST_NOTIFICATION, 5L, LocalDateTime.parse("2023-08-11T13:50:00")), diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java index f8f5a0e0f..f1b63372c 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java @@ -1,18 +1,27 @@ package com.emmsale.report.application; +import static com.emmsale.event.EventFixture.eventFixture; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import com.emmsale.comment.domain.Comment; +import com.emmsale.comment.domain.CommentRepository; +import com.emmsale.event.domain.Event; +import com.emmsale.event.domain.RecruitmentPost; +import com.emmsale.event.domain.repository.EventRepository; +import com.emmsale.event.domain.repository.RecruitmentPostRepository; import com.emmsale.helper.ServiceIntegrationTestHelper; import com.emmsale.member.domain.Member; import com.emmsale.member.domain.MemberRepository; +import com.emmsale.notification.domain.RequestNotification; +import com.emmsale.notification.domain.RequestNotificationRepository; import com.emmsale.report.application.dto.ReportRequest; import com.emmsale.report.application.dto.ReportResponse; import com.emmsale.report.domain.ReportType; -import com.emmsale.report.domain.repository.ReportRepository; import com.emmsale.report.exception.ReportException; import com.emmsale.report.exception.ReportExceptionType; import org.assertj.core.api.ThrowableAssert.ThrowingCallable; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -20,49 +29,45 @@ class ReportCommandServiceTest extends ServiceIntegrationTestHelper { + private static final Long 신고자_ID = 1L; + private static Long 신고_대상자_ID; + @Autowired private ReportCommandService reportCommandService; @Autowired private MemberRepository memberRepository; @Autowired - private ReportRepository reportRepository; + private CommentRepository commentRepository; + @Autowired + private EventRepository eventRepository; + @Autowired + private RecruitmentPostRepository recruitmentPostRepository; + @Autowired + private RequestNotificationRepository requestNotificationRepository; + + @BeforeEach + void init() { + final Event event = eventRepository.save(eventFixture()); + final Member 신고_대상자 = memberRepository.findById(2L).get(); + 신고_대상자_ID = 신고_대상자.getId(); + commentRepository.save(Comment.createRoot(event, 신고_대상자, "상대방에게 불쾌감을 줄 수 있는 내용")); + recruitmentPostRepository.save(new RecruitmentPost(신고_대상자, event, "사회적 논란을 불러일으킬 수 있는 내용")); + requestNotificationRepository.save( + new RequestNotification(신고_대상자_ID, 신고자_ID, event.getId(), "모욕감을 줄 수 있는 내용")); + } @Nested @DisplayName("특정 게시글을 신고할 수 있다.") class Create { - @Test - @DisplayName("신고자와 신고 대상자, 신고 유형 등을 입력하면 특정 게시물을 정상적으로 신고할 수 있고, 게시물 작성자가 차단된다.") - void create_success() { - // given - final Long reporterId = 1L; - final Long reportedId = 2L; - final Long abusingContentId = 1L; - final Member reporter = memberRepository.findById(reporterId).get(); - final ReportRequest request = new ReportRequest(reporterId, reportedId, ReportType.COMMENT, - abusingContentId); - final ReportResponse expected = new ReportResponse(1L, reporterId, reportedId, - ReportType.COMMENT, abusingContentId, null); - - // when - final ReportResponse actual = reportCommandService.create(request, reporter); - // TODO: 2023-08-09 신고 대상자가 차단되었는지 여부를 검증하는 로직 추가 - // then - assertThat(actual) - .usingRecursiveComparison() - .ignoringFields("id", "createdAt") - .isEqualTo(expected); - } - @Test @DisplayName("신고 대상자가 존재하지 않을 경우 예외를 반환한다.") void create_fail_not_found_member() { // given - final Long reporterId = 1L; - final Long reportedId = 9999L; + final Long wrongReportedId = 9999L; final Long abusingContentId = 1L; - final Member reporter = memberRepository.findById(reporterId).get(); - final ReportRequest request = new ReportRequest(reporterId, reportedId, ReportType.COMMENT, + final Member reporter = memberRepository.findById(신고자_ID).get(); + final ReportRequest request = new ReportRequest(신고자_ID, wrongReportedId, ReportType.COMMENT, abusingContentId); // when @@ -78,10 +83,9 @@ void create_fail_not_found_member() { @DisplayName("자신을 신고할 경우 예외를 반환한다.") void create_fail_report_self() { // given - final Long reporterId = 1L; final Long abusingContentId = 1L; - final Member reporter = memberRepository.findById(reporterId).get(); - final ReportRequest request = new ReportRequest(reporterId, reporterId, ReportType.COMMENT, + final Member reporter = memberRepository.findById(신고자_ID).get(); + final ReportRequest request = new ReportRequest(신고자_ID, 신고자_ID, ReportType.COMMENT, abusingContentId); // when @@ -97,11 +101,10 @@ void create_fail_report_self() { @DisplayName("신고자가 자신이 아닐 경우 예외를 반환한다.") void create_fail_forbidden_report() { // given - final Long reporterId = 1L; final Long otherMemberId = 2L; final Long reportedId = 1L; final Long abusingContentId = 1L; - final Member reporter = memberRepository.findById(reporterId).get(); + final Member reporter = memberRepository.findById(신고자_ID).get(); final ReportRequest request = new ReportRequest(otherMemberId, reportedId, ReportType.COMMENT, abusingContentId); @@ -118,11 +121,9 @@ void create_fail_forbidden_report() { @DisplayName("이미 신고한 사용자를 한 번 더 신고할 경우 예외를 반환한다.") void create_fail_already_exist_report() { // given - final Long reporterId = 1L; - final Long reportedId = 2L; final Long abusingContentId = 1L; - final Member reporter = memberRepository.findById(reporterId).get(); - final ReportRequest request = new ReportRequest(reporterId, reportedId, ReportType.COMMENT, + final Member reporter = memberRepository.findById(신고자_ID).get(); + final ReportRequest request = new ReportRequest(신고자_ID, 신고_대상자_ID, ReportType.COMMENT, abusingContentId); reportCommandService.create(request, reporter); @@ -134,6 +135,113 @@ void create_fail_already_exist_report() { .isInstanceOf(ReportException.class) .hasMessage(ReportExceptionType.ALREADY_EXIST_REPORT.errorMessage()); } + + @Test + @DisplayName("존재하지 않는 게시물을 신고할 경우 예외를 반환한다.") + void create_fail_not_found_content() { + // given + final Long abusingContentId = 9999L; + final Member reporter = memberRepository.findById(신고자_ID).get(); + final ReportRequest request = new ReportRequest(신고자_ID, 신고_대상자_ID, ReportType.COMMENT, + abusingContentId); + + // when + final ThrowingCallable actual = () -> reportCommandService.create(request, reporter); + + // then + assertThatThrownBy(actual) + .isInstanceOf(ReportException.class) + .hasMessage(ReportExceptionType.NOT_FOUND_CONTENT.errorMessage()); + } + + @Test + @DisplayName("신고한 게시물이 신고 대상자의 게시물이 아닌 경우 예외를 반환한다.") + void create_fail_reported_mismatch_writer() { + // given + final Long abusingContentId = 2L; + final Member reporter = memberRepository.findById(신고자_ID).get(); + final ReportRequest request = new ReportRequest(신고자_ID, 신고_대상자_ID, ReportType.COMMENT, + abusingContentId); + + // when + final ThrowingCallable actual = () -> reportCommandService.create(request, reporter); + + // then + assertThatThrownBy(actual) + .isInstanceOf(ReportException.class) + .hasMessage(ReportExceptionType.REPORTED_MISMATCH_WRITER.errorMessage()); + } + + @Nested + @DisplayName("신고자와 신고 대상자, 신고 유형 등을 입력하면 특정 게시물을 정상적으로 신고할 수 있고, 게시물 작성자가 차단된다.") + class CreateSuccess { + + @Test + @DisplayName("댓글을 신고할 수 있다.") + void create_success_comment() { + // given + final Long abusingContentId = 1L; + final Member reporter = memberRepository.findById(신고자_ID).get(); + final ReportRequest request = new ReportRequest(신고자_ID, 신고_대상자_ID, ReportType.COMMENT, + abusingContentId); + final ReportResponse expected = new ReportResponse(1L, 신고자_ID, 신고_대상자_ID, + ReportType.COMMENT, abusingContentId, null); + + // when + final ReportResponse actual = reportCommandService.create(request, reporter); + // TODO: 2023-08-09 신고 대상자가 차단되었는지 여부를 검증하는 로직 추가 + // then + assertThat(actual) + .usingRecursiveComparison() + .ignoringFields("id", "createdAt") + .isEqualTo(expected); + } + + @Test + @DisplayName("함께해요 게시글을 신고할 수 있다.") + void create_success_participant() { + // given + final Long abusingContentId = 1L; + final Member reporter = memberRepository.findById(신고자_ID).get(); + final ReportRequest request = new ReportRequest(신고자_ID, 신고_대상자_ID, + ReportType.RECRUITMENT_POST, + abusingContentId); + final ReportResponse expected = new ReportResponse(1L, 신고자_ID, 신고_대상자_ID, + ReportType.RECRUITMENT_POST, abusingContentId, null); + + // when + final ReportResponse actual = reportCommandService.create(request, reporter); + // TODO: 2023-08-09 신고 대상자가 차단되었는지 여부를 검증하는 로직 추가 + // then + assertThat(actual) + .usingRecursiveComparison() + .ignoringFields("id", "createdAt") + .isEqualTo(expected); + } + + @Test + @DisplayName("같이가요 요청을 신고할 수 있다.") + void create_success_request_notification() { + // given + final Long abusingContentId = 1L; + final Member reporter = memberRepository.findById(신고자_ID).get(); + final ReportRequest request = new ReportRequest(신고자_ID, 신고_대상자_ID, + ReportType.REQUEST_NOTIFICATION, + abusingContentId); + final ReportResponse expected = new ReportResponse(1L, 신고자_ID, 신고_대상자_ID, + ReportType.REQUEST_NOTIFICATION, abusingContentId, null); + + // when + final ReportResponse actual = reportCommandService.create(request, reporter); + // TODO: 2023-08-09 신고 대상자가 차단되었는지 여부를 검증하는 로직 추가 + // then + assertThat(actual) + .usingRecursiveComparison() + .ignoringFields("id", "createdAt") + .isEqualTo(expected); + } + } + } } \ No newline at end of file From fd3bb1931a623041fa20227cca53d43c21d4cad3 Mon Sep 17 00:00:00 2001 From: amaran-th Date: Mon, 14 Aug 2023 15:44:50 +0900 Subject: [PATCH 08/15] =?UTF-8?q?refactor:=20ReportReasonType=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 사용되지 않는 enum 클래스 삭제 #245 --- .../java/com/emmsale/report/domain/ReportReasonType.java | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportReasonType.java diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportReasonType.java b/backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportReasonType.java deleted file mode 100644 index fc6f26c0b..000000000 --- a/backend/emm-sale/src/main/java/com/emmsale/report/domain/ReportReasonType.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.emmsale.report.domain; - -public enum ReportReasonType { - ABUSE, - SPAM, - IMPERSONATION; -} From d249f1a743efbb10c4df37162f28b294503618ed Mon Sep 17 00:00:00 2001 From: amaran-th Date: Mon, 14 Aug 2023 15:47:01 +0900 Subject: [PATCH 09/15] =?UTF-8?q?feat:=20content=20id=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=A6=9D=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 - type에 따라 content가 존재하는지 검증 - content의 작성자가 신고 대상자와 일치하는지 검증 #245 --- .../application/ReportCommandService.java | 49 +++++++++++++++++++ .../application/ReportCommandServiceTest.java | 9 ++-- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java index 1d14aca94..6780d7a3b 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java @@ -1,10 +1,17 @@ package com.emmsale.report.application; +import com.emmsale.comment.domain.Comment; +import com.emmsale.comment.domain.CommentRepository; +import com.emmsale.event.domain.RecruitmentPost; +import com.emmsale.event.domain.repository.RecruitmentPostRepository; import com.emmsale.member.domain.Member; import com.emmsale.member.domain.MemberRepository; +import com.emmsale.notification.domain.RequestNotification; +import com.emmsale.notification.domain.RequestNotificationRepository; import com.emmsale.report.application.dto.ReportRequest; import com.emmsale.report.application.dto.ReportResponse; import com.emmsale.report.domain.Report; +import com.emmsale.report.domain.ReportType; import com.emmsale.report.domain.repository.ReportRepository; import com.emmsale.report.exception.ReportException; import com.emmsale.report.exception.ReportExceptionType; @@ -19,6 +26,9 @@ public class ReportCommandService { private final ReportRepository reportRepository; private final MemberRepository memberRepository; + private final CommentRepository commentRepository; + private final RecruitmentPostRepository recruitmentPostRepository; + private final RequestNotificationRepository requestNotificationRepository; public ReportResponse create(final ReportRequest reportRequest, final Member member) { validateReportRequest(reportRequest, member); @@ -32,6 +42,7 @@ private void validateReportRequest(final ReportRequest reportRequest, final Memb validateReportMySelf(reportRequest.getReportedId(), member); validateExistReportedMember(reportRequest.getReportedId()); validateAlreadyExistReport(reportRequest); + validateContent(reportRequest); } private void validateReporterMismatch(final Long reporterId, final Member member) { @@ -58,4 +69,42 @@ private void validateAlreadyExistReport(final ReportRequest reportRequest) { throw new ReportException(ReportExceptionType.ALREADY_EXIST_REPORT); } } + + private void validateContent(final ReportRequest reportRequest) { + if (reportRequest.getType() == ReportType.COMMENT) { + validateComment(reportRequest); + } + if (reportRequest.getType() == ReportType.RECRUITMENT_POST) { + validateRecruitmentPost(reportRequest); + } + if (reportRequest.getType() == ReportType.REQUEST_NOTIFICATION) { + validateRequestNotification(reportRequest); + } + } + + private void validateComment(final ReportRequest reportRequest) { + Comment comment = commentRepository.findById(reportRequest.getContentId()) + .orElseThrow(() -> new ReportException(ReportExceptionType.NOT_FOUND_CONTENT)); + if (comment.getMember().getId().equals(reportRequest.getReportedId())) { + throw new ReportException(ReportExceptionType.REPORTED_MISMATCH_WRITER); + } + } + + private void validateRecruitmentPost(final ReportRequest reportRequest) { + RecruitmentPost recruitmentPost = recruitmentPostRepository.findById( + reportRequest.getContentId()) + .orElseThrow(() -> new ReportException(ReportExceptionType.NOT_FOUND_CONTENT)); + if (recruitmentPost.getMember().getId().equals(reportRequest.getReportedId())) { + throw new ReportException(ReportExceptionType.REPORTED_MISMATCH_WRITER); + } + } + + private void validateRequestNotification(final ReportRequest reportRequest) { + RequestNotification requestNotification = requestNotificationRepository.findById( + reportRequest.getContentId()) + .orElseThrow(() -> new ReportException(ReportExceptionType.NOT_FOUND_CONTENT)); + if (requestNotification.getSenderId().equals(reportRequest.getReportedId())) { + throw new ReportException(ReportExceptionType.REPORTED_MISMATCH_WRITER); + } + } } diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java index f1b63372c..3051886e5 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java @@ -29,7 +29,7 @@ class ReportCommandServiceTest extends ServiceIntegrationTestHelper { - private static final Long 신고자_ID = 1L; + private static Long 신고자_ID; private static Long 신고_대상자_ID; @Autowired @@ -37,10 +37,10 @@ class ReportCommandServiceTest extends ServiceIntegrationTestHelper { @Autowired private MemberRepository memberRepository; @Autowired - private CommentRepository commentRepository; - @Autowired private EventRepository eventRepository; @Autowired + private CommentRepository commentRepository; + @Autowired private RecruitmentPostRepository recruitmentPostRepository; @Autowired private RequestNotificationRepository requestNotificationRepository; @@ -48,9 +48,12 @@ class ReportCommandServiceTest extends ServiceIntegrationTestHelper { @BeforeEach void init() { final Event event = eventRepository.save(eventFixture()); + final Member 신고자 = memberRepository.findById(1L).get(); final Member 신고_대상자 = memberRepository.findById(2L).get(); + 신고자_ID = 신고자.getId(); 신고_대상자_ID = 신고_대상자.getId(); commentRepository.save(Comment.createRoot(event, 신고_대상자, "상대방에게 불쾌감을 줄 수 있는 내용")); + commentRepository.save(Comment.createRoot(event, 신고자, "그냥 댓글")); recruitmentPostRepository.save(new RecruitmentPost(신고_대상자, event, "사회적 논란을 불러일으킬 수 있는 내용")); requestNotificationRepository.save( new RequestNotification(신고_대상자_ID, 신고자_ID, event.getId(), "모욕감을 줄 수 있는 내용")); From 4d18058593c99d29bd1c0873962d97668699fb74 Mon Sep 17 00:00:00 2001 From: amaran-th Date: Mon, 14 Aug 2023 16:55:23 +0900 Subject: [PATCH 10/15] =?UTF-8?q?feat:=20=EC=8B=A0=EA=B3=A0=20=ED=9B=84=20?= =?UTF-8?q?=EC=B0=A8=EB=8B=A8=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 사용자 신고 후 해당 사용자를 차단하는 기능 구현 #245 --- .../application/ReportCommandService.java | 21 ++++++-- .../src/main/resources/http/report.http | 2 +- .../application/ReportCommandServiceTest.java | 51 +++++++++++++------ 3 files changed, 54 insertions(+), 20 deletions(-) diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java index 6780d7a3b..4545d843d 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java @@ -1,5 +1,7 @@ package com.emmsale.report.application; +import com.emmsale.block.domain.Block; +import com.emmsale.block.domain.BlockRepository; import com.emmsale.comment.domain.Comment; import com.emmsale.comment.domain.CommentRepository; import com.emmsale.event.domain.RecruitmentPost; @@ -29,14 +31,16 @@ public class ReportCommandService { private final CommentRepository commentRepository; private final RecruitmentPostRepository recruitmentPostRepository; private final RequestNotificationRepository requestNotificationRepository; + private final BlockRepository blockRepository; public ReportResponse create(final ReportRequest reportRequest, final Member member) { validateReportRequest(reportRequest, member); final Report report = reportRequest.toReport(); - + blockReportedMember(reportRequest); return ReportResponse.of(reportRepository.save(report)); } + private void validateReportRequest(final ReportRequest reportRequest, final Member member) { validateReporterMismatch(reportRequest.getReporterId(), member); validateReportMySelf(reportRequest.getReportedId(), member); @@ -85,7 +89,7 @@ private void validateContent(final ReportRequest reportRequest) { private void validateComment(final ReportRequest reportRequest) { Comment comment = commentRepository.findById(reportRequest.getContentId()) .orElseThrow(() -> new ReportException(ReportExceptionType.NOT_FOUND_CONTENT)); - if (comment.getMember().getId().equals(reportRequest.getReportedId())) { + if (!comment.getMember().getId().equals(reportRequest.getReportedId())) { throw new ReportException(ReportExceptionType.REPORTED_MISMATCH_WRITER); } } @@ -94,7 +98,7 @@ private void validateRecruitmentPost(final ReportRequest reportRequest) { RecruitmentPost recruitmentPost = recruitmentPostRepository.findById( reportRequest.getContentId()) .orElseThrow(() -> new ReportException(ReportExceptionType.NOT_FOUND_CONTENT)); - if (recruitmentPost.getMember().getId().equals(reportRequest.getReportedId())) { + if (!recruitmentPost.getMember().getId().equals(reportRequest.getReportedId())) { throw new ReportException(ReportExceptionType.REPORTED_MISMATCH_WRITER); } } @@ -103,8 +107,17 @@ private void validateRequestNotification(final ReportRequest reportRequest) { RequestNotification requestNotification = requestNotificationRepository.findById( reportRequest.getContentId()) .orElseThrow(() -> new ReportException(ReportExceptionType.NOT_FOUND_CONTENT)); - if (requestNotification.getSenderId().equals(reportRequest.getReportedId())) { + if (!requestNotification.getSenderId().equals(reportRequest.getReportedId())) { throw new ReportException(ReportExceptionType.REPORTED_MISMATCH_WRITER); } } + + private void blockReportedMember(final ReportRequest reportRequest) { + final Long reporterId = reportRequest.getReporterId(); + final Long reportedId = reportRequest.getReportedId(); + if (!blockRepository.existsByRequestMemberIdAndBlockMemberId(reporterId, reportedId)) { + final Block block = new Block(reporterId, reportedId); + blockRepository.save(block); + } + } } diff --git a/backend/emm-sale/src/main/resources/http/report.http b/backend/emm-sale/src/main/resources/http/report.http index 4af95fce1..a5306ee7c 100644 --- a/backend/emm-sale/src/main/resources/http/report.http +++ b/backend/emm-sale/src/main/resources/http/report.http @@ -6,7 +6,7 @@ Authorization: bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjkwMTk2OTY5L { "reporterId": 1, - "reportedId": 3, + "reportedId": 2, "type": "COMMENT", "contentId": 1 } diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java index 3051886e5..432349c2a 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java @@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import com.emmsale.block.domain.BlockRepository; import com.emmsale.comment.domain.Comment; import com.emmsale.comment.domain.CommentRepository; import com.emmsale.event.domain.Event; @@ -21,6 +22,7 @@ import com.emmsale.report.exception.ReportException; import com.emmsale.report.exception.ReportExceptionType; import org.assertj.core.api.ThrowableAssert.ThrowingCallable; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -39,6 +41,8 @@ class ReportCommandServiceTest extends ServiceIntegrationTestHelper { @Autowired private EventRepository eventRepository; @Autowired + private BlockRepository blockRepository; + @Autowired private CommentRepository commentRepository; @Autowired private RecruitmentPostRepository recruitmentPostRepository; @@ -192,12 +196,18 @@ void create_success_comment() { // when final ReportResponse actual = reportCommandService.create(request, reporter); - // TODO: 2023-08-09 신고 대상자가 차단되었는지 여부를 검증하는 로직 추가 + final boolean isBlocked = blockRepository.existsByRequestMemberIdAndBlockMemberId(신고자_ID, + 신고_대상자_ID); + // then - assertThat(actual) - .usingRecursiveComparison() - .ignoringFields("id", "createdAt") - .isEqualTo(expected); + Assertions.assertAll( + () -> assertThat(actual) + .usingRecursiveComparison() + .ignoringFields("id", "createdAt") + .isEqualTo(expected), + () -> assertThat(isBlocked).isTrue() + ); + } @Test @@ -214,12 +224,17 @@ void create_success_participant() { // when final ReportResponse actual = reportCommandService.create(request, reporter); - // TODO: 2023-08-09 신고 대상자가 차단되었는지 여부를 검증하는 로직 추가 + final boolean isBlocked = blockRepository.existsByRequestMemberIdAndBlockMemberId(신고자_ID, + 신고_대상자_ID); + // then - assertThat(actual) - .usingRecursiveComparison() - .ignoringFields("id", "createdAt") - .isEqualTo(expected); + Assertions.assertAll( + () -> assertThat(actual) + .usingRecursiveComparison() + .ignoringFields("id", "createdAt") + .isEqualTo(expected), + () -> assertThat(isBlocked).isTrue() + ); } @Test @@ -236,13 +251,19 @@ void create_success_request_notification() { // when final ReportResponse actual = reportCommandService.create(request, reporter); - // TODO: 2023-08-09 신고 대상자가 차단되었는지 여부를 검증하는 로직 추가 + final boolean isBlocked = blockRepository.existsByRequestMemberIdAndBlockMemberId(신고자_ID, + 신고_대상자_ID); + // then - assertThat(actual) - .usingRecursiveComparison() - .ignoringFields("id", "createdAt") - .isEqualTo(expected); + Assertions.assertAll( + () -> assertThat(actual) + .usingRecursiveComparison() + .ignoringFields("id", "createdAt") + .isEqualTo(expected), + () -> assertThat(isBlocked).isTrue() + ); } + } } From 3c1f7851dc1b6b3a230bc8372f2eb845e30f6f84 Mon Sep 17 00:00:00 2001 From: amaran-th Date: Mon, 14 Aug 2023 17:15:19 +0900 Subject: [PATCH 11/15] =?UTF-8?q?fix:=20=EC=8B=A0=EA=B3=A0=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=8B=A4=ED=8C=A8=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 테스트를 위한 초기 데이터 셋팅 #245 --- .../application/ReportQueryServiceTest.java | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java index 72b583a74..9ee7f9d49 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java @@ -1,6 +1,12 @@ package com.emmsale.report.application; +import static com.emmsale.event.EventFixture.eventFixture; + +import com.emmsale.comment.domain.Comment; +import com.emmsale.comment.domain.CommentRepository; +import com.emmsale.event.domain.Event; +import com.emmsale.event.domain.repository.EventRepository; import com.emmsale.helper.ServiceIntegrationTestHelper; import com.emmsale.member.domain.Member; import com.emmsale.member.domain.MemberRepository; @@ -9,28 +15,44 @@ import com.emmsale.report.domain.ReportType; import java.util.List; import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; class ReportQueryServiceTest extends ServiceIntegrationTestHelper { + private static Long 신고자_ID; + private static Long 신고_대상자_ID; @Autowired private ReportQueryService reportQueryService; @Autowired private ReportCommandService reportCommandService; @Autowired private MemberRepository memberRepository; + @Autowired + private EventRepository eventRepository; + @Autowired + private CommentRepository commentRepository; + + @BeforeEach + void init() { + final Event event = eventRepository.save(eventFixture()); + final Member 신고자 = memberRepository.findById(1L).get(); + final Member 신고_대상자 = memberRepository.findById(2L).get(); + 신고자_ID = 신고자.getId(); + 신고_대상자_ID = 신고_대상자.getId(); + commentRepository.save(Comment.createRoot(event, 신고_대상자, "상대방에게 불쾌감을 줄 수 있는 내용")); + commentRepository.save(Comment.createRoot(event, 신고자, "그냥 댓글")); + } @Test @DisplayName("모든 신고 목록을 조회할 수 있다.") void findReports() { // given - final Long reporterId = 1L; - final Long reportedId = 2L; final Long abusingContentId = 1L; - final Member reporter = memberRepository.findById(reporterId).get(); - final ReportRequest request = new ReportRequest(reporterId, reportedId, ReportType.COMMENT, + final Member reporter = memberRepository.findById(신고자_ID).get(); + final ReportRequest request = new ReportRequest(신고자_ID, 신고_대상자_ID, ReportType.COMMENT, abusingContentId); final List expected = List.of(reportCommandService.create(request, reporter)); From e7bd35174ff1a1f3c3058c523d86944249131e94 Mon Sep 17 00:00:00 2001 From: amaran-th Date: Mon, 14 Aug 2023 22:57:16 +0900 Subject: [PATCH 12/15] =?UTF-8?q?refactor:=20=EC=9A=B0=EB=A5=B4=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 누락된 final 추가 - Dto 네이밍을 HTTP Method와 비슷하게 변경 - TDA 적용 #245 --- .../com/emmsale/comment/domain/Comment.java | 4 ++ .../emmsale/event/domain/RecruitmentPost.java | 4 ++ .../domain/RequestNotification.java | 4 ++ .../com/emmsale/report/api/ReportApi.java | 10 +++-- .../application/ReportCommandService.java | 34 +++++++-------- .../application/ReportQueryService.java | 6 +-- ...tRequest.java => ReportCreateRequest.java} | 2 +- .../application/dto/ReportCreateResponse.java | 27 ++++++++++++ ...tResponse.java => ReportFindResponse.java} | 18 ++++---- .../com/emmsale/report/api/ReportApiTest.java | 25 ++++++----- .../application/ReportCommandServiceTest.java | 41 +++++++++++-------- .../application/ReportQueryServiceTest.java | 15 ++++--- 12 files changed, 123 insertions(+), 67 deletions(-) rename backend/emm-sale/src/main/java/com/emmsale/report/application/dto/{ReportRequest.java => ReportCreateRequest.java} (92%) create mode 100644 backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportCreateResponse.java rename backend/emm-sale/src/main/java/com/emmsale/report/application/dto/{ReportResponse.java => ReportFindResponse.java} (73%) diff --git a/backend/emm-sale/src/main/java/com/emmsale/comment/domain/Comment.java b/backend/emm-sale/src/main/java/com/emmsale/comment/domain/Comment.java index 2265b56a5..a93e61bdd 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/comment/domain/Comment.java +++ b/backend/emm-sale/src/main/java/com/emmsale/comment/domain/Comment.java @@ -115,6 +115,10 @@ public Long getParentIdOrSelfId() { return parent.id; } + public boolean isNotOwner(final Long memberId) { + return member.isNotMe(memberId); + } + @Override public boolean equals(final Object o) { if (this == o) { diff --git a/backend/emm-sale/src/main/java/com/emmsale/event/domain/RecruitmentPost.java b/backend/emm-sale/src/main/java/com/emmsale/event/domain/RecruitmentPost.java index c50b9624b..401ed8eaf 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/event/domain/RecruitmentPost.java +++ b/backend/emm-sale/src/main/java/com/emmsale/event/domain/RecruitmentPost.java @@ -49,6 +49,10 @@ public boolean isSameMember(final Member member) { return this.member.isMe(member); } + public boolean isNotOwner(final Long memberId) { + return member.isNotMe(memberId); + } + public void updateContent(final String content) { this.content = content; } diff --git a/backend/emm-sale/src/main/java/com/emmsale/notification/domain/RequestNotification.java b/backend/emm-sale/src/main/java/com/emmsale/notification/domain/RequestNotification.java index 66299f743..0938ad07e 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/notification/domain/RequestNotification.java +++ b/backend/emm-sale/src/main/java/com/emmsale/notification/domain/RequestNotification.java @@ -54,6 +54,10 @@ public boolean isNotOwner(final Long memberId) { return !receiverId.equals(memberId); } + public boolean isNotSender(final Long memberId) { + return !senderId.equals(memberId); + } + public void modifyStatus(final RequestNotificationStatus status) { this.status = status; } diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/api/ReportApi.java b/backend/emm-sale/src/main/java/com/emmsale/report/api/ReportApi.java index 1eec3197c..3779984ca 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/api/ReportApi.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/api/ReportApi.java @@ -3,8 +3,9 @@ import com.emmsale.member.domain.Member; import com.emmsale.report.application.ReportCommandService; import com.emmsale.report.application.ReportQueryService; -import com.emmsale.report.application.dto.ReportRequest; -import com.emmsale.report.application.dto.ReportResponse; +import com.emmsale.report.application.dto.ReportCreateRequest; +import com.emmsale.report.application.dto.ReportCreateResponse; +import com.emmsale.report.application.dto.ReportFindResponse; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; @@ -23,12 +24,13 @@ public class ReportApi { @PostMapping("/reports") @ResponseStatus(HttpStatus.CREATED) - public ReportResponse create(@RequestBody final ReportRequest reportRequest, Member member) { + public ReportCreateResponse create(@RequestBody final ReportCreateRequest reportRequest, + final Member member) { return reportCommandService.create(reportRequest, member); } @GetMapping("/reports") - public List findReports() { + public List findReports() { return reportQueryService.findReports(); } } diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java index 4545d843d..17a50daaf 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java @@ -10,8 +10,8 @@ import com.emmsale.member.domain.MemberRepository; import com.emmsale.notification.domain.RequestNotification; import com.emmsale.notification.domain.RequestNotificationRepository; -import com.emmsale.report.application.dto.ReportRequest; -import com.emmsale.report.application.dto.ReportResponse; +import com.emmsale.report.application.dto.ReportCreateRequest; +import com.emmsale.report.application.dto.ReportCreateResponse; import com.emmsale.report.domain.Report; import com.emmsale.report.domain.ReportType; import com.emmsale.report.domain.repository.ReportRepository; @@ -33,15 +33,15 @@ public class ReportCommandService { private final RequestNotificationRepository requestNotificationRepository; private final BlockRepository blockRepository; - public ReportResponse create(final ReportRequest reportRequest, final Member member) { + public ReportCreateResponse create(final ReportCreateRequest reportRequest, final Member member) { validateReportRequest(reportRequest, member); final Report report = reportRequest.toReport(); blockReportedMember(reportRequest); - return ReportResponse.of(reportRepository.save(report)); + return ReportCreateResponse.from(reportRepository.save(report)); } - private void validateReportRequest(final ReportRequest reportRequest, final Member member) { + private void validateReportRequest(final ReportCreateRequest reportRequest, final Member member) { validateReporterMismatch(reportRequest.getReporterId(), member); validateReportMySelf(reportRequest.getReportedId(), member); validateExistReportedMember(reportRequest.getReportedId()); @@ -67,14 +67,14 @@ private void validateExistReportedMember(final Long reportedId) { } } - private void validateAlreadyExistReport(final ReportRequest reportRequest) { + private void validateAlreadyExistReport(final ReportCreateRequest reportRequest) { if (reportRepository.existsReportByReporterIdAndReportedId( reportRequest.getReporterId(), reportRequest.getReportedId())) { throw new ReportException(ReportExceptionType.ALREADY_EXIST_REPORT); } } - private void validateContent(final ReportRequest reportRequest) { + private void validateContent(final ReportCreateRequest reportRequest) { if (reportRequest.getType() == ReportType.COMMENT) { validateComment(reportRequest); } @@ -86,35 +86,35 @@ private void validateContent(final ReportRequest reportRequest) { } } - private void validateComment(final ReportRequest reportRequest) { + private void validateComment(final ReportCreateRequest reportRequest) { Comment comment = commentRepository.findById(reportRequest.getContentId()) .orElseThrow(() -> new ReportException(ReportExceptionType.NOT_FOUND_CONTENT)); - if (!comment.getMember().getId().equals(reportRequest.getReportedId())) { + if (comment.isNotOwner(reportRequest.getReportedId())) { throw new ReportException(ReportExceptionType.REPORTED_MISMATCH_WRITER); } } - private void validateRecruitmentPost(final ReportRequest reportRequest) { + private void validateRecruitmentPost(final ReportCreateRequest reportRequest) { RecruitmentPost recruitmentPost = recruitmentPostRepository.findById( reportRequest.getContentId()) .orElseThrow(() -> new ReportException(ReportExceptionType.NOT_FOUND_CONTENT)); - if (!recruitmentPost.getMember().getId().equals(reportRequest.getReportedId())) { + if (recruitmentPost.isNotOwner(reportRequest.getReportedId())) { throw new ReportException(ReportExceptionType.REPORTED_MISMATCH_WRITER); } } - private void validateRequestNotification(final ReportRequest reportRequest) { + private void validateRequestNotification(final ReportCreateRequest reportCreateRequest) { RequestNotification requestNotification = requestNotificationRepository.findById( - reportRequest.getContentId()) + reportCreateRequest.getContentId()) .orElseThrow(() -> new ReportException(ReportExceptionType.NOT_FOUND_CONTENT)); - if (!requestNotification.getSenderId().equals(reportRequest.getReportedId())) { + if (requestNotification.isNotSender(reportCreateRequest.getReportedId())) { throw new ReportException(ReportExceptionType.REPORTED_MISMATCH_WRITER); } } - private void blockReportedMember(final ReportRequest reportRequest) { - final Long reporterId = reportRequest.getReporterId(); - final Long reportedId = reportRequest.getReportedId(); + private void blockReportedMember(final ReportCreateRequest reportCreateRequest) { + final Long reporterId = reportCreateRequest.getReporterId(); + final Long reportedId = reportCreateRequest.getReportedId(); if (!blockRepository.existsByRequestMemberIdAndBlockMemberId(reporterId, reportedId)) { final Block block = new Block(reporterId, reportedId); blockRepository.save(block); diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportQueryService.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportQueryService.java index 00053bc80..6ca29076a 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportQueryService.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportQueryService.java @@ -1,6 +1,6 @@ package com.emmsale.report.application; -import com.emmsale.report.application.dto.ReportResponse; +import com.emmsale.report.application.dto.ReportFindResponse; import com.emmsale.report.domain.repository.ReportRepository; import java.util.List; import lombok.RequiredArgsConstructor; @@ -14,7 +14,7 @@ public class ReportQueryService { private final ReportRepository reportRepository; - public List findReports() { - return ReportResponse.of(reportRepository.findAll()); + public List findReports() { + return ReportFindResponse.from(reportRepository.findAll()); } } diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportRequest.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportCreateRequest.java similarity index 92% rename from backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportRequest.java rename to backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportCreateRequest.java index 6da7eb6e9..7d44735fe 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportRequest.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportCreateRequest.java @@ -7,7 +7,7 @@ @RequiredArgsConstructor @Getter -public class ReportRequest { +public class ReportCreateRequest { private final Long reporterId; private final Long reportedId; diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportCreateResponse.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportCreateResponse.java new file mode 100644 index 000000000..f2c47ee6c --- /dev/null +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportCreateResponse.java @@ -0,0 +1,27 @@ +package com.emmsale.report.application.dto; + +import com.emmsale.report.domain.Report; +import com.emmsale.report.domain.ReportType; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.time.LocalDateTime; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public class ReportCreateResponse { + + private final Long id; + private final Long reporterId; + private final Long reportedId; + private final ReportType type; + private final Long contentId; + @JsonFormat(pattern = "yyyy:MM:dd:HH:mm:ss") + private final LocalDateTime createdAt; + + public static ReportCreateResponse from(final Report report) { + return new ReportCreateResponse(report.getId(), report.getReporterId(), + report.getReportedId(), report.getType(), report.getContentId(), + report.getCreatedAt()); + } +} diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportResponse.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportFindResponse.java similarity index 73% rename from backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportResponse.java rename to backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportFindResponse.java index 890dd2152..bda5d8b0f 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportResponse.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/dto/ReportFindResponse.java @@ -11,7 +11,7 @@ @RequiredArgsConstructor @Getter -public class ReportResponse { +public class ReportFindResponse { private final Long id; private final Long reporterId; @@ -21,15 +21,15 @@ public class ReportResponse { @JsonFormat(pattern = "yyyy:MM:dd:HH:mm:ss") private final LocalDateTime createdAt; - public static ReportResponse of(Report report) { - return new ReportResponse(report.getId(), report.getReporterId(), - report.getReportedId(), report.getType(), report.getContentId(), - report.getCreatedAt()); - } - - public static List of(List reports) { + public static List from(final List reports) { return reports.stream() - .map(ReportResponse::of) + .map(ReportFindResponse::from) .collect(Collectors.toList()); } + + private static ReportFindResponse from(final Report report) { + return new ReportFindResponse(report.getId(), report.getReporterId(), + report.getReportedId(), report.getType(), report.getContentId(), + report.getCreatedAt()); + } } diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java index 83e1e7bc2..51641f82e 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/api/ReportApiTest.java @@ -13,8 +13,9 @@ import com.emmsale.helper.MockMvcTestHelper; import com.emmsale.report.application.ReportCommandService; import com.emmsale.report.application.ReportQueryService; -import com.emmsale.report.application.dto.ReportRequest; -import com.emmsale.report.application.dto.ReportResponse; +import com.emmsale.report.application.dto.ReportCreateRequest; +import com.emmsale.report.application.dto.ReportCreateResponse; +import com.emmsale.report.application.dto.ReportFindResponse; import com.emmsale.report.domain.ReportType; import java.time.LocalDateTime; import java.util.List; @@ -58,13 +59,15 @@ void addReport() throws Exception { fieldWithPath("createdAt").type(JsonFieldType.STRING) .description("신고 일자(yyyy:MM:dd:HH:mm:ss)") ); - final ReportRequest reportRequest = new ReportRequest(1L, 2L, ReportType.COMMENT, 1L); + final ReportCreateRequest reportRequest = new ReportCreateRequest(1L, 2L, ReportType.COMMENT, + 1L); - final ReportResponse reportResponse = new ReportResponse(1L, reportRequest.getReporterId(), + final ReportCreateResponse reportCreateResponse = new ReportCreateResponse(1L, + reportRequest.getReporterId(), reportRequest.getReportedId(), reportRequest.getType(), reportRequest.getContentId(), LocalDateTime.parse("2023-08-09T13:25:00")); - when(reportCommandService.create(any(), any())).thenReturn(reportResponse); + when(reportCommandService.create(any(), any())).thenReturn(reportCreateResponse); // when & then mockMvc.perform(post("/reports") @@ -92,19 +95,19 @@ void findReports() throws Exception { .description("신고 일자(yyyy:MM:dd:HH:mm:ss)") ); - final List reportResponses = List.of( - new ReportResponse(1L, 1L, 2L, ReportType.COMMENT, 3L, + final List reportFindResponse = List.of( + new ReportFindResponse(1L, 1L, 2L, ReportType.COMMENT, 3L, LocalDateTime.parse("2023-08-09T13:25:00")), - new ReportResponse(2L, 2L, 1L, ReportType.RECRUITMENT_POST, 1L, + new ReportFindResponse(2L, 2L, 1L, ReportType.RECRUITMENT_POST, 1L, LocalDateTime.parse("2023-08-11T13:25:00")), - new ReportResponse(3L, 1L, 3L, ReportType.REQUEST_NOTIFICATION, 5L, + new ReportFindResponse(3L, 1L, 3L, ReportType.REQUEST_NOTIFICATION, 5L, LocalDateTime.parse("2023-08-11T13:50:00")), - new ReportResponse(4L, 4L, 1L, ReportType.COMMENT, 2L, + new ReportFindResponse(4L, 4L, 1L, ReportType.COMMENT, 2L, LocalDateTime.parse("2023-08-12T13:25:00")) ); - when(reportQueryService.findReports()).thenReturn(reportResponses); + when(reportQueryService.findReports()).thenReturn(reportFindResponse); // when & then mockMvc.perform(get("/reports")) diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java index 432349c2a..6ac5d135c 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java @@ -16,8 +16,8 @@ import com.emmsale.member.domain.MemberRepository; import com.emmsale.notification.domain.RequestNotification; import com.emmsale.notification.domain.RequestNotificationRepository; -import com.emmsale.report.application.dto.ReportRequest; -import com.emmsale.report.application.dto.ReportResponse; +import com.emmsale.report.application.dto.ReportCreateRequest; +import com.emmsale.report.application.dto.ReportCreateResponse; import com.emmsale.report.domain.ReportType; import com.emmsale.report.exception.ReportException; import com.emmsale.report.exception.ReportExceptionType; @@ -74,7 +74,8 @@ void create_fail_not_found_member() { final Long wrongReportedId = 9999L; final Long abusingContentId = 1L; final Member reporter = memberRepository.findById(신고자_ID).get(); - final ReportRequest request = new ReportRequest(신고자_ID, wrongReportedId, ReportType.COMMENT, + final ReportCreateRequest request = new ReportCreateRequest(신고자_ID, wrongReportedId, + ReportType.COMMENT, abusingContentId); // when @@ -92,7 +93,8 @@ void create_fail_report_self() { // given final Long abusingContentId = 1L; final Member reporter = memberRepository.findById(신고자_ID).get(); - final ReportRequest request = new ReportRequest(신고자_ID, 신고자_ID, ReportType.COMMENT, + final ReportCreateRequest request = new ReportCreateRequest(신고자_ID, 신고자_ID, + ReportType.COMMENT, abusingContentId); // when @@ -112,7 +114,8 @@ void create_fail_forbidden_report() { final Long reportedId = 1L; final Long abusingContentId = 1L; final Member reporter = memberRepository.findById(신고자_ID).get(); - final ReportRequest request = new ReportRequest(otherMemberId, reportedId, ReportType.COMMENT, + final ReportCreateRequest request = new ReportCreateRequest(otherMemberId, reportedId, + ReportType.COMMENT, abusingContentId); // when @@ -130,7 +133,8 @@ void create_fail_already_exist_report() { // given final Long abusingContentId = 1L; final Member reporter = memberRepository.findById(신고자_ID).get(); - final ReportRequest request = new ReportRequest(신고자_ID, 신고_대상자_ID, ReportType.COMMENT, + final ReportCreateRequest request = new ReportCreateRequest(신고자_ID, 신고_대상자_ID, + ReportType.COMMENT, abusingContentId); reportCommandService.create(request, reporter); @@ -149,7 +153,8 @@ void create_fail_not_found_content() { // given final Long abusingContentId = 9999L; final Member reporter = memberRepository.findById(신고자_ID).get(); - final ReportRequest request = new ReportRequest(신고자_ID, 신고_대상자_ID, ReportType.COMMENT, + final ReportCreateRequest request = new ReportCreateRequest(신고자_ID, 신고_대상자_ID, + ReportType.COMMENT, abusingContentId); // when @@ -167,7 +172,8 @@ void create_fail_reported_mismatch_writer() { // given final Long abusingContentId = 2L; final Member reporter = memberRepository.findById(신고자_ID).get(); - final ReportRequest request = new ReportRequest(신고자_ID, 신고_대상자_ID, ReportType.COMMENT, + final ReportCreateRequest request = new ReportCreateRequest(신고자_ID, 신고_대상자_ID, + ReportType.COMMENT, abusingContentId); // when @@ -189,13 +195,14 @@ void create_success_comment() { // given final Long abusingContentId = 1L; final Member reporter = memberRepository.findById(신고자_ID).get(); - final ReportRequest request = new ReportRequest(신고자_ID, 신고_대상자_ID, ReportType.COMMENT, + final ReportCreateRequest request = new ReportCreateRequest(신고자_ID, 신고_대상자_ID, + ReportType.COMMENT, abusingContentId); - final ReportResponse expected = new ReportResponse(1L, 신고자_ID, 신고_대상자_ID, + final ReportCreateResponse expected = new ReportCreateResponse(1L, 신고자_ID, 신고_대상자_ID, ReportType.COMMENT, abusingContentId, null); // when - final ReportResponse actual = reportCommandService.create(request, reporter); + final ReportCreateResponse actual = reportCommandService.create(request, reporter); final boolean isBlocked = blockRepository.existsByRequestMemberIdAndBlockMemberId(신고자_ID, 신고_대상자_ID); @@ -216,14 +223,14 @@ void create_success_participant() { // given final Long abusingContentId = 1L; final Member reporter = memberRepository.findById(신고자_ID).get(); - final ReportRequest request = new ReportRequest(신고자_ID, 신고_대상자_ID, + final ReportCreateRequest request = new ReportCreateRequest(신고자_ID, 신고_대상자_ID, ReportType.RECRUITMENT_POST, abusingContentId); - final ReportResponse expected = new ReportResponse(1L, 신고자_ID, 신고_대상자_ID, + final ReportCreateResponse expected = new ReportCreateResponse(1L, 신고자_ID, 신고_대상자_ID, ReportType.RECRUITMENT_POST, abusingContentId, null); // when - final ReportResponse actual = reportCommandService.create(request, reporter); + final ReportCreateResponse actual = reportCommandService.create(request, reporter); final boolean isBlocked = blockRepository.existsByRequestMemberIdAndBlockMemberId(신고자_ID, 신고_대상자_ID); @@ -243,14 +250,14 @@ void create_success_request_notification() { // given final Long abusingContentId = 1L; final Member reporter = memberRepository.findById(신고자_ID).get(); - final ReportRequest request = new ReportRequest(신고자_ID, 신고_대상자_ID, + final ReportCreateRequest request = new ReportCreateRequest(신고자_ID, 신고_대상자_ID, ReportType.REQUEST_NOTIFICATION, abusingContentId); - final ReportResponse expected = new ReportResponse(1L, 신고자_ID, 신고_대상자_ID, + final ReportCreateResponse expected = new ReportCreateResponse(1L, 신고자_ID, 신고_대상자_ID, ReportType.REQUEST_NOTIFICATION, abusingContentId, null); // when - final ReportResponse actual = reportCommandService.create(request, reporter); + final ReportCreateResponse actual = reportCommandService.create(request, reporter); final boolean isBlocked = blockRepository.existsByRequestMemberIdAndBlockMemberId(신고자_ID, 신고_대상자_ID); diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java index 9ee7f9d49..769913c89 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportQueryServiceTest.java @@ -10,8 +10,9 @@ import com.emmsale.helper.ServiceIntegrationTestHelper; import com.emmsale.member.domain.Member; import com.emmsale.member.domain.MemberRepository; -import com.emmsale.report.application.dto.ReportRequest; -import com.emmsale.report.application.dto.ReportResponse; +import com.emmsale.report.application.dto.ReportCreateRequest; +import com.emmsale.report.application.dto.ReportCreateResponse; +import com.emmsale.report.application.dto.ReportFindResponse; import com.emmsale.report.domain.ReportType; import java.util.List; import org.assertj.core.api.Assertions; @@ -52,12 +53,16 @@ void findReports() { // given final Long abusingContentId = 1L; final Member reporter = memberRepository.findById(신고자_ID).get(); - final ReportRequest request = new ReportRequest(신고자_ID, 신고_대상자_ID, ReportType.COMMENT, + final ReportCreateRequest request = new ReportCreateRequest(신고자_ID, 신고_대상자_ID, + ReportType.COMMENT, abusingContentId); - final List expected = List.of(reportCommandService.create(request, reporter)); + final ReportCreateResponse report = reportCommandService.create(request, reporter); + final List expected = List.of( + new ReportFindResponse(report.getId(), report.getReporterId(), report.getReportedId(), + report.getType(), report.getContentId(), report.getCreatedAt())); // when - List actual = reportQueryService.findReports(); + List actual = reportQueryService.findReports(); // then Assertions.assertThat(actual) From a5e7171d765bb3dc124b575148881fee12379f1e Mon Sep 17 00:00:00 2001 From: amaran-th Date: Wed, 16 Aug 2023 00:34:34 +0900 Subject: [PATCH 13/15] =?UTF-8?q?refactor:=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=EB=AA=85,=20=EB=B3=80=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ReportException의 예외 타입 중 REPORT_MYSELF를 FORBIDDEN_REPORT_MYSELF로 수정 - validateExistReportedMember()의 메서드명을 validateNotFoundReportedMember()로 변경 #245 --- .../emmsale/report/application/ReportCommandService.java | 6 +++--- .../com/emmsale/report/exception/ReportExceptionType.java | 2 +- .../report/application/ReportCommandServiceTest.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java index 17a50daaf..68559a922 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java @@ -44,7 +44,7 @@ public ReportCreateResponse create(final ReportCreateRequest reportRequest, fina private void validateReportRequest(final ReportCreateRequest reportRequest, final Member member) { validateReporterMismatch(reportRequest.getReporterId(), member); validateReportMySelf(reportRequest.getReportedId(), member); - validateExistReportedMember(reportRequest.getReportedId()); + validateNotFoundReportedMember(reportRequest.getReportedId()); validateAlreadyExistReport(reportRequest); validateContent(reportRequest); } @@ -57,11 +57,11 @@ private void validateReporterMismatch(final Long reporterId, final Member member private void validateReportMySelf(final Long reportedId, final Member member) { if (member.isMe(reportedId)) { - throw new ReportException(ReportExceptionType.REPORT_MYSELF); + throw new ReportException(ReportExceptionType.FORBIDDEN_REPORT_MYSELF); } } - private void validateExistReportedMember(final Long reportedId) { + private void validateNotFoundReportedMember(final Long reportedId) { if (!memberRepository.existsById(reportedId)) { throw new ReportException(ReportExceptionType.NOT_FOUND_MEMBER); } diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java b/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java index 7dc6dd393..dc54d8142 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/exception/ReportExceptionType.java @@ -17,7 +17,7 @@ public enum ReportExceptionType implements BaseExceptionType { HttpStatus.BAD_REQUEST, "신고한 게시물이 신고 대상자의 게시물이 아닙니다." ), - REPORT_MYSELF( + FORBIDDEN_REPORT_MYSELF( HttpStatus.BAD_REQUEST, "자기 자신은 신고할 수 없습니다." ), diff --git a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java index 6ac5d135c..ec940c568 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/report/application/ReportCommandServiceTest.java @@ -103,7 +103,7 @@ void create_fail_report_self() { // then assertThatThrownBy(actual) .isInstanceOf(ReportException.class) - .hasMessage(ReportExceptionType.REPORT_MYSELF.errorMessage()); + .hasMessage(ReportExceptionType.FORBIDDEN_REPORT_MYSELF.errorMessage()); } @Test From 0e7dd5f28b39b378f2891f0dcd641fbc5023efc9 Mon Sep 17 00:00:00 2001 From: amaran-th Date: Wed, 16 Aug 2023 00:39:12 +0900 Subject: [PATCH 14/15] =?UTF-8?q?refactor:=20validate=20=ED=8C=8C=EB=9D=BC?= =?UTF-8?q?=EB=AF=B8=ED=84=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - validate가 dto의 값 대신 dto 객체를 파라미터로 받도록 변경 #245 --- .../application/ReportCommandService.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java index 68559a922..02f236e96 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java @@ -42,27 +42,28 @@ public ReportCreateResponse create(final ReportCreateRequest reportRequest, fina private void validateReportRequest(final ReportCreateRequest reportRequest, final Member member) { - validateReporterMismatch(reportRequest.getReporterId(), member); - validateReportMySelf(reportRequest.getReportedId(), member); - validateNotFoundReportedMember(reportRequest.getReportedId()); + validateReporterMismatch(reportRequest, member); + validateReportMySelf(reportRequest, member); + validateNotFoundReportedMember(reportRequest); validateAlreadyExistReport(reportRequest); validateContent(reportRequest); } - private void validateReporterMismatch(final Long reporterId, final Member member) { - if (member.isNotMe(reporterId)) { + private void validateReporterMismatch(final ReportCreateRequest reportRequest, + final Member member) { + if (member.isNotMe(reportRequest.getReportedId())) { throw new ReportException(ReportExceptionType.REPORTER_MISMATCH); } } - private void validateReportMySelf(final Long reportedId, final Member member) { - if (member.isMe(reportedId)) { + private void validateReportMySelf(final ReportCreateRequest reportRequest, final Member member) { + if (member.isMe(reportRequest.getReportedId())) { throw new ReportException(ReportExceptionType.FORBIDDEN_REPORT_MYSELF); } } - private void validateNotFoundReportedMember(final Long reportedId) { - if (!memberRepository.existsById(reportedId)) { + private void validateNotFoundReportedMember(final ReportCreateRequest reportRequest) { + if (!memberRepository.existsById(reportRequest.getReportedId())) { throw new ReportException(ReportExceptionType.NOT_FOUND_MEMBER); } } From f5f54bc93027d9177d13457c8baf39e500b502a2 Mon Sep 17 00:00:00 2001 From: amaran-th Date: Wed, 16 Aug 2023 01:12:04 +0900 Subject: [PATCH 15/15] =?UTF-8?q?fix:=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 신고자와 비교해야 할 것을 신고 대상자와 비교하는 로직으로 인해 발생한 오류 수정 #245 --- .../com/emmsale/report/application/ReportCommandService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java index 02f236e96..e5906546d 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java +++ b/backend/emm-sale/src/main/java/com/emmsale/report/application/ReportCommandService.java @@ -51,7 +51,7 @@ private void validateReportRequest(final ReportCreateRequest reportRequest, fina private void validateReporterMismatch(final ReportCreateRequest reportRequest, final Member member) { - if (member.isNotMe(reportRequest.getReportedId())) { + if (member.isNotMe(reportRequest.getReporterId())) { throw new ReportException(ReportExceptionType.REPORTER_MISMATCH); } }