Skip to content

Commit 02a1165

Browse files
Merge pull request #302 from prgrms-web-devcourse-final-project/develop
[EA3-68] chore: develop → main 브랜치 머지
2 parents 5c5dbf1 + f54880b commit 02a1165

File tree

6 files changed

+39
-9
lines changed

6 files changed

+39
-9
lines changed

src/main/java/grep/neogulcoder/domain/recruitment/RecruitmentErrorCode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ public enum RecruitmentErrorCode implements ErrorCode {
1515
NOT_FOUND_STUDY_MEMBER(HttpStatus.NOT_FOUND, HttpStatus.NOT_FOUND.name(), "스터디에 참여하고 있지 않은 회원 입니다."),
1616
NOT_FOUND_COMMENT(HttpStatus.NOT_FOUND, HttpStatus.NOT_FOUND.name(), "댓글을 찾지 못했습니다"),
1717
NOT_OWNER(HttpStatus.BAD_REQUEST, HttpStatus.BAD_REQUEST.name(), "모집글을 등록한 당사자가 아닙니다."),
18-
END_DATE_ERROR(HttpStatus.BAD_REQUEST, HttpStatus.BAD_REQUEST.name(), "모집글은 스터디가 시작되고 종료될 때까지 작성 가능 합니다.");
18+
END_DATE_ERROR(HttpStatus.BAD_REQUEST, HttpStatus.BAD_REQUEST.name(), "모집글은 스터디가 시작되고 종료될 때까지 작성 가능 합니다."),
19+
END_DATE_BEFORE_NOW_NOT_ALLOWED(HttpStatus.BAD_REQUEST, HttpStatus.BAD_REQUEST.name(), "모집글 마감기간은 오늘 이전으로 선택은 불가능 합니다.");
1920

2021
private static final String BASIC_MESSAGE = "RECRUITMENT";
2122
private final HttpStatus status;

src/main/java/grep/neogulcoder/domain/recruitment/post/controller/RecruitmentPostSaveController.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,18 @@
55
import grep.neogulcoder.domain.recruitment.post.controller.dto.response.save.JoinedStudyLoadInfo;
66
import grep.neogulcoder.domain.recruitment.post.service.RecruitmentPostSaveService;
77
import grep.neogulcoder.global.auth.Principal;
8+
import grep.neogulcoder.global.exception.validation.ValidationException;
89
import grep.neogulcoder.global.response.ApiResponse;
910
import jakarta.validation.Valid;
1011
import lombok.RequiredArgsConstructor;
1112
import org.springframework.http.ResponseEntity;
1213
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1314
import org.springframework.web.bind.annotation.*;
1415

16+
import java.time.LocalDate;
17+
18+
import static grep.neogulcoder.domain.recruitment.RecruitmentErrorCode.END_DATE_BEFORE_NOW_NOT_ALLOWED;
19+
1520
@RequestMapping("/recruitment-posts")
1621
@RequiredArgsConstructor
1722
@RestController
@@ -22,6 +27,11 @@ public class RecruitmentPostSaveController implements RecruitmentPostSaveSpecifi
2227
@PostMapping
2328
public ResponseEntity<ApiResponse<Long>> save(@Valid @RequestBody RecruitmentPostCreateRequest request,
2429
@AuthenticationPrincipal Principal userDetails) {
30+
31+
if (request.hasExpiredDateBefore(LocalDate.now())) {
32+
throw new ValidationException(END_DATE_BEFORE_NOW_NOT_ALLOWED);
33+
}
34+
2535
long postId = recruitmentPostService.create(request.toServiceRequest(), userDetails.getUserId());
2636
return ResponseEntity.ok(ApiResponse.success(postId));
2737
}

src/main/java/grep/neogulcoder/domain/recruitment/post/controller/dto/request/save/RecruitmentPostCreateRequest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import lombok.Builder;
99
import lombok.Getter;
1010

11+
import java.time.LocalDate;
1112
import java.time.LocalDateTime;
1213

1314
@Getter
@@ -55,4 +56,8 @@ public RecruitmentPostCreateServiceRequest toServiceRequest() {
5556
.expiredDate(this.expiredDate)
5657
.build();
5758
}
59+
60+
public boolean hasExpiredDateBefore(LocalDate date) {
61+
return this.expiredDate.toLocalDate().isBefore(date);
62+
}
5863
}

src/main/java/grep/neogulcoder/domain/recruitment/post/service/RecruitmentPostSaveService.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package grep.neogulcoder.domain.recruitment.post.service;
22

3-
import grep.neogulcoder.domain.recruitment.post.controller.dto.response.save.JoinedStudyLoadInfo;
43
import grep.neogulcoder.domain.recruitment.post.controller.dto.response.save.JoinedStudiesInfo;
4+
import grep.neogulcoder.domain.recruitment.post.controller.dto.response.save.JoinedStudyLoadInfo;
55
import grep.neogulcoder.domain.recruitment.post.repository.RecruitmentPostRepository;
66
import grep.neogulcoder.domain.recruitment.post.service.request.RecruitmentPostCreateServiceRequest;
77
import grep.neogulcoder.domain.study.Study;
@@ -13,12 +13,9 @@
1313
import org.springframework.stereotype.Service;
1414
import org.springframework.transaction.annotation.Transactional;
1515

16-
import java.time.LocalDateTime;
1716
import java.util.List;
1817

1918
import static grep.neogulcoder.domain.recruitment.RecruitmentErrorCode.*;
20-
import static grep.neogulcoder.domain.recruitment.RecruitmentErrorCode.NOT_FOUND_STUDY_MEMBER;
21-
import static grep.neogulcoder.domain.recruitment.RecruitmentErrorCode.NOT_STUDY_LEADER;
2219

2320
@RequiredArgsConstructor
2421
@Transactional(readOnly = true)
@@ -36,7 +33,7 @@ public long create(RecruitmentPostCreateServiceRequest request, long userId) {
3633
throw new BusinessException(NOT_STUDY_LEADER);
3734
}
3835

39-
if(studyMember.getStudy().hasEndDateBefore(request.getExpiredDate())){
36+
if (studyMember.getStudy().hasEndDateBefore(request.getExpiredDate())) {
4037
throw new BusinessException(END_DATE_ERROR);
4138
}
4239

@@ -70,7 +67,7 @@ private List<Study> toStudyList(List<StudyMember> studyMembers) {
7067
private Study findValidStudy(long studyId, long userId) {
7168
StudyMember studyMember = studyMemberRepository.findByStudyIdAndUserId(studyId, userId);
7269

73-
if(isNotParticipated(studyMember)){
70+
if (isNotParticipated(studyMember)) {
7471
throw new NotFoundException(NOT_FOUND_STUDY_MEMBER);
7572
}
7673
return studyMember.getStudy();

src/main/java/grep/neogulcoder/domain/study/Study.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ public boolean isReviewableAt(LocalDateTime currentDateTime) {
126126
}
127127

128128
public boolean hasEndDateBefore(LocalDateTime dateTime) {
129-
return this.endDate.isBefore(dateTime);
129+
return this.endDate.toLocalDate().isBefore(dateTime.toLocalDate());
130130
}
131131

132132
public static boolean isOverJoinLimit(int joinedStudyCount) {

src/main/java/grep/neogulcoder/domain/study/service/StudySchedulerService.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import grep.neogulcoder.domain.study.Study;
55
import grep.neogulcoder.domain.study.StudyMember;
66
import grep.neogulcoder.domain.study.event.StudyExtensionReminderEvent;
7+
import grep.neogulcoder.domain.study.repository.StudyMemberQueryRepository;
78
import grep.neogulcoder.domain.study.repository.StudyMemberRepository;
89
import grep.neogulcoder.domain.study.repository.StudyRepository;
910
import lombok.RequiredArgsConstructor;
@@ -14,6 +15,8 @@
1415
import java.time.LocalDate;
1516
import java.time.LocalDateTime;
1617
import java.util.List;
18+
import java.util.Map;
19+
import java.util.stream.Collectors;
1720

1821
@Transactional(readOnly = true)
1922
@RequiredArgsConstructor
@@ -24,6 +27,7 @@ public class StudySchedulerService {
2427
private final BuddyEnergyService buddyEnergyService;
2528
private final StudyMemberRepository studyMemberRepository;
2629
private final ApplicationEventPublisher eventPublisher;
30+
private final StudyMemberQueryRepository studyMemberQueryRepository;
2731

2832
@Transactional
2933
public void findStudiesEndingIn7Days() {
@@ -43,14 +47,27 @@ public void finalizeStudies() {
4347
LocalDateTime now = LocalDateTime.now();
4448
List<Study> studiesToBeFinished = studyRepository.findStudiesToBeFinished(now);
4549

50+
Map<Long, List<StudyMember>> memberMap = getActivatedMemberMap(studiesToBeFinished);
51+
4652
for (Study study : studiesToBeFinished) {
4753
study.finish();
4854

4955
// 스터디 멤버들 조회 후 버디에너지 업데이트
50-
List<StudyMember> members = studyMemberRepository.findFetchStudyByStudyId(study.getId());
56+
List<StudyMember> members = memberMap.getOrDefault(study.getId(), List.of());
5157
for (StudyMember member : members) {
5258
buddyEnergyService.updateEnergyByStudy(member.getUserId(), member.isLeader());
5359
}
5460
}
5561
}
62+
63+
private Map<Long, List<StudyMember>> getActivatedMemberMap(List<Study> studies) {
64+
List<Long> studyIds = studies.stream()
65+
.map(Study::getId)
66+
.toList();
67+
68+
List<StudyMember> allActivatedMembers = studyMemberQueryRepository.findActivatedMembersByStudyIds(studyIds);
69+
70+
return allActivatedMembers.stream()
71+
.collect(Collectors.groupingBy(studyMember -> studyMember.getStudy().getId()));
72+
}
5673
}

0 commit comments

Comments
 (0)