diff --git a/app/Http/Controllers/ESign/EsignApiController.php b/app/Http/Controllers/ESign/EsignApiController.php index 42986f1f..f9777232 100644 --- a/app/Http/Controllers/ESign/EsignApiController.php +++ b/app/Http/Controllers/ESign/EsignApiController.php @@ -12,6 +12,7 @@ use App\Models\ESign\EsignSignField; use App\Models\ESign\EsignAuditLog; use App\Models\Tenants\TenantSetting; +use App\Services\GoogleCloudStorageService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; @@ -32,24 +33,21 @@ public function getStamp(): JsonResponse ->where('setting_key', 'company_stamp') ->first(); - if (!$setting || empty($setting->setting_value['image_path'])) { + if (!$setting || empty($setting->setting_value['gcs_object'])) { return response()->json(['success' => true, 'data' => null]); } - $path = $setting->setting_value['image_path']; - if (!Storage::disk('local')->exists($path)) { + $gcs = app(GoogleCloudStorageService::class); + $signedUrl = $gcs->getSignedUrl($setting->setting_value['gcs_object'], 60); + + if (!$signedUrl) { return response()->json(['success' => true, 'data' => null]); } - $content = Storage::disk('local')->get($path); - $mime = Storage::disk('local')->mimeType($path) ?: 'image/png'; - $dataUrl = 'data:' . $mime . ';base64,' . base64_encode($content); - return response()->json([ 'success' => true, 'data' => [ - 'image_path' => $path, - 'image_url' => $dataUrl, + 'image_url' => $signedUrl, ], ]); } @@ -70,14 +68,31 @@ public function uploadStamp(Request $request): JsonResponse return response()->json(['success' => false, 'message' => '이미지 데이터가 올바르지 않습니다.'], 422); } - $path = "esign/{$tenantId}/stamps/company_stamp.png"; - - // 기존 파일이 있으면 삭제 - if (Storage::disk('local')->exists($path)) { - Storage::disk('local')->delete($path); + $gcs = app(GoogleCloudStorageService::class); + if (!$gcs->isAvailable()) { + return response()->json(['success' => false, 'message' => 'GCS 설정이 되어 있지 않습니다.'], 500); } - Storage::disk('local')->put($path, $imageData); + // 기존 GCS 파일 삭제 + $existing = TenantSetting::where('tenant_id', $tenantId) + ->where('setting_group', 'esign') + ->where('setting_key', 'company_stamp') + ->first(); + if ($existing && !empty($existing->setting_value['gcs_object'])) { + $gcs->delete($existing->setting_value['gcs_object']); + } + + // 임시 파일에 저장 후 GCS 업로드 + $tmpFile = tempnam(sys_get_temp_dir(), 'stamp_'); + file_put_contents($tmpFile, $imageData); + + $gcsObject = "esign/{$tenantId}/stamps/company_stamp.png"; + $gcsUri = $gcs->upload($tmpFile, $gcsObject); + unlink($tmpFile); + + if (!$gcsUri) { + return response()->json(['success' => false, 'message' => 'GCS 업로드에 실패했습니다.'], 500); + } TenantSetting::updateOrCreate( [ @@ -86,20 +101,18 @@ public function uploadStamp(Request $request): JsonResponse 'setting_key' => 'company_stamp', ], [ - 'setting_value' => ['image_path' => $path], + 'setting_value' => ['gcs_object' => $gcsObject], 'updated_by' => auth()->id(), ] ); - $mime = Storage::disk('local')->mimeType($path) ?: 'image/png'; - $dataUrl = 'data:' . $mime . ';base64,' . base64_encode($imageData); + $signedUrl = $gcs->getSignedUrl($gcsObject, 60); return response()->json([ 'success' => true, 'message' => '법인도장이 등록되었습니다.', 'data' => [ - 'image_path' => $path, - 'image_url' => $dataUrl, + 'image_url' => $signedUrl, ], ]); } @@ -116,9 +129,10 @@ public function deleteStamp(): JsonResponse ->first(); if ($setting) { - $path = $setting->setting_value['image_path'] ?? null; - if ($path && Storage::disk('local')->exists($path)) { - Storage::disk('local')->delete($path); + $gcsObject = $setting->setting_value['gcs_object'] ?? null; + if ($gcsObject) { + $gcs = app(GoogleCloudStorageService::class); + $gcs->delete($gcsObject); } $setting->delete(); } @@ -287,22 +301,30 @@ public function store(Request $request): JsonResponse ]); } - // 법인도장 자동 적용: tenant_settings에 등록된 도장이 있으면 creator signer에 설정 + // 법인도장 자동 적용: GCS에서 다운로드 → 로컬 저장 → signer에 설정 $stampSetting = TenantSetting::where('tenant_id', $tenantId) ->where('setting_group', 'esign') ->where('setting_key', 'company_stamp') ->first(); - if ($stampSetting && !empty($stampSetting->setting_value['image_path'])) { + if ($stampSetting && !empty($stampSetting->setting_value['gcs_object'])) { $creatorSigner = EsignSigner::withoutGlobalScopes() ->where('contract_id', $contract->id) ->where('role', 'creator') ->first(); if ($creatorSigner) { - $creatorSigner->update([ - 'signature_image_path' => $stampSetting->setting_value['image_path'], - ]); + $gcs = app(GoogleCloudStorageService::class); + $signedUrl = $gcs->getSignedUrl($stampSetting->setting_value['gcs_object'], 5); + + if ($signedUrl) { + $imageData = @file_get_contents($signedUrl); + if ($imageData) { + $localPath = "esign/{$tenantId}/signatures/{$contract->id}_{$creatorSigner->id}_stamp.png"; + Storage::disk('local')->put($localPath, $imageData); + $creatorSigner->update(['signature_image_path' => $localPath]); + } + } } }