diff --git a/dap-gateway/src/main/java/io/shinhanlife/dap/mcg/presentation/ScaffoldingController.java b/dap-gateway/src/main/java/io/shinhanlife/dap/mcg/presentation/ScaffoldingController.java index e1e5448e..21b00739 100644 --- a/dap-gateway/src/main/java/io/shinhanlife/dap/mcg/presentation/ScaffoldingController.java +++ b/dap-gateway/src/main/java/io/shinhanlife/dap/mcg/presentation/ScaffoldingController.java @@ -155,6 +155,21 @@ public class ScaffoldingController { .sorted().toList(); } + @GetMapping("/categories") + public List listCategories(@RequestParam String moduleName) { + if (moduleName == null || !moduleName.matches("^dap-was-[a-z0-9-]+$")) { + throw new IllegalArgumentException("Invalid target module."); + } + String sourceDir = System.getenv("AXHUB_SOURCE_DIR"); + if (sourceDir == null || sourceDir.isBlank()) sourceDir = System.getProperty("user.dir"); + File bizDir = new File(sourceDir, moduleName + "/src/main/java/io/shinhanlife/dap/mcc/biz"); + File[] dirs = bizDir.listFiles(File::isDirectory); + if (dirs == null) return List.of(); + return Arrays.stream(dirs).map(File::getName) + .filter(name -> name.matches("^[a-z0-9]{3}$")) + .sorted().toList(); + } + @PostMapping("/field-draft") public ResponseEntity generateFieldDraft(@RequestBody Map req) { String description = req.getOrDefault("description", "").trim(); diff --git a/dap-gateway/src/main/resources/static/admin/scaffold.html b/dap-gateway/src/main/resources/static/admin/scaffold.html index c334afd3..ec270593 100644 --- a/dap-gateway/src/main/resources/static/admin/scaffold.html +++ b/dap-gateway/src/main/resources/static/admin/scaffold.html @@ -824,6 +824,50 @@
+
+
+ + +
Destination Pod directory.
+
+
+ + +
Controls dynamic routing exposure.
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ + +
+
@@ -920,26 +964,6 @@
-
-
- - - - - - - - - -
-
- - -
-
@@ -977,27 +1001,6 @@
-
-
- - -
Destination Pod directory.
-
-
- - -
Controls dynamic routing exposure.
-
-
@@ -1483,6 +1486,9 @@ if (modules && modules.length > 0) { select.innerHTML = modules.map(m => ``).join(''); } + if (typeof loadCategoriesForSelection === 'function') { + loadCategoriesForSelection(); + } }) .catch(err => console.error('Failed to load modules:', err)); }); @@ -1569,8 +1575,37 @@ } } - document.querySelector('#toolForm [name="categoryKey"]').addEventListener('change', loadUseCasesForSelection); - document.getElementById('targetModuleSelect').addEventListener('change', loadUseCasesForSelection); + async function loadCategoriesForSelection() { + const moduleName = document.getElementById('targetModuleSelect').value; + const select = document.getElementById('domainCategorySelect'); + const nameInput = document.getElementById('domainCategoryName'); + select.innerHTML = ''; + try { + const response = await fetch(`/api/v1/scaffold/categories?moduleName=${encodeURIComponent(moduleName)}`); + if (!response.ok) throw new Error('Category 목록 조회 실패'); + const categories = await response.json(); + categories.forEach(cat => select.add(new Option(`기존 ${cat} 도메인`, cat))); + } catch (error) { + console.warn(error); + } + nameInput.value = ''; + nameInput.readOnly = false; + loadUseCasesForSelection(); + } + + document.getElementById('domainCategoryName').addEventListener('input', loadUseCasesForSelection); + document.getElementById('targetModuleSelect').addEventListener('change', loadCategoriesForSelection); + document.getElementById('domainCategorySelect').addEventListener('change', function() { + const nameInput = document.getElementById('domainCategoryName'); + if (this.value) { + nameInput.value = this.value; + nameInput.readOnly = true; + } else { + nameInput.value = ''; + nameInput.readOnly = false; + } + loadUseCasesForSelection(); + }); document.getElementById('toolGroupUseCaseSelect').addEventListener('change', function() { const nameInput = document.getElementById('toolGroupUseCaseName'); if (this.value) {