Skip to content

Commit bebeebd

Browse files
Merge pull request #58 from devpalsPlus/Dev
Dev
2 parents 4c2aace + 1dbaf97 commit bebeebd

File tree

14 files changed

+246
-40
lines changed

14 files changed

+246
-40
lines changed

src/main/java/hs/kr/backend/devpals/domain/report/controller/ReportController.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class ReportController {
2323
private final ReportService reportService;
2424

2525
@PostMapping
26-
@Operation(summary = "신고 작성", description = "신고를 작성합니다. reportFilter의 값은 다음과 같습니다. USER(1),PROJECT(2),COMMENT(3),RECOMMENT(4),INQUIRY(5)\n")
26+
@Operation(summary = "신고 작성", description = "신고를 작성합니다. reportFilter의 값은 다음과 같습니다. USER(1),PROJECT(2),COMMENT(3),RECOMMENT(4)\n")
2727
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "신고 작성 성공")
2828
@io.swagger.v3.oas.annotations.responses.ApiResponse(
2929
responseCode = "400",
@@ -40,5 +40,4 @@ public ResponseEntity<ApiResponse<ReportResponse>> createReport(
4040
return reportService.report(request, token);
4141
}
4242

43-
4443
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package hs.kr.backend.devpals.domain.report.controller;
2+
3+
import hs.kr.backend.devpals.domain.report.dto.ReportTagRequest;
4+
import hs.kr.backend.devpals.domain.report.entity.ReportTagEntity;
5+
import hs.kr.backend.devpals.domain.report.facade.ReportFacade;
6+
import hs.kr.backend.devpals.global.common.ApiResponse;
7+
import io.swagger.v3.oas.annotations.Operation;
8+
import io.swagger.v3.oas.annotations.media.Content;
9+
import io.swagger.v3.oas.annotations.media.ExampleObject;
10+
import io.swagger.v3.oas.annotations.media.Schema;
11+
import io.swagger.v3.oas.annotations.tags.Tag;
12+
import lombok.RequiredArgsConstructor;
13+
import org.springframework.http.ResponseEntity;
14+
import org.springframework.web.bind.annotation.*;
15+
16+
import java.util.List;
17+
18+
@RequiredArgsConstructor
19+
@RestController
20+
@Tag(name = "Report API", description = "신고사유(카테고리)관련 API")
21+
public class ReportFacadeController {
22+
23+
private final ReportFacade reportFacade;
24+
25+
@PostMapping("/report-tag")
26+
@Operation(summary = "신고사유(카테고리) 등록", description = "신고사유(카테고리)를 저장합니다.")
27+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "신고사유(카테고리) 저장 성공")
28+
@io.swagger.v3.oas.annotations.responses.ApiResponse(
29+
responseCode = "400",
30+
description = "신고사유(카테고리) 저장 실패",
31+
content = @Content(
32+
mediaType = "application/json",
33+
schema = @Schema(implementation = ApiResponse.class),
34+
examples = @ExampleObject(value = "{\"success\": false, \"message\": \"신고사유(카테고리)를 저장하던 중 오류가 발생했습니다.\", \"data\": null}")
35+
)
36+
)
37+
public ResponseEntity<ApiResponse<ReportTagEntity>> createReportTag(@RequestBody ReportTagRequest request) {
38+
return reportFacade.createReportTag(request);
39+
}
40+
41+
@GetMapping("/report-tag")
42+
@Operation(summary = "신고사유(카테고리) 조회", description = "저장된 모든 신고사유(카테고리)를 조회합니다.")
43+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "신고사유(카테고리) 목록 가져오기 성공")
44+
@io.swagger.v3.oas.annotations.responses.ApiResponse(
45+
responseCode = "400",
46+
description = "신고사유 조회 실패",
47+
content = @Content(
48+
mediaType = "application/json",
49+
schema = @Schema(implementation = ApiResponse.class),
50+
examples = @ExampleObject(value = "{\"success\": false, \"message\": \"신고사유를 불러오는 중 오류가 발생했습니다.\", \"data\": null}")
51+
)
52+
)
53+
public ResponseEntity<ApiResponse<List<ReportTagEntity>>> getReportTag() {
54+
return reportFacade.getReportTags();
55+
}
56+
57+
@DeleteMapping("/report-tag")
58+
@Operation(summary = "신고사유(카테고리) 삭제", description = "신고사유(카테고리)를 삭제합니다.")
59+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "신고사유(카테고리) 삭제 성공")
60+
@io.swagger.v3.oas.annotations.responses.ApiResponse(
61+
responseCode = "400",
62+
description = "신고사유(카테고리) 삭제 실패",
63+
content = @Content(
64+
mediaType = "application/json",
65+
schema = @Schema(implementation = ApiResponse.class),
66+
examples = @ExampleObject(value = "{\"success\": false, \"message\": \"신고사유(카테고리)를 삭제하던 중 오류가 발생했습니다.\", \"data\": null}")
67+
)
68+
)
69+
public ResponseEntity<ApiResponse<String>> deleteReportTag(@RequestParam Long reportTagId) {
70+
return reportFacade.deleteReportTag(reportTagId);
71+
}
72+
73+
74+
}

src/main/java/hs/kr/backend/devpals/domain/report/dto/ReportRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ public class ReportRequest {
1212

1313
private Long reportTargetId;
1414
private Integer reportFilter;
15-
private String reportReason;
15+
private String[] reason;
1616
private String detail;
1717
}

src/main/java/hs/kr/backend/devpals/domain/report/dto/ReportResponse.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import lombok.Getter;
66
import lombok.NoArgsConstructor;
77

8+
import java.util.List;
9+
810
@Getter
911
@NoArgsConstructor
1012
@AllArgsConstructor
@@ -13,11 +15,11 @@ public class ReportResponse {
1315
private Long id;
1416
private Long reportTargetId;
1517
private Integer reportFilter;
16-
private String reportReason;
18+
private List<String> reason;
1719
private String detail;
1820

19-
public static ReportResponse of(ReportEntity report) {
20-
return new ReportResponse(report.getId(), report.getReportTargetId(), report.getReportFilter().getValue(), report.getReportReason(), report.getDetail());
21+
public static ReportResponse of(ReportEntity report, List<String> reason) {
22+
return new ReportResponse(report.getId(), report.getReportTargetId(), report.getReportFilter().getValue(), reason, report.getDetail());
2123

2224
}
2325
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package hs.kr.backend.devpals.domain.report.dto;
2+
3+
4+
import lombok.Getter;
5+
6+
@Getter
7+
public class ReportTagDto {
8+
9+
private Long id;
10+
private String name;
11+
12+
public ReportTagDto(Long id, String name) {
13+
this.id = id;
14+
this.name = name;
15+
}
16+
17+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package hs.kr.backend.devpals.domain.report.dto;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public class ReportTagRequest {
7+
private String name;
8+
}

src/main/java/hs/kr/backend/devpals/domain/report/entity/ReportEntity.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
package hs.kr.backend.devpals.domain.report.entity;
22

33
import hs.kr.backend.devpals.domain.report.dto.ReportRequest;
4+
import hs.kr.backend.devpals.domain.user.convert.LongListConverter;
45
import hs.kr.backend.devpals.domain.user.entity.UserEntity;
56
import hs.kr.backend.devpals.global.common.enums.ReportFilter;
67
import jakarta.persistence.*;
78
import lombok.AllArgsConstructor;
8-
import lombok.Builder;
99
import lombok.Getter;
1010
import lombok.NoArgsConstructor;
1111

1212
import java.time.LocalDateTime;
13+
import java.util.ArrayList;
14+
import java.util.List;
1315

1416
@Entity
1517
@Getter
@@ -33,8 +35,9 @@ public class ReportEntity {
3335
@Column(nullable = false)
3436
private ReportFilter reportFilter;
3537

36-
@Column(nullable = false, length = 255)
37-
private String reportReason;
38+
@Convert(converter = LongListConverter.class)
39+
@Column(columnDefinition = "TEXT")
40+
private List<Long> reportTagIds = new ArrayList<>();
3841

3942
@Column(nullable = false)
4043
private String detail;
@@ -46,10 +49,10 @@ public class ReportEntity {
4649
private LocalDateTime updatedAt = LocalDateTime.now();
4750

4851

49-
public ReportEntity(ReportRequest request, UserEntity reporter) {
52+
public ReportEntity(ReportRequest request,List<Long> reportTagIds, UserEntity reporter) {
5053
this.reporter = reporter;
5154
this.reportFilter = ReportFilter.fromValue(request.getReportFilter());
52-
this.reportReason = request.getReportReason();
55+
this.reportTagIds = this.reportTagIds = (reportTagIds == null) ? new ArrayList<>() : new ArrayList<>(reportTagIds);;
5356
this.detail = request.getDetail();
5457
this.reportTargetId = request.getReportTargetId();
5558
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package hs.kr.backend.devpals.domain.report.entity;
2+
3+
import jakarta.persistence.*;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
7+
import java.time.LocalDateTime;
8+
9+
10+
@Entity
11+
@Getter
12+
@NoArgsConstructor
13+
@Table(name = "ReportTag")
14+
public class ReportTagEntity {
15+
16+
@Id
17+
@GeneratedValue(strategy = GenerationType.IDENTITY)
18+
private Long id;
19+
20+
@Column(nullable = false, unique = true)
21+
private String name;
22+
23+
@Column(updatable = false)
24+
private LocalDateTime createdAt = LocalDateTime.now();
25+
26+
public ReportTagEntity(String name) {
27+
this.name = name;
28+
}
29+
30+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package hs.kr.backend.devpals.domain.report.facade;
2+
3+
import hs.kr.backend.devpals.domain.report.dto.ReportTagRequest;
4+
import hs.kr.backend.devpals.domain.report.entity.ReportTagEntity;
5+
import hs.kr.backend.devpals.domain.report.repository.ReportTagRepository;
6+
import hs.kr.backend.devpals.global.common.ApiResponse;
7+
import hs.kr.backend.devpals.global.exception.CustomException;
8+
import hs.kr.backend.devpals.global.exception.ErrorException;
9+
import jakarta.annotation.PostConstruct;
10+
import lombok.RequiredArgsConstructor;
11+
import org.springframework.http.ResponseEntity;
12+
import org.springframework.stereotype.Service;
13+
14+
import java.util.List;
15+
import java.util.Map;
16+
import java.util.concurrent.ConcurrentHashMap;
17+
import java.util.stream.Collectors;
18+
19+
@RequiredArgsConstructor
20+
@Service
21+
public class ReportFacade {
22+
23+
private final ReportTagRepository reportTagRepository;
24+
private final Map<Long, ReportTagEntity> reportTagCache = new ConcurrentHashMap<>();
25+
26+
@PostConstruct
27+
public void initCache() {
28+
refreshReportTags();
29+
}
30+
31+
private void refreshReportTags() {
32+
List<ReportTagEntity> reportTags = reportTagRepository.findAll();
33+
reportTagCache.clear();
34+
reportTagCache.putAll(reportTags.stream().collect(Collectors.toMap(ReportTagEntity::getId, tag -> tag)));
35+
}
36+
37+
public List<ReportTagEntity> getReportTag(){
38+
return List.copyOf(reportTagCache.values());
39+
}
40+
41+
public ResponseEntity<ApiResponse<List<ReportTagEntity>>> getReportTags() {
42+
List<ReportTagEntity> reportTagEntities = List.copyOf(reportTagCache.values());
43+
ApiResponse<List<ReportTagEntity>> response = new ApiResponse<>(true, "신고사유(카테고리) 목록 가져오기 성공", reportTagEntities);
44+
return ResponseEntity.ok(response);
45+
}
46+
47+
public ResponseEntity<ApiResponse<String>> deleteReportTag(Long reportTagId) {
48+
ReportTagEntity reportTag = reportTagRepository.findById(reportTagId)
49+
.orElseThrow(() -> new CustomException(ErrorException.REPORT_TAG_NOT_FOUND));
50+
51+
reportTagRepository.delete(reportTag);
52+
reportTagCache.remove(reportTagId);
53+
54+
ApiResponse<String> response = new ApiResponse<>(true, "신고사유(카테고리) 삭제 성공", null);
55+
return ResponseEntity.ok(response);
56+
}
57+
58+
public ResponseEntity<ApiResponse<ReportTagEntity>> createReportTag(ReportTagRequest request) {
59+
ReportTagEntity reportTag = new ReportTagEntity(request.getName());
60+
ReportTagEntity saved = reportTagRepository.save(reportTag);
61+
refreshReportTags();
62+
return ResponseEntity.ok(new ApiResponse<>(true, "신고사유(카테고리) 등록 성공", saved));
63+
}
64+
65+
66+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package hs.kr.backend.devpals.domain.report.repository;
2+
3+
import hs.kr.backend.devpals.domain.report.entity.ReportTagEntity;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface ReportTagRepository extends JpaRepository<ReportTagEntity, Long> {
7+
}

0 commit comments

Comments
 (0)