Skip to content

Commit 481451e

Browse files
authored
[DDING-001] 폼지 수정 로직 개선 (#294)
1 parent 572bd86 commit 481451e

File tree

12 files changed

+316
-74
lines changed

12 files changed

+316
-74
lines changed

src/main/java/ddingdong/ddingdongBE/domain/club/entity/Club.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public BigDecimal editScore(Score score) {
117117

118118
public void addClubMember(ClubMember clubMember) {
119119
this.clubMembers.add(clubMember);
120-
clubMember.setClubFormConvenience(this);
120+
clubMember.setClubForConvenience(this);
121121
}
122122

123123
public String getClubUrl() {

src/main/java/ddingdong/ddingdongBE/domain/clubmember/entity/ClubMember.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public void updateInformation(ClubMember updateClubMember) {
7070
this.department = updateClubMember.getDepartment();
7171
}
7272

73-
public void setClubFormConvenience(Club club) {
73+
public void setClubForConvenience(Club club) {
7474
this.club = club;
7575
}
7676
}

src/main/java/ddingdong/ddingdongBE/domain/form/controller/dto/request/UpdateFormRequest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ public record UpdateFormRequest(
3939
) {
4040

4141
record UpdateFormFieldRequest(
42+
@Schema(description = "폼지 질문 식별자", example = "1")
43+
Long id,
44+
4245
@Schema(description = "폼지 질문", example = "우리 동아리 들어올겁니까?")
4346
@NotNull(message = "질문는 null이 될 수 없습니다.")
4447
String question,
@@ -65,6 +68,7 @@ record UpdateFormFieldRequest(
6568

6669
public UpdateFormFieldCommand toCommand() {
6770
return UpdateFormFieldCommand.builder()
71+
.id(id)
6872
.question(question)
6973
.type(FieldType.findType(type))
7074
.options(options)

src/main/java/ddingdong/ddingdongBE/domain/form/controller/dto/response/FormResponse.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ public record FormResponse(
2929

3030
@Builder
3131
record FormFieldListResponse(
32+
@Schema(description = "폼지 질문 식별자", example = "1")
33+
Long id,
3234
@Schema(description = "폼지 질문", example = "당신의 이름은?")
3335
String question,
3436
@Schema(description = "폼지 질문 유형", example = "CHECK_BOX")
@@ -45,6 +47,7 @@ record FormFieldListResponse(
4547

4648
public static FormFieldListResponse from(FormFieldListQuery formFieldListQuery) {
4749
return FormFieldListResponse.builder()
50+
.id(formFieldListQuery.id())
4851
.question(formFieldListQuery.question())
4952
.type(formFieldListQuery.type())
5053
.options(formFieldListQuery.options())

src/main/java/ddingdong/ddingdongBE/domain/form/entity/Form.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import ddingdong.ddingdongBE.common.BaseEntity;
44
import ddingdong.ddingdongBE.common.converter.StringListConverter;
55
import ddingdong.ddingdongBE.domain.club.entity.Club;
6+
import jakarta.persistence.CascadeType;
67
import jakarta.persistence.Column;
78
import jakarta.persistence.Convert;
89
import jakarta.persistence.Entity;
@@ -11,8 +12,12 @@
1112
import jakarta.persistence.GenerationType;
1213
import jakarta.persistence.Id;
1314
import jakarta.persistence.ManyToOne;
15+
import jakarta.persistence.OneToMany;
1416
import java.time.LocalDate;
17+
import java.util.ArrayList;
1518
import java.util.List;
19+
import java.util.Map;
20+
import java.util.stream.Collectors;
1621
import lombok.AccessLevel;
1722
import lombok.Builder;
1823
import lombok.Getter;
@@ -48,6 +53,9 @@ public class Form extends BaseEntity {
4853
@ManyToOne(fetch = FetchType.LAZY)
4954
private Club club;
5055

56+
@OneToMany(mappedBy = "form", cascade = CascadeType.ALL, orphanRemoval = true)
57+
private List<FormField> formFields = new ArrayList<>();
58+
5159
@Builder
5260
private Form(
5361
String title,
@@ -56,7 +64,8 @@ private Form(
5664
LocalDate endDate,
5765
boolean hasInterview,
5866
List<String> sections,
59-
Club club
67+
Club club,
68+
List<FormField> formFields
6069
) {
6170
this.title = title;
6271
this.description = description;
@@ -65,6 +74,12 @@ private Form(
6574
this.hasInterview = hasInterview;
6675
this.sections = sections;
6776
this.club = club;
77+
this.formFields = formFields;
78+
}
79+
80+
public void addFormFields(FormField formField) {
81+
this.formFields.add(formField);
82+
formField.setFormForConvenience(this);
6883
}
6984

7085
public void update(Form updateForm) {
@@ -80,6 +95,31 @@ public boolean isEqualsById(Long formId) {
8095
return this.id.equals(formId);
8196
}
8297

98+
public void updateFormFields(List<FormField> updatedFormFields) {
99+
// 삭제될 폼 필드
100+
List<FormField> deletedFormFields = this.formFields.stream()
101+
.filter(formField -> updatedFormFields.stream()
102+
.filter(updatedFormField -> updatedFormField.getId() != null)
103+
.noneMatch(updatedField -> updatedField.getId().equals(formField.getId())))
104+
.toList();
105+
this.formFields.removeAll(deletedFormFields);
106+
107+
Map<Long, FormField> existingFieldMap = this.formFields.stream()
108+
.collect(Collectors.toMap(FormField::getId, field -> field));
109+
110+
// 추가 및 업데이트
111+
for (FormField updatedField : updatedFormFields) {
112+
if (updatedField.getId() == null || !existingFieldMap.containsKey(updatedField.getId())) {
113+
// 추가
114+
addFormFields(updatedField);
115+
} else {
116+
// 업데이트
117+
FormField existingField = existingFieldMap.get(updatedField.getId());
118+
existingField.update(updatedField);
119+
}
120+
}
121+
}
122+
83123
public void updateEndDate(LocalDate endDate) {
84124
this.endDate = endDate;
85125
}

src/main/java/ddingdong/ddingdongBE/domain/form/entity/FormField.java

Lines changed: 72 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -23,61 +23,76 @@
2323
@Getter
2424
public class FormField extends BaseEntity {
2525

26-
@Id
27-
@GeneratedValue(strategy = GenerationType.IDENTITY)
28-
private Long id;
29-
30-
@Column(nullable = false)
31-
private String question;
32-
33-
@Column(nullable = false)
34-
private boolean required;
35-
36-
@Column(nullable = false)
37-
private int fieldOrder;
38-
39-
@Column(nullable = false)
40-
private String section;
41-
42-
@Convert(converter = StringListConverter.class)
43-
private List<String> options;
44-
45-
@Enumerated(EnumType.STRING)
46-
@Column(nullable = false)
47-
private FieldType fieldType;
48-
49-
@ManyToOne(fetch = FetchType.LAZY)
50-
private Form form;
51-
52-
@Builder
53-
private FormField(
54-
String question,
55-
FieldType fieldType,
56-
boolean required,
57-
int fieldOrder,
58-
String section,
59-
List<String> options,
60-
Form form
61-
) {
62-
this.question = question;
63-
this.fieldType = fieldType;
64-
this.required = required;
65-
this.fieldOrder = fieldOrder;
66-
this.section = section;
67-
this.options = options;
68-
this.form = form;
69-
}
70-
71-
public boolean isMultipleChoice() {
72-
return this.fieldType == FieldType.CHECK_BOX || this.fieldType == FieldType.RADIO;
73-
}
74-
75-
public boolean isTextType() {
76-
return this.fieldType == FieldType.TEXT || this.fieldType == FieldType.LONG_TEXT
77-
|| this.fieldType == FieldType.FILE;
78-
}
79-
80-
public boolean isFile() {
81-
return this.fieldType == FieldType.FILE;
82-
}
26+
@Id
27+
@GeneratedValue(strategy = GenerationType.IDENTITY)
28+
private Long id;
29+
30+
@Column(nullable = false)
31+
private String question;
32+
33+
@Column(nullable = false)
34+
private boolean required;
35+
36+
@Column(nullable = false)
37+
private int fieldOrder;
38+
39+
@Column(nullable = false)
40+
private String section;
41+
42+
@Convert(converter = StringListConverter.class)
43+
private List<String> options;
44+
45+
@Enumerated(EnumType.STRING)
46+
@Column(nullable = false)
47+
private FieldType fieldType;
48+
49+
@ManyToOne(fetch = FetchType.LAZY)
50+
private Form form;
51+
52+
@Builder
53+
private FormField(
54+
Long id,
55+
String question,
56+
FieldType fieldType,
57+
boolean required,
58+
int fieldOrder,
59+
String section,
60+
List<String> options,
61+
Form form
62+
) {
63+
this.id = id;
64+
this.question = question;
65+
this.fieldType = fieldType;
66+
this.required = required;
67+
this.fieldOrder = fieldOrder;
68+
this.section = section;
69+
this.options = options;
70+
this.form = form;
71+
}
72+
73+
public boolean isMultipleChoice() {
74+
return this.fieldType == FieldType.CHECK_BOX || this.fieldType == FieldType.RADIO;
75+
}
76+
77+
public boolean isTextType() {
78+
return this.fieldType == FieldType.TEXT || this.fieldType == FieldType.LONG_TEXT
79+
|| this.fieldType == FieldType.FILE;
80+
}
81+
82+
public boolean isFile() {
83+
return this.fieldType == FieldType.FILE;
84+
}
85+
86+
public void setFormForConvenience(Form form) {
87+
this.form = form;
88+
}
89+
90+
public void update(FormField updatedField) {
91+
this.question = updatedField.getQuestion();
92+
this.fieldType = updatedField.getFieldType();
93+
this.required = updatedField.isRequired();
94+
this.fieldOrder = updatedField.getFieldOrder();
95+
this.section = updatedField.getSection();
96+
this.options = updatedField.getOptions();
97+
}
8398
}

src/main/java/ddingdong/ddingdongBE/domain/form/service/FacadeCentralFormServiceImpl.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,8 @@ public void updateForm(UpdateFormCommand command) {
8383
Form updateForm = command.toEntity();
8484
originform.update(updateForm);
8585

86-
List<FormField> originFormFields = formFieldService.findAllByForm(originform);
87-
formFieldService.deleteAll(originFormFields);
88-
89-
List<FormField> updateFormFields = toUpdateFormFields(originform,
90-
command.formFieldCommands());
91-
formFieldService.createAll(updateFormFields);
86+
List<FormField> updatedFormFields = toUpdateFormFields(originform, command.formFieldCommands());
87+
originform.updateFormFields(updatedFormFields);
9288
}
9389

9490
@Transactional

src/main/java/ddingdong/ddingdongBE/domain/form/service/dto/command/UpdateFormCommand.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public record UpdateFormCommand(
2323

2424
@Builder
2525
public record UpdateFormFieldCommand(
26+
Long id,
2627
String question,
2728
FieldType type,
2829
List<String> options,
@@ -33,6 +34,7 @@ public record UpdateFormFieldCommand(
3334

3435
public FormField toEntity(Form form) {
3536
return FormField.builder()
37+
.id(id)
3638
.form(form)
3739
.question(question)
3840
.fieldType(type)

src/main/java/ddingdong/ddingdongBE/domain/formapplication/entity/FormAnswer.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import ddingdong.ddingdongBE.common.converter.StringListConverter;
55
import ddingdong.ddingdongBE.domain.form.entity.FieldType;
66
import ddingdong.ddingdongBE.domain.form.entity.FormField;
7+
import jakarta.persistence.Column;
78
import jakarta.persistence.Convert;
89
import jakarta.persistence.Entity;
910
import jakarta.persistence.FetchType;
@@ -12,22 +13,28 @@
1213
import jakarta.persistence.Id;
1314
import jakarta.persistence.JoinColumn;
1415
import jakarta.persistence.ManyToOne;
16+
import java.time.LocalDateTime;
1517
import java.util.List;
1618
import lombok.AccessLevel;
1719
import lombok.Builder;
1820
import lombok.Getter;
1921
import lombok.NoArgsConstructor;
22+
import org.hibernate.annotations.SQLDelete;
23+
import org.hibernate.annotations.SQLRestriction;
2024

2125
@Entity
2226
@NoArgsConstructor(access = AccessLevel.PROTECTED)
2327
@Getter
28+
@SQLDelete(sql = "update form_answer set deleted_at = CURRENT_TIMESTAMP where id=?")
29+
@SQLRestriction("deleted_at IS NULL")
2430
public class FormAnswer extends BaseEntity {
2531

2632
@Id
2733
@GeneratedValue(strategy = GenerationType.IDENTITY)
2834
private Long id;
2935

3036
@Convert(converter = StringListConverter.class)
37+
@Column(columnDefinition = "TEXT")
3138
private List<String> value;
3239

3340
@JoinColumn(name = "application_id")
@@ -38,11 +45,20 @@ public class FormAnswer extends BaseEntity {
3845
@ManyToOne(fetch = FetchType.LAZY)
3946
private FormField formField;
4047

48+
@Column(columnDefinition = "TIMESTAMP")
49+
private LocalDateTime deletedAt;
50+
4151
@Builder
42-
private FormAnswer(List<String> value, FormApplication formApplication, FormField formField) {
52+
private FormAnswer(
53+
List<String> value,
54+
FormApplication formApplication,
55+
FormField formField,
56+
LocalDateTime deletedAt
57+
) {
4358
this.value = value;
4459
this.formApplication = formApplication;
4560
this.formField = formField;
61+
this.deletedAt = deletedAt;
4662
}
4763

4864
public boolean isFile() {

0 commit comments

Comments
 (0)