diff --git a/src/main/java/ddingdong/ddingdongBE/domain/form/entity/Form.java b/src/main/java/ddingdong/ddingdongBE/domain/form/entity/Form.java index 96b0257a..f4941b9e 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/form/entity/Form.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/form/entity/Form.java @@ -123,4 +123,8 @@ public void updateFormFields(List updatedFormFields) { public void updateEndDate(LocalDate endDate) { this.endDate = endDate; } + + public boolean isLargerSectionThan(int sectionSize) { + return this.sections.size() > sectionSize; + } } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/form/entity/FormField.java b/src/main/java/ddingdong/ddingdongBE/domain/form/entity/FormField.java index b3c93065..8a5be689 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/form/entity/FormField.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/form/entity/FormField.java @@ -13,6 +13,7 @@ import jakarta.persistence.Id; import jakarta.persistence.ManyToOne; import java.util.List; +import java.util.stream.Stream; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -22,6 +23,8 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter public class FormField extends BaseEntity { + private static final String COMMON_SECTION = "공통"; + private static final int SINGLE_SECTION_SIZE = 1; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -95,4 +98,32 @@ public void update(FormField updatedField) { this.section = updatedField.getSection(); this.options = updatedField.getOptions(); } + + public Stream generateFormFieldsBySection(Form form) { + if (form.isLargerSectionThan(SINGLE_SECTION_SIZE)) { + return expandCommonSectionFormField(form); + } + return Stream.of(this); + } + + private Stream expandCommonSectionFormField(Form form) { + if (this.section.equals(COMMON_SECTION)) { + return form.getSections().stream() + .filter(section -> !section.equals(COMMON_SECTION)) + .map(this::copyWithSection); + } + return Stream.of(this); + } + + private FormField copyWithSection(String newSection) { + return FormField.builder() + .question(this.question) + .fieldType(this.fieldType) + .required(this.required) + .fieldOrder(this.fieldOrder) + .section(newSection) + .options(this.options) + .form(this.form) + .build(); + } } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/form/service/FacadeCentralFormServiceImpl.java b/src/main/java/ddingdong/ddingdongBE/domain/form/service/FacadeCentralFormServiceImpl.java index 91dc6f37..c07e3ebe 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/form/service/FacadeCentralFormServiceImpl.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/form/service/FacadeCentralFormServiceImpl.java @@ -67,7 +67,6 @@ public void createForm(CreateFormCommand createFormCommand) { Form form = createFormCommand.toEntity(club); Form savedForm = formService.create(form); - List formFields = toCreateFormFields(savedForm, createFormCommand.formFieldCommands()); formFieldService.createAll(formFields); @@ -249,12 +248,15 @@ private void validateEndDate(LocalDate startDate, LocalDate endDate) { private List toUpdateFormFields(Form originform, List updateFormFieldCommands) { return updateFormFieldCommands.stream() - .map(formFieldCommand -> formFieldCommand.toEntity(originform)).toList(); + .map(formFieldCommand -> formFieldCommand.toEntity(originform)) + .toList(); } private List toCreateFormFields(Form savedForm, List createFormFieldCommands) { return createFormFieldCommands.stream() - .map(formFieldCommand -> formFieldCommand.toEntity(savedForm)).toList(); + .map(formFieldCommand -> formFieldCommand.toEntity(savedForm)) + .flatMap(formField -> formField.generateFormFieldsBySection(savedForm)) + .toList(); } } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/form/service/dto/command/CreateFormCommand.java b/src/main/java/ddingdong/ddingdongBE/domain/form/service/dto/command/CreateFormCommand.java index de927563..662590c2 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/form/service/dto/command/CreateFormCommand.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/form/service/dto/command/CreateFormCommand.java @@ -42,6 +42,19 @@ public FormField toEntity(Form savedForm) { .form(savedForm) .build(); } + + public FormField toEntityWithSection(Form savedForm, String section) { + return FormField.builder() + .question(question) + .fieldType(type) + .options(options) + .required(required) + .fieldOrder(order) + .section(section) + .form(savedForm) + .build(); + } + } public Form toEntity(Club club) {