header = new IFCommonHeader(); } abstract protected function run(Request $request): array; public function entry(Request $request) { try { $this->setLogContext($request); $this->checkHeader($request); logger(sprintf( "リクエスト受信:%s 顧客コード:%s 駐車場管理コード:%s IF:%s", $request->path(), $this->header->customerCode, $this->header->parkingManagementCode, $this->header->interfaceId )); if (!$this->checkIp($request)) { throw new Exception("IP不正"); } // 顧客コードから接続先DBの切り替え $this->switchDb(); $result = $this->run($request); } catch (ValidationException $e) { logs()->error("バリデーション失敗"); logs()->error($e->errors()); logs()->debug("Request Contents", $request->toArray()); logs()->debug($request->toArray()); $result = $this->failResponseFromEmpty(); return response()->json($result); } catch (AppCommonException $e) { logs()->error(sprintf( "リクエスト失敗:%s 顧客コード:%s 駐車場管理コード:%s", $request->path(), $this->header->customerCode, $this->header->parkingManagementCode, )); logs()->error($e->getMessage()); $result = $this->failResponse($request); return response()->json($result); } catch (Exception $e) { $contexts = [ 'path' => $request->path(), 'ip' => $request->ip(), 'data' => $request->all(), 'message' => $e->getMessage() ]; logs()->error("例外発生", $contexts); logs()->error($e->getMessage()); $result = $this->failResponseFromEmpty($request); return response()->json($result); } return response()->json($result); } private function checkHeader(Request $request) { // 駐車場情報取得 IFCommonHeader::validateLayout($request); $this->header = IFCommonHeader::createFromRequest($request); } private function checkIp(Request $request) { // SIFのIPが一致しているか確認 if (app()->environment([EnvironmentName::LOCAL->value, EnvironmentName::STAGING->value, EnvironmentName::TEST->value])) { return true; } return in_array($request->ip(), config("transmission.sif_ip_address")); } protected function successResponse(Request $request, array|IFResponse $body = []): array { if ($body instanceof IFResponse) { return $this->Response(ResultCode::SUCCESS, $request, $body->getBodyArray()); } else { return $this->Response(ResultCode::SUCCESS, $request, $body); } } protected function failResponse(Request $request, array|IFResponse $body = []): array { if ($body instanceof IFResponse) { return $this->Response(ResultCode::FAIL, $request, $body->toArray()); } else { return $this->Response(ResultCode::FAIL, $request, $body); } } private function Response(ResultCode $resultCode, Request $request, array $body): array { $response = []; $header = IFCommonHeader::createFromRequest($request); $header->resultCode = $resultCode->value; $response[IFCommonHeader::COL_NAME_HEADER] = $header->toArray(); if (!empty($body)) { $response[IFCommonHeader::COL_NAME_BODY] = $body; } return $response; } protected function failResponseFromEmpty(): array { $response = []; $header = new IFCommonHeader(); $header->resultCode = ResultCode::FAIL->value; $response[IFCommonHeader::COL_NAME_HEADER] = $header->toArray(); return $response; } protected function setLogContext(Request $request) { $context = [ '__requestUuid__' => strval(Str::uuid()), '__path__' => $request->path(), '__ip__' => $request->ip(), ]; if (app()->environment([EnvironmentName::LOCAL->value, EnvironmentName::STAGING->value])) { $context["__requestParam__"] = $request->all(); } Log::withContext($context); } protected function switchDb() { $customer = MstCustomer::whereCustomerId($this->header->customerCode)->firstOrFail(); HtpmsCustomerConnectionSwitch::switch($customer->id); } }