Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ public enum RecruitmentErrorCode implements ErrorCode {
NOT_FOUND_STUDY_MEMBER(HttpStatus.NOT_FOUND, HttpStatus.NOT_FOUND.name(), "스터디에 참여하고 있지 않은 회원 입니다."),
NOT_FOUND_COMMENT(HttpStatus.NOT_FOUND, HttpStatus.NOT_FOUND.name(), "댓글을 찾지 못했습니다"),
NOT_OWNER(HttpStatus.BAD_REQUEST, HttpStatus.BAD_REQUEST.name(), "모집글을 등록한 당사자가 아닙니다."),
END_DATE_ERROR(HttpStatus.BAD_REQUEST, HttpStatus.BAD_REQUEST.name(), "모집글은 스터디가 시작되고 종료될 때까지 작성 가능 합니다.");
END_DATE_ERROR(HttpStatus.BAD_REQUEST, HttpStatus.BAD_REQUEST.name(), "모집글은 스터디가 시작되고 종료될 때까지 작성 가능 합니다."),
END_DATE_BEFORE_NOW_NOT_ALLOWED(HttpStatus.BAD_REQUEST, HttpStatus.BAD_REQUEST.name(), "모집글 마감기간은 오늘 이전으로 선택은 불가능 합니다.");

private static final String BASIC_MESSAGE = "RECRUITMENT";
private final HttpStatus status;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,18 @@
import grep.neogulcoder.domain.recruitment.post.controller.dto.response.save.JoinedStudyLoadInfo;
import grep.neogulcoder.domain.recruitment.post.service.RecruitmentPostSaveService;
import grep.neogulcoder.global.auth.Principal;
import grep.neogulcoder.global.exception.validation.ValidationException;
import grep.neogulcoder.global.response.ApiResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;

import static grep.neogulcoder.domain.recruitment.RecruitmentErrorCode.END_DATE_BEFORE_NOW_NOT_ALLOWED;

@RequestMapping("/recruitment-posts")
@RequiredArgsConstructor
@RestController
Expand All @@ -22,6 +27,11 @@ public class RecruitmentPostSaveController implements RecruitmentPostSaveSpecifi
@PostMapping
public ResponseEntity<ApiResponse<Long>> save(@Valid @RequestBody RecruitmentPostCreateRequest request,
@AuthenticationPrincipal Principal userDetails) {

if (request.hasExpiredDateBefore(LocalDate.now())) {
throw new ValidationException(END_DATE_BEFORE_NOW_NOT_ALLOWED);
}

long postId = recruitmentPostService.create(request.toServiceRequest(), userDetails.getUserId());
return ResponseEntity.ok(ApiResponse.success(postId));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import lombok.Builder;
import lombok.Getter;

import java.time.LocalDate;
import java.time.LocalDateTime;

@Getter
Expand Down Expand Up @@ -55,4 +56,8 @@ public RecruitmentPostCreateServiceRequest toServiceRequest() {
.expiredDate(this.expiredDate)
.build();
}

public boolean hasExpiredDateBefore(LocalDate date) {
return this.expiredDate.toLocalDate().isBefore(date);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package grep.neogulcoder.domain.recruitment.post.service;

import grep.neogulcoder.domain.recruitment.post.controller.dto.response.save.JoinedStudyLoadInfo;
import grep.neogulcoder.domain.recruitment.post.controller.dto.response.save.JoinedStudiesInfo;
import grep.neogulcoder.domain.recruitment.post.controller.dto.response.save.JoinedStudyLoadInfo;
import grep.neogulcoder.domain.recruitment.post.repository.RecruitmentPostRepository;
import grep.neogulcoder.domain.recruitment.post.service.request.RecruitmentPostCreateServiceRequest;
import grep.neogulcoder.domain.study.Study;
Expand All @@ -13,12 +13,9 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

import static grep.neogulcoder.domain.recruitment.RecruitmentErrorCode.*;
import static grep.neogulcoder.domain.recruitment.RecruitmentErrorCode.NOT_FOUND_STUDY_MEMBER;
import static grep.neogulcoder.domain.recruitment.RecruitmentErrorCode.NOT_STUDY_LEADER;

@RequiredArgsConstructor
@Transactional(readOnly = true)
Expand All @@ -36,7 +33,7 @@ public long create(RecruitmentPostCreateServiceRequest request, long userId) {
throw new BusinessException(NOT_STUDY_LEADER);
}

if(studyMember.getStudy().hasEndDateBefore(request.getExpiredDate())){
if (studyMember.getStudy().hasEndDateBefore(request.getExpiredDate())) {
throw new BusinessException(END_DATE_ERROR);
}

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

if(isNotParticipated(studyMember)){
if (isNotParticipated(studyMember)) {
throw new NotFoundException(NOT_FOUND_STUDY_MEMBER);
}
return studyMember.getStudy();
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/grep/neogulcoder/domain/study/Study.java
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ public boolean isReviewableAt(LocalDateTime currentDateTime) {
}

public boolean hasEndDateBefore(LocalDateTime dateTime) {
return this.endDate.isBefore(dateTime);
return this.endDate.toLocalDate().isBefore(dateTime.toLocalDate());
}

public static boolean isOverJoinLimit(int joinedStudyCount) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import grep.neogulcoder.domain.study.Study;
import grep.neogulcoder.domain.study.StudyMember;
import grep.neogulcoder.domain.study.event.StudyExtensionReminderEvent;
import grep.neogulcoder.domain.study.repository.StudyMemberQueryRepository;
import grep.neogulcoder.domain.study.repository.StudyMemberRepository;
import grep.neogulcoder.domain.study.repository.StudyRepository;
import lombok.RequiredArgsConstructor;
Expand All @@ -14,6 +15,8 @@
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Transactional(readOnly = true)
@RequiredArgsConstructor
Expand All @@ -24,6 +27,7 @@ public class StudySchedulerService {
private final BuddyEnergyService buddyEnergyService;
private final StudyMemberRepository studyMemberRepository;
private final ApplicationEventPublisher eventPublisher;
private final StudyMemberQueryRepository studyMemberQueryRepository;

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

Map<Long, List<StudyMember>> memberMap = getActivatedMemberMap(studiesToBeFinished);

for (Study study : studiesToBeFinished) {
study.finish();

// 스터디 멤버들 조회 후 버디에너지 업데이트
List<StudyMember> members = studyMemberRepository.findFetchStudyByStudyId(study.getId());
List<StudyMember> members = memberMap.getOrDefault(study.getId(), List.of());
for (StudyMember member : members) {
buddyEnergyService.updateEnergyByStudy(member.getUserId(), member.isLeader());
}
}
}

private Map<Long, List<StudyMember>> getActivatedMemberMap(List<Study> studies) {
List<Long> studyIds = studies.stream()
.map(Study::getId)
.toList();

List<StudyMember> allActivatedMembers = studyMemberQueryRepository.findActivatedMembersByStudyIds(studyIds);

return allActivatedMembers.stream()
.collect(Collectors.groupingBy(studyMember -> studyMember.getStudy().getId()));
}
}