Skip to content

Commit 185c0bb

Browse files
authored
[DDING-92] 지원자 전체조회 API 구현 (#239)
1 parent b64952b commit 185c0bb

33 files changed

+559
-101
lines changed

src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/entity/FormApplicationStatus.java

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/repository/FormApplicationRepository.java

Lines changed: 0 additions & 7 deletions
This file was deleted.

src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/FacadeUserFormService.java

Lines changed: 0 additions & 9 deletions
This file was deleted.

src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/FormAnswerService.java

Lines changed: 0 additions & 10 deletions
This file was deleted.

src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/FormApplicationService.java

Lines changed: 0 additions & 9 deletions
This file was deleted.

src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/GeneralFormApplicationService.java

Lines changed: 0 additions & 22 deletions
This file was deleted.
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package ddingdong.ddingdongBE.domain.formapplication.api;
2+
3+
import ddingdong.ddingdongBE.auth.PrincipalDetails;
4+
import ddingdong.ddingdongBE.domain.formapplication.controller.dto.response.MyFormApplicationPageResponse;
5+
import io.swagger.v3.oas.annotations.Operation;
6+
import io.swagger.v3.oas.annotations.Parameter;
7+
import io.swagger.v3.oas.annotations.media.Content;
8+
import io.swagger.v3.oas.annotations.media.Schema;
9+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
10+
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
11+
import io.swagger.v3.oas.annotations.tags.Tag;
12+
import org.springframework.http.HttpStatus;
13+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
14+
import org.springframework.web.bind.annotation.*;
15+
16+
@Tag(name = "Form - Club", description = "Form API")
17+
@RequestMapping("/server/central")
18+
public interface CentralFormApplicationApi {
19+
@Operation(summary = "지원자 전체 조회 API")
20+
@Parameter(name = "size", description = "한 페이지당 조회할 지원자 수 (기본값: 15)")
21+
@Parameter(name = "currentCursorId", description = "현재 커서 위치 (첫 페이지: -1)")
22+
@ApiResponse(responseCode = "200", description = "지원자 전체 조회 성공",
23+
content = @Content(schema = @Schema(implementation = MyFormApplicationPageResponse.class)))
24+
@ResponseStatus(HttpStatus.OK)
25+
@SecurityRequirement(name = "AccessToken")
26+
@GetMapping("/my/forms/{formId}/applications")
27+
MyFormApplicationPageResponse getMyFormApplicationPage(
28+
@PathVariable("formId") Long formId,
29+
@RequestParam(value = "size", defaultValue = "15") int size,
30+
@RequestParam(value = "currentCursorId", defaultValue = "-1") Long currentCursorId,
31+
@AuthenticationPrincipal PrincipalDetails principalDetails
32+
);
33+
34+
}

src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/api/UserFormApi.java renamed to src/main/java/ddingdong/ddingdongBE/domain/formapplication/api/UserFormApplicationApi.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package ddingdong.ddingdongBE.domain.formapplicaion.api;
1+
package ddingdong.ddingdongBE.domain.formapplication.api;
22

3-
import ddingdong.ddingdongBE.domain.formapplicaion.controller.dto.request.CreateFormApplicationRequest;
3+
import ddingdong.ddingdongBE.domain.formapplication.controller.dto.request.CreateFormApplicationRequest;
44
import io.swagger.v3.oas.annotations.Operation;
55
import io.swagger.v3.oas.annotations.responses.ApiResponse;
66
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -10,7 +10,7 @@
1010

1111
@Tag(name = "Form - User", description = "User Form API")
1212
@RequestMapping("/server")
13-
public interface UserFormApi {
13+
public interface UserFormApplicationApi {
1414

1515
@Operation(summary = "지원하기 API")
1616
@ApiResponse(responseCode = "201", description = "지원하기 성공")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package ddingdong.ddingdongBE.domain.formapplication.controller;
2+
3+
import ddingdong.ddingdongBE.auth.PrincipalDetails;
4+
import ddingdong.ddingdongBE.domain.formapplication.service.FacadeCentralFormApplicationService;
5+
import ddingdong.ddingdongBE.domain.formapplication.api.CentralFormApplicationApi;
6+
import ddingdong.ddingdongBE.domain.formapplication.controller.dto.response.MyFormApplicationPageResponse;
7+
import ddingdong.ddingdongBE.domain.formapplication.service.dto.query.MyFormApplicationPageQuery;
8+
import ddingdong.ddingdongBE.domain.user.entity.User;
9+
import lombok.RequiredArgsConstructor;
10+
import org.springframework.web.bind.annotation.RestController;
11+
12+
@RestController
13+
@RequiredArgsConstructor
14+
public class CentralFormApplicationController implements CentralFormApplicationApi {
15+
16+
private final FacadeCentralFormApplicationService facadeCentralFormService;
17+
18+
@Override
19+
public MyFormApplicationPageResponse getMyFormApplicationPage(Long formId, int size, Long currentCursorId, PrincipalDetails principalDetails) {
20+
User user = principalDetails.getUser();
21+
MyFormApplicationPageQuery query = facadeCentralFormService.getMyFormApplicationPage(formId, user, size, currentCursorId);
22+
return MyFormApplicationPageResponse.from(query);
23+
}
24+
}

src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/controller/UserFormController.java renamed to src/main/java/ddingdong/ddingdongBE/domain/formapplication/controller/UserFormApplicationController.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
package ddingdong.ddingdongBE.domain.formapplicaion.controller;
1+
package ddingdong.ddingdongBE.domain.formapplication.controller;
22

3-
import ddingdong.ddingdongBE.domain.formapplicaion.api.UserFormApi;
4-
import ddingdong.ddingdongBE.domain.formapplicaion.controller.dto.request.CreateFormApplicationRequest;
5-
import ddingdong.ddingdongBE.domain.formapplicaion.service.FacadeUserFormService;
3+
import ddingdong.ddingdongBE.domain.formapplication.api.UserFormApplicationApi;
4+
import ddingdong.ddingdongBE.domain.formapplication.controller.dto.request.CreateFormApplicationRequest;
5+
import ddingdong.ddingdongBE.domain.formapplication.service.FacadeUserFormService;
66
import lombok.RequiredArgsConstructor;
77
import org.springframework.web.bind.annotation.RestController;
88

99
@RestController
1010
@RequiredArgsConstructor
11-
public class UserFormController implements UserFormApi {
11+
public class UserFormApplicationController implements UserFormApplicationApi {
1212

1313
private final FacadeUserFormService facadeUserFormService;
1414

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
package ddingdong.ddingdongBE.domain.formapplicaion.controller.dto.request;
1+
package ddingdong.ddingdongBE.domain.formapplication.controller.dto.request;
22

3-
import ddingdong.ddingdongBE.domain.formapplicaion.entity.FormApplicationStatus;
4-
import ddingdong.ddingdongBE.domain.formapplicaion.service.dto.CreateFormApplicationCommand;
5-
import ddingdong.ddingdongBE.domain.formapplicaion.service.dto.CreateFormApplicationCommand.CreateFormAnswerCommand;
3+
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplicationStatus;
4+
import ddingdong.ddingdongBE.domain.formapplication.service.dto.command.CreateFormApplicationCommand;
5+
import ddingdong.ddingdongBE.domain.formapplication.service.dto.command.CreateFormApplicationCommand.CreateFormAnswerCommand;
66
import io.swagger.v3.oas.annotations.media.ArraySchema;
77
import io.swagger.v3.oas.annotations.media.Schema;
88
import jakarta.validation.constraints.NotNull;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package ddingdong.ddingdongBE.domain.formapplication.controller.dto.response;
2+
3+
import ddingdong.ddingdongBE.domain.formapplication.service.dto.query.MyFormApplicationPageQuery;
4+
import ddingdong.ddingdongBE.domain.formapplication.service.dto.query.MyFormApplicationPageQuery.FormApplicationListQuery;
5+
import io.swagger.v3.oas.annotations.media.ArraySchema;
6+
import io.swagger.v3.oas.annotations.media.Schema;
7+
import lombok.Builder;
8+
9+
import java.time.LocalDateTime;
10+
import java.util.List;
11+
12+
public record MyFormApplicationPageResponse (
13+
@ArraySchema(schema = @Schema(name = "지원자 전체 조회 페이지", implementation = MyFormApplicationPageResponse.MyFormApplicationListResponse.class))
14+
List<MyFormApplicationListResponse> formApplications,
15+
@Schema(name = "지원자 전체 조회 페이지 정보", implementation = PagingResponse.class)
16+
PagingResponse pagingInfo
17+
) {
18+
public static MyFormApplicationPageResponse from(MyFormApplicationPageQuery myFormApplicationPageQuery) {
19+
List<MyFormApplicationListResponse> formApplications = myFormApplicationPageQuery.formApplicationListQueries().stream()
20+
.map(MyFormApplicationListResponse::from)
21+
.toList();
22+
return new MyFormApplicationPageResponse(formApplications, PagingResponse.from(myFormApplicationPageQuery.pagingQuery()));
23+
}
24+
25+
@Builder
26+
record MyFormApplicationListResponse(
27+
@Schema(description = "지원자 id", example = "1")
28+
Long id,
29+
30+
@Schema(description = "폼 id", example = "1")
31+
Long formId,
32+
33+
@Schema(description = "지원 시각", example = "2025-01-01T00:00")
34+
LocalDateTime submittedAt,
35+
36+
@Schema(description = "지원자 이름", example = "김띵동")
37+
String name,
38+
39+
@Schema(description = "지원자 학번", example = "60200000")
40+
String studentNumber,
41+
42+
@Schema(description = "지원자 상태", example = "SUBMITTED")
43+
String status
44+
) {
45+
46+
public static MyFormApplicationListResponse from(FormApplicationListQuery formApplicationListQuery) {
47+
return MyFormApplicationListResponse.builder()
48+
.id(formApplicationListQuery.id())
49+
.formId(formApplicationListQuery.formId())
50+
.submittedAt(formApplicationListQuery.submittedAt())
51+
.name(formApplicationListQuery.name())
52+
.studentNumber(formApplicationListQuery.studentNumber())
53+
.status(formApplicationListQuery.status())
54+
.build();
55+
}
56+
}
57+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package ddingdong.ddingdongBE.domain.formapplication.controller.dto.response;
2+
3+
import ddingdong.ddingdongBE.domain.formapplication.service.dto.query.PagingQuery;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
6+
public record PagingResponse(
7+
@Schema(name = "현재 커서 id", description = "9")
8+
Long currentCursorId,
9+
@Schema(name = "다음 커서 id", description = "10")
10+
Long nextCursorId,
11+
@Schema(name = "다음 커서 존재 여부", description = "true")
12+
boolean hasNext
13+
) {
14+
15+
public static PagingResponse from(PagingQuery pagingQuery) {
16+
return new PagingResponse(pagingQuery.currentCursorId(), pagingQuery.nextCursorId(), pagingQuery.hasNext());
17+
}
18+
19+
}

src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/entity/FormAnswer.java renamed to src/main/java/ddingdong/ddingdongBE/domain/formapplication/entity/FormAnswer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ddingdong.ddingdongBE.domain.formapplicaion.entity;
1+
package ddingdong.ddingdongBE.domain.formapplication.entity;
22

33
import ddingdong.ddingdongBE.common.BaseEntity;
44
import ddingdong.ddingdongBE.common.converter.StringListConverter;

src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/entity/FormApplication.java renamed to src/main/java/ddingdong/ddingdongBE/domain/formapplication/entity/FormApplication.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ddingdong.ddingdongBE.domain.formapplicaion.entity;
1+
package ddingdong.ddingdongBE.domain.formapplication.entity;
22

33
import ddingdong.ddingdongBE.common.BaseEntity;
44
import ddingdong.ddingdongBE.domain.form.entity.Form;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package ddingdong.ddingdongBE.domain.formapplication.entity;
2+
3+
public enum FormApplicationStatus {
4+
SUBMITTED,
5+
FIRST_PASS,
6+
FINAL_PASS,
7+
FIRST_FAIL,
8+
FINAL_FAIL
9+
}

src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/repository/FormAnswerRepository.java renamed to src/main/java/ddingdong/ddingdongBE/domain/formapplication/repository/FormAnswerRepository.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package ddingdong.ddingdongBE.domain.formapplicaion.repository;
1+
package ddingdong.ddingdongBE.domain.formapplication.repository;
22

3-
import ddingdong.ddingdongBE.domain.formapplicaion.entity.FormAnswer;
3+
import ddingdong.ddingdongBE.domain.formapplication.entity.FormAnswer;
44
import org.springframework.data.jpa.repository.JpaRepository;
55

66
public interface FormAnswerRepository extends JpaRepository<FormAnswer, Long> {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package ddingdong.ddingdongBE.domain.formapplication.repository;
2+
3+
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplication;
4+
import org.springframework.data.domain.Slice;
5+
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.springframework.data.jpa.repository.Query;
7+
import org.springframework.data.repository.query.Param;
8+
9+
public interface FormApplicationRepository extends JpaRepository<FormApplication, Long> {
10+
@Query(value = """
11+
select *
12+
from form_application f
13+
where (:currentCursorId = -1 or id < :currentCursorId)
14+
and f.form_id = :formId
15+
order by f.id DESC
16+
limit :size
17+
""", nativeQuery = true)
18+
Slice<FormApplication> findPageByFormIdOrderById(
19+
@Param("formId") Long formId,
20+
@Param("size") int size,
21+
@Param("currentCursorId") Long currentCursorId
22+
);
23+
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package ddingdong.ddingdongBE.domain.formapplication.service;
2+
3+
import ddingdong.ddingdongBE.domain.formapplication.service.dto.query.MyFormApplicationPageQuery;
4+
import ddingdong.ddingdongBE.domain.user.entity.User;
5+
6+
public interface FacadeCentralFormApplicationService {
7+
8+
MyFormApplicationPageQuery getMyFormApplicationPage(Long formId, User user, int size, Long currentCursorId);
9+
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package ddingdong.ddingdongBE.domain.formapplication.service;
2+
3+
import ddingdong.ddingdongBE.domain.club.entity.Club;
4+
import ddingdong.ddingdongBE.domain.club.service.ClubService;
5+
import ddingdong.ddingdongBE.domain.formapplication.service.dto.query.PagingQuery;
6+
import ddingdong.ddingdongBE.domain.form.entity.Form;
7+
import ddingdong.ddingdongBE.domain.form.service.FormService;
8+
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplication;
9+
import ddingdong.ddingdongBE.domain.formapplication.service.dto.query.MyFormApplicationPageQuery;
10+
import ddingdong.ddingdongBE.domain.formapplication.service.dto.query.MyFormApplicationPageQuery.FormApplicationListQuery;
11+
import ddingdong.ddingdongBE.domain.user.entity.User;
12+
import lombok.RequiredArgsConstructor;
13+
import org.springframework.data.domain.Slice;
14+
import org.springframework.security.access.AccessDeniedException;
15+
import org.springframework.stereotype.Service;
16+
import org.springframework.transaction.annotation.Transactional;
17+
18+
import java.util.List;
19+
20+
@Service
21+
@RequiredArgsConstructor
22+
@Transactional(readOnly = true)
23+
public class FacadeCentralFormApplicationServiceImpl implements FacadeCentralFormApplicationService {
24+
25+
private final ClubService clubService;
26+
private final FormService formService;
27+
private final FormApplicationService formApplicationService;
28+
29+
@Override
30+
public MyFormApplicationPageQuery getMyFormApplicationPage(Long formId, User user, int size, Long currentCursorId) {
31+
Club club = clubService.getByUserId(user.getId());
32+
Form form = formService.getById(formId);
33+
if (!form.getClub().equals(club)) {
34+
throw new AccessDeniedException("권한이 없습니다.");
35+
}
36+
Slice<FormApplication> formApplicationPage = formApplicationService.getFormApplicationPageByFormId(formId, size, currentCursorId);
37+
if (formApplicationPage == null) {
38+
return MyFormApplicationPageQuery.createEmpty();
39+
}
40+
List<FormApplication> completeFormApplications = formApplicationPage.getContent();
41+
List<FormApplicationListQuery> formApplicationListQueries = completeFormApplications.stream()
42+
.map(FormApplicationListQuery::of)
43+
.toList();
44+
PagingQuery pagingQuery = PagingQuery.of(currentCursorId, completeFormApplications, formApplicationPage.hasNext());
45+
46+
return MyFormApplicationPageQuery.of(formApplicationListQueries, pagingQuery);
47+
48+
}
49+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package ddingdong.ddingdongBE.domain.formapplication.service;
2+
3+
import ddingdong.ddingdongBE.domain.formapplication.service.dto.command.CreateFormApplicationCommand;
4+
5+
public interface FacadeUserFormService {
6+
7+
void createFormApplication(CreateFormApplicationCommand createFormApplicationCommand);
8+
9+
}

0 commit comments

Comments
 (0)