Skip to content

Commit 279e9c9

Browse files
authored
[DDING-000] 어드민 - 활동보고서 상세 조회 API 구현 (#291)
1 parent cdab9fa commit 279e9c9

File tree

6 files changed

+93
-24
lines changed

6 files changed

+93
-24
lines changed

src/main/java/ddingdong/ddingdongBE/domain/activityreport/api/AdminActivityReportApi.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ddingdong.ddingdongBE.domain.activityreport.api;
22

33
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.request.CreateActivityTermInfoRequest;
4+
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.response.ActivityReportResponse;
45
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.response.AdminActivityReportListResponse;
56
import io.swagger.v3.oas.annotations.Operation;
67
import io.swagger.v3.oas.annotations.media.Content;
@@ -15,21 +16,33 @@
1516
import org.springframework.web.bind.annotation.PostMapping;
1617
import org.springframework.web.bind.annotation.RequestBody;
1718
import org.springframework.web.bind.annotation.RequestMapping;
19+
import org.springframework.web.bind.annotation.RequestParam;
1820
import org.springframework.web.bind.annotation.ResponseStatus;
1921

2022
@Tag(name = "Activity Report - Admin", description = "Activity Report Admin API")
2123
@RequestMapping("/server/admin/activity-reports")
2224
public interface AdminActivityReportApi {
2325

24-
@Operation(summary = "활동 보고서 전체 조회")
26+
@Operation(summary = "어드민 - 활동 보고서 전체 조회")
2527
@ApiResponse(responseCode = "200", description = "활동 보고서 전체 조회 성공",
2628
content = @Content(schema = @Schema(implementation = AdminActivityReportListResponse.class)))
2729
@ResponseStatus(HttpStatus.OK)
2830
@SecurityRequirement(name = "AccessToken")
29-
@GetMapping("/{term}")
30-
List<AdminActivityReportListResponse> getActivityReports(@PathVariable("term") int term);
31+
@GetMapping()
32+
List<AdminActivityReportListResponse> getActivityReports(@RequestParam("term") int term);
3133

32-
@Operation(summary = "활동 보고서 회차별 기간 설정 API")
34+
@Operation(summary = "어드민 - 활동보고서 상세 조회")
35+
@ApiResponse(responseCode = "200", description = "활동보고서 상세 조회 성공",
36+
content = @Content(schema = @Schema(implementation = ActivityReportResponse.class)))
37+
@ResponseStatus(HttpStatus.OK)
38+
@SecurityRequirement(name = "AccessToken")
39+
@GetMapping("/clubs/{clubId}")
40+
List<ActivityReportResponse> getActivityReport(
41+
@PathVariable("clubId") Long clubId,
42+
@RequestParam("term") int term
43+
);
44+
45+
@Operation(summary = "어드민 - 활동 보고서 회차별 기간 설정 API")
3346
@ApiResponse(responseCode = "201", description = "활동 보고서 회차 생성 성공")
3447
@ResponseStatus(HttpStatus.CREATED)
3548
@SecurityRequirement(name = "AccessToken")

src/main/java/ddingdong/ddingdongBE/domain/activityreport/controller/AdminActivityReportApiController.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import ddingdong.ddingdongBE.domain.activityreport.api.AdminActivityReportApi;
44
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.request.CreateActivityTermInfoRequest;
5+
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.response.ActivityReportResponse;
56
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.response.AdminActivityReportListResponse;
67
import ddingdong.ddingdongBE.domain.activityreport.service.FacadeAdminActivityReportService;
8+
import ddingdong.ddingdongBE.domain.activityreport.service.dto.query.ActivityReportQuery;
79
import ddingdong.ddingdongBE.domain.activityreport.service.dto.query.AdminActivityReportListQuery;
810
import java.time.LocalDateTime;
911
import java.util.List;
@@ -25,6 +27,15 @@ public List<AdminActivityReportListResponse> getActivityReports(int term) {
2527
.toList();
2628
}
2729

30+
@Override
31+
public List<ActivityReportResponse> getActivityReport(Long clubId, int term) {
32+
LocalDateTime now = LocalDateTime.now();
33+
List<ActivityReportQuery> queries = facadeAdminActivityReportService.getActivityReport(clubId, now, term);
34+
return queries.stream()
35+
.map(ActivityReportResponse::from)
36+
.toList();
37+
}
38+
2839
@Override
2940
public void createActivityTermInfo(CreateActivityTermInfoRequest request) {
3041
facadeAdminActivityReportService.createActivityTermInfo(request.toCommand());

src/main/java/ddingdong/ddingdongBE/domain/activityreport/controller/dto/response/AdminActivityReportListResponse.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,29 @@
77

88
@Builder
99
public record AdminActivityReportListResponse(
10-
@Schema(description = "동아리 이름", example = "카우")
11-
String name,
10+
AdminActivityReportListClubResponse club,
1211

13-
@Schema(description = "활동보고서 정보")
14-
List<ActivityReportDto> activityReports
12+
@Schema(description = "활동보고서 정보")
13+
List<ActivityReportDto> activityReports
1514
) {
1615

1716
public static AdminActivityReportListResponse from(AdminActivityReportListQuery query) {
1817
List<ActivityReportDto> activityReports = query.activityReports().stream()
19-
.map(ActivityReportDto::from)
20-
.toList();
18+
.map(ActivityReportDto::from)
19+
.toList();
2120

2221
return AdminActivityReportListResponse.builder()
23-
.name(query.name())
24-
.activityReports(activityReports)
25-
.build();
22+
.club(new AdminActivityReportListClubResponse(query.clubId(), query.clubName()))
23+
.activityReports(activityReports)
24+
.build();
25+
}
26+
27+
public record AdminActivityReportListClubResponse(
28+
@Schema(description = "동아리 식별자", example = "1")
29+
Long id,
30+
@Schema(description = "동아리 이름", example = "카우")
31+
String name
32+
) {
33+
2634
}
2735
}

src/main/java/ddingdong/ddingdongBE/domain/activityreport/service/FacadeAdminActivityReportService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ddingdong.ddingdongBE.domain.activityreport.service;
22

33
import ddingdong.ddingdongBE.domain.activityreport.service.dto.command.CreateActivityTermInfoCommand;
4+
import ddingdong.ddingdongBE.domain.activityreport.service.dto.query.ActivityReportQuery;
45
import ddingdong.ddingdongBE.domain.activityreport.service.dto.query.AdminActivityReportListQuery;
56
import java.time.LocalDateTime;
67
import java.util.List;
@@ -9,5 +10,7 @@ public interface FacadeAdminActivityReportService {
910

1011
List<AdminActivityReportListQuery> getActivityReports(LocalDateTime now, int term);
1112

13+
List<ActivityReportQuery> getActivityReport(Long clubId, LocalDateTime now, int term);
14+
1215
void createActivityTermInfo(CreateActivityTermInfoCommand command);
1316
}

src/main/java/ddingdong/ddingdongBE/domain/activityreport/service/FacadeAdminActivityReportServiceImpl.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,14 @@
33
import ddingdong.ddingdongBE.domain.activityreport.entity.ActivityReport;
44
import ddingdong.ddingdongBE.domain.activityreport.service.dto.command.CreateActivityTermInfoCommand;
55
import ddingdong.ddingdongBE.domain.activityreport.service.dto.query.ActivityReportInfo;
6+
import ddingdong.ddingdongBE.domain.activityreport.service.dto.query.ActivityReportQuery;
67
import ddingdong.ddingdongBE.domain.activityreport.service.dto.query.AdminActivityReportListQuery;
8+
import ddingdong.ddingdongBE.domain.club.entity.Club;
9+
import ddingdong.ddingdongBE.domain.club.service.ClubService;
10+
import ddingdong.ddingdongBE.domain.filemetadata.entity.DomainType;
11+
import ddingdong.ddingdongBE.domain.filemetadata.service.FileMetaDataService;
12+
import ddingdong.ddingdongBE.file.service.S3FileService;
13+
import ddingdong.ddingdongBE.file.service.dto.query.UploadedFileUrlQuery;
714
import java.time.LocalDateTime;
815
import java.util.List;
916
import java.util.Map;
@@ -17,8 +24,11 @@
1724
@Transactional(readOnly = true)
1825
public class FacadeAdminActivityReportServiceImpl implements FacadeAdminActivityReportService {
1926

27+
private final ClubService clubService;
2028
private final ActivityReportTermInfoService activityReportTermInfoService;
2129
private final ActivityReportService activityReportService;
30+
private final FileMetaDataService fileMetaDataService;
31+
private final S3FileService s3FileService;
2232

2333
@Override
2434
public List<AdminActivityReportListQuery> getActivityReports(LocalDateTime now, int term) {
@@ -27,22 +37,43 @@ public List<AdminActivityReportListQuery> getActivityReports(LocalDateTime now,
2737
return parseToListQuery(activityReports);
2838
}
2939

40+
@Override
41+
public List<ActivityReportQuery> getActivityReport(Long clubId, LocalDateTime now, int term) {
42+
Club club = clubService.getById(clubId);
43+
int currentYear = now.getYear();
44+
List<ActivityReport> activityReports = activityReportService.getActivityReport(club, currentYear, term);
45+
46+
return activityReports.stream()
47+
.map(this::parseToQuery)
48+
.toList();
49+
}
50+
3051
@Transactional
3152
@Override
3253
public void createActivityTermInfo(CreateActivityTermInfoCommand command) {
3354
activityReportTermInfoService.create(command.startDate(), command.totalTermCount());
3455
}
3556

57+
private ActivityReportQuery parseToQuery(ActivityReport activityReport) {
58+
UploadedFileUrlQuery image = fileMetaDataService
59+
.getCoupledAllByDomainTypeAndEntityId(DomainType.ACTIVITY_REPORT_IMAGE, activityReport.getId())
60+
.stream()
61+
.map(fileMetaData -> s3FileService.getUploadedFileUrl(fileMetaData.getFileKey()))
62+
.findFirst()
63+
.orElse(null);
64+
return ActivityReportQuery.of(activityReport, image);
65+
}
66+
3667
private List<AdminActivityReportListQuery> parseToListQuery(final List<ActivityReport> activityReports) {
37-
Map<String, List<ActivityReport>> activityReportsGroupedByClubName = activityReports.stream()
38-
.collect(Collectors.groupingBy(report -> report.getClub().getName()));
68+
Map<Club, List<ActivityReport>> activityReportsGroupedByClubName = activityReports.stream()
69+
.collect(Collectors.groupingBy(ActivityReport::getClub));
3970

4071
return activityReportsGroupedByClubName.entrySet().stream()
4172
.map(entry -> {
4273
List<ActivityReportInfo> activityReportInfos = entry.getValue().stream()
4374
.map(ActivityReportInfo::from)
4475
.toList();
45-
return new AdminActivityReportListQuery(entry.getKey(), activityReportInfos);
76+
return AdminActivityReportListQuery.of(entry.getKey(), activityReportInfos);
4677
})
4778
.toList();
4879
}
Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
package ddingdong.ddingdongBE.domain.activityreport.service.dto.query;
22

3+
import ddingdong.ddingdongBE.domain.club.entity.Club;
34
import java.util.List;
45
import lombok.Builder;
56

67
@Builder
78
public record AdminActivityReportListQuery(
8-
String name,
9-
List<ActivityReportInfo> activityReports
9+
Long clubId,
10+
String clubName,
11+
List<ActivityReportInfo> activityReports
1012
) {
1113

12-
public static AdminActivityReportListQuery of(String name, List<ActivityReportInfo> activityReportInfos) {
13-
return AdminActivityReportListQuery.builder()
14-
.name(name)
15-
.activityReports(activityReportInfos)
16-
.build();
17-
}
14+
public static AdminActivityReportListQuery of(Club club, List<ActivityReportInfo> activityReportInfos) {
15+
return AdminActivityReportListQuery.builder()
16+
.clubId(club.getId())
17+
.clubName(club.getName())
18+
.activityReports(activityReportInfos)
19+
.build();
20+
}
1821
}

0 commit comments

Comments
 (0)