fix: [bending] Docker 환경 API 호출 시 internal_url 미사용 500 에러 수정

BendingBaseController, BendingProductController, FileViewController,
DocumentTemplateController에서 API_INTERNAL_URL 미적용으로 Docker 내부
api.sam.kr 연결 실패하던 문제 수정
This commit is contained in:
김보곤
2026-03-21 09:32:45 +09:00
parent 861c9c1cfb
commit 72a1075ef2
4 changed files with 73 additions and 31 deletions

View File

@@ -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 {