diff --git a/.gitignore b/.gitignore index 8fed8d34..db9bd29a 100644 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,4 @@ docker-compose.override.yml *.swp *.swo *~ +!/CLAUDE.md diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml index b36438cb..107547b6 100644 --- a/docker-compose-dev.yml +++ b/docker-compose-dev.yml @@ -10,11 +10,15 @@ services: environment: - SPRING_PROFILES_ACTIVE=dev - TZ=Asia/Seoul + volumes: + - /mnt/nfs_share/images:/app/original-images + - /mnt/nfs_share/model_output:/app/model-outputs + - /mnt/nfs_share/train_dataset:/app/train-dataset networks: - kamco-cds restart: unless-stopped healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/monitor/health"] + test: [ "CMD", "curl", "-f", "http://localhost:8080/monitor/health" ] interval: 10s timeout: 5s retries: 5 diff --git a/src/main/java/com/kamco/cd/kamcoback/common/api/NfsTestApiController.java b/src/main/java/com/kamco/cd/kamcoback/common/api/NfsTestApiController.java new file mode 100644 index 00000000..c4bf90cd --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/common/api/NfsTestApiController.java @@ -0,0 +1,94 @@ +package com.kamco.cd.kamcoback.common.api; + +import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Slf4j +@RestController +@RequestMapping("/api/nfs-test") +public class NfsTestApiController { + + private static final String ORIGINAL_IMAGES_PATH = "/app/original-images"; + private static final String MODEL_OUTPUTS_PATH = "/app/model-outputs"; + private static final String TRAIN_DATASET_PATH = "/app/train-dataset"; + + @GetMapping("/original-images") + public Map listOriginalImages() { + return listDirectory(ORIGINAL_IMAGES_PATH); + } + + @GetMapping("/model-outputs") + public Map listModelOutputs() { + return listDirectory(MODEL_OUTPUTS_PATH); + } + + @GetMapping("/train-dataset") + public Map listTrainDataset() { + return listDirectory(TRAIN_DATASET_PATH); + } + + @GetMapping("/all") + public Map listAllDirectories() { + Map result = new HashMap<>(); + result.put("originalImages", listDirectory(ORIGINAL_IMAGES_PATH)); + result.put("modelOutputs", listDirectory(MODEL_OUTPUTS_PATH)); + result.put("trainDataset", listDirectory(TRAIN_DATASET_PATH)); + return result; + } + + private Map listDirectory(String directoryPath) { + Map result = new HashMap<>(); + + try { + Path path = Paths.get(directoryPath); + File directory = path.toFile(); + + result.put("path", directoryPath); + result.put("exists", directory.exists()); + result.put("isDirectory", directory.isDirectory()); + result.put("canRead", directory.canRead()); + result.put("canWrite", directory.canWrite()); + + if (directory.exists() && directory.isDirectory()) { + List> files = new ArrayList<>(); + + File[] fileArray = directory.listFiles(); + if (fileArray != null) { + for (File file : fileArray) { + Map fileInfo = new HashMap<>(); + fileInfo.put("name", file.getName()); + fileInfo.put("isDirectory", file.isDirectory()); + fileInfo.put("size", file.length()); + fileInfo.put("lastModified", file.lastModified()); + fileInfo.put("canRead", file.canRead()); + fileInfo.put("canWrite", file.canWrite()); + files.add(fileInfo); + } + } + + result.put("files", files); + result.put("fileCount", files.size()); + } else { + result.put("files", new ArrayList<>()); + result.put("fileCount", 0); + result.put("error", "Directory does not exist or is not accessible"); + } + + } catch (Exception e) { + log.error("Error listing directory: {}", directoryPath, e); + result.put("error", e.getMessage()); + result.put("exception", e.getClass().getSimpleName()); + } + + return result; + } +}