Skip to content

Commit cb52e2e

Browse files
authored
[DDING-97] 동아리 지원 폼지 통계 전체조회 API 구현 (#242)
1 parent 5084cc4 commit cb52e2e

21 files changed

+1214
-203
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package ddingdong.ddingdongBE.common.utils;
2+
3+
public class CalculationUtils {
4+
5+
public static int calculateRatio(int numerator, int denominator) {
6+
if (denominator == 0) {
7+
return 0;
8+
}
9+
return (int) ((double) numerator / denominator * 100);
10+
}
11+
12+
public static int calculateDifference(int beforeCount, int count) {
13+
return count - beforeCount;
14+
}
15+
16+
public static int calculateDifferenceRatio(int beforeCount, int count) {
17+
int difference = calculateDifference(beforeCount, count);
18+
return calculateRatio(difference, beforeCount);
19+
}
20+
}

src/main/java/ddingdong/ddingdongBE/common/utils/TimeUtils.java

+23-18
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,36 @@
66

77
public class TimeUtils {
88

9-
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm";
9+
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm";
1010

11-
public static LocalDateTime parseToLocalDateTime(String dateString) {
12-
if (dateString == null || dateString.isBlank()) {
13-
return null;
11+
public static LocalDateTime parseToLocalDateTime(String dateString) {
12+
if (dateString == null || dateString.isBlank()) {
13+
return null;
14+
}
15+
16+
return LocalDateTime.parse(dateString, DateTimeFormatter.ofPattern(DATE_FORMAT));
1417
}
1518

16-
return LocalDateTime.parse(dateString, DateTimeFormatter.ofPattern(DATE_FORMAT));
17-
}
19+
public static LocalDateTime processDate(String dateString, LocalDateTime currentDate) {
20+
if (dateString == null) {
21+
return null;
22+
}
1823

19-
public static LocalDateTime processDate(String dateString, LocalDateTime currentDate) {
20-
if (dateString == null) {
21-
return null;
22-
}
24+
if (dateString.isBlank()) {
25+
return null;
26+
}
2327

24-
if (dateString.isBlank()) {
25-
return null;
28+
return parseToLocalDateTime(dateString);
2629
}
2730

28-
return parseToLocalDateTime(dateString);
29-
}
31+
public static boolean isDateInRange(LocalDate nowDate, LocalDate startDate, LocalDate endDate) {
32+
if (nowDate == null || startDate == null || endDate == null) {
33+
return false;
34+
}
35+
return !nowDate.isBefore(startDate) && !nowDate.isAfter(endDate);
36+
}
3037

31-
public static boolean isDateInRange(LocalDate nowDate, LocalDate startDate, LocalDate endDate) {
32-
if (nowDate == null || startDate == null || endDate == null) {
33-
return false;
38+
public static String getYearAndMonth(LocalDate date) {
39+
return date.getYear() + "-" + date.getMonthValue();
3440
}
35-
return !nowDate.isBefore(startDate) && !nowDate.isAfter(endDate); }
3641
}

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

+56-48
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import ddingdong.ddingdongBE.domain.form.controller.dto.request.UpdateFormRequest;
66
import ddingdong.ddingdongBE.domain.form.controller.dto.response.FormListResponse;
77
import ddingdong.ddingdongBE.domain.form.controller.dto.response.FormResponse;
8+
import ddingdong.ddingdongBE.domain.form.controller.dto.response.FormStatisticsResponse;
89
import io.swagger.v3.oas.annotations.Operation;
910
import io.swagger.v3.oas.annotations.media.ArraySchema;
1011
import io.swagger.v3.oas.annotations.media.Content;
@@ -29,56 +30,63 @@
2930
@RequestMapping("/server/central")
3031
public interface CentralFormApi {
3132

32-
@Operation(summary = "동아리 지원 폼지 생성 API")
33-
@ApiResponse(responseCode = "201", description = "동아리 지원 폼지 생성 성공")
34-
@ResponseStatus(HttpStatus.CREATED)
35-
@SecurityRequirement(name = "AccessToken")
36-
@PostMapping("/my/forms")
37-
void createForm(
38-
@Valid @RequestBody CreateFormRequest createFormRequest,
39-
@AuthenticationPrincipal PrincipalDetails principalDetails
40-
);
33+
@Operation(summary = "동아리 지원 폼지 생성 API")
34+
@ApiResponse(responseCode = "201", description = "동아리 지원 폼지 생성 성공")
35+
@ResponseStatus(HttpStatus.CREATED)
36+
@SecurityRequirement(name = "AccessToken")
37+
@PostMapping("/my/forms")
38+
void createForm(
39+
@Valid @RequestBody CreateFormRequest createFormRequest,
40+
@AuthenticationPrincipal PrincipalDetails principalDetails
41+
);
4142

42-
@Operation(summary = "동아리 지원 폼지 수정 API")
43-
@ApiResponse(responseCode = "204", description = "동아리 지원 폼지 수정 성공")
44-
@ResponseStatus(HttpStatus.NO_CONTENT)
45-
@SecurityRequirement(name = "AccessToken")
46-
@PutMapping("/my/forms/{formId}")
47-
void updateForm(
48-
@Valid @RequestBody UpdateFormRequest updateFormRequest,
49-
@PathVariable("formId") Long formId,
50-
@AuthenticationPrincipal PrincipalDetails principalDetails
51-
);
43+
@Operation(summary = "동아리 지원 폼지 수정 API")
44+
@ApiResponse(responseCode = "204", description = "동아리 지원 폼지 수정 성공")
45+
@ResponseStatus(HttpStatus.NO_CONTENT)
46+
@SecurityRequirement(name = "AccessToken")
47+
@PutMapping("/my/forms/{formId}")
48+
void updateForm(
49+
@Valid @RequestBody UpdateFormRequest updateFormRequest,
50+
@PathVariable("formId") Long formId,
51+
@AuthenticationPrincipal PrincipalDetails principalDetails
52+
);
5253

53-
@Operation(summary = "동아리 지원 폼지 삭제 API")
54-
@ApiResponse(responseCode = "204", description = "동아리 지원 폼지 삭제 성공")
55-
@ResponseStatus(HttpStatus.NO_CONTENT)
56-
@SecurityRequirement(name = "AccessToken")
57-
@DeleteMapping("/my/forms/{formId}")
58-
void deleteForm(
59-
@PathVariable("formId") Long formId,
60-
@AuthenticationPrincipal PrincipalDetails principalDetails
61-
);
54+
@Operation(summary = "동아리 지원 폼지 삭제 API")
55+
@ApiResponse(responseCode = "204", description = "동아리 지원 폼지 삭제 성공")
56+
@ResponseStatus(HttpStatus.NO_CONTENT)
57+
@SecurityRequirement(name = "AccessToken")
58+
@DeleteMapping("/my/forms/{formId}")
59+
void deleteForm(
60+
@PathVariable("formId") Long formId,
61+
@AuthenticationPrincipal PrincipalDetails principalDetails
62+
);
6263

63-
@Operation(summary = "동아리 지원 폼지 전체조회 API")
64-
@ApiResponse(responseCode = "200", description = "동아리 지원 폼지 전체조회 성공",
65-
content = @Content(
66-
array = @ArraySchema(schema = @Schema(implementation = FormListResponse.class))
67-
))
68-
@ResponseStatus(HttpStatus.OK)
69-
@SecurityRequirement(name = "AccessToken")
70-
@GetMapping("/my/forms")
71-
List<FormListResponse> getAllMyForm(
72-
@AuthenticationPrincipal PrincipalDetails principalDetails
73-
);
64+
@Operation(summary = "동아리 지원 폼지 전체조회 API")
65+
@ApiResponse(responseCode = "200", description = "동아리 지원 폼지 전체조회 성공",
66+
content = @Content(
67+
array = @ArraySchema(schema = @Schema(implementation = FormListResponse.class))
68+
))
69+
@ResponseStatus(HttpStatus.OK)
70+
@SecurityRequirement(name = "AccessToken")
71+
@GetMapping("/my/forms")
72+
List<FormListResponse> getAllMyForm(@AuthenticationPrincipal PrincipalDetails principalDetails);
7473

75-
@Operation(summary = "동아리 지원 폼지 상세조회 API")
76-
@ApiResponse(responseCode = "200", description = "동아리 지원 폼지 상세조회 성공",
77-
content = @Content(schema = @Schema(implementation = FormResponse.class)))
78-
@ResponseStatus(HttpStatus.OK)
79-
@SecurityRequirement(name = "AccessToken")
80-
@GetMapping("/my/forms/{formId}")
81-
FormResponse getForm(
82-
@PathVariable("formId") Long formId
83-
);
74+
@Operation(summary = "동아리 지원 폼지 상세조회 API")
75+
@ApiResponse(responseCode = "200", description = "동아리 지원 폼지 상세조회 성공",
76+
content = @Content(schema = @Schema(implementation = FormResponse.class)))
77+
@ResponseStatus(HttpStatus.OK)
78+
@SecurityRequirement(name = "AccessToken")
79+
@GetMapping("/my/forms/{formId}")
80+
FormResponse getForm(@PathVariable("formId") Long formId);
81+
82+
@Operation(summary = "동아리 지원 폼지 통계 전체조회 API")
83+
@ApiResponse(responseCode = "200", description = "동아리 지원 폼지 통계 전체조회 성공",
84+
content = @Content(schema = @Schema(implementation = FormStatisticsResponse.class)))
85+
@ResponseStatus(HttpStatus.OK)
86+
@SecurityRequirement(name = "AccessToken")
87+
@GetMapping("/my/forms/{formId}/statistics")
88+
FormStatisticsResponse getFormStatistics(
89+
@PathVariable("formId") Long formId,
90+
@AuthenticationPrincipal PrincipalDetails principalDetails
91+
);
8492
}

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

+52-40
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
import ddingdong.ddingdongBE.domain.form.controller.dto.request.UpdateFormRequest;
77
import ddingdong.ddingdongBE.domain.form.controller.dto.response.FormListResponse;
88
import ddingdong.ddingdongBE.domain.form.controller.dto.response.FormResponse;
9+
import ddingdong.ddingdongBE.domain.form.controller.dto.response.FormStatisticsResponse;
910
import ddingdong.ddingdongBE.domain.form.service.FacadeCentralFormService;
1011
import ddingdong.ddingdongBE.domain.form.service.dto.query.FormListQuery;
1112
import ddingdong.ddingdongBE.domain.form.service.dto.query.FormQuery;
13+
import ddingdong.ddingdongBE.domain.form.service.dto.query.FormStatisticsQuery;
1214
import ddingdong.ddingdongBE.domain.user.entity.User;
1315
import java.util.List;
1416
import lombok.RequiredArgsConstructor;
@@ -18,44 +20,54 @@
1820
@RequiredArgsConstructor
1921
public class CentralFormController implements CentralFormApi {
2022

21-
private final FacadeCentralFormService facadeCentralFormService;
22-
23-
@Override
24-
public void createForm(
25-
CreateFormRequest createFormRequest,
26-
PrincipalDetails principalDetails
27-
) {
28-
User user = principalDetails.getUser();
29-
facadeCentralFormService.createForm(createFormRequest.toCommand(user));
30-
}
31-
32-
@Override
33-
public void updateForm(
34-
UpdateFormRequest updateFormRequest,
35-
Long formId,
36-
PrincipalDetails principalDetails
37-
) {
38-
facadeCentralFormService.updateForm(updateFormRequest.toCommand(formId));
39-
}
40-
41-
@Override
42-
public void deleteForm(Long formId, PrincipalDetails principalDetails) {
43-
User user = principalDetails.getUser();
44-
facadeCentralFormService.deleteForm(formId, user);
45-
}
46-
47-
@Override
48-
public List<FormListResponse> getAllMyForm(PrincipalDetails principalDetails) {
49-
User user = principalDetails.getUser();
50-
List<FormListQuery> queries = facadeCentralFormService.getAllMyForm(user);
51-
return queries.stream()
52-
.map(FormListResponse::from)
53-
.toList();
54-
}
55-
56-
@Override
57-
public FormResponse getForm(Long formId) {
58-
FormQuery query = facadeCentralFormService.getForm(formId);
59-
return FormResponse.from(query);
60-
}
23+
private final FacadeCentralFormService facadeCentralFormService;
24+
25+
@Override
26+
public void createForm(
27+
CreateFormRequest createFormRequest,
28+
PrincipalDetails principalDetails
29+
) {
30+
User user = principalDetails.getUser();
31+
facadeCentralFormService.createForm(createFormRequest.toCommand(user));
32+
}
33+
34+
@Override
35+
public void updateForm(
36+
UpdateFormRequest updateFormRequest,
37+
Long formId,
38+
PrincipalDetails principalDetails
39+
) {
40+
facadeCentralFormService.updateForm(updateFormRequest.toCommand(formId));
41+
}
42+
43+
@Override
44+
public void deleteForm(Long formId, PrincipalDetails principalDetails) {
45+
User user = principalDetails.getUser();
46+
facadeCentralFormService.deleteForm(formId, user);
47+
}
48+
49+
@Override
50+
public List<FormListResponse> getAllMyForm(PrincipalDetails principalDetails) {
51+
User user = principalDetails.getUser();
52+
List<FormListQuery> queries = facadeCentralFormService.getAllMyForm(user);
53+
return queries.stream()
54+
.map(FormListResponse::from)
55+
.toList();
56+
}
57+
58+
@Override
59+
public FormResponse getForm(Long formId) {
60+
FormQuery query = facadeCentralFormService.getForm(formId);
61+
return FormResponse.from(query);
62+
}
63+
64+
@Override
65+
public FormStatisticsResponse getFormStatistics(
66+
Long formId,
67+
PrincipalDetails principalDetails
68+
) {
69+
User user = principalDetails.getUser();
70+
FormStatisticsQuery query = facadeCentralFormService.getStatisticsByForm(user, formId);
71+
return FormStatisticsResponse.from(query);
72+
}
6173
}

0 commit comments

Comments
 (0)