feat: [api-explorer] Phase 1 기본 구조 및 OpenAPI 파싱 구현

- Config, Service, Controller, View 생성
- Model 4개 (admin_api_* 테이블 참조)
- 3-Panel 레이아웃 (sidebar, request, response)
- HTMX 기반 동적 UI
- 마이그레이션은 api/ 프로젝트에서 관리
This commit is contained in:
2025-12-17 22:06:28 +09:00
parent 6b3d13aced
commit fbd4fb728e
16 changed files with 2805 additions and 5 deletions

View File

@@ -1,11 +1,17 @@
<?php
use App\Http\Controllers\ApiLogController;
use App\Http\Controllers\ArchivedRecordController;
use App\Http\Controllers\Auth\LoginController;
use App\Http\Controllers\BoardController;
use App\Http\Controllers\DailyLogController;
use App\Http\Controllers\DepartmentController;
use App\Http\Controllers\DevTools\ApiExplorerController;
use App\Http\Controllers\DevTools\FlowTesterController;
use App\Http\Controllers\ItemFieldController;
use App\Http\Controllers\Lab\AIController;
use App\Http\Controllers\Lab\ManagementController;
use App\Http\Controllers\Lab\StrategyController;
use App\Http\Controllers\MenuController;
use App\Http\Controllers\PermissionController;
use App\Http\Controllers\PostController;
@@ -15,11 +21,6 @@
use App\Http\Controllers\RoleController;
use App\Http\Controllers\RolePermissionController;
use App\Http\Controllers\TenantController;
use App\Http\Controllers\ItemFieldController;
use App\Http\Controllers\ApiLogController;
use App\Http\Controllers\Lab\AIController;
use App\Http\Controllers\Lab\ManagementController;
use App\Http\Controllers\Lab\StrategyController;
use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;
@@ -294,5 +295,45 @@
Route::post('/{id}/run', [FlowTesterController::class, 'run'])->name('run');
Route::get('/{id}/history', [FlowTesterController::class, 'history'])->name('history');
});
// API Explorer (OpenAPI 3.0 뷰어)
Route::prefix('api-explorer')->name('api-explorer.')->group(function () {
// 메인 뷰
Route::get('/', [ApiExplorerController::class, 'index'])->name('index');
// 엔드포인트 (HTMX)
Route::get('/endpoints', [ApiExplorerController::class, 'endpoints'])->name('endpoints');
Route::get('/endpoints/{operationId}', [ApiExplorerController::class, 'endpoint'])->name('endpoint');
// API 실행
Route::post('/execute', [ApiExplorerController::class, 'execute'])->name('execute');
// 즐겨찾기
Route::get('/bookmarks', [ApiExplorerController::class, 'bookmarks'])->name('bookmarks.index');
Route::post('/bookmarks', [ApiExplorerController::class, 'storeBookmark'])->name('bookmarks.store');
Route::put('/bookmarks/{id}', [ApiExplorerController::class, 'updateBookmark'])->name('bookmarks.update');
Route::delete('/bookmarks/{id}', [ApiExplorerController::class, 'deleteBookmark'])->name('bookmarks.destroy');
Route::post('/bookmarks/toggle', [ApiExplorerController::class, 'toggleBookmark'])->name('bookmarks.toggle');
Route::post('/bookmarks/reorder', [ApiExplorerController::class, 'reorderBookmarks'])->name('bookmarks.reorder');
// 템플릿
Route::get('/templates/{endpoint}', [ApiExplorerController::class, 'templates'])->name('templates.index');
Route::post('/templates', [ApiExplorerController::class, 'storeTemplate'])->name('templates.store');
Route::put('/templates/{id}', [ApiExplorerController::class, 'updateTemplate'])->name('templates.update');
Route::delete('/templates/{id}', [ApiExplorerController::class, 'deleteTemplate'])->name('templates.destroy');
// 히스토리
Route::get('/history', [ApiExplorerController::class, 'history'])->name('history.index');
Route::get('/history/{id}', [ApiExplorerController::class, 'historyDetail'])->name('history.show');
Route::post('/history/{id}/replay', [ApiExplorerController::class, 'replayHistory'])->name('history.replay');
Route::delete('/history/{id}', [ApiExplorerController::class, 'deleteHistory'])->name('history.destroy');
Route::delete('/history', [ApiExplorerController::class, 'clearHistory'])->name('history.clear');
// 환경 설정
Route::get('/environments', [ApiExplorerController::class, 'environments'])->name('environments.index');
Route::post('/environments', [ApiExplorerController::class, 'storeEnvironment'])->name('environments.store');
Route::put('/environments/{id}', [ApiExplorerController::class, 'updateEnvironment'])->name('environments.update');
Route::delete('/environments/{id}', [ApiExplorerController::class, 'deleteEnvironment'])->name('environments.destroy');
});
});
});