Merge remote-tracking branch 'origin/feat/dev_251201' into feat/dev_251201

# Conflicts:
#	src/main/java/com/kamco/cd/kamcoback/mapsheet/service/MapSheetMngService.java
This commit is contained in:
Moon
2025-12-23 13:05:24 +09:00
11 changed files with 133 additions and 69 deletions

View File

@@ -50,6 +50,7 @@ public class GlobalExceptionHandler {
public ApiResponseDto<String> handleDuplicateFileException( public ApiResponseDto<String> handleDuplicateFileException(
DuplicateFileException e, HttpServletRequest request) { DuplicateFileException e, HttpServletRequest request) {
log.warn("[DuplicateFileException] resource :{} ", e.getMessage()); log.warn("[DuplicateFileException] resource :{} ", e.getMessage());
this.errorLog(request, e);
ApiResponseCode code = ApiResponseCode.CONFLICT; ApiResponseCode code = ApiResponseCode.CONFLICT;
ErrorLogEntity errorLog = ErrorLogEntity errorLog =
saveErrorLogData( saveErrorLogData(
@@ -68,6 +69,7 @@ public class GlobalExceptionHandler {
public ApiResponseDto<String> handleValidationException( public ApiResponseDto<String> handleValidationException(
ValidationException e, HttpServletRequest request) { ValidationException e, HttpServletRequest request) {
log.warn("[ValidationException] resource :{} ", e.getMessage()); log.warn("[ValidationException] resource :{} ", e.getMessage());
this.errorLog(request, e);
ApiResponseCode code = ApiResponseCode.UNPROCESSABLE_ENTITY; ApiResponseCode code = ApiResponseCode.UNPROCESSABLE_ENTITY;
ErrorLogEntity errorLog = ErrorLogEntity errorLog =
saveErrorLogData( saveErrorLogData(
@@ -86,6 +88,7 @@ public class GlobalExceptionHandler {
public ApiResponseDto<String> handleIllegalArgumentException( public ApiResponseDto<String> handleIllegalArgumentException(
IllegalArgumentException e, HttpServletRequest request) { IllegalArgumentException e, HttpServletRequest request) {
log.warn("[IllegalArgumentException] resource :{} ", e.getMessage()); log.warn("[IllegalArgumentException] resource :{} ", e.getMessage());
this.errorLog(request, e);
ApiResponseCode code = ApiResponseCode.BAD_REQUEST; ApiResponseCode code = ApiResponseCode.BAD_REQUEST;
ErrorLogEntity errorLog = ErrorLogEntity errorLog =
saveErrorLogData( saveErrorLogData(
@@ -104,6 +107,7 @@ public class GlobalExceptionHandler {
public ApiResponseDto<String> handlerEntityNotFoundException( public ApiResponseDto<String> handlerEntityNotFoundException(
EntityNotFoundException e, HttpServletRequest request) { EntityNotFoundException e, HttpServletRequest request) {
log.warn("[EntityNotFoundException] resource :{} ", e.getMessage()); log.warn("[EntityNotFoundException] resource :{} ", e.getMessage());
this.errorLog(request, e);
String codeName = "NOT_FOUND_DATA"; String codeName = "NOT_FOUND_DATA";
ErrorLogEntity errorLog = ErrorLogEntity errorLog =
saveErrorLogData( saveErrorLogData(
@@ -125,6 +129,7 @@ public class GlobalExceptionHandler {
public ApiResponseDto<String> handleUnreadable( public ApiResponseDto<String> handleUnreadable(
HttpMessageNotReadableException e, HttpServletRequest request) { HttpMessageNotReadableException e, HttpServletRequest request) {
log.warn("[HttpMessageNotReadableException] resource :{} ", e.getMessage()); log.warn("[HttpMessageNotReadableException] resource :{} ", e.getMessage());
this.errorLog(request, e);
String codeName = "BAD_REQUEST"; String codeName = "BAD_REQUEST";
ErrorLogEntity errorLog = ErrorLogEntity errorLog =
saveErrorLogData( saveErrorLogData(
@@ -146,6 +151,7 @@ public class GlobalExceptionHandler {
public ApiResponseDto<String> handlerNoSuchElementException( public ApiResponseDto<String> handlerNoSuchElementException(
NoSuchElementException e, HttpServletRequest request) { NoSuchElementException e, HttpServletRequest request) {
log.warn("[NoSuchElementException] resource :{} ", e.getMessage()); log.warn("[NoSuchElementException] resource :{} ", e.getMessage());
this.errorLog(request, e);
String codeName = "NOT_FOUND_DATA"; String codeName = "NOT_FOUND_DATA";
ErrorLogEntity errorLog = ErrorLogEntity errorLog =
saveErrorLogData( saveErrorLogData(
@@ -167,6 +173,7 @@ public class GlobalExceptionHandler {
public ApiResponseDto<String> handlerDataIntegrityViolationException( public ApiResponseDto<String> handlerDataIntegrityViolationException(
DataIntegrityViolationException e, HttpServletRequest request) { DataIntegrityViolationException e, HttpServletRequest request) {
log.warn("[DataIntegrityViolationException] resource :{} ", e.getMessage()); log.warn("[DataIntegrityViolationException] resource :{} ", e.getMessage());
this.errorLog(request, e);
String codeName = "DATA_INTEGRITY_ERROR"; String codeName = "DATA_INTEGRITY_ERROR";
ErrorLogEntity errorLog = ErrorLogEntity errorLog =
saveErrorLogData( saveErrorLogData(
@@ -188,6 +195,7 @@ public class GlobalExceptionHandler {
public ApiResponseDto<String> handlerMethodArgumentNotValidException( public ApiResponseDto<String> handlerMethodArgumentNotValidException(
MethodArgumentNotValidException e, HttpServletRequest request) { MethodArgumentNotValidException e, HttpServletRequest request) {
log.warn("[MethodArgumentNotValidException] resource :{} ", e.getMessage()); log.warn("[MethodArgumentNotValidException] resource :{} ", e.getMessage());
this.errorLog(request, e);
String codeName = "BAD_REQUEST"; String codeName = "BAD_REQUEST";
ErrorLogEntity errorLog = ErrorLogEntity errorLog =
saveErrorLogData( saveErrorLogData(
@@ -209,6 +217,7 @@ public class GlobalExceptionHandler {
public ApiResponseDto<String> handlerAccessDeniedException( public ApiResponseDto<String> handlerAccessDeniedException(
AccessDeniedException e, HttpServletRequest request) { AccessDeniedException e, HttpServletRequest request) {
log.warn("[AccessDeniedException] resource :{} ", e.getMessage()); log.warn("[AccessDeniedException] resource :{} ", e.getMessage());
this.errorLog(request, e);
String codeName = "FORBIDDEN"; String codeName = "FORBIDDEN";
ErrorLogEntity errorLog = ErrorLogEntity errorLog =
saveErrorLogData( saveErrorLogData(
@@ -230,6 +239,7 @@ public class GlobalExceptionHandler {
public ApiResponseDto<String> handlerHttpServerErrorException( public ApiResponseDto<String> handlerHttpServerErrorException(
HttpServerErrorException e, HttpServletRequest request) { HttpServerErrorException e, HttpServletRequest request) {
log.warn("[HttpServerErrorException] resource :{} ", e.getMessage()); log.warn("[HttpServerErrorException] resource :{} ", e.getMessage());
this.errorLog(request, e);
String codeName = "BAD_GATEWAY"; String codeName = "BAD_GATEWAY";
ErrorLogEntity errorLog = ErrorLogEntity errorLog =
saveErrorLogData( saveErrorLogData(
@@ -251,7 +261,7 @@ public class GlobalExceptionHandler {
public ApiResponseDto<String> handlerIllegalStateException( public ApiResponseDto<String> handlerIllegalStateException(
IllegalStateException e, HttpServletRequest request) { IllegalStateException e, HttpServletRequest request) {
log.warn("[IllegalStateException] resource :{} ", e.getMessage()); log.warn("[IllegalStateException] resource :{} ", e.getMessage());
this.errorLog(request, e);
String codeName = "UNPROCESSABLE_ENTITY"; String codeName = "UNPROCESSABLE_ENTITY";
ErrorLogEntity errorLog = ErrorLogEntity errorLog =
saveErrorLogData( saveErrorLogData(
@@ -273,7 +283,7 @@ public class GlobalExceptionHandler {
public ApiResponseDto<String> handlerDuplicateMemberException( public ApiResponseDto<String> handlerDuplicateMemberException(
MemberException.DuplicateMemberException e, HttpServletRequest request) { MemberException.DuplicateMemberException e, HttpServletRequest request) {
log.warn("[DuplicateMemberException] resource :{} ", e.getMessage()); log.warn("[DuplicateMemberException] resource :{} ", e.getMessage());
this.errorLog(request, e);
String codeName = ""; String codeName = "";
switch (e.getField()) { switch (e.getField()) {
@@ -305,7 +315,7 @@ public class GlobalExceptionHandler {
public ApiResponseDto<String> handlerMemberNotFoundException( public ApiResponseDto<String> handlerMemberNotFoundException(
MemberException.MemberNotFoundException e, HttpServletRequest request) { MemberException.MemberNotFoundException e, HttpServletRequest request) {
log.warn("[MemberNotFoundException] resource :{} ", e.getMessage()); log.warn("[MemberNotFoundException] resource :{} ", e.getMessage());
this.errorLog(request, e);
String codeName = "NOT_FOUND_USER"; String codeName = "NOT_FOUND_USER";
ErrorLogEntity errorLog = ErrorLogEntity errorLog =
@@ -328,7 +338,7 @@ public class GlobalExceptionHandler {
public ApiResponseDto<String> handlerDuplicateKeyException( public ApiResponseDto<String> handlerDuplicateKeyException(
DuplicateKeyException e, HttpServletRequest request) { DuplicateKeyException e, HttpServletRequest request) {
log.warn("[DuplicateKeyException] resource :{} ", e.getMessage()); log.warn("[DuplicateKeyException] resource :{} ", e.getMessage());
this.errorLog(request, e);
String codeName = "DUPLICATE_DATA"; String codeName = "DUPLICATE_DATA";
ErrorLogEntity errorLog = ErrorLogEntity errorLog =
@@ -350,7 +360,7 @@ public class GlobalExceptionHandler {
public ResponseEntity<ApiResponseDto<String>> handleBadCredentials( public ResponseEntity<ApiResponseDto<String>> handleBadCredentials(
BadCredentialsException e, HttpServletRequest request) { BadCredentialsException e, HttpServletRequest request) {
log.warn("[BadCredentialsException] resource : {} ", e.getMessage()); log.warn("[BadCredentialsException] resource : {} ", e.getMessage());
this.errorLog(request, e);
String codeName = "UNAUTHORIZED"; String codeName = "UNAUTHORIZED";
ErrorLogEntity errorLog = ErrorLogEntity errorLog =
@@ -377,7 +387,7 @@ public class GlobalExceptionHandler {
public ApiResponseDto<String> handlerRuntimeException( public ApiResponseDto<String> handlerRuntimeException(
RuntimeException e, HttpServletRequest request) { RuntimeException e, HttpServletRequest request) {
log.warn("[RuntimeException] resource :{} ", e.getMessage()); log.warn("[RuntimeException] resource :{} ", e.getMessage());
this.errorLog(request, e);
String codeName = "INTERNAL_SERVER_ERROR"; String codeName = "INTERNAL_SERVER_ERROR";
ErrorLogEntity errorLog = ErrorLogEntity errorLog =
saveErrorLogData( saveErrorLogData(
@@ -397,8 +407,7 @@ public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class) @ExceptionHandler(Exception.class)
public ApiResponseDto<String> handlerException(Exception e, HttpServletRequest request) { public ApiResponseDto<String> handlerException(Exception e, HttpServletRequest request) {
log.error("[Exception] resource: {}, message: {}", request.getRequestURI(), e.getMessage()); this.errorLog(request, e);
log.error("Exception stacktrace: ", e);
String codeName = "INTERNAL_SERVER_ERROR"; String codeName = "INTERNAL_SERVER_ERROR";
ErrorLogEntity errorLog = ErrorLogEntity errorLog =
@@ -454,8 +463,7 @@ public class GlobalExceptionHandler {
String stackTraceStr = String stackTraceStr =
Arrays.stream(stackTrace) Arrays.stream(stackTrace)
.map(StackTraceElement::toString) .map(StackTraceElement::toString)
.collect(Collectors.joining("\n")) .collect(Collectors.joining("\n"));
.substring(0, Math.min(stackTrace.length, 255));
ErrorLogEntity errorLogEntity = ErrorLogEntity errorLogEntity =
new ErrorLogEntity( new ErrorLogEntity(
@@ -475,7 +483,7 @@ public class GlobalExceptionHandler {
public ApiResponseDto<String> handleCustomApiException( public ApiResponseDto<String> handleCustomApiException(
CustomApiException e, HttpServletRequest request) { CustomApiException e, HttpServletRequest request) {
log.warn("[CustomApiException] resource : {}", e.getMessage()); log.warn("[CustomApiException] resource : {}", e.getMessage());
this.errorLog(request, e);
String codeName = e.getCodeName(); String codeName = e.getCodeName();
HttpStatus status = e.getStatus(); HttpStatus status = e.getStatus();
// String message = e.getMessage() == null ? ApiResponseCode.getMessage(codeName) : // String message = e.getMessage() == null ? ApiResponseCode.getMessage(codeName) :
@@ -512,6 +520,7 @@ public class GlobalExceptionHandler {
public ApiResponseDto<String> handleMaxUploadSizeExceeded( public ApiResponseDto<String> handleMaxUploadSizeExceeded(
MaxUploadSizeExceededException e, HttpServletRequest request) { MaxUploadSizeExceededException e, HttpServletRequest request) {
log.warn("[MaxUploadSizeExceededException] resource :{} ", e.getMessage()); log.warn("[MaxUploadSizeExceededException] resource :{} ", e.getMessage());
this.errorLog(request, e);
ApiResponseCode code = ApiResponseCode.PAYLOAD_TOO_LARGE; ApiResponseCode code = ApiResponseCode.PAYLOAD_TOO_LARGE;
ErrorLogEntity errorLog = ErrorLogEntity errorLog =
saveErrorLogData( saveErrorLogData(
@@ -524,4 +533,15 @@ public class GlobalExceptionHandler {
return ApiResponseDto.createException( return ApiResponseDto.createException(
code, code.getText(), HttpStatus.PAYLOAD_TOO_LARGE, errorLog.getId()); code, code.getText(), HttpStatus.PAYLOAD_TOO_LARGE, errorLog.getId());
} }
private void errorLog(HttpServletRequest request, Throwable e) {
String uri = request != null ? request.getRequestURI() : "N/A";
// 예외 타입명 (IllegalArgumentException, BadCredentialsException 등)
String exceptionName = e.getClass().getSimpleName();
log.error("[{}] uri={}, message={}", exceptionName, uri, e.getMessage());
log.error("[{}] stacktrace", exceptionName, e);
}
} }

View File

@@ -15,7 +15,6 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@@ -29,8 +28,7 @@ import org.springframework.web.bind.annotation.RestController;
public class MenuApiController { public class MenuApiController {
private final MenuService menuService; private final MenuService menuService;
private final ObjectMapper objectMapper;
@Autowired private ObjectMapper objectMapper;
@Operation(summary = "목록 조회", description = "모든 메뉴 조회") @Operation(summary = "목록 조회", description = "모든 메뉴 조회")
@ApiResponses( @ApiResponses(

View File

@@ -4,15 +4,16 @@ import com.kamco.cd.kamcoback.config.api.ApiResponseDto;
import com.kamco.cd.kamcoback.model.dto.ModelMngDto; import com.kamco.cd.kamcoback.model.dto.ModelMngDto;
import com.kamco.cd.kamcoback.model.service.ModelMngService; import com.kamco.cd.kamcoback.model.service.ModelMngService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.transaction.Transactional; import jakarta.transaction.Transactional;
import java.time.LocalDate; import java.time.LocalDate;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@Tag(name = "모델 관리", description = "모델 관리 API") @Tag(name = "모델 관리", description = "모델 관리 API")
@RequiredArgsConstructor @RequiredArgsConstructor
@@ -40,4 +41,28 @@ public class ModelMngApiController {
return ApiResponseDto.ok(result); return ApiResponseDto.ok(result);
} }
@Operation(summary = "삭제", description = "모델을 삭제 합니다.")
@ApiResponses(
value = {
@ApiResponse(
responseCode = "204",
description = "모델 삭제 성공",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = Long.class))),
@ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content),
@ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content),
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
})
@DeleteMapping("/{modelVer}")
public ApiResponseDto<ApiResponseDto.ResponseObj> removeModel(
@io.swagger.v3.oas.annotations.parameters.RequestBody(
description = "모델 삭제 요청 정보",
required = true)
@PathVariable
String modelVer) {
return ApiResponseDto.okObject(modelMngService.removeModel(modelVer));
}
} }

View File

@@ -69,10 +69,10 @@ public class ModelMngDto {
public static class ModelList { public static class ModelList {
private Integer rowNum; private Integer rowNum;
private String modelVer; private String modelVer;
private String dockerFileNm; private String fileName;
private String modelType; private String modelType;
private String createCompleteDttm; private String createCompleteDttm;
private String recentUseDttm; // TODO: 추론관리 테이블 나오면 분석진행중일 때 사용중으로 리턴하기 private String recentUseDttm;
private BigDecimal f1Score; private BigDecimal f1Score;
private BigDecimal precision; private BigDecimal precision;
private BigDecimal recall; private BigDecimal recall;

View File

@@ -1,5 +1,6 @@
package com.kamco.cd.kamcoback.model.service; package com.kamco.cd.kamcoback.model.service;
import com.kamco.cd.kamcoback.config.api.ApiResponseDto;
import com.kamco.cd.kamcoback.model.dto.ModelMngDto; import com.kamco.cd.kamcoback.model.dto.ModelMngDto;
import com.kamco.cd.kamcoback.postgres.core.ModelMngCoreService; import com.kamco.cd.kamcoback.postgres.core.ModelMngCoreService;
import java.time.LocalDate; import java.time.LocalDate;
@@ -22,4 +23,8 @@ public class ModelMngService {
return modelMngCoreService.findModelMgmtList( return modelMngCoreService.findModelMgmtList(
searchReq, startDate, endDate, modelType, searchVal); searchReq, startDate, endDate, modelType, searchVal);
} }
public ApiResponseDto.ResponseObj removeModel(String modelVer) {
return modelMngCoreService.removeModel(modelVer);
}
} }

View File

@@ -1,7 +1,10 @@
package com.kamco.cd.kamcoback.postgres.core; package com.kamco.cd.kamcoback.postgres.core;
import com.kamco.cd.kamcoback.config.api.ApiResponseDto;
import com.kamco.cd.kamcoback.model.dto.ModelMngDto; import com.kamco.cd.kamcoback.model.dto.ModelMngDto;
import com.kamco.cd.kamcoback.postgres.entity.ModelMngEntity;
import com.kamco.cd.kamcoback.postgres.repository.model.ModelMngRepository; import com.kamco.cd.kamcoback.postgres.repository.model.ModelMngRepository;
import jakarta.persistence.EntityNotFoundException;
import java.time.LocalDate; import java.time.LocalDate;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
@@ -22,4 +25,15 @@ public class ModelMngCoreService {
return modelMngRepository.findModelMgmtList( return modelMngRepository.findModelMgmtList(
searchReq, startDate, endDate, modelType, searchVal); searchReq, startDate, endDate, modelType, searchVal);
} }
public ApiResponseDto.ResponseObj removeModel(String modelVer) {
ModelMngEntity entity =
modelMngRepository
.findByModelUid(modelVer)
.orElseThrow(() -> new EntityNotFoundException("model을 찾을 수 없습니다. ver: " + modelVer));
// id 코드 deleted = true 업데이트
entity.deleted();
return new ApiResponseDto.ResponseObj(ApiResponseDto.ApiResponseCode.OK, "");
}
} }

View File

@@ -4,7 +4,6 @@ import com.kamco.cd.kamcoback.log.dto.ErrorLogDto;
import com.kamco.cd.kamcoback.log.dto.EventType; import com.kamco.cd.kamcoback.log.dto.EventType;
import com.kamco.cd.kamcoback.postgres.CommonCreateEntity; import com.kamco.cd.kamcoback.postgres.CommonCreateEntity;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.Size;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
@@ -33,8 +32,7 @@ public class ErrorLogEntity extends CommonCreateEntity {
private String errorCode; private String errorCode;
private String errorMessage; private String errorMessage;
@Size(max = 255) @Column(name = "stack_trace", columnDefinition = "TEXT")
@Column(name = "stack_trace")
private String stackTrace; private String stackTrace;
private Long handlerUid; private Long handlerUid;

View File

@@ -19,15 +19,6 @@ public class ModelMngEntity extends CommonDateEntity {
@Column(name = "model_ver") @Column(name = "model_ver")
private String modelVer; private String modelVer;
@Column(name = "hyper_ver")
private String hyperVer;
@Column(name = "epoch_ver")
private String epochVer;
@Column(name = "docker_file_nm")
private String dockerFileNm;
@Column(name = "create_complete_dttm") @Column(name = "create_complete_dttm")
private ZonedDateTime createCompleteDttm; private ZonedDateTime createCompleteDttm;
@@ -42,4 +33,17 @@ public class ModelMngEntity extends CommonDateEntity {
@Column(name = "updated_uid") @Column(name = "updated_uid")
private Long updatedUid; private Long updatedUid;
@Column(name = "model_type")
private String modelType;
@Column(name = "file_path")
private String filePath;
@Column(name = "file_name")
private String fileName;
public void deleted() {
this.deleted = true;
}
} }

View File

@@ -6,9 +6,7 @@ import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetMngEntity.mapSheet
import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetMngFileEntity.mapSheetMngFileEntity; import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetMngFileEntity.mapSheetMngFileEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetMngHstEntity.mapSheetMngHstEntity; import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetMngHstEntity.mapSheetMngHstEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QYearEntity.yearEntity; import static com.kamco.cd.kamcoback.postgres.entity.QYearEntity.yearEntity;
import static java.lang.String.CASE_INSENSITIVE_ORDER;
import com.kamco.cd.kamcoback.common.utils.FIleChecker.Folder;
import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto; import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto;
import com.kamco.cd.kamcoback.postgres.entity.MapSheetMngHstEntity; import com.kamco.cd.kamcoback.postgres.entity.MapSheetMngHstEntity;
import com.querydsl.core.BooleanBuilder; import com.querydsl.core.BooleanBuilder;
@@ -22,9 +20,7 @@ import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext; import jakarta.persistence.PersistenceContext;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import java.time.LocalDate;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@@ -181,14 +177,13 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport
queryFactory queryFactory
.select(yearEntity.yyyy) .select(yearEntity.yyyy)
.from(yearEntity) .from(yearEntity)
.leftJoin(mapSheetMngEntity).on(mapSheetMngEntity.mngYyyy.eq(yearEntity.yyyy)) .leftJoin(mapSheetMngEntity)
.on(mapSheetMngEntity.mngYyyy.eq(yearEntity.yyyy))
.where(yearEntity.status.eq("NOTYET")) .where(yearEntity.status.eq("NOTYET"))
.orderBy(yearEntity.yyyy.asc()) .orderBy(yearEntity.yyyy.asc())
.limit(10) .limit(10)
.fetch(); .fetch();
foundContent.sort(Comparator.reverseOrder()); foundContent.sort(Comparator.reverseOrder());
return foundContent; return foundContent;

View File

@@ -1,7 +1,9 @@
package com.kamco.cd.kamcoback.postgres.repository.model; package com.kamco.cd.kamcoback.postgres.repository.model;
import com.kamco.cd.kamcoback.model.dto.ModelMngDto; import com.kamco.cd.kamcoback.model.dto.ModelMngDto;
import com.kamco.cd.kamcoback.postgres.entity.ModelMngEntity;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.Optional;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
public interface ModelMngRepositoryCustom { public interface ModelMngRepositoryCustom {
@@ -12,4 +14,6 @@ public interface ModelMngRepositoryCustom {
LocalDate endDate, LocalDate endDate,
String modelType, String modelType,
String searchVal); String searchVal);
Optional<ModelMngEntity> findByModelUid(String modelVer);
} }

View File

@@ -9,10 +9,7 @@ import com.kamco.cd.kamcoback.postgres.entity.ModelMngEntity;
import com.querydsl.core.BooleanBuilder; import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.Expression; import com.querydsl.core.types.Expression;
import com.querydsl.core.types.Projections; import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.*;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.dsl.NumberPath;
import com.querydsl.core.types.dsl.StringExpression;
import com.querydsl.jpa.impl.JPAQueryFactory; import com.querydsl.jpa.impl.JPAQueryFactory;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
@@ -21,6 +18,7 @@ import java.time.ZoneId;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
@@ -68,16 +66,9 @@ public class ModelMngRepositoryImpl extends QuerydslRepositorySupport
ModelMngDto.ModelList.class, ModelMngDto.ModelList.class,
Expressions.numberTemplate( Expressions.numberTemplate(
Integer.class, "row_number() over(order by {0} desc)", sortColumn), Integer.class, "row_number() over(order by {0} desc)", sortColumn),
Expressions.stringTemplate(
"concat({0}, {1}, {2}, {3}, {4})",
modelMngEntity.modelVer, modelMngEntity.modelVer,
".", modelMngEntity.fileName,
modelMngEntity.hyperVer, modelMngEntity.modelType,
".",
modelMngEntity.epochVer)
.as("modelVer"),
modelMngEntity.dockerFileNm,
modelMngEntity.modelVer.as("modelType"),
Expressions.stringTemplate( Expressions.stringTemplate(
"to_char({0}, 'YYYY-MM-DD')", modelMngEntity.createCompleteDttm), "to_char({0}, 'YYYY-MM-DD')", modelMngEntity.createCompleteDttm),
Expressions.stringTemplate( Expressions.stringTemplate(
@@ -93,7 +84,8 @@ public class ModelMngRepositoryImpl extends QuerydslRepositorySupport
.on(modelMngEntity.modelUid.eq(modelResultMetricEntity.modelUid)) .on(modelMngEntity.modelUid.eq(modelResultMetricEntity.modelUid))
.where( .where(
eventEndedAtBetween(startDate, endDate, property), eventEndedAtBetween(startDate, endDate, property),
searchModelVersion(modelType, searchVal)) searchModelVersion(modelType, searchVal),
modelMngEntity.deleted.isFalse().or(modelMngEntity.deleted.isNull()))
.offset(pageable.getOffset()) .offset(pageable.getOffset())
.limit(pageable.getPageSize()) .limit(pageable.getPageSize())
.orderBy( .orderBy(
@@ -113,6 +105,15 @@ public class ModelMngRepositoryImpl extends QuerydslRepositorySupport
return new PageImpl<>(foundContent, pageable, countQuery); return new PageImpl<>(foundContent, pageable, countQuery);
} }
@Override
public Optional<ModelMngEntity> findByModelUid(String modelVer) {
return Optional.ofNullable(
queryFactory
.selectFrom(modelMngEntity)
.where(modelMngEntity.modelVer.eq(modelVer))
.fetchOne());
}
private BooleanExpression eventEndedAtBetween( private BooleanExpression eventEndedAtBetween(
LocalDate startDate, LocalDate endDate, String sortColumn) { LocalDate startDate, LocalDate endDate, String sortColumn) {
if (Objects.isNull(startDate) || Objects.isNull(endDate)) { if (Objects.isNull(startDate) || Objects.isNull(endDate)) {
@@ -139,11 +140,11 @@ public class ModelMngRepositoryImpl extends QuerydslRepositorySupport
BooleanBuilder builder = new BooleanBuilder(); BooleanBuilder builder = new BooleanBuilder();
if (Objects.nonNull(modelType)) { if (Objects.nonNull(modelType)) {
builder.and(modelMngEntity.modelVer.eq(modelType)); builder.and(modelMngEntity.modelType.eq(modelType));
} }
if (Objects.nonNull(searchVal)) { if (Objects.nonNull(searchVal)) {
builder.and(modelMngEntity.dockerFileNm.likeIgnoreCase("%" + searchVal + "%")); builder.and(modelMngEntity.modelVer.likeIgnoreCase("%" + searchVal + "%"));
} }
return builder; return builder;