Skip to content

Commit e073509

Browse files
authored
[DDING-133] 지원자 동아리 명단 연동시 기존 인원 초기화 로직 구현 (#312)
1 parent a7920a7 commit e073509

File tree

11 files changed

+172
-271
lines changed

11 files changed

+172
-271
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,9 @@ public void addClubMember(ClubMember clubMember) {
123123
public String getClubUrl() {
124124
return DDINDONG_SERVICE_CLUB_URL + id;
125125
}
126+
127+
public void addClubMembers(List<ClubMember> clubMembers) {
128+
this.clubMembers.addAll(clubMembers);
129+
clubMembers.forEach(clubMember -> clubMember.setClubForConvenience(this));
130+
}
126131
}

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package ddingdong.ddingdongBE.domain.clubmember.entity;
22

3+
import static ddingdong.ddingdongBE.domain.club.entity.Position.MEMBER;
4+
35
import ddingdong.ddingdongBE.common.BaseEntity;
46
import ddingdong.ddingdongBE.domain.club.entity.Club;
57
import ddingdong.ddingdongBE.domain.club.entity.Position;
8+
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplication;
69
import jakarta.persistence.Column;
710
import jakarta.persistence.Entity;
811
import jakarta.persistence.EnumType;
@@ -64,6 +67,16 @@ public ClubMember(Long id, Club club, String name, String studentNumber, String
6467
this.department = department;
6568
}
6669

70+
public static ClubMember createFromFormApplication(FormApplication formApplication) {
71+
return ClubMember.builder()
72+
.name(formApplication.getName())
73+
.studentNumber(formApplication.getStudentNumber())
74+
.department(formApplication.getDepartment())
75+
.phoneNumber(formApplication.getPhoneNumber())
76+
.position(MEMBER)
77+
.build();
78+
}
79+
6780
public void updateInformation(ClubMember updateClubMember) {
6881
this.name = updateClubMember.getName();
6982
this.studentNumber = updateClubMember.getStudentNumber();

src/main/java/ddingdong/ddingdongBE/domain/form/api/CentralFormApi.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,10 @@ FormStatisticsResponse getFormStatistics(
117117
@ResponseStatus(HttpStatus.CREATED)
118118
@SecurityRequirement(name = "AccessToken")
119119
@PostMapping("/my/forms/{formId}/members/register-applicants")
120-
void registerMembers(@PathVariable("formId") Long formId);
120+
void registerMembers(
121+
@AuthenticationPrincipal PrincipalDetails principalDetails,
122+
@PathVariable("formId") Long formId
123+
);
121124

122125
@Operation(summary = "동아리 지원 결과 이메일 전송 API")
123126
@ApiResponse(responseCode = "201", description = "동아리 지원 결과 이메일 전송 성공")

src/main/java/ddingdong/ddingdongBE/domain/form/controller/CentralFormController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,9 @@ public SingleFieldStatisticsResponse getTextFieldStatistics(Long fieldId) {
9292
}
9393

9494
@Override
95-
public void registerMembers(Long formId) {
96-
facadeCentralFormService.registerApplicantAsMember(formId);
95+
public void registerMembers(PrincipalDetails principalDetails, Long formId) {
96+
Long userId = principalDetails.getUser().getId();
97+
facadeCentralFormService.registerApplicantAsMember(userId, formId);
9798
}
9899

99100
@Override

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public interface FacadeCentralFormService {
2828

2929
MultipleFieldStatisticsQuery getMultipleFieldStatistics(Long fieldId);
3030

31-
void registerApplicantAsMember(Long formId);
31+
void registerApplicantAsMember(Long userId, Long formId);
3232

3333
SingleFieldStatisticsQuery getTextFieldStatistics(Long fieldId);
3434

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

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
package ddingdong.ddingdongBE.domain.form.service;
22

3-
import static ddingdong.ddingdongBE.domain.club.entity.Position.MEMBER;
4-
53
import ddingdong.ddingdongBE.common.exception.FormException.InvalidFieldTypeException;
64
import ddingdong.ddingdongBE.common.exception.FormException.InvalidFormEndDateException;
75
import ddingdong.ddingdongBE.common.exception.FormException.NonHaveFormAuthority;
86
import ddingdong.ddingdongBE.common.exception.FormException.OverlapFormPeriodException;
97
import ddingdong.ddingdongBE.domain.club.entity.Club;
108
import ddingdong.ddingdongBE.domain.club.service.ClubService;
119
import ddingdong.ddingdongBE.domain.clubmember.entity.ClubMember;
10+
import ddingdong.ddingdongBE.domain.clubmember.service.ClubMemberService;
1211
import ddingdong.ddingdongBE.domain.filemetadata.entity.FileMetaData;
1312
import ddingdong.ddingdongBE.domain.filemetadata.service.FileMetaDataService;
1413
import ddingdong.ddingdongBE.domain.form.entity.Form;
@@ -62,6 +61,7 @@ public class FacadeCentralFormServiceImpl implements FacadeCentralFormService {
6261
private final SesEmailService sesEmailService;
6362
private final FormAnswerService formAnswerService;
6463
private final FileMetaDataService fileMetaDataService;
64+
private final ClubMemberService clubMemberService;
6565

6666
@Transactional
6767
@Override
@@ -153,19 +153,17 @@ public MultipleFieldStatisticsQuery getMultipleFieldStatistics(Long fieldId) {
153153

154154
@Override
155155
@Transactional
156-
public void registerApplicantAsMember(Long formId) {
156+
public void registerApplicantAsMember(Long userId, Long formId) {
157+
Club club = clubService.getByUserId(userId);
158+
List<ClubMember> originClubMembers = club.getClubMembers();
159+
clubMemberService.deleteAll(originClubMembers);
160+
157161
List<FormApplication> finalPassedFormApplications = formApplicationService.getAllFinalPassedByFormId(formId);
158-
finalPassedFormApplications.forEach(formApplication -> {
159-
Club club = formApplication.getForm().getClub();
160-
ClubMember clubMember = ClubMember.builder()
161-
.name(formApplication.getName())
162-
.studentNumber(formApplication.getStudentNumber())
163-
.department(formApplication.getDepartment())
164-
.phoneNumber(formApplication.getPhoneNumber())
165-
.position(MEMBER)
166-
.build();
167-
club.addClubMember(clubMember);
168-
});
162+
List<ClubMember> finalPassedClubMembers = finalPassedFormApplications.stream()
163+
.map(ClubMember::createFromFormApplication)
164+
.toList();
165+
club.addClubMembers(finalPassedClubMembers);
166+
clubMemberService.saveAll(finalPassedClubMembers);
169167
}
170168

171169
@Override

src/test/java/ddingdong/ddingdongBE/domain/clubmember/service/ClubMemberFixture.java renamed to src/test/java/ddingdong/ddingdongBE/common/fixture/ClubMemberFixture.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ddingdong.ddingdongBE.domain.clubmember.service;
1+
package ddingdong.ddingdongBE.common.fixture;
22

33
import ddingdong.ddingdongBE.domain.club.entity.Club;
44
import ddingdong.ddingdongBE.domain.clubmember.entity.ClubMember;

src/test/java/ddingdong/ddingdongBE/common/fixture/FormFixture.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,28 @@
11
package ddingdong.ddingdongBE.common.fixture;
22

3+
import ddingdong.ddingdongBE.domain.club.entity.Club;
34
import ddingdong.ddingdongBE.domain.form.entity.FieldType;
45
import ddingdong.ddingdongBE.domain.form.entity.Form;
56
import ddingdong.ddingdongBE.domain.form.entity.FormField;
67
import ddingdong.ddingdongBE.domain.formapplication.entity.FormAnswer;
8+
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplication;
9+
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplicationStatus;
710
import java.time.LocalDate;
811
import java.util.List;
912

1013
public class FormFixture {
1114

15+
public static Form createForm(Club club) {
16+
return Form.builder()
17+
.title("모집 지원서")
18+
.description("동아리 모집을 위한 지원서입니다.")
19+
.startDate(LocalDate.of(2025, 4, 1))
20+
.endDate(LocalDate.of(2025, 4, 15))
21+
.hasInterview(true)
22+
.sections(List.of("자기소개", "지원 동기", "경력 및 경험"))
23+
.build();
24+
}
25+
1226
public static Form formWithClubNull() {
1327
return Form.builder()
1428
.title("모집 지원서")
@@ -38,4 +52,16 @@ public static FormAnswer formAnswerByFormField(FormField savedFormField) {
3852
.formField(savedFormField)
3953
.build();
4054
}
55+
56+
public static FormApplication createFormApplicationFinalPass(Form form) {
57+
return FormApplication.builder()
58+
.name("김철수")
59+
.studentNumber("60191234")
60+
.department("컴퓨터공학과")
61+
.phoneNumber("010-1234-5678")
62+
.email("chulsoo.kim@mju.ac.kr")
63+
.status(FormApplicationStatus.FINAL_PASS) // 또는 적절한 enum 값
64+
.form(form) // 기존에 생성된 Form 객체
65+
.build();
66+
}
4167
}

src/test/java/ddingdong/ddingdongBE/domain/club/service/FacadeCentralClubServiceImplTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import ddingdong.ddingdongBE.domain.filemetadata.entity.FileMetaData;
1717
import ddingdong.ddingdongBE.domain.filemetadata.entity.FileStatus;
1818
import ddingdong.ddingdongBE.domain.filemetadata.repository.FileMetaDataRepository;
19+
import ddingdong.ddingdongBE.domain.form.repository.FormRepository;
1920
import ddingdong.ddingdongBE.domain.scorehistory.entity.Score;
2021
import ddingdong.ddingdongBE.domain.user.entity.User;
2122
import ddingdong.ddingdongBE.domain.user.repository.UserRepository;
@@ -40,6 +41,8 @@ class FacadeCentralClubServiceImplTest extends TestContainerSupport {
4041
private FileMetaDataRepository fileMetaDataRepository;
4142

4243
private final FixtureMonkey fixture = FixtureMonkeyFactory.getNotNullBuilderIntrospectorMonkey();
44+
@Autowired
45+
private FormRepository formRepository;
4346

4447
@DisplayName("중앙동아리: 내 동아리 정보 조회")
4548
@Test
@@ -120,5 +123,4 @@ void updateClubInfo() {
120123
Club result = clubRepository.findById(savedClub.getId()).orElseThrow();
121124
assertThat(result.getName()).isEqualTo("testname");
122125
}
123-
124126
}

src/test/java/ddingdong/ddingdongBE/domain/clubmember/service/FacadeCentralClubMemberServiceTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.navercorp.fixturemonkey.FixtureMonkey;
77
import ddingdong.ddingdongBE.common.exception.PersistenceException.ResourceNotFound;
88
import ddingdong.ddingdongBE.common.fixture.ClubFixture;
9+
import ddingdong.ddingdongBE.common.fixture.ClubMemberFixture;
910
import ddingdong.ddingdongBE.common.fixture.UserFixture;
1011
import ddingdong.ddingdongBE.common.support.FixtureMonkeyFactory;
1112
import ddingdong.ddingdongBE.common.support.TestContainerSupport;

0 commit comments

Comments
 (0)