Skip to content

Commit 2355591

Browse files
authored
[DDING-000] Form 제거시 Form과 연관된 FileMetaData 삭제로직 구현 (#299)
1 parent 8cedf45 commit 2355591

File tree

9 files changed

+150
-3
lines changed

9 files changed

+150
-3
lines changed

src/main/java/ddingdong/ddingdongBE/domain/filemetadata/service/FileMetaDataService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ List<FileMetaData> getCoupledAllByDomainTypeAndEntityIdOrderedAsc(DomainType dom
3131

3232
void updateStatusToDelete(DomainType domainType, Long entityId);
3333

34+
void updateStatusToDelete(List<FileMetaData> fileMetaDatas);
35+
3436
void update(String id, DomainType domainType, Long entityId);
3537

3638
void update(List<String> ids, DomainType domainType, Long entityId);

src/main/java/ddingdong/ddingdongBE/domain/filemetadata/service/FileMetaDataServiceImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,11 @@ public void updateStatusToDelete(DomainType domainType, Long entityId) {
174174
fileMetaDatas.forEach(fileMetaData -> fileMetaData.updateStatus(DELETED));
175175
}
176176

177+
@Override
178+
public void updateStatusToDelete(List<FileMetaData> fileMetaDatas) {
179+
fileMetaDatas.forEach(fileMetaData -> fileMetaData.updateStatus(DELETED));
180+
}
181+
177182
private List<String> getNewIds(List<String> ids) {
178183
List<FileMetaData> fileMetaDatas = fileMetaDataRepository.findByIdIn(toUUIDs(ids));
179184
return fileMetaDatas.stream()

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import ddingdong.ddingdongBE.domain.club.entity.Club;
1010
import ddingdong.ddingdongBE.domain.club.service.ClubService;
1111
import ddingdong.ddingdongBE.domain.clubmember.entity.ClubMember;
12+
import ddingdong.ddingdongBE.domain.filemetadata.entity.FileMetaData;
13+
import ddingdong.ddingdongBE.domain.filemetadata.service.FileMetaDataService;
1214
import ddingdong.ddingdongBE.domain.form.entity.Form;
1315
import ddingdong.ddingdongBE.domain.form.entity.FormField;
1416
import ddingdong.ddingdongBE.domain.form.entity.FormStatus;
@@ -30,6 +32,7 @@
3032
import ddingdong.ddingdongBE.domain.form.service.dto.query.SingleFieldStatisticsQuery.SingleStatisticsQuery;
3133
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplication;
3234
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplicationStatus;
35+
import ddingdong.ddingdongBE.domain.formapplication.service.FormAnswerService;
3336
import ddingdong.ddingdongBE.domain.formapplication.service.FormApplicationService;
3437
import ddingdong.ddingdongBE.domain.user.entity.User;
3538
import ddingdong.ddingdongBE.email.SesEmailService;
@@ -58,6 +61,8 @@ public class FacadeCentralFormServiceImpl implements FacadeCentralFormService {
5861
private final FormStatisticService formStatisticService;
5962
private final FormApplicationService formApplicationService;
6063
private final SesEmailService sesEmailService;
64+
private final FormAnswerService formAnswerService;
65+
private final FileMetaDataService fileMetaDataService;
6166

6267
@Transactional
6368
@Override
@@ -97,7 +102,8 @@ public void deleteForm(Long formId, User user) {
97102
Club club = clubService.getByUserId(user.getId());
98103
Form form = formService.getById(formId);
99104
validateEqualsClub(club, form);
100-
// TODO : fileMetaData의 formFile formAnswer 지우기
105+
List<FileMetaData> fileMetaDatas = formAnswerService.getAllFileByForm(form);
106+
fileMetaDataService.updateStatusToDelete(fileMetaDatas);
101107
formService.delete(form); //테이블 생성 시 외래 키에 cascade 설정하여 formField 삭제도 자동으로 됨.
102108
}
103109

src/main/java/ddingdong/ddingdongBE/domain/formapplication/repository/FormAnswerRepository.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ddingdong.ddingdongBE.domain.formapplication.repository;
22

3+
import ddingdong.ddingdongBE.domain.filemetadata.entity.FileMetaData;
34
import ddingdong.ddingdongBE.domain.form.entity.FormField;
45
import ddingdong.ddingdongBE.domain.formapplication.entity.FormAnswer;
56
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplication;
@@ -58,5 +59,15 @@ AND fmd.entity_id IN (:answerIds)
5859
List<FileAnswerInfo> findAllFileAnswerInfo(
5960
@Param("domainType") String domainType,
6061
@Param("answerIds") List<Long> answerIds,
61-
@Param("fileStatus") String fileStatus );
62+
@Param("fileStatus") String fileStatus);
63+
64+
65+
@Query("""
66+
SELECT fmd
67+
FROM FileMetaData fmd
68+
JOIN FormAnswer fa ON fmd.entityId = fa.id
69+
JOIN FormField ffd ON fa.formField.id = ffd.id
70+
WHERE fmd.domainType = 'FORM_FILE' AND ffd.form.id = :formId
71+
""")
72+
List<FileMetaData> getAllFileByForm(@Param("formId") Long formId);
6273
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package ddingdong.ddingdongBE.domain.formapplication.service;
22

3+
import ddingdong.ddingdongBE.domain.filemetadata.entity.FileMetaData;
4+
import ddingdong.ddingdongBE.domain.form.entity.Form;
35
import ddingdong.ddingdongBE.domain.formapplication.entity.FormAnswer;
46
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplication;
5-
67
import java.util.List;
78

89
public interface FormAnswerService {
@@ -11,4 +12,5 @@ public interface FormAnswerService {
1112

1213
List<FormAnswer> getAllByApplication(FormApplication formApplication);
1314

15+
List<FileMetaData> getAllFileByForm(Form form);
1416
}

src/main/java/ddingdong/ddingdongBE/domain/formapplication/service/GeneralFormAnswerService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package ddingdong.ddingdongBE.domain.formapplication.service;
22

3+
import ddingdong.ddingdongBE.domain.filemetadata.entity.FileMetaData;
4+
import ddingdong.ddingdongBE.domain.form.entity.Form;
35
import ddingdong.ddingdongBE.domain.formapplication.entity.FormAnswer;
46
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplication;
57
import ddingdong.ddingdongBE.domain.formapplication.repository.FormAnswerRepository;
@@ -26,4 +28,9 @@ public void createAll(List<FormAnswer> formAnswers) {
2628
public List<FormAnswer> getAllByApplication(FormApplication formApplication) {
2729
return formAnswerRepository.findAllByFormApplication(formApplication);
2830
}
31+
32+
@Override
33+
public List<FileMetaData> getAllFileByForm(Form form) {
34+
return formAnswerRepository.getAllFileByForm(form.getId());
35+
}
2936
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package ddingdong.ddingdongBE.common.fixture;
2+
3+
import ddingdong.ddingdongBE.domain.filemetadata.entity.DomainType;
4+
import ddingdong.ddingdongBE.domain.filemetadata.entity.FileMetaData;
5+
import ddingdong.ddingdongBE.domain.filemetadata.entity.FileStatus;
6+
import java.util.UUID;
7+
8+
public class FileMetaDataFixture {
9+
10+
public static FileMetaData formFileMetaData(UUID id, Long entityId) {
11+
return FileMetaData.builder()
12+
.id(id)
13+
.fileKey("1")
14+
.fileStatus(FileStatus.COUPLED)
15+
.fileName("파일")
16+
.domainType(DomainType.FORM_FILE)
17+
.entityId(entityId)
18+
.build();
19+
}
20+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package ddingdong.ddingdongBE.common.fixture;
2+
3+
import ddingdong.ddingdongBE.domain.form.entity.FieldType;
4+
import ddingdong.ddingdongBE.domain.form.entity.Form;
5+
import ddingdong.ddingdongBE.domain.form.entity.FormField;
6+
import ddingdong.ddingdongBE.domain.formapplication.entity.FormAnswer;
7+
import java.time.LocalDate;
8+
import java.util.List;
9+
10+
public class FormFixture {
11+
12+
public static Form formWithClubNull() {
13+
return Form.builder()
14+
.title("모집 지원서")
15+
.description("동아리 모집을 위한 지원서입니다.")
16+
.startDate(LocalDate.of(2025, 4, 1))
17+
.endDate(LocalDate.of(2025, 4, 15))
18+
.hasInterview(true)
19+
.sections(List.of("자기소개", "지원 동기", "경력 및 경험"))
20+
.build();
21+
}
22+
23+
public static FormField formFieldWithFormNull() {
24+
return FormField.builder()
25+
.question("자기소개를 해주세요.")
26+
.required(true)
27+
.fieldOrder(1)
28+
.section("기본 정보")
29+
.options(List.of("없음"))
30+
.fieldType(FieldType.TEXT)
31+
.form(null)
32+
.build();
33+
}
34+
35+
public static FormAnswer formAnswerByFormField(FormField savedFormField) {
36+
return FormAnswer.builder()
37+
.value(List.of("답변"))
38+
.formField(savedFormField)
39+
.build();
40+
}
41+
}

src/test/java/ddingdong/ddingdongBE/domain/formapplication/repository/FormAnswerRepositoryTest.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
package ddingdong.ddingdongBE.domain.formapplication.repository;
22

3+
import static org.assertj.core.api.SoftAssertions.assertSoftly;
4+
5+
import ddingdong.ddingdongBE.common.fixture.FileMetaDataFixture;
6+
import ddingdong.ddingdongBE.common.fixture.FormFixture;
37
import ddingdong.ddingdongBE.common.support.DataJpaTestSupport;
8+
import ddingdong.ddingdongBE.domain.filemetadata.entity.FileMetaData;
9+
import ddingdong.ddingdongBE.domain.filemetadata.repository.FileMetaDataRepository;
410
import ddingdong.ddingdongBE.domain.form.entity.FieldType;
11+
import ddingdong.ddingdongBE.domain.form.entity.Form;
512
import ddingdong.ddingdongBE.domain.form.entity.FormField;
613
import ddingdong.ddingdongBE.domain.form.repository.FormFieldRepository;
14+
import ddingdong.ddingdongBE.domain.form.repository.FormRepository;
715
import ddingdong.ddingdongBE.domain.formapplication.entity.FormAnswer;
816
import java.util.List;
17+
import java.util.UUID;
918
import org.assertj.core.api.Assertions;
1019
import org.junit.jupiter.api.DisplayName;
1120
import org.junit.jupiter.api.Test;
@@ -17,6 +26,10 @@ class FormAnswerRepositoryTest extends DataJpaTestSupport {
1726
FormAnswerRepository formAnswerRepository;
1827
@Autowired
1928
FormFieldRepository formFieldRepository;
29+
@Autowired
30+
FormRepository formRepository;
31+
@Autowired
32+
FileMetaDataRepository fileMetaDataRepository;
2033

2134
@DisplayName("주어진 FormField와 연관된 FormAnswer의 value를 모두 반환한다.")
2235
@Test
@@ -47,4 +60,44 @@ void findAllValueByFormFieldId() {
4760
Assertions.assertThat(allValueByFormField).hasSize(2);
4861
Assertions.assertThat(allValueByFormField.get(0)).isEqualTo("[\"서버\",\"\"]");
4962
}
63+
64+
@DisplayName("FormID에 해당하는 모든 FormAnswer ID를 EntityId로 보유한 FileMetaData를 모두 조회한다")
65+
@Test
66+
void getAllFileByForm() {
67+
// given
68+
Form form = FormFixture.formWithClubNull();
69+
Form savedForm = formRepository.save(form);
70+
FormField formField = FormFixture.formFieldWithFormNull();
71+
72+
formField.setFormForConvenience(savedForm);
73+
FormField savedField = formFieldRepository.save(formField);
74+
75+
FormAnswer formAnswer1 = FormFixture.formAnswerByFormField(savedField);
76+
FormAnswer savedFormAnswer1 = formAnswerRepository.save(formAnswer1);
77+
78+
FormAnswer formAnswer2 = FormFixture.formAnswerByFormField(savedField);
79+
FormAnswer savedFormAnswer2 = formAnswerRepository.save(formAnswer2);
80+
81+
FormAnswer formAnswer3 = FormFixture.formAnswerByFormField(savedField);
82+
FormAnswer savedFormAnswer3 = formAnswerRepository.save(formAnswer3);
83+
84+
UUID fileId1 = UUID.randomUUID();
85+
UUID fileId2 = UUID.randomUUID();
86+
UUID fileId3 = UUID.randomUUID();
87+
88+
FileMetaData fileMetaData1 = FileMetaDataFixture.formFileMetaData(fileId1, savedFormAnswer1.getId());
89+
FileMetaData fileMetaData2 = FileMetaDataFixture.formFileMetaData(fileId2, savedFormAnswer2.getId());
90+
FileMetaData fileMetaData3 = FileMetaDataFixture.formFileMetaData(fileId3, savedFormAnswer3.getId());
91+
fileMetaDataRepository.saveAll(List.of(fileMetaData1, fileMetaData2, fileMetaData3));
92+
93+
// when
94+
List<FileMetaData> allFileByForm = formAnswerRepository.getAllFileByForm(savedForm.getId());
95+
96+
// then
97+
assertSoftly(softly -> {
98+
softly.assertThat(allFileByForm.get(0).getEntityId()).isEqualTo(savedFormAnswer1.getId());
99+
softly.assertThat(allFileByForm.get(1).getEntityId()).isEqualTo(savedFormAnswer2.getId());
100+
softly.assertThat(allFileByForm.get(2).getEntityId()).isEqualTo(savedFormAnswer3.getId());
101+
});
102+
}
50103
}

0 commit comments

Comments
 (0)