Skip to content

Commit cd339cb

Browse files
committed
merge
2 parents 5ea86cb + 546cf90 commit cd339cb

File tree

14 files changed

+183
-25
lines changed

14 files changed

+183
-25
lines changed

src/main/java/ddingdong/ddingdongBE/common/exception/FormException.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
public class FormException extends CustomException {
66

77
public static final String FORM_PERIOD_ERROR_MESSAGE = "해당 폼지의 응답기간이 아닙니다";
8-
private static final String INVALID_FORM_DATE_MESSAGE = "입력한 기간과 겹치는 폼이 존재합니다.";
8+
private static final String OVERLAPPED_FORM_DATE_MESSAGE = "입력한 기간과 겹치는 폼이 존재합니다.";
99
private static final String INVALID_FIELD_TYPE_MESSAGE = "통계를 조회할 질문 유형이 올바르지 않습니다.";
10+
private static final String INVALID_FORM_DATE_MESSAGE = "폼지 종료일자는 폼지 시작일자 이전일 수 없습니다.";
1011

1112

1213
public FormException(String message, int errorCode) {
@@ -23,6 +24,13 @@ public FormPeriodException() {
2324
public static final class OverlapFormPeriodException extends FormException {
2425

2526
public OverlapFormPeriodException() {
27+
super(OVERLAPPED_FORM_DATE_MESSAGE, BAD_REQUEST.value());
28+
}
29+
}
30+
31+
public static final class InvalidFormEndDateException extends FormException {
32+
33+
public InvalidFormEndDateException() {
2634
super(INVALID_FORM_DATE_MESSAGE, BAD_REQUEST.value());
2735
}
2836
}

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
}

src/main/java/ddingdong/ddingdongBE/domain/form/api/CentralFormApi.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import ddingdong.ddingdongBE.auth.PrincipalDetails;
44
import ddingdong.ddingdongBE.domain.form.controller.dto.request.CreateFormRequest;
55
import ddingdong.ddingdongBE.domain.form.controller.dto.request.SendApplicationResultEmailRequest;
6+
import ddingdong.ddingdongBE.domain.form.controller.dto.request.UpdateFormEndDateRequest;
67
import ddingdong.ddingdongBE.domain.form.controller.dto.request.UpdateFormRequest;
78
import ddingdong.ddingdongBE.domain.form.controller.dto.response.FormListResponse;
89
import ddingdong.ddingdongBE.domain.form.controller.dto.response.FormResponse;
@@ -22,6 +23,7 @@
2223
import org.springframework.security.core.annotation.AuthenticationPrincipal;
2324
import org.springframework.web.bind.annotation.DeleteMapping;
2425
import org.springframework.web.bind.annotation.GetMapping;
26+
import org.springframework.web.bind.annotation.PatchMapping;
2527
import org.springframework.web.bind.annotation.PathVariable;
2628
import org.springframework.web.bind.annotation.PostMapping;
2729
import org.springframework.web.bind.annotation.PutMapping;
@@ -125,4 +127,15 @@ FormStatisticsResponse getFormStatistics(
125127
void sendApplicationResultEmail(@PathVariable("formId") Long formId,
126128
@AuthenticationPrincipal PrincipalDetails principalDetails,
127129
@RequestBody SendApplicationResultEmailRequest request);
130+
131+
@Operation(summary = "동아리 폼지 종료일자 수정 API")
132+
@ApiResponse(responseCode = "204", description = "동아리 폼지 지원기간 마감일자 수정 성공")
133+
@ResponseStatus(HttpStatus.NO_CONTENT)
134+
@SecurityRequirement(name = "AccessToken")
135+
@PatchMapping("/my/forms/{formId}/deadline")
136+
void updateFormEndDate(
137+
@Valid @RequestBody UpdateFormEndDateRequest updateFormEndDateRequest,
138+
@PathVariable("formId") Long formId,
139+
@AuthenticationPrincipal PrincipalDetails principalDetails
140+
);
128141
}

src/main/java/ddingdong/ddingdongBE/domain/form/controller/CentralFormController.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import ddingdong.ddingdongBE.domain.form.api.CentralFormApi;
55
import ddingdong.ddingdongBE.domain.form.controller.dto.request.CreateFormRequest;
66
import ddingdong.ddingdongBE.domain.form.controller.dto.request.SendApplicationResultEmailRequest;
7+
import ddingdong.ddingdongBE.domain.form.controller.dto.request.UpdateFormEndDateRequest;
78
import ddingdong.ddingdongBE.domain.form.controller.dto.request.UpdateFormRequest;
89
import ddingdong.ddingdongBE.domain.form.controller.dto.response.FormListResponse;
910
import ddingdong.ddingdongBE.domain.form.controller.dto.response.FormResponse;
@@ -104,4 +105,11 @@ public void sendApplicationResultEmail(
104105
User user = principalDetails.getUser();
105106
facadeCentralFormService.sendApplicationResultEmail(request.toCommand(user.getId(), formId));
106107
}
108+
109+
@Override
110+
public void updateFormEndDate(UpdateFormEndDateRequest updateFormEndDateRequest, Long formId,
111+
PrincipalDetails principalDetails) {
112+
User user = principalDetails.getUser();
113+
facadeCentralFormService.updateFormEndDate(updateFormEndDateRequest.toCommand(user, formId));
114+
}
107115
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package ddingdong.ddingdongBE.domain.form.controller.dto.request;
2+
3+
import ddingdong.ddingdongBE.domain.form.service.dto.command.UpdateFormEndDateCommand;
4+
import ddingdong.ddingdongBE.domain.user.entity.User;
5+
import io.swagger.v3.oas.annotations.media.Schema;
6+
import jakarta.validation.constraints.NotNull;
7+
import com.fasterxml.jackson.annotation.JsonFormat;
8+
import java.time.LocalDate;
9+
10+
public record UpdateFormEndDateRequest (
11+
@Schema(description = "폼지 종료일자", example = "2025-03-10")
12+
@NotNull(message = "폼지 종료일자는 null이 될 수 없습니다.")
13+
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
14+
LocalDate endDate
15+
){
16+
public UpdateFormEndDateCommand toCommand(User user, Long formId) {
17+
return UpdateFormEndDateCommand.builder()
18+
.user(user)
19+
.formId(formId)
20+
.endDate(endDate)
21+
.build();
22+
}
23+
}

0 commit comments

Comments
 (0)