diff --git a/src/main/java/ddingdong/ddingdongBE/common/config/SecurityConfig.java b/src/main/java/ddingdong/ddingdongBE/common/config/SecurityConfig.java index d606b656..e7c358e0 100644 --- a/src/main/java/ddingdong/ddingdongBE/common/config/SecurityConfig.java +++ b/src/main/java/ddingdong/ddingdongBE/common/config/SecurityConfig.java @@ -1,6 +1,7 @@ package ddingdong.ddingdongBE.common.config; import static org.springframework.http.HttpMethod.GET; +import static org.springframework.http.HttpMethod.POST; import ddingdong.ddingdongBE.auth.service.JwtAuthService; import ddingdong.ddingdongBE.common.filter.JwtAuthenticationFilter; @@ -46,7 +47,13 @@ public SecurityFilterChain filterChain(HttpSecurity http, JwtAuthService authSer API_PREFIX + "/banners/**", API_PREFIX + "/documents/**", API_PREFIX + "/questions/**", - API_PREFIX + "/feeds/**") + API_PREFIX + "/feeds/**", + API_PREFIX + "/forms/**" + ) + .permitAll() + .requestMatchers(POST, + API_PREFIX + "/forms/{formId}/applications" + ) .permitAll() .requestMatchers(API_PREFIX + "/internal/**") .permitAll() diff --git a/src/main/java/ddingdong/ddingdongBE/domain/form/service/FormFieldService.java b/src/main/java/ddingdong/ddingdongBE/domain/form/service/FormFieldService.java index d173c0db..9fa1e86f 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/form/service/FormFieldService.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/form/service/FormFieldService.java @@ -3,11 +3,14 @@ import ddingdong.ddingdongBE.domain.form.entity.Form; import ddingdong.ddingdongBE.domain.form.entity.FormField; import java.util.List; +import java.util.Optional; public interface FormFieldService { void createAll(List formFields); + FormField getById(Long id); + List findAllByForm(Form form); void deleteAll(List originFormFields); diff --git a/src/main/java/ddingdong/ddingdongBE/domain/form/service/GeneralFormFieldService.java b/src/main/java/ddingdong/ddingdongBE/domain/form/service/GeneralFormFieldService.java index 20696576..f13d1f46 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/form/service/GeneralFormFieldService.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/form/service/GeneralFormFieldService.java @@ -4,6 +4,8 @@ import ddingdong.ddingdongBE.domain.form.entity.FormField; import ddingdong.ddingdongBE.domain.form.repository.FormFieldRepository; import java.util.List; +import java.util.Optional; + import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -21,6 +23,12 @@ public void createAll(List formFields) { formFieldRepository.saveAll(formFields); } + + @Override + public FormField getById(Long id) { + return formFieldRepository.findById(id) + .orElseThrow(() -> new IllegalArgumentException("해당 field를 id로 찾을 수 없습니다: " + id)); + @Override public List findAllByForm(Form form) { return formFieldRepository.findAllByForm(form); diff --git a/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/api/UserFormApi.java b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/api/UserFormApi.java new file mode 100644 index 00000000..cb72bbfd --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/api/UserFormApi.java @@ -0,0 +1,24 @@ +package ddingdong.ddingdongBE.domain.formapplicaion.api; + +import ddingdong.ddingdongBE.domain.formapplicaion.controller.dto.request.CreateFormApplicationRequest; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +@Tag(name = "Form - User", description = "User Form API") +@RequestMapping("/server") +public interface UserFormApi { + + @Operation(summary = "지원하기 API") + @ApiResponse(responseCode = "201", description = "지원하기 성공") + @ResponseStatus(HttpStatus.CREATED) + @PostMapping("/forms/{formId}/applications") + void createFormResponse( + @PathVariable Long formId, + @Valid @RequestBody CreateFormApplicationRequest request + ); + +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/controller/UserFormController.java b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/controller/UserFormController.java new file mode 100644 index 00000000..d022247b --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/controller/UserFormController.java @@ -0,0 +1,19 @@ +package ddingdong.ddingdongBE.domain.formapplicaion.controller; + +import ddingdong.ddingdongBE.domain.formapplicaion.api.UserFormApi; +import ddingdong.ddingdongBE.domain.formapplicaion.controller.dto.request.CreateFormApplicationRequest; +import ddingdong.ddingdongBE.domain.formapplicaion.service.FacadeUserFormService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class UserFormController implements UserFormApi { + + private final FacadeUserFormService facadeUserFormService; + + @Override + public void createFormResponse(Long formId, CreateFormApplicationRequest createFormApplicationRequest) { + facadeUserFormService.createFormApplication(formId, createFormApplicationRequest.toCommand()); + } +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/controller/dto/request/CreateFormApplicationRequest.java b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/controller/dto/request/CreateFormApplicationRequest.java new file mode 100644 index 00000000..9e9577ad --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/controller/dto/request/CreateFormApplicationRequest.java @@ -0,0 +1,60 @@ +package ddingdong.ddingdongBE.domain.formapplicaion.controller.dto.request; + +import ddingdong.ddingdongBE.domain.formapplicaion.entity.FormApplicationStatus; +import ddingdong.ddingdongBE.domain.formapplicaion.service.dto.CreateFormApplicationCommand; +import ddingdong.ddingdongBE.domain.formapplicaion.service.dto.CreateFormApplicationCommand.CreateFormAnswerCommand; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.util.List; + +public record CreateFormApplicationRequest( + + @NotNull(message = "지원자 이름은 필수 입력 사항입니다.") + @Schema(description = "지원자 이름", example = "김띵동") + String name, + + @NotNull(message = "지원자 학번은 필수 입력 사항입니다.") + @Schema(description = "학번", example = "60200000") + String studentNumber, + + @NotNull(message = "지원자 학과는 필수 입력 사항입니다.") + @Schema(description = "학과", example = "융합소프트웨어학부 응용소프트웨어전공") + String department, + + @ArraySchema(schema = @Schema(implementation = CreateFormAnswerRequest.class)) + List formAnswers +) { + record CreateFormAnswerRequest( + @NotNull(message = "질문 id는 null이 될 수 없습니다.") + @Schema(description = "질문 id", example = "1") + Long fieldId, + + @Schema(description = "답변 값") + List value + ) { + public CreateFormAnswerCommand toCommand() { + return CreateFormAnswerCommand.builder() + .fieldId(fieldId) + .value(value) + .build(); + } + } + + public CreateFormApplicationCommand toCommand() { + List createFormAnswerCommands = formAnswers.stream() + .map(CreateFormAnswerRequest::toCommand) + .toList(); + return CreateFormApplicationCommand.builder() + .name(name) + .studentNumber(studentNumber) + .department(department) + .status(FormApplicationStatus.SUBMITTED) + .formAnswerCommands(createFormAnswerCommands) + .build(); + } + +} + + diff --git a/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/entity/FormAnswer.java b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/entity/FormAnswer.java new file mode 100644 index 00000000..1bc15417 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/entity/FormAnswer.java @@ -0,0 +1,40 @@ +package ddingdong.ddingdongBE.domain.formapplicaion.entity; + +import ddingdong.ddingdongBE.common.BaseEntity; +import ddingdong.ddingdongBE.common.converter.StringListConverter; +import ddingdong.ddingdongBE.domain.form.entity.FieldType; +import ddingdong.ddingdongBE.domain.form.entity.FormField; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import java.util.List; + +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +public class FormAnswer extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + @Convert(converter = StringListConverter.class) + private List value; + + @ManyToOne(fetch = FetchType.LAZY) + private FormApplication formApplication; + + @ManyToOne(fetch = FetchType.LAZY) + private FormField formField; + + @Builder + private FormAnswer(List value, FormApplication formApplication, FormField formField) { + this.value = value; + this.formApplication = formApplication; + this.formField = formField; + } + +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/entity/FormApplication.java b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/entity/FormApplication.java new file mode 100644 index 00000000..5f471268 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/entity/FormApplication.java @@ -0,0 +1,44 @@ +package ddingdong.ddingdongBE.domain.formapplicaion.entity; + +import ddingdong.ddingdongBE.common.BaseEntity; +import ddingdong.ddingdongBE.domain.form.entity.Form; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +public class FormApplication extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String name; + + @Column(nullable = false) + private String studentNumber; + + @Column(nullable = false) + private String department; + + @Enumerated(EnumType.STRING) + @Column(nullable = false, name = "status") + private FormApplicationStatus status; + + @ManyToOne(fetch = FetchType.LAZY) + private Form form; + + @Builder + private FormApplication(String name, String studentNumber, String department, FormApplicationStatus status, Form form) { + this.name = name; + this.studentNumber = studentNumber; + this.department = department; + this.status = status; + this.form = form; + } +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/entity/FormApplicationStatus.java b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/entity/FormApplicationStatus.java new file mode 100644 index 00000000..5421e661 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/entity/FormApplicationStatus.java @@ -0,0 +1,8 @@ +package ddingdong.ddingdongBE.domain.formapplicaion.entity; + +public enum FormApplicationStatus { + SUBMITTED, + FIRST_PASS, + FINAL_PASS, + FAILURE +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/repository/FormAnswerRepository.java b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/repository/FormAnswerRepository.java new file mode 100644 index 00000000..f4fb5865 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/repository/FormAnswerRepository.java @@ -0,0 +1,7 @@ +package ddingdong.ddingdongBE.domain.formapplicaion.repository; + +import ddingdong.ddingdongBE.domain.formapplicaion.entity.FormAnswer; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface FormAnswerRepository extends JpaRepository { +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/repository/FormApplicationRepository.java b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/repository/FormApplicationRepository.java new file mode 100644 index 00000000..d37b9a83 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/repository/FormApplicationRepository.java @@ -0,0 +1,7 @@ +package ddingdong.ddingdongBE.domain.formapplicaion.repository; + +import ddingdong.ddingdongBE.domain.formapplicaion.entity.FormApplication; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface FormApplicationRepository extends JpaRepository { +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/FacadeUserFormService.java b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/FacadeUserFormService.java new file mode 100644 index 00000000..7b3cc98b --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/FacadeUserFormService.java @@ -0,0 +1,9 @@ +package ddingdong.ddingdongBE.domain.formapplicaion.service; + +import ddingdong.ddingdongBE.domain.formapplicaion.service.dto.CreateFormApplicationCommand; + +public interface FacadeUserFormService { + + void createFormApplication(Long formId, CreateFormApplicationCommand createFormApplicationCommand); + +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/FacadeUserFormServiceImpl.java b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/FacadeUserFormServiceImpl.java new file mode 100644 index 00000000..c5b75a55 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/FacadeUserFormServiceImpl.java @@ -0,0 +1,46 @@ +package ddingdong.ddingdongBE.domain.formapplicaion.service; + +import ddingdong.ddingdongBE.domain.form.entity.Form; +import ddingdong.ddingdongBE.domain.formapplicaion.entity.FormAnswer; +import ddingdong.ddingdongBE.domain.form.entity.FormField; +import ddingdong.ddingdongBE.domain.formapplicaion.entity.FormApplication; +import ddingdong.ddingdongBE.domain.form.service.FormFieldService; +import ddingdong.ddingdongBE.domain.form.service.FormService; +import ddingdong.ddingdongBE.domain.formapplicaion.service.dto.CreateFormApplicationCommand; +import ddingdong.ddingdongBE.domain.formapplicaion.service.dto.CreateFormApplicationCommand.CreateFormAnswerCommand; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class FacadeUserFormServiceImpl implements FacadeUserFormService { + + private final FormApplicationService formApplicationService; + private final FormAnswerService formAnswerService; + private final FormService formService; + private final FormFieldService formFieldService; + + @Transactional + @Override + public void createFormApplication(Long formId, CreateFormApplicationCommand createFormApplicationCommand) { + Form form = formService.getById(formId); + FormApplication formApplication = createFormApplicationCommand.toEntity(form); + FormApplication savedFormApplication = formApplicationService.create(formApplication); + + List formAnswers = toFormAnswers(savedFormApplication, createFormApplicationCommand.formAnswerCommands()); + formAnswerService.createAll(formAnswers); + } + + private List toFormAnswers(FormApplication savedFormApplication, List createFormAnswerCommands) { + return createFormAnswerCommands.stream() + .map(formAnswerCommand -> { + FormField formField = formFieldService.getById(formAnswerCommand.fieldId()); + return formAnswerCommand.toEntity(savedFormApplication, formField); + }) + .toList(); + } +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/FormAnswerService.java b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/FormAnswerService.java new file mode 100644 index 00000000..49c608e7 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/FormAnswerService.java @@ -0,0 +1,10 @@ +package ddingdong.ddingdongBE.domain.formapplicaion.service; + +import ddingdong.ddingdongBE.domain.formapplicaion.entity.FormAnswer; +import java.util.List; + +public interface FormAnswerService { + + void createAll(List formAnswers); + +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/FormApplicationService.java b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/FormApplicationService.java new file mode 100644 index 00000000..0de7d8a1 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/FormApplicationService.java @@ -0,0 +1,9 @@ +package ddingdong.ddingdongBE.domain.formapplicaion.service; + +import ddingdong.ddingdongBE.domain.formapplicaion.entity.FormApplication; + +public interface FormApplicationService { + + FormApplication create(FormApplication formApplication); + +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/GeneralFormAnswerService.java b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/GeneralFormAnswerService.java new file mode 100644 index 00000000..08c5b310 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/GeneralFormAnswerService.java @@ -0,0 +1,24 @@ +package ddingdong.ddingdongBE.domain.formapplicaion.service; + +import ddingdong.ddingdongBE.domain.formapplicaion.entity.FormAnswer; +import ddingdong.ddingdongBE.domain.formapplicaion.repository.FormAnswerRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class GeneralFormAnswerService implements FormAnswerService { + + private final FormAnswerRepository formAnswerRepository; + + @Transactional + @Override + public void createAll(List formAnswers) { + formAnswerRepository.saveAll(formAnswers); + } + +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/GeneralFormApplicationService.java b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/GeneralFormApplicationService.java new file mode 100644 index 00000000..928b3999 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/GeneralFormApplicationService.java @@ -0,0 +1,22 @@ +package ddingdong.ddingdongBE.domain.formapplicaion.service; + +import ddingdong.ddingdongBE.domain.formapplicaion.entity.FormApplication; +import ddingdong.ddingdongBE.domain.formapplicaion.repository.FormApplicationRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class GeneralFormApplicationService implements FormApplicationService { + + private final FormApplicationRepository formApplicationRepository; + + @Transactional + @Override + public FormApplication create(FormApplication formApplication) { + return formApplicationRepository.save(formApplication); + } + +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/dto/CreateFormApplicationCommand.java b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/dto/CreateFormApplicationCommand.java new file mode 100644 index 00000000..a1f8cb1f --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/service/dto/CreateFormApplicationCommand.java @@ -0,0 +1,47 @@ +package ddingdong.ddingdongBE.domain.formapplicaion.service.dto; + +import ddingdong.ddingdongBE.domain.form.entity.FieldType; +import ddingdong.ddingdongBE.domain.form.entity.Form; +import ddingdong.ddingdongBE.domain.formapplicaion.entity.FormAnswer; +import ddingdong.ddingdongBE.domain.form.entity.FormField; +import ddingdong.ddingdongBE.domain.formapplicaion.entity.FormApplication; +import ddingdong.ddingdongBE.domain.formapplicaion.entity.FormApplicationStatus; +import lombok.Builder; + +import java.util.List; + +@Builder +public record CreateFormApplicationCommand( + Form form, + String name, + String studentNumber, + String department, + FormApplicationStatus status, + List formAnswerCommands +) { + @Builder + public record CreateFormAnswerCommand( + Long fieldId, + List value, + FieldType valueType + ) { + public FormAnswer toEntity(FormApplication formApplication, FormField formField) { + return FormAnswer.builder() + .value(value) + .formField(formField) + .formApplication(formApplication) + .build(); + } + } + + public FormApplication toEntity(Form form) { + return FormApplication.builder() + .name(name) + .studentNumber(studentNumber) + .department(department) + .status(status) + .form(form) + .build(); + } + +} diff --git a/src/main/resources/db/migration/V35_create_form_response_and_answer_table.sql b/src/main/resources/db/migration/V35_create_form_response_and_answer_table.sql new file mode 100644 index 00000000..2f061fc1 --- /dev/null +++ b/src/main/resources/db/migration/V35_create_form_response_and_answer_table.sql @@ -0,0 +1,25 @@ +CREATE TABLE form_response +( + id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, + submitted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + name VARCHAR(50) NOT NULL, + student_number VARCHAR(50) NOT NULL, + status VARCHAR(50) NOT NULL, + form_id BIGINT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NULL, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NULL, + CONSTRAINT fk_response_form FOREIGN KEY (form_id) REFERENCES form (id) ON DELETE CASCADE +); + +CREATE TABLE form_answer +( + id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, + value VARCHAR(1500) NULL, + value_type VARCHAR(50) NOT NULL, + response_id BIGINT, + field_id BIGINT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NULL, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NULL, + CONSTRAINT fk_answer_response FOREIGN KEY (response_id) REFERENCES form_response (id) ON DELETE CASCADE, + CONSTRAINT fk_answer_field FOREIGN KEY (field_id) REFERENCES form_field (id) ON DELETE CASCADE +); diff --git a/src/test/java/ddingdong/ddingdongBE/domain/form/service/FacadeUserFormServiceImplTest.java b/src/test/java/ddingdong/ddingdongBE/domain/form/service/FacadeUserFormServiceImplTest.java new file mode 100644 index 00000000..d216782c --- /dev/null +++ b/src/test/java/ddingdong/ddingdongBE/domain/form/service/FacadeUserFormServiceImplTest.java @@ -0,0 +1,92 @@ +package ddingdong.ddingdongBE.domain.form.service; + +import com.navercorp.fixturemonkey.FixtureMonkey; +import ddingdong.ddingdongBE.common.support.FixtureMonkeyFactory; +import ddingdong.ddingdongBE.common.support.TestContainerSupport; +import ddingdong.ddingdongBE.domain.club.entity.Club; +import ddingdong.ddingdongBE.domain.club.repository.ClubRepository; +import ddingdong.ddingdongBE.domain.form.entity.Form; +import ddingdong.ddingdongBE.domain.form.repository.FormRepository; +import ddingdong.ddingdongBE.domain.formapplicaion.entity.FormAnswer; +import ddingdong.ddingdongBE.domain.formapplicaion.entity.FormApplication; +import ddingdong.ddingdongBE.domain.formapplicaion.repository.FormAnswerRepository; +import ddingdong.ddingdongBE.domain.formapplicaion.repository.FormApplicationRepository; +import ddingdong.ddingdongBE.domain.formapplicaion.service.FacadeUserFormService; +import ddingdong.ddingdongBE.domain.formapplicaion.service.dto.CreateFormApplicationCommand; +import ddingdong.ddingdongBE.domain.user.entity.Role; +import ddingdong.ddingdongBE.domain.user.entity.User; +import ddingdong.ddingdongBE.domain.user.repository.UserRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +@SpringBootTest +class FacadeUserFormServiceImplTest extends TestContainerSupport { + + @Autowired + private FacadeUserFormService facadeUserFormService; + + @Autowired + private FormApplicationRepository formApplicationRepository; + + @Autowired + private FormAnswerRepository formAnswerRepository; + + @Autowired + private FormRepository formRepository; + + @Autowired + private ClubRepository clubRepository; + + @Autowired + private UserRepository userRepository; + + private static final FixtureMonkey fixtureMonkey = FixtureMonkeyFactory.getNotNullBuilderIntrospectorMonkey(); + + @DisplayName("유저: 지원하기") + @Test + void createFormApplication() { + // given + User user = fixtureMonkey.giveMeBuilder(User.class) + .set("id", 1L) + .set("Role", Role.CLUB) + .set("deletedAt", null) + .sample(); + User savedUser = userRepository.save(user); + Club club = fixtureMonkey.giveMeBuilder(Club.class) + .set("id", 1L) + .set("user", savedUser) + .set("score", null) + .set("clubMembers", null) + .set("deletedAt", null) + .sample(); + clubRepository.save(club); + Club savedClub = clubRepository.save(club); + Form form = fixtureMonkey.giveMeBuilder(Form.class) + .set("id", 1L) + .set("title", "띵동 폼") + .set("description", "저희 동아리는 띵동입니다.") + .set("hasInterview", false) + .set("club", savedClub) + .sample(); + Form savedForm = formRepository.save(form); + CreateFormApplicationCommand createFormApplicationCommand = fixtureMonkey.giveMeBuilder(CreateFormApplicationCommand.class) + .set("form", savedForm) + .sample(); + // when + facadeUserFormService.createFormApplication(savedForm.getId(), createFormApplicationCommand); + // then + List formApplications = formApplicationRepository.findAll(); + List formAnswers = formAnswerRepository.findAll(); + + assertThat(formApplications).isNotEmpty(); + assertThat(formAnswers).isNotEmpty(); + } + + +} \ No newline at end of file