service->getByToken($token); }, __('message.fetched')); } public function sendOtp(string $token): JsonResponse { return ApiResponse::handle(function () use ($token) { return $this->service->sendOtp($token); }, __('message.esign.otp_sent')); } public function verifyOtp(string $token, Request $request): JsonResponse { return ApiResponse::handle(function () use ($token, $request) { $request->validate(['otp_code' => 'required|string|size:6']); return $this->service->verifyOtp($token, $request->input('otp_code')); }, __('message.esign.otp_verified')); } public function getDocument(string $token): \Symfony\Component\HttpFoundation\StreamedResponse|JsonResponse { try { $data = $this->service->getByToken($token); $contract = $data['contract']; $filePath = $contract->original_file_path; if (! $filePath || ! Storage::disk('local')->exists($filePath)) { return ApiResponse::error(__('error.esign.file_not_found'), 404); } return Storage::disk('local')->response($filePath, null, [ 'Content-Type' => 'application/pdf', ]); } catch (\Throwable $e) { return ApiResponse::error($e->getMessage(), $e->getCode() ?: 500); } } public function submit(string $token, SignSubmitRequest $request): JsonResponse { return ApiResponse::handle(function () use ($token, $request) { return $this->service->submitSignature($token, $request->validated()); }, __('message.esign.signed')); } public function reject(string $token, SignRejectRequest $request): JsonResponse { return ApiResponse::handle(function () use ($token, $request) { return $this->service->reject($token, $request->validated()['reason']); }, __('message.esign.rejected')); } }