diff --git a/common/core/src/main/java/kr/co/palnet/kac/core/exception/BaseErrorCode.java b/common/core/src/main/java/kr/co/palnet/kac/core/exception/BaseErrorCode.java index 125e550..f4b37fa 100644 --- a/common/core/src/main/java/kr/co/palnet/kac/core/exception/BaseErrorCode.java +++ b/common/core/src/main/java/kr/co/palnet/kac/core/exception/BaseErrorCode.java @@ -25,7 +25,13 @@ public enum BaseErrorCode { WEB_NOT_FOUND("WB404", HttpStatus.INTERNAL_SERVER_ERROR, "찾을수 없는 페이지"), WEB_API_ERROR("WB500", HttpStatus.INTERNAL_SERVER_ERROR, "외부 연동 에러"), DATA_ALREADY_EXISTS("DT001", HttpStatus.INTERNAL_SERVER_ERROR, "이미 등록된 데이터"), - DATA_EMPTY("DT002", HttpStatus.INTERNAL_SERVER_ERROR, "데이터 없음"); + DATA_EMPTY("DT002", HttpStatus.INTERNAL_SERVER_ERROR, "데이터 없음"), + + QR_EXPIRED("QR001", HttpStatus.BAD_REQUEST ,"QR코드 유효기간이 만료되었습니다") + + ; + + private final String code; diff --git a/data/com/src/main/java/kr/co/palnet/kac/data/com/domain/ComConfirmBas.java b/data/com/src/main/java/kr/co/palnet/kac/data/com/domain/ComConfirmBas.java index 6eb5fc8..45a6dbf 100644 --- a/data/com/src/main/java/kr/co/palnet/kac/data/com/domain/ComConfirmBas.java +++ b/data/com/src/main/java/kr/co/palnet/kac/data/com/domain/ComConfirmBas.java @@ -34,7 +34,7 @@ public class ComConfirmBas { // 상태 @Column(name = "STATUS", length = 20, nullable = false) - private String status; // GENERATED, RECEIVED, CHECKED, FAILED, EXPIRED + private String status; // `GENERATED`, `RECEIVED`, CHECKED, FAILED, EXPIRED // 대상구분 @Column(name = "TARGET_TYPE", length = 100) diff --git a/data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComConfirmBasRepository.java b/data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComConfirmBasRepository.java index 16dfcd1..b5fdff1 100644 --- a/data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComConfirmBasRepository.java +++ b/data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComConfirmBasRepository.java @@ -3,6 +3,10 @@ package kr.co.palnet.kac.data.com.repository; import kr.co.palnet.kac.data.com.domain.ComConfirmBas; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface ComConfirmBasRepository extends JpaRepository { + Optional findFirstByConfirmKeyOrderByCreateDtDesc(String confirmKey); + } diff --git a/data/com/src/main/java/kr/co/palnet/kac/data/com/service/ComConfirmDomainService.java b/data/com/src/main/java/kr/co/palnet/kac/data/com/service/ComConfirmDomainService.java index 92f48f7..af6f5d1 100644 --- a/data/com/src/main/java/kr/co/palnet/kac/data/com/service/ComConfirmDomainService.java +++ b/data/com/src/main/java/kr/co/palnet/kac/data/com/service/ComConfirmDomainService.java @@ -6,6 +6,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.Optional; + @Service @Slf4j @RequiredArgsConstructor @@ -17,4 +19,12 @@ public class ComConfirmDomainService { return comConfirmBasRepository.save(entity); } + public Optional findFirstByConfirmKeyOrderByCreateDtDesc(String confirmKey){ + return comConfirmBasRepository.findFirstByConfirmKeyOrderByCreateDtDesc(confirmKey); + } + + public void flush(){ + comConfirmBasRepository.flush(); + } + } diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/external/model/TsQRcodeRQ.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/external/model/TsQRcodeRQ.java index 3e6e072..c6575f9 100644 --- a/web/api-flight/src/main/java/kr/co/palnet/kac/api/external/model/TsQRcodeRQ.java +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/external/model/TsQRcodeRQ.java @@ -1,9 +1,7 @@ package kr.co.palnet.kac.api.external.model; -import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; -import lombok.NoArgsConstructor; @Data public class TsQRcodeRQ { diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/controller/FlightLaancController.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/controller/FlightLaancController.java index cb83a7a..dce7641 100644 --- a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/controller/FlightLaancController.java +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/controller/FlightLaancController.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import kr.co.palnet.kac.api.v1.flight.laanc.model.create.CreateLaancPlanRQ; import kr.co.palnet.kac.api.v1.flight.laanc.model.create.CreateLaancPlanRS; +import kr.co.palnet.kac.api.v1.flight.laanc.model.pliotvalid.PilotValidRs; import kr.co.palnet.kac.api.v1.flight.laanc.model.tsqr.LaancTsQRcodeRQ; import kr.co.palnet.kac.api.v1.flight.laanc.model.tsqr.LaancTsQRcodeRS; import kr.co.palnet.kac.api.v1.flight.laanc.service.FlightLaancService; @@ -40,5 +41,16 @@ public class FlightLaancController { return ResponseEntity.status(HttpStatus.CREATED).body(result); } + @GetMapping("/ts/qr/{confirmKey}") + @Operation(summary = "TS QR 코드 확인", description = "조종사 자격증명 및 기체 보험 여부 등 데이터를 받고 검증된 데이터인지 확인") + public ResponseEntity checkQrcode(@PathVariable("confirmKey") String confirmKey) { + + PilotValidRs result = flightLaancService.checkQrcode(confirmKey); + + return ResponseEntity.ok().body(result); + } + + + } diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/ComConfirmBasDTO.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/ComConfirmBasDTO.java index aa3b837..162a787 100644 --- a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/ComConfirmBasDTO.java +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/model/ComConfirmBasDTO.java @@ -1,6 +1,5 @@ package kr.co.palnet.kac.api.v1.flight.laanc.model; -import jakarta.persistence.*; import lombok.Data; import java.time.LocalDateTime; diff --git a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/service/FlightLaancService.java b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/service/FlightLaancService.java index 8a5d5d2..9b82da7 100644 --- a/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/service/FlightLaancService.java +++ b/web/api-flight/src/main/java/kr/co/palnet/kac/api/v1/flight/laanc/service/FlightLaancService.java @@ -1,5 +1,7 @@ package kr.co.palnet.kac.api.v1.flight.laanc.service; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; import kr.co.palnet.kac.api.external.model.TsQRcodeRQ; import kr.co.palnet.kac.api.external.service.CtrTrnsLctnService; import kr.co.palnet.kac.api.external.service.TsService; @@ -33,6 +35,7 @@ import kr.co.palnet.kac.api.util.FileUtils; import kr.co.palnet.kac.api.util.HttpUtils; import kr.co.palnet.kac.api.util.model.LaancPdfModel; import kr.co.palnet.kac.util.EncryptUtil; +import kr.co.palnet.kac.util.ObjectMapperUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -44,10 +47,10 @@ import org.springframework.web.util.UriComponentsBuilder; import com.google.zxing.WriterException; import java.io.IOException; +import java.time.Instant; import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; -import java.util.UUID; +import java.time.temporal.ChronoUnit; +import java.util.*; @Service @Slf4j @@ -64,7 +67,7 @@ public class FlightLaancService { private final ComFileDomainService comFileDomainService; - private final ComConfirmDomainService confirmDomainService; + private final ComConfirmDomainService comConfirmDomainService; private final OtherDomainService otherDomainService; @@ -370,7 +373,7 @@ public class FlightLaancService { .updateDt(LocalDateTime.now()) .build(); - confirmDomainService.saveComConfirmBas(comConfirmBas); + comConfirmDomainService.saveComConfirmBas(comConfirmBas); log.info(">>> confirmKey [GENERATED] ", confirmKey); return LaancTsQRcodeRS.builder() @@ -378,4 +381,42 @@ public class FlightLaancService { .confirmKey(confirmKey) .build(); } + + public PilotValidRs checkQrcode(String confirmKey) { + log.info(">>> confirmKey : {}", confirmKey); + String userId = SessionHelper.getUserId(); + Optional entityData = comConfirmDomainService.findFirstByConfirmKeyOrderByCreateDtDesc(confirmKey); + if(entityData.isEmpty()) throw new BaseException(BaseErrorCode.DATA_EMPTY, "QR코드 조회 실패"); + + ComConfirmBas entity = entityData.get(); + + if (!"RECEIVED".equals(entity.getStatus())){ + Map errorParam = new HashMap<>(); + errorParam.put("status", entity.getStatus()); + throw new BaseException(BaseErrorCode.DATA_EMPTY, errorParam.toString()); + } + + // TODO 일자 검증 - 3분 초과 + LocalDateTime createDt = entity.getCreateDt().plusMinutes(3); + boolean flag = !createDt.isBefore(LocalDateTime.now()); + if (!flag) { + entity.setStatus("EXPIRED"); + entity.setUpdateUserId(userId); + comConfirmDomainService.saveComConfirmBas(entity); + comConfirmDomainService.flush(); + throw new BaseException(BaseErrorCode.QR_EXPIRED, "QR 기간 만료"); + } + + PilotValidRs rs = null; + String rsData = entity.getRsData(); + if(rsData != null && !rsData.isEmpty()){ + try{ + rs = ObjectMapperUtils.getObjectMapper().readValue(rsData, PilotValidRs.class); + } catch (JsonProcessingException e){ + log.error("",e); + } + } + + return rs; + } }