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 @@ -57,6 +57,15 @@ public Application getApplicationById(Long id) {
});
}

public Application getApplicationByIdForUpdate(Long id) {
return applicationRepository
.findByIdWithPessimisticLock(id)
.orElseThrow(
() -> {
throw ApplicantNotFound.EXCEPTION;
});
}

public Application getApplicationByUuidAndEmail(String uuid, String email) {
return applicationRepository
.findByUuidAndEmail(uuid, email)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@
import ceos.backend.domain.application.domain.Pass;
import ceos.backend.global.common.entity.Part;
import java.util.Optional;

import jakarta.persistence.LockModeType;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Lock;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

Expand Down Expand Up @@ -63,4 +66,10 @@ Page<Application> findAllByPartAndDocumentPassAndFinalPass(
@Param("convertedDocPass") Pass convertedDocPass,
@Param("convertedFinalPass") Pass convertedFinalPass,
PageRequest pageRequest);


@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("select a from Application a where a.id = :id")
Optional<Application> findByIdWithPessimisticLock(@Param("id") Long id);

}
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ public GetInterviewTime getInterviewTime(Long applicationId) {
public void updateInterviewTime(Long applicationId, UpdateInterviewTime updateInterviewTime) {
recruitmentValidator.validateBetweenStartDateDocAndResultDateDoc(); // 기간 검증
applicationValidator.validateExistingApplicant(applicationId); // 유저 검증
final Application application = applicationHelper.getApplicationById(applicationId);
final Application application = applicationHelper.getApplicationByIdForUpdate(applicationId);
applicationValidator.validateDocumentPassStatus(application); // 서류 통과 검증
final List<Interview> interviews = interviewRepository.findAll();
final String duration =
Expand All @@ -262,15 +262,15 @@ public void updateDocumentPassStatus(Long applicationId, UpdatePassStatus update
recruitmentValidator.validateBetweenStartDateDocAndResultDateDoc(); // 기간 검증
applicationValidator.validateExistingApplicant(applicationId); // 유저 검증

final Application application = applicationHelper.getApplicationById(applicationId);
final Application application = applicationHelper.getApplicationByIdForUpdate(applicationId);
application.updateDocumentPass(updatePassStatus.getPass());
}

@Transactional
public void updateFinalPassStatus(Long applicationId, UpdatePassStatus updatePassStatus) {
recruitmentValidator.validateBetweenResultDateDocAndResultDateFinal(); // 기간 검증
applicationValidator.validateExistingApplicant(applicationId); // 유저 검증
final Application application = applicationHelper.getApplicationById(applicationId);
final Application application = applicationHelper.getApplicationByIdForUpdate(applicationId);
applicationValidator.validateDocumentPassStatus(application); // 서류 통과 검증

application.updateFinalPass(updatePassStatus.getPass());
Expand Down