Skip to content

Commit 50ed6d0

Browse files
authored
Merge pull request #77 from YAPP-Github/feat/T3-198
[T3-198] 전체 제보 목록 조회 API
2 parents 3923922 + 31e6746 commit 50ed6d0

10 files changed

Lines changed: 166 additions & 17 deletions

File tree

src/main/java/bitnagil/bitnagil_backend/file/controller/FileController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
@RestController
1414
@RequiredArgsConstructor
15-
@RequestMapping(value = "/api/v2/file")
15+
@RequestMapping(value = "/api/v2/files")
1616
public class FileController implements FileSpec {
1717
private final FileService fileService;
1818

src/main/java/bitnagil/bitnagil_backend/report/controller/ReportController.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,18 @@
44
import bitnagil.bitnagil_backend.global.response.CustomResponseDto;
55
import bitnagil.bitnagil_backend.report.controller.spec.ReportSpec;
66
import bitnagil.bitnagil_backend.report.request.ReportRegisterRequest;
7+
import bitnagil.bitnagil_backend.report.response.ReportInfoResponse;
78
import bitnagil.bitnagil_backend.report.service.ReportService;
89
import bitnagil.bitnagil_backend.user.domain.User;
10+
import io.swagger.v3.oas.annotations.media.Content;
11+
import io.swagger.v3.oas.annotations.media.ExampleObject;
12+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
913
import lombok.RequiredArgsConstructor;
10-
import org.springframework.http.MediaType;
1114
import org.springframework.web.bind.annotation.*;
12-
import org.springframework.web.multipart.MultipartFile;
13-
14-
import java.util.List;
1515

1616
@RestController
1717
@RequiredArgsConstructor
18-
@RequestMapping(value = "/api/v2/report")
18+
@RequestMapping(value = "/api/v2/reports")
1919
public class ReportController implements ReportSpec {
2020

2121
private final ReportService reportService;
@@ -27,6 +27,12 @@ public CustomResponseDto<Long> registerReport(@CurrentUser User user,
2727
return CustomResponseDto.from(reportService.registerReport(user, request));
2828
}
2929

30+
// 제보 목록 조회 API
31+
@GetMapping()
32+
public CustomResponseDto<ReportInfoResponse> getAllReportInfo(@CurrentUser User user) {
33+
return CustomResponseDto.from(reportService.getAllReportInfo(user));
34+
}
35+
3036
/* 추후에 변경을 고려해서 소스만 남겨놓음
3137
// 제보 파일 저장 API
3238
@PutMapping(value = "/{reportId}/images")

src/main/java/bitnagil/bitnagil_backend/report/controller/spec/ReportSpec.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,36 @@
11
package bitnagil.bitnagil_backend.report.controller.spec;
22

3+
import bitnagil.bitnagil_backend.global.annotation.CurrentUser;
34
import bitnagil.bitnagil_backend.global.response.CustomResponseDto;
45
import bitnagil.bitnagil_backend.global.swagger.ApiTags;
56
import bitnagil.bitnagil_backend.report.request.ReportRegisterRequest;
7+
import bitnagil.bitnagil_backend.report.response.ReportInfoResponse;
68
import bitnagil.bitnagil_backend.user.domain.User;
79
import io.swagger.v3.oas.annotations.Operation;
10+
import io.swagger.v3.oas.annotations.media.Content;
11+
import io.swagger.v3.oas.annotations.media.ExampleObject;
12+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
813
import io.swagger.v3.oas.annotations.tags.Tag;
14+
15+
import org.springframework.web.bind.annotation.GetMapping;
916
import org.springframework.web.bind.annotation.RequestBody;
1017

1118
import java.util.List;
1219

1320
@Tag(name = ApiTags.REPORT)
1421
public interface ReportSpec {
1522

23+
@ApiResponse(responseCode = "200", useReturnTypeSchema = true, content =
24+
@Content(mediaType = "application/json", examples = @ExampleObject(name = "성공 예시", value =
25+
"{\n \"code\": \"OK\",\n \"message\": \"등록되었습니다.\",\n \"data\": 1\n}")))
1626
@Operation(summary = "제보등록",
1727
description = "회원이 제보를 등록합니다.")
1828
CustomResponseDto<Long> registerReport(User user, @RequestBody ReportRegisterRequest request);
1929

30+
@Operation(summary = "전체 제보 목록 조회",
31+
description = "전체 제보 목록을 조회합니다.")
32+
CustomResponseDto<ReportInfoResponse> getAllReportInfo(@CurrentUser User user);
33+
2034
/* 추후에 변경을 고려해서 소스만 남겨놓음
2135
@Operation(summary = "제보 이미지 등록",
2236
description = "presigned URL을 통해 업로드된 이미지들의 URL을 제보 이미지로 등록합니다.")

src/main/java/bitnagil/bitnagil_backend/report/domain/Report.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import bitnagil.bitnagil_backend.global.entity.BaseTimeEntity;
44
import bitnagil.bitnagil_backend.global.utils.StringListConverter;
55
import bitnagil.bitnagil_backend.report.domain.enums.ReportCategory;
6+
import bitnagil.bitnagil_backend.report.domain.enums.ReportStatus;
67
import bitnagil.bitnagil_backend.routineInfoV2.domain.RoutineInfoV2;
78
import bitnagil.bitnagil_backend.user.domain.User;
89
import jakarta.persistence.*;
@@ -31,6 +32,10 @@ public class Report extends BaseTimeEntity {
3132
@GeneratedValue(strategy = GenerationType.IDENTITY)
3233
private Long reportId; // 제보ID
3334

35+
@Enumerated(EnumType.STRING)
36+
@Column(columnDefinition = "varchar(40)")
37+
private ReportStatus reportStatus; // 제보 처리 상태
38+
3439
@Enumerated(EnumType.STRING)
3540
@Column(columnDefinition = "varchar(40)")
3641
private ReportCategory reportCategory; // 제보카테고리
@@ -55,8 +60,10 @@ public class Report extends BaseTimeEntity {
5560
private User user;
5661

5762
@Builder
58-
public Report(ReportCategory reportCategory, List<String> reportImageUrls, String reportTitle, String reportContent,
59-
String reportLocation, BigDecimal latitude, BigDecimal longitude, User user) {
63+
public Report(ReportStatus reportStatus, ReportCategory reportCategory, List<String> reportImageUrls,
64+
String reportTitle, String reportContent, String reportLocation, BigDecimal latitude, BigDecimal longitude,
65+
User user) {
66+
this.reportStatus = reportStatus;
6067
this.reportCategory = reportCategory;
6168
this.reportImageUrls = reportImageUrls;
6269
this.reportTitle = reportTitle;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package bitnagil.bitnagil_backend.report.domain.enums;
2+
3+
import lombok.Getter;
4+
import lombok.RequiredArgsConstructor;
5+
6+
@RequiredArgsConstructor
7+
@Getter
8+
public enum ReportStatus {
9+
10+
PENDING("제보 완료"),
11+
IN_PROGRESS("처리 중"),
12+
COMPLETED("처리 완료");
13+
14+
15+
private final String description;
16+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
package bitnagil.bitnagil_backend.report.repository;
22

3+
import java.util.List;
4+
35
import bitnagil.bitnagil_backend.report.domain.Report;
6+
import bitnagil.bitnagil_backend.user.domain.User;
7+
48
import org.springframework.data.jpa.repository.JpaRepository;
59
import org.springframework.stereotype.Repository;
610

711
@Repository
812
public interface ReportRepository extends JpaRepository<Report, Long> {
13+
14+
List<Report> findByUser(User user);
915
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package bitnagil.bitnagil_backend.report.response;
2+
3+
import bitnagil.bitnagil_backend.report.domain.enums.ReportCategory;
4+
import bitnagil.bitnagil_backend.report.domain.enums.ReportStatus;
5+
import io.swagger.v3.oas.annotations.media.Schema;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Builder;
8+
import lombok.Getter;
9+
10+
@Getter
11+
@AllArgsConstructor
12+
@Builder
13+
public class ReportInfo {
14+
15+
@Schema(description = "제보 ID 식별값입니다.",
16+
example = "1")
17+
private Long reportId;
18+
19+
@Schema(description = "현재 제보 상태",
20+
example = "IN_PROGRESS")
21+
private ReportStatus reportStatus;
22+
23+
@Schema(description = "제보 명",
24+
example = "가로등 불 꺼짐")
25+
private String reportTitle;
26+
27+
@Schema(description = "제보 카테고리",
28+
example = "TRANSPORTATION")
29+
private ReportCategory reportCategory;
30+
31+
@Schema(description = "제보 위치",
32+
example = "서울시 강남구 삼성동")
33+
private String reportLocation;
34+
35+
@Schema(description = "제보 이미지 URL 리스트",
36+
example = "https://example.com/report/image1.jpg")
37+
private String reportImageUrl;
38+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package bitnagil.bitnagil_backend.report.response;
2+
3+
import java.time.LocalDate;
4+
import java.util.List;
5+
import java.util.Map;
6+
7+
import io.swagger.v3.oas.annotations.media.Schema;
8+
import lombok.AllArgsConstructor;
9+
import lombok.Builder;
10+
import lombok.Getter;
11+
12+
@Getter
13+
@AllArgsConstructor
14+
public class ReportInfoResponse {
15+
16+
@Schema(description = "날짜 별 제보 목록\n\n제보한 기록이 없을 경우 빈 Map을 반환합니다.")
17+
private Map<LocalDate, List<ReportInfo>> reportInfos;
18+
}

src/main/java/bitnagil/bitnagil_backend/report/service/ReportService.java

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,22 @@
33
import bitnagil.bitnagil_backend.global.errorcode.ErrorCode;
44
import bitnagil.bitnagil_backend.global.exception.CustomException;
55
import bitnagil.bitnagil_backend.report.domain.Report;
6+
import bitnagil.bitnagil_backend.report.domain.enums.ReportStatus;
67
import bitnagil.bitnagil_backend.report.repository.ReportRepository;
78
import bitnagil.bitnagil_backend.report.request.ReportRegisterRequest;
9+
import bitnagil.bitnagil_backend.report.response.ReportInfo;
10+
import bitnagil.bitnagil_backend.report.response.ReportInfoResponse;
811
import bitnagil.bitnagil_backend.routineInfoV2.domain.RoutineInfoV2;
912
import bitnagil.bitnagil_backend.user.domain.User;
1013
import lombok.RequiredArgsConstructor;
1114
import org.springframework.stereotype.Service;
1215
import org.springframework.transaction.annotation.Transactional;
1316

17+
import java.time.LocalDate;
18+
import java.util.ArrayList;
19+
import java.util.HashMap;
1420
import java.util.List;
21+
import java.util.Map;
1522

1623
@Service
1724
@RequiredArgsConstructor
@@ -23,20 +30,55 @@ public class ReportService {
2330
@Transactional
2431
public long registerReport(User user, ReportRegisterRequest request) {
2532
Report report = Report.builder()
26-
.reportCategory(request.getReportCategory())
27-
.reportImageUrls(request.getReportImageUrls())
28-
.reportContent(request.getReportContent())
29-
.reportLocation(request.getReportLocation())
30-
.reportTitle(request.getReportTitle())
31-
.latitude(request.getLatitude())
32-
.longitude(request.getLongitude())
33-
.user(user)
34-
.build();
33+
.reportStatus(ReportStatus.PENDING)
34+
.reportCategory(request.getReportCategory())
35+
.reportImageUrls(request.getReportImageUrls())
36+
.reportContent(request.getReportContent())
37+
.reportLocation(request.getReportLocation())
38+
.reportTitle(request.getReportTitle())
39+
.latitude(request.getLatitude())
40+
.longitude(request.getLongitude())
41+
.user(user)
42+
.build();
3543

3644
reportRepository.save(report);
3745
return report.getReportId();
3846
}
3947

48+
// 제보 전체 목록 조회
49+
@Transactional(readOnly = true)
50+
public ReportInfoResponse getAllReportInfo(User user) {
51+
List<Report> reports = reportRepository.findByUser(user);
52+
53+
Map<LocalDate, List<ReportInfo>> reportInfoMap = new HashMap<>();
54+
55+
for (Report report : reports) {
56+
LocalDate reportDate = report.getCreatedAt().toLocalDate();
57+
58+
ReportInfo reportInfo = ReportInfo.builder()
59+
.reportId(report.getReportId())
60+
.reportStatus(report.getReportStatus())
61+
.reportTitle(report.getReportTitle())
62+
.reportCategory(report.getReportCategory())
63+
.reportLocation(report.getReportLocation())
64+
.reportImageUrl(report.getReportImageUrls().get(0)) // 첫 번째 사진을 썸네일로 임의 설정
65+
.build();
66+
67+
List<ReportInfo> reportInfos;
68+
if (reportInfoMap.containsKey(reportDate)) {
69+
reportInfos = reportInfoMap.get(reportDate);
70+
71+
} else {
72+
reportInfos = new ArrayList<>();
73+
}
74+
reportInfos.add(reportInfo);
75+
reportInfoMap.put(reportDate, reportInfos);
76+
77+
}
78+
79+
return new ReportInfoResponse(reportInfoMap);
80+
}
81+
4082
/* 추후에 변경을 고려해서 소스만 남겨놓음
4183
@Transactional
4284
public void updateImages(Long reportId, List<String> urls) {
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ALTER TABLE report
2+
ADD COLUMN report_status VARCHAR(50) NOT NULL;

0 commit comments

Comments
 (0)