88import grep .neogulcoder .domain .study .repository .StudyMemberRepository ;
99import grep .neogulcoder .domain .study .repository .StudyRepository ;
1010import grep .neogulcoder .domain .timevote .dto .request .TimeVotePeriodCreateRequest ;
11+ import grep .neogulcoder .domain .timevote .dto .response .TimeVotePeriodResponse ;
1112import grep .neogulcoder .domain .timevote .entity .TimeVotePeriod ;
1213import grep .neogulcoder .domain .timevote .repository .TimeVotePeriodRepository ;
1314import grep .neogulcoder .domain .timevote .repository .TimeVoteRepository ;
1415import grep .neogulcoder .domain .timevote .repository .TimeVoteStatRepository ;
1516import grep .neogulcoder .global .exception .business .BusinessException ;
1617import java .time .LocalDateTime ;
18+ import java .time .LocalTime ;
1719import java .time .temporal .ChronoUnit ;
1820import lombok .RequiredArgsConstructor ;
1921import org .springframework .stereotype .Service ;
2527public class TimeVotePeriodService {
2628
2729 private final TimeVotePeriodRepository timeVotePeriodRepository ;
28- private final StudyRepository studyRepository ;
2930 private final TimeVoteRepository timeVoteRepository ;
3031 private final TimeVoteStatRepository timeVoteStatRepository ;
32+ private final StudyRepository studyRepository ;
3133 private final StudyMemberRepository studyMemberRepository ;
3234
33- public TimeVotePeriod createTimeVotePeriodAndReturn (TimeVotePeriodCreateRequest request , Long studyId , Long userId ) {
35+ public TimeVotePeriodResponse createTimeVotePeriodAndReturn (TimeVotePeriodCreateRequest request , Long studyId , Long userId ) {
3436 StudyMember studyMember = getValidStudyMember (studyId , userId );
3537 validateStudyLeader (studyMember );
3638
3739 validateStartDateNotPast (request .getStartDate ());
3840 validatePeriodRange (request .getStartDate (), request .getEndDate ());
3941 validateMaxPeriod (request .getStartDate (), request .getEndDate ());
4042
43+ LocalDateTime adjustedEndDate = adjustEndDate (request .getEndDate ());
44+
4145 if (timeVotePeriodRepository .existsByStudyId (studyId )) {
4246 deleteAllTimeVoteDate (studyId );
4347 }
4448
45- TimeVotePeriod savedPeriod = timeVotePeriodRepository .save (request .toEntity (studyId ));
49+ TimeVotePeriod savedPeriod = timeVotePeriodRepository .save (request .toEntity (studyId , adjustedEndDate ));
4650
47- return savedPeriod ;
51+ return TimeVotePeriodResponse . from ( savedPeriod ) ;
4852 }
4953
5054 public void deleteAllTimeVoteDate (Long studyId ) {
51- Study study = studyRepository .findById (studyId )
52- .orElseThrow (() -> new BusinessException (STUDY_NOT_FOUND ));
55+ getValidStudy (studyId );
5356
5457 timeVoteRepository .deleteAllByPeriod_StudyId (studyId );
5558 timeVoteStatRepository .deleteAllByPeriod_StudyId (studyId );
5659 timeVotePeriodRepository .deleteAllByStudyId (studyId );
5760 }
5861
5962 // ================================= 검증 로직 ================================
63+ // 주어진 ID의 스터디가 존재하는지 검증 (존재하지 않으면 예외 발생)
64+ private Study getValidStudy (Long studyId ) {
65+ return studyRepository .findById (studyId )
66+ .orElseThrow (() -> new BusinessException (STUDY_NOT_FOUND ));
67+ }
68+
6069 // 유효한 스터디 멤버인지 확인 (활성화된 멤버만 허용)
6170 private StudyMember getValidStudyMember (Long studyId , Long userId ) {
6271 return studyMemberRepository .findByStudyIdAndUserIdAndActivatedTrue (studyId , userId )
@@ -79,6 +88,11 @@ private void validateMaxPeriod(LocalDateTime startDate, LocalDateTime endDate) {
7988 }
8089 }
8190
91+ // 투표 기간 종료일을 마지막 날 23:59:59로 보정
92+ private LocalDateTime adjustEndDate (LocalDateTime endDate ) {
93+ return endDate .with (LocalTime .of (23 , 59 , 59 ));
94+ }
95+
8296 // 시작일이 종료일보다 늦은 비정상적인 입력 방지
8397 private void validatePeriodRange (LocalDateTime startDate , LocalDateTime endDate ) {
8498 if (startDate .isAfter (endDate )) {
0 commit comments