Skip to content

Commit 5def5cc

Browse files
committed
feat(recruit-board): 모집글 상태 변경 기능
1 parent c622657 commit 5def5cc

File tree

3 files changed

+56
-10
lines changed

3 files changed

+56
-10
lines changed

src/main/java/com/somemore/recruitboard/domain/RecruitBoard.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.somemore.recruitboard.domain;
22

3+
import static com.somemore.recruitboard.domain.RecruitStatus.CLOSED;
34
import static com.somemore.recruitboard.domain.RecruitStatus.RECRUITING;
45
import static jakarta.persistence.EnumType.STRING;
56
import static jakarta.persistence.GenerationType.IDENTITY;
@@ -15,6 +16,7 @@
1516
import jakarta.persistence.Id;
1617
import jakarta.persistence.Lob;
1718
import jakarta.persistence.Table;
19+
import java.time.LocalDateTime;
1820
import java.time.LocalTime;
1921
import java.util.UUID;
2022
import lombok.Builder;
@@ -84,6 +86,13 @@ public void updateWith(String region) {
8486
recruitmentInfo.updateWith(region);
8587
}
8688

89+
public void changeStatus(RecruitStatus newStatus, LocalDateTime currentDateTime) {
90+
validateStatusChange(newStatus);
91+
validateChangeDeadline(currentDateTime);
92+
93+
this.recruitStatus = newStatus;
94+
}
95+
8796
private void updateRecruitmentInfo(RecruitBoardUpdateRequestDto dto) {
8897
recruitmentInfo.updateWith(
8998
dto.recruitmentCount(),
@@ -93,4 +102,20 @@ private void updateRecruitmentInfo(RecruitBoardUpdateRequestDto dto) {
93102
dto.admitted()
94103
);
95104
}
105+
106+
private void validateStatusChange(RecruitStatus newStatus) {
107+
if (newStatus != RECRUITING && newStatus != CLOSED) {
108+
throw new IllegalArgumentException("상태는 '모집중' 또는 '마감'으로만 변경할 수 있습니다.");
109+
}
110+
}
111+
112+
private void validateChangeDeadline(LocalDateTime currentDateTime) {
113+
LocalDateTime volunteerStartDateTime = recruitmentInfo.getVolunteerStartDateTime();
114+
LocalDateTime deadline = volunteerStartDateTime.toLocalDate().atStartOfDay();
115+
116+
if (!currentDateTime.isBefore(deadline)) {
117+
throw new IllegalStateException("봉사 시작 일시 자정 전까지만 상태를 변경할 수 있습니다.");
118+
}
119+
}
120+
96121
}

src/main/java/com/somemore/recruitboard/service/command/UpdateRecruitBoardService.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66
import com.somemore.global.exception.BadRequestException;
77
import com.somemore.location.usecase.command.UpdateLocationUseCase;
88
import com.somemore.recruitboard.domain.RecruitBoard;
9+
import com.somemore.recruitboard.domain.RecruitStatus;
910
import com.somemore.recruitboard.dto.request.RecruitBoardLocationUpdateRequestDto;
1011
import com.somemore.recruitboard.dto.request.RecruitBoardUpdateRequestDto;
1112
import com.somemore.recruitboard.repository.RecruitBoardRepository;
1213
import com.somemore.recruitboard.usecase.command.UpdateRecruitBoardUseCase;
13-
import com.somemore.recruitboard.usecase.query.RecruitBoardQueryUseCase;
14+
import java.time.LocalDateTime;
1415
import java.util.UUID;
1516
import lombok.RequiredArgsConstructor;
1617
import org.springframework.stereotype.Service;
@@ -23,7 +24,6 @@
2324
public class UpdateRecruitBoardService implements UpdateRecruitBoardUseCase {
2425

2526
private final RecruitBoardRepository recruitBoardRepository;
26-
private final RecruitBoardQueryUseCase recruitBoardQueryUseCase;
2727
private final UpdateLocationUseCase updateLocationUseCase;
2828

2929
@Override
@@ -33,9 +33,7 @@ public void updateRecruitBoard(
3333
UUID centerId,
3434
String imgUrl) {
3535

36-
RecruitBoard recruitBoard = recruitBoardQueryUseCase.findById(recruitBoardId).orElseThrow(
37-
() -> new BadRequestException(NOT_EXISTS_RECRUIT_BOARD.getMessage())
38-
);
36+
RecruitBoard recruitBoard = getRecruitBoard(recruitBoardId);
3937
validateWriter(recruitBoard, centerId);
4038
recruitBoard.updateWith(requestDto, imgUrl);
4139

@@ -46,9 +44,7 @@ public void updateRecruitBoard(
4644
public void updateRecruitBoardLocation(RecruitBoardLocationUpdateRequestDto requestDto,
4745
Long recruitBoardId, UUID centerId) {
4846

49-
RecruitBoard recruitBoard = recruitBoardQueryUseCase.findById(recruitBoardId).orElseThrow(
50-
() -> new BadRequestException(NOT_EXISTS_RECRUIT_BOARD.getMessage())
51-
);
47+
RecruitBoard recruitBoard = getRecruitBoard(recruitBoardId);
5248
validateWriter(recruitBoard, centerId);
5349

5450
updateLocationUseCase.updateLocation(requestDto.toLocationUpdateRequestDto(),
@@ -58,6 +54,22 @@ public void updateRecruitBoardLocation(RecruitBoardLocationUpdateRequestDto requ
5854
recruitBoardRepository.save(recruitBoard);
5955
}
6056

57+
@Override
58+
public void updateRecruitBoardStatus(RecruitStatus status, Long recruitBoardId, UUID centerId,
59+
LocalDateTime currentDateTime) {
60+
RecruitBoard recruitBoard = getRecruitBoard(recruitBoardId);
61+
validateWriter(recruitBoard, centerId);
62+
63+
recruitBoard.changeStatus(status, currentDateTime);
64+
recruitBoardRepository.save(recruitBoard);
65+
}
66+
67+
private RecruitBoard getRecruitBoard(Long recruitBoardId) {
68+
return recruitBoardRepository.findById(recruitBoardId).orElseThrow(
69+
() -> new BadRequestException(NOT_EXISTS_RECRUIT_BOARD.getMessage())
70+
);
71+
}
72+
6173
private void validateWriter(RecruitBoard recruitBoard, UUID centerId) {
6274
if (recruitBoard.isWriter(centerId)) {
6375
return;
Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,31 @@
11
package com.somemore.recruitboard.usecase.command;
22

3+
import com.somemore.recruitboard.domain.RecruitStatus;
34
import com.somemore.recruitboard.dto.request.RecruitBoardLocationUpdateRequestDto;
45
import com.somemore.recruitboard.dto.request.RecruitBoardUpdateRequestDto;
6+
import java.time.LocalDateTime;
57
import java.util.UUID;
68

79
public interface UpdateRecruitBoardUseCase {
810

9-
public void updateRecruitBoard(
11+
void updateRecruitBoard(
1012
RecruitBoardUpdateRequestDto requestDto,
1113
Long recruitBoardId,
1214
UUID centerId,
1315
String imgUrl
1416
);
1517

16-
public void updateRecruitBoardLocation(
18+
void updateRecruitBoardLocation(
1719
RecruitBoardLocationUpdateRequestDto requestDto,
1820
Long recruitBoardId,
1921
UUID centerId
2022
);
2123

24+
void updateRecruitBoardStatus(
25+
RecruitStatus status,
26+
Long recruitBoardId,
27+
UUID centerId,
28+
LocalDateTime currentDateTime
29+
);
30+
2231
}

0 commit comments

Comments
 (0)