Skip to content

Commit 5084cc4

Browse files
authored
[DDING-102] 폼지 섹션 조회 API 구현 (#245)
1 parent d3565af commit 5084cc4

File tree

11 files changed

+285
-84
lines changed

11 files changed

+285
-84
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package ddingdong.ddingdongBE.domain.form.api;
2+
3+
import ddingdong.ddingdongBE.domain.form.controller.dto.response.FormSectionResponse;
4+
import io.swagger.v3.oas.annotations.Operation;
5+
import io.swagger.v3.oas.annotations.media.Content;
6+
import io.swagger.v3.oas.annotations.media.Schema;
7+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
8+
import io.swagger.v3.oas.annotations.tags.Tag;
9+
import org.springframework.http.HttpStatus;
10+
import org.springframework.web.bind.annotation.GetMapping;
11+
import org.springframework.web.bind.annotation.PathVariable;
12+
import org.springframework.web.bind.annotation.RequestMapping;
13+
import org.springframework.web.bind.annotation.ResponseStatus;
14+
15+
@Tag(name = "Form - User", description = "User Form API")
16+
@RequestMapping("/server")
17+
public interface UserFormApi {
18+
19+
@Operation(summary = "폼지 섹션 조회 API")
20+
@ApiResponse(responseCode = "200", description = "폼지 섹션 조회 성공",
21+
content = @Content(schema = @Schema(implementation = FormSectionResponse.class)))
22+
@ResponseStatus(HttpStatus.OK)
23+
@GetMapping("/forms/{formId}/sections")
24+
FormSectionResponse getFormSections(
25+
@PathVariable("formId") Long formId
26+
);
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package ddingdong.ddingdongBE.domain.form.controller;
2+
3+
import ddingdong.ddingdongBE.domain.form.api.UserFormApi;
4+
import ddingdong.ddingdongBE.domain.form.controller.dto.response.FormSectionResponse;
5+
import ddingdong.ddingdongBE.domain.form.service.FacadeUserFormService;
6+
import ddingdong.ddingdongBE.domain.form.service.dto.query.FormSectionQuery;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.web.bind.annotation.RestController;
9+
10+
@RestController
11+
@RequiredArgsConstructor
12+
public class UserFormController implements UserFormApi {
13+
14+
private final FacadeUserFormService facadeUserFormService;
15+
16+
@Override
17+
public FormSectionResponse getFormSections(Long formId) {
18+
FormSectionQuery query = facadeUserFormService.getFormSection(formId);
19+
return FormSectionResponse.from(query);
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package ddingdong.ddingdongBE.domain.form.controller.dto.response;
2+
3+
import ddingdong.ddingdongBE.domain.form.service.dto.query.FormSectionQuery;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
import java.util.List;
6+
import lombok.Builder;
7+
8+
@Builder
9+
public record FormSectionResponse (
10+
@Schema(description = "폼지 제목", example = "카우 1기 폼지")
11+
String title,
12+
@Schema(description = "폼지 설명", example = "폼지 설명입니다")
13+
String description,
14+
@Schema(description = "섹션 리스트", example = "[서버, 웹]")
15+
List<String> sections
16+
) {
17+
public static FormSectionResponse from(FormSectionQuery formSectionQuery) {
18+
return FormSectionResponse.builder()
19+
.title(formSectionQuery.title())
20+
.description(formSectionQuery.description())
21+
.sections(formSectionQuery.sections())
22+
.build();
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package ddingdong.ddingdongBE.domain.form.service;
2+
3+
import ddingdong.ddingdongBE.domain.form.service.dto.query.FormSectionQuery;
4+
5+
public interface FacadeUserFormService {
6+
7+
FormSectionQuery getFormSection(Long formId);
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package ddingdong.ddingdongBE.domain.form.service;
2+
3+
import ddingdong.ddingdongBE.domain.form.entity.Form;
4+
import ddingdong.ddingdongBE.domain.form.service.dto.query.FormSectionQuery;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.stereotype.Service;
7+
import org.springframework.transaction.annotation.Transactional;
8+
9+
@Service
10+
@RequiredArgsConstructor
11+
@Transactional(readOnly = true)
12+
public class FacadeUserFormServiceImpl implements FacadeUserFormService {
13+
14+
private final FormService formService;
15+
16+
@Override
17+
public FormSectionQuery getFormSection(Long formId) {
18+
Form form = formService.getById(formId);
19+
return FormSectionQuery.from(form);
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package ddingdong.ddingdongBE.domain.form.service.dto.query;
2+
3+
import ddingdong.ddingdongBE.domain.form.entity.Form;
4+
import java.util.List;
5+
import lombok.Builder;
6+
7+
@Builder
8+
public record FormSectionQuery(
9+
String title,
10+
String description,
11+
List<String> sections
12+
) {
13+
14+
public static FormSectionQuery from(Form form) {
15+
return FormSectionQuery.builder()
16+
.title(form.getTitle())
17+
.description(form.getDescription())
18+
.sections(form.getSections())
19+
.build();
20+
}
21+
}

src/main/java/ddingdong/ddingdongBE/domain/formapplication/controller/UserFormApplicationController.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,20 @@
22

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

99
@RestController
1010
@RequiredArgsConstructor
1111
public class UserFormApplicationController implements UserFormApplicationApi {
1212

13-
private final FacadeUserFormService facadeUserFormService;
13+
private final FacadeUserFormApplicationService facadeUserFormApplicationService;
1414

1515
@Override
1616
public void createFormApplication(Long formId,
1717
CreateFormApplicationRequest createFormApplicationRequest) {
18-
facadeUserFormService.createFormApplication(createFormApplicationRequest.toCommand(formId));
18+
facadeUserFormApplicationService.createFormApplication(
19+
createFormApplicationRequest.toCommand(formId));
1920
}
2021
}

src/main/java/ddingdong/ddingdongBE/domain/formapplication/service/FacadeUserFormService.java renamed to src/main/java/ddingdong/ddingdongBE/domain/formapplication/service/FacadeUserFormApplicationService.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import ddingdong.ddingdongBE.domain.formapplication.service.dto.command.CreateFormApplicationCommand;
44

5-
public interface FacadeUserFormService {
5+
public interface FacadeUserFormApplicationService {
66

77
void createFormApplication(CreateFormApplicationCommand createFormApplicationCommand);
88

src/main/java/ddingdong/ddingdongBE/domain/formapplication/service/FacadeUserFormServiceImpl.java renamed to src/main/java/ddingdong/ddingdongBE/domain/formapplication/service/FacadeUserFormApplicationServiceImpl.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
@Service
1616
@RequiredArgsConstructor
1717
@Transactional(readOnly = true)
18-
public class FacadeUserFormServiceImpl implements FacadeUserFormService {
18+
public class FacadeUserFormApplicationServiceImpl implements FacadeUserFormApplicationService {
1919

2020
private final FormApplicationService formApplicationService;
2121
private final FormAnswerService formAnswerService;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package ddingdong.ddingdongBE.domain.form.service;
2+
3+
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
4+
5+
import com.navercorp.fixturemonkey.FixtureMonkey;
6+
import ddingdong.ddingdongBE.common.support.FixtureMonkeyFactory;
7+
import ddingdong.ddingdongBE.common.support.TestContainerSupport;
8+
import ddingdong.ddingdongBE.domain.club.entity.Club;
9+
import ddingdong.ddingdongBE.domain.club.repository.ClubRepository;
10+
import ddingdong.ddingdongBE.domain.form.entity.FieldType;
11+
import ddingdong.ddingdongBE.domain.form.entity.Form;
12+
import ddingdong.ddingdongBE.domain.form.entity.FormField;
13+
import ddingdong.ddingdongBE.domain.form.repository.FormFieldRepository;
14+
import ddingdong.ddingdongBE.domain.form.repository.FormRepository;
15+
import ddingdong.ddingdongBE.domain.formapplication.entity.FormAnswer;
16+
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplication;
17+
import ddingdong.ddingdongBE.domain.formapplication.repository.FormAnswerRepository;
18+
import ddingdong.ddingdongBE.domain.formapplication.repository.FormApplicationRepository;
19+
import ddingdong.ddingdongBE.domain.formapplication.service.FacadeUserFormApplicationService;
20+
import ddingdong.ddingdongBE.domain.formapplication.service.dto.command.CreateFormApplicationCommand;
21+
import ddingdong.ddingdongBE.domain.formapplication.service.dto.command.CreateFormApplicationCommand.CreateFormAnswerCommand;
22+
import ddingdong.ddingdongBE.domain.user.entity.Role;
23+
import ddingdong.ddingdongBE.domain.user.entity.User;
24+
import ddingdong.ddingdongBE.domain.user.repository.UserRepository;
25+
import jakarta.persistence.EntityManager;
26+
import java.util.List;
27+
import org.junit.jupiter.api.DisplayName;
28+
import org.junit.jupiter.api.Test;
29+
import org.springframework.beans.factory.annotation.Autowired;
30+
import org.springframework.boot.test.context.SpringBootTest;
31+
32+
@SpringBootTest
33+
class FacadeUserFormApplicationServiceImplTest extends TestContainerSupport {
34+
35+
@Autowired
36+
private FacadeUserFormApplicationService facadeUserFormApplicationService;
37+
38+
@Autowired
39+
private FormApplicationRepository formApplicationRepository;
40+
41+
@Autowired
42+
private FormAnswerRepository formAnswerRepository;
43+
44+
@Autowired
45+
private FormRepository formRepository;
46+
47+
@Autowired
48+
private ClubRepository clubRepository;
49+
50+
@Autowired
51+
private UserRepository userRepository;
52+
53+
@Autowired
54+
private FormFieldRepository formFieldRepository;
55+
56+
@Autowired
57+
private EntityManager entityManager;
58+
59+
private static final FixtureMonkey fixtureMonkey = FixtureMonkeyFactory.getNotNullBuilderIntrospectorMonkey();
60+
61+
@DisplayName("사용자는 동아리에 지원할 수 있다.")
62+
@Test
63+
void createFormApplication() {
64+
// given
65+
User user = fixtureMonkey.giveMeBuilder(User.class)
66+
.set("id", 1L)
67+
.set("Role", Role.CLUB)
68+
.set("deletedAt", null)
69+
.sample();
70+
User savedUser = userRepository.save(user);
71+
Club club = fixtureMonkey.giveMeBuilder(Club.class)
72+
.set("id", 1L)
73+
.set("user", savedUser)
74+
.set("score", null)
75+
.set("clubMembers", null)
76+
.set("deletedAt", null)
77+
.sample();
78+
clubRepository.save(club);
79+
Club savedClub = clubRepository.save(club);
80+
Form form = fixtureMonkey.giveMeBuilder(Form.class)
81+
.set("id", 1L)
82+
.set("title", "띵동 폼")
83+
.set("description", "저희 동아리는 띵동입니다.")
84+
.set("hasInterview", false)
85+
.set("club", savedClub)
86+
.sample();
87+
Form savedForm = formRepository.save(form);
88+
FormField formField = FormField.builder()
89+
.form(savedForm)
90+
.fieldType(FieldType.CHECK_BOX)
91+
.fieldOrder(1)
92+
.section("서버")
93+
.required(true)
94+
.question("질문")
95+
.build();
96+
FormField savedFormField = formFieldRepository.save(formField);
97+
CreateFormApplicationCommand createFormApplicationCommand = fixtureMonkey.giveMeBuilder(CreateFormApplicationCommand.class)
98+
.set("formId", savedForm.getId())
99+
.set("formAnswerCommands", List.of(new CreateFormAnswerCommand(savedFormField.getId(), List.of("답변"))))
100+
.sample();
101+
// when
102+
facadeUserFormApplicationService.createFormApplication(createFormApplicationCommand);
103+
// then
104+
List<FormApplication> formApplications = formApplicationRepository.findAll();
105+
List<FormAnswer> formAnswers = formAnswerRepository.findAll();
106+
107+
assertThat(formApplications).isNotEmpty();
108+
assertThat(formApplications.get(0).getForm().getId()).isEqualTo(savedForm.getId());
109+
assertThat(formAnswers).isNotEmpty();
110+
assertThat(formAnswers.get(0).getValue()).isEqualTo(List.of("답변"));
111+
}
112+
}

0 commit comments

Comments
 (0)