diff --git a/app/Http/Controllers/BendingBaseController.php b/app/Http/Controllers/BendingBaseController.php index e43bb7cd..c12bf0ea 100644 --- a/app/Http/Controllers/BendingBaseController.php +++ b/app/Http/Controllers/BendingBaseController.php @@ -11,14 +11,23 @@ class BendingBaseController extends Controller private function api(): \Illuminate\Http\Client\PendingRequest { $baseUrl = config('services.api.base_url', 'https://api.sam.kr'); + $internalUrl = config('services.api.internal_url'); $token = session('api_access_token', ''); + $headers = [ + 'X-API-KEY' => config('services.api.key') ?: '42Jfwc6EaRQ04GNRmLR5kzJp5UudSOzGGqjmdk1a', + 'X-TENANT-ID' => session('selected_tenant_id', 1), + ]; + + // Docker: internal_url(nginx 컨테이너) 경유, Host 헤더로 서버 블록 라우팅 + if ($internalUrl) { + $headers['Host'] = parse_url($baseUrl, PHP_URL_HOST) ?: 'api.sam.kr'; + $baseUrl = $internalUrl; + } + return Http::baseUrl($baseUrl) ->withoutVerifying() - ->withHeaders([ - 'X-API-KEY' => config('services.api.key') ?: '42Jfwc6EaRQ04GNRmLR5kzJp5UudSOzGGqjmdk1a', - 'X-TENANT-ID' => session('selected_tenant_id', 1), - ]) + ->withHeaders($headers) ->withToken($token) ->timeout(10); } @@ -37,7 +46,6 @@ public function index(Request $request): View|\Illuminate\Http\Response 'last_page' => $body['last_page'] ?? 1, ]; - $filterResponse = $this->api()->get('/api/v1/bending-items/filters'); $filterOptions = $filterResponse->successful() ? $filterResponse->json('data', []) : []; @@ -45,6 +53,7 @@ public function index(Request $request): View|\Illuminate\Http\Response if ($request->header('HX-Target') === 'items-table') { return view('bending.base.partials.table', ['items' => $data]); } + return response('', 200)->header('HX-Redirect', route('bending.base.index', $request->query())); } @@ -112,13 +121,14 @@ public function store(Request $request) $apiMessage = $body['message'] ?? 'API 오류'; $errorBag = ['api' => "[{$response->status()}] {$apiMessage}"]; foreach ($apiErrors as $field => $msgs) { - $fieldLabel = match($field) { + $fieldLabel = match ($field) { 'code' => '코드', 'name' => '이름', 'item_sep' => '대분류', 'item_bending' => '분류', 'item_name' => '품명', 'material' => '재질', default => $field, }; - $errorBag["api_{$field}"] = "[{$fieldLabel}] " . (is_array($msgs) ? implode(', ', $msgs) : $msgs); + $errorBag["api_{$field}"] = "[{$fieldLabel}] ".(is_array($msgs) ? implode(', ', $msgs) : $msgs); } + return back()->withErrors($errorBag)->withInput(); } @@ -152,7 +162,6 @@ public function update(Request $request, int $id) 'model_UA.in' => '인정여부는 인정 또는 비인정만 선택 가능합니다.', ]); - $data = $this->prepareApiData($request); $response = $this->api()->put("/api/v1/bending-items/{$id}", $data); @@ -240,7 +249,7 @@ private function uploadCanvasImage(int $itemId, string $dataURL): ?array } // 임시 파일 생성 - $tmpPath = tempnam(sys_get_temp_dir(), 'canvas_') . '.' . $ext; + $tmpPath = tempnam(sys_get_temp_dir(), 'canvas_').'.'.$ext; file_put_contents($tmpPath, $binary); try { diff --git a/app/Http/Controllers/BendingProductController.php b/app/Http/Controllers/BendingProductController.php index 9268c5ab..761aaf8a 100644 --- a/app/Http/Controllers/BendingProductController.php +++ b/app/Http/Controllers/BendingProductController.php @@ -2,7 +2,6 @@ namespace App\Http\Controllers; -use Barryvdh\DomPDF\Facade\Pdf; use Illuminate\Http\Request; use Illuminate\Support\Facades\Http; use Illuminate\View\View; @@ -18,14 +17,22 @@ class BendingProductController extends Controller private function api(): \Illuminate\Http\Client\PendingRequest { $baseUrl = config('services.api.base_url', 'https://api.sam.kr'); + $internalUrl = config('services.api.internal_url'); $token = session('api_access_token', ''); + $headers = [ + 'X-API-KEY' => config('services.api.key') ?: '42Jfwc6EaRQ04GNRmLR5kzJp5UudSOzGGqjmdk1a', + 'X-TENANT-ID' => session('selected_tenant_id', 1), + ]; + + if ($internalUrl) { + $headers['Host'] = parse_url($baseUrl, PHP_URL_HOST) ?: 'api.sam.kr'; + $baseUrl = $internalUrl; + } + return Http::baseUrl($baseUrl) ->withoutVerifying() - ->withHeaders([ - 'X-API-KEY' => config('services.api.key') ?: '42Jfwc6EaRQ04GNRmLR5kzJp5UudSOzGGqjmdk1a', - 'X-TENANT-ID' => session('selected_tenant_id', 1), - ]) + ->withHeaders($headers) ->withToken($token) ->timeout(10); } @@ -51,7 +58,6 @@ public function index(Request $request, string $category = 'GUIDERAIL_MODEL'): V 'last_page' => $body['last_page'] ?? 1, ]; - $filterResponse = $this->api()->get('/api/v1/guiderail-models/filters'); $filterOptions = $filterResponse->successful() ? $filterResponse->json('data', []) : []; @@ -60,6 +66,7 @@ public function index(Request $request, string $category = 'GUIDERAIL_MODEL'): V if ($request->header('HX-Target') === 'items-table') { return view('bending.products.partials.table', ['items' => $data, 'config' => $config, 'category' => $category]); } + // 사이드바 등 그 외 HTMX → 전체 페이지 리로드 return response('', 200)->header('HX-Redirect', route("bending.{$config['prefix']}.index", $request->query())); } @@ -155,8 +162,9 @@ public function store(Request $request, string $category = 'GUIDERAIL_MODEL') $apiMessage = $body['message'] ?? 'API 오류'; $errorBag = ['api' => "[{$response->status()}] {$apiMessage}"]; foreach ($apiErrors as $field => $msgs) { - $errorBag["api_{$field}"] = "[{$field}] " . (is_array($msgs) ? implode(', ', $msgs) : $msgs); + $errorBag["api_{$field}"] = "[{$field}] ".(is_array($msgs) ? implode(', ', $msgs) : $msgs); } + return back()->withErrors($errorBag)->withInput(); } @@ -209,8 +217,9 @@ public function update(Request $request, int $id) $apiMessage = $body['message'] ?? 'API 오류'; $errorBag = ['api' => "[{$response->status()}] {$apiMessage}"]; foreach ($apiErrors as $field => $msgs) { - $errorBag["api_{$field}"] = "[{$field}] " . (is_array($msgs) ? implode(', ', $msgs) : $msgs); + $errorBag["api_{$field}"] = "[{$field}] ".(is_array($msgs) ? implode(', ', $msgs) : $msgs); } + return back()->withErrors($errorBag)->withInput(); } @@ -344,7 +353,7 @@ private function uploadCanvasImage(int $itemId, string $dataURL): ?array return null; } - $tmpPath = tempnam(sys_get_temp_dir(), 'canvas_') . '.' . $ext; + $tmpPath = tempnam(sys_get_temp_dir(), 'canvas_').'.'.$ext; file_put_contents($tmpPath, $binary); try { @@ -375,7 +384,7 @@ private function prepareApiData(Request $request): array if (empty($data['code'])) { $modelName = $data['model_name'] ?? ''; $itemSep = $data['item_sep'] ?? ''; - $data['code'] = trim("{$itemSep}_{$modelName}_" . date('ymd_His')); + $data['code'] = trim("{$itemSep}_{$modelName}_".date('ymd_His')); } if (empty($data['name'])) { $data['name'] = $data['model_name'] ?? $data['code']; diff --git a/app/Http/Controllers/DocumentTemplateController.php b/app/Http/Controllers/DocumentTemplateController.php index d38fcb24..f7f8e2e9 100644 --- a/app/Http/Controllers/DocumentTemplateController.php +++ b/app/Http/Controllers/DocumentTemplateController.php @@ -136,15 +136,23 @@ public function blockEdit(int $id): View private function getPresignedUrlFromApi(int $fileId): ?string { $baseUrl = config('services.api.base_url', 'https://api.sam.kr'); + $internalUrl = config('services.api.internal_url'); $apiKey = config('services.api.key'); $token = session('api_access_token', ''); + $headers = [ + 'X-API-KEY' => $apiKey, + 'X-TENANT-ID' => session('selected_tenant_id', 1), + ]; + + if ($internalUrl) { + $headers['Host'] = parse_url($baseUrl, PHP_URL_HOST) ?: 'api.sam.kr'; + $baseUrl = $internalUrl; + } + $response = \Illuminate\Support\Facades\Http::baseUrl($baseUrl) ->withoutVerifying() - ->withHeaders([ - 'X-API-KEY' => $apiKey, - 'X-TENANT-ID' => session('selected_tenant_id', 1), - ]) + ->withHeaders($headers) ->withToken($token) ->timeout(10) ->get("/api/v1/files/{$fileId}/presigned-url"); @@ -155,15 +163,23 @@ private function getPresignedUrlFromApi(int $fileId): ?string private function getPresignedUrlByPath(string $path): ?string { $baseUrl = config('services.api.base_url', 'https://api.sam.kr'); + $internalUrl = config('services.api.internal_url'); $apiKey = config('services.api.key'); $token = session('api_access_token', ''); + $headers = [ + 'X-API-KEY' => $apiKey, + 'X-TENANT-ID' => session('selected_tenant_id', 1), + ]; + + if ($internalUrl) { + $headers['Host'] = parse_url($baseUrl, PHP_URL_HOST) ?: 'api.sam.kr'; + $baseUrl = $internalUrl; + } + $response = \Illuminate\Support\Facades\Http::baseUrl($baseUrl) ->withoutVerifying() - ->withHeaders([ - 'X-API-KEY' => $apiKey, - 'X-TENANT-ID' => session('selected_tenant_id', 1), - ]) + ->withHeaders($headers) ->withToken($token) ->timeout(10) ->post('/api/v1/files/presigned-url-by-path', ['path' => $path]); diff --git a/app/Http/Controllers/FileViewController.php b/app/Http/Controllers/FileViewController.php index 1ce6fc73..1e15781a 100644 --- a/app/Http/Controllers/FileViewController.php +++ b/app/Http/Controllers/FileViewController.php @@ -19,15 +19,23 @@ public function show(int $id) $url = Cache::remember($cacheKey, now()->addMinutes(5), function () use ($id) { $baseUrl = config('services.api.base_url', 'https://api.sam.kr'); + $internalUrl = config('services.api.internal_url'); $apiKey = config('services.api.key'); $token = session('api_access_token', ''); + $headers = [ + 'X-API-KEY' => $apiKey, + 'X-TENANT-ID' => session('selected_tenant_id', 1), + ]; + + if ($internalUrl) { + $headers['Host'] = parse_url($baseUrl, PHP_URL_HOST) ?: 'api.sam.kr'; + $baseUrl = $internalUrl; + } + $response = Http::baseUrl($baseUrl) ->withoutVerifying() - ->withHeaders([ - 'X-API-KEY' => $apiKey, - 'X-TENANT-ID' => session('selected_tenant_id', 1), - ]) + ->withHeaders($headers) ->withToken($token) ->timeout(10) ->get("/api/v1/files/{$id}/presigned-url");