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 @@ -5,6 +5,7 @@

@Getter
public enum RecruitCoreApplicationErrorCode {
RECRUITMENT_CLOSED("RECRUITMENT_CLOSED", "μ½”μ–΄ 지원 기간이 μ’…λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.", HttpStatus.FORBIDDEN),
ALREADY_APPLIED("ALREADY_APPLIED", "이미 지원이 μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.", HttpStatus.CONFLICT),
APPLICATION_NOT_FOUND("APPLICATION_NOT_FOUND", "제좜된 μš΄μ˜μ§„ μ§€μ›μ„œκ°€ μ—†μŠ΅λ‹ˆλ‹€.", HttpStatus.NOT_FOUND);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package inha.gdgoc.domain.recruit.core.exception;

import java.time.Instant;
import lombok.Getter;

@Getter
public class RecruitCoreClosedException extends RuntimeException {

private final RecruitCoreApplicationErrorCode errorCode;
private final Instant deadline;

public RecruitCoreClosedException(Instant deadline) {
super(RecruitCoreApplicationErrorCode.RECRUITMENT_CLOSED.getMessage());
this.errorCode = RecruitCoreApplicationErrorCode.RECRUITMENT_CLOSED;
this.deadline = deadline;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,19 @@ public ResponseEntity<RecruitCoreApplicationErrorResponse> handleAlreadyApplied(
return ResponseEntity.status(code.getStatus()).body(body);
}

@ExceptionHandler(RecruitCoreClosedException.class)
public ResponseEntity<RecruitCoreApplicationErrorResponse> handleClosed(
RecruitCoreClosedException ex
) {
log.debug("RecruitCoreClosedException: {}", ex.getMessage());
var code = ex.getErrorCode();
RecruitCoreApplicationErrorResponse body = RecruitCoreApplicationErrorResponse.of(
code.getCode(),
code.getMessage()
);
return ResponseEntity.status(code.getStatus()).body(body);
}

@ExceptionHandler(RecruitCoreApplicationNotFoundException.class)
public ResponseEntity<RecruitCoreApplicationErrorResponse> handleNotFound(
RecruitCoreApplicationNotFoundException ex
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@
import inha.gdgoc.domain.recruit.core.enums.RecruitCoreResultStatus;
import inha.gdgoc.domain.recruit.core.exception.RecruitCoreAlreadyAppliedException;
import inha.gdgoc.domain.recruit.core.exception.RecruitCoreApplicationNotFoundException;
import inha.gdgoc.domain.recruit.core.exception.RecruitCoreClosedException;
import inha.gdgoc.domain.recruit.core.repository.RecruitCoreApplicationRepository;
import inha.gdgoc.domain.user.entity.User;
import inha.gdgoc.domain.user.enums.UserRole;
import inha.gdgoc.domain.user.repository.UserRepository;
import inha.gdgoc.global.exception.BusinessException;
import inha.gdgoc.global.exception.GlobalErrorCode;
import java.time.Instant;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand All @@ -26,6 +28,8 @@
@RequiredArgsConstructor
public class RecruitCoreApplicationService {

private static final Instant RECRUITMENT_DEADLINE = Instant.parse("2026-03-14T14:59:59Z");

private final RecruitCoreApplicationRepository repository;
private final UserRepository userRepository;
private final RecruitCoreSessionResolver recruitCoreSessionResolver;
Expand All @@ -38,6 +42,7 @@ public RecruitCoreApplicantDetailResponse getApplicantDetail(Long id) {

@Transactional(readOnly = true)
public RecruitCoreEligibilityResponse checkEligibility(Long userId) {
validateRecruitmentOpen();
String session = recruitCoreSessionResolver.currentSession();
return repository.findByUserIdAndSession(userId, session)
.map(app -> RecruitCoreEligibilityResponse.ineligible(session, "ALREADY_APPLIED", app.getId()))
Expand All @@ -46,6 +51,7 @@ public RecruitCoreEligibilityResponse checkEligibility(Long userId) {

@Transactional(readOnly = true)
public RecruitCorePrefillResponse prefill(Long userId) {
validateRecruitmentOpen();
String session = recruitCoreSessionResolver.currentSession();
repository.findByUserIdAndSession(userId, session)
.ifPresent(existing -> {
Expand All @@ -58,6 +64,7 @@ public RecruitCorePrefillResponse prefill(Long userId) {

@Transactional
public RecruitCoreApplicationCreateResponse submit(Long userId, RecruitCoreApplicationCreateRequest request) {
validateRecruitmentOpen();
String session = recruitCoreSessionResolver.currentSession();
repository.findByUserIdAndSession(userId, session)
.ifPresent(existing -> {
Expand Down Expand Up @@ -123,4 +130,10 @@ private User getUser(Long userId) {
.orElseThrow(() -> new BusinessException(GlobalErrorCode.RESOURCE_NOT_FOUND));
}

private void validateRecruitmentOpen() {
if (Instant.now().isAfter(RECRUITMENT_DEADLINE)) {
throw new RecruitCoreClosedException(RECRUITMENT_DEADLINE);
}
}

}
Loading