Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

162 rindas
5.3KB

  1. <?php
  2. namespace App\Http\Controllers\Server;
  3. use App\Codes\EnvironmentName;
  4. use App\Exceptions\AppCommonException;
  5. use App\Http\Controllers\Controller;
  6. use App\Models\Htpms\MstCustomer;
  7. use App\Models\HtpmsCustomer\HtpmsCustomerConnectionSwitch;
  8. use App\Transmission\ResultCode;
  9. use App\Transmission\Layouts\IFCommonHeader;
  10. use App\Transmission\Layouts\IFResponse;
  11. use Exception;
  12. use Illuminate\Http\Request;
  13. use Illuminate\Support\Facades\Log;
  14. use Illuminate\Support\Str;
  15. use Illuminate\Validation\ValidationException;
  16. abstract class IFController extends Controller
  17. {
  18. protected IFCommonHeader $header;
  19. public function __constract()
  20. {
  21. $this->header = new IFCommonHeader();
  22. }
  23. abstract protected function run(Request $request): array;
  24. public function entry(Request $request)
  25. {
  26. try {
  27. $this->setLogContext($request);
  28. $this->checkHeader($request);
  29. logger(sprintf(
  30. "リクエスト受信:%s 顧客コード:%s 駐車場管理コード:%s IF:%s",
  31. $request->path(),
  32. $this->header->customerCode,
  33. $this->header->parkingManagementCode,
  34. $this->header->interfaceId
  35. ));
  36. if (!$this->checkIp($request)) {
  37. throw new Exception("IP不正");
  38. }
  39. // 顧客コードから接続先DBの切り替え
  40. $this->switchDb();
  41. $result = $this->run($request);
  42. } catch (ValidationException $e) {
  43. logs()->error("バリデーション失敗");
  44. logs()->error($e->errors());
  45. logs()->debug("Request Contents", $request->toArray());
  46. logs()->debug($request->toArray());
  47. $result = $this->failResponseFromEmpty();
  48. return response()->json($result);
  49. } catch (AppCommonException $e) {
  50. logs()->error(sprintf(
  51. "リクエスト失敗:%s 顧客コード:%s 駐車場管理コード:%s",
  52. $request->path(),
  53. $this->header->customerCode,
  54. $this->header->parkingManagementCode,
  55. ));
  56. logs()->error($e->getMessage());
  57. $result = $this->failResponse($request);
  58. return response()->json($result);
  59. } catch (Exception $e) {
  60. $contexts = [
  61. 'path' => $request->path(),
  62. 'ip' => $request->ip(),
  63. 'data' => $request->all(),
  64. 'message' => $e->getMessage()
  65. ];
  66. logs()->error("例外発生", $contexts);
  67. logs()->error($e->getMessage());
  68. $result = $this->failResponseFromEmpty($request);
  69. return response()->json($result);
  70. }
  71. return response()->json($result);
  72. }
  73. private function checkHeader(Request $request)
  74. {
  75. // 駐車場情報取得
  76. IFCommonHeader::validateLayout($request);
  77. $this->header = IFCommonHeader::createFromRequest($request);
  78. }
  79. private function checkIp(Request $request)
  80. {
  81. // SIFのIPが一致しているか確認
  82. if (app()->environment([EnvironmentName::LOCAL->value, EnvironmentName::STAGING->value, EnvironmentName::TEST->value])) {
  83. return true;
  84. }
  85. return in_array($request->ip(), config("transmission.sif_ip_address"));
  86. }
  87. protected function successResponse(Request $request, array|IFResponse $body = []): array
  88. {
  89. if ($body instanceof IFResponse) {
  90. return $this->Response(ResultCode::SUCCESS, $request, $body->getBodyArray());
  91. } else {
  92. return $this->Response(ResultCode::SUCCESS, $request, $body);
  93. }
  94. }
  95. protected function failResponse(Request $request, array|IFResponse $body = []): array
  96. {
  97. if ($body instanceof IFResponse) {
  98. return $this->Response(ResultCode::FAIL, $request, $body->toArray());
  99. } else {
  100. return $this->Response(ResultCode::FAIL, $request, $body);
  101. }
  102. }
  103. private function Response(ResultCode $resultCode, Request $request, array $body): array
  104. {
  105. $response = [];
  106. $header = IFCommonHeader::createFromRequest($request);
  107. $header->resultCode = $resultCode->value;
  108. $response[IFCommonHeader::COL_NAME_HEADER] = $header->toArray();
  109. if (!empty($body)) {
  110. $response[IFCommonHeader::COL_NAME_BODY] = $body;
  111. }
  112. return $response;
  113. }
  114. protected function failResponseFromEmpty(): array
  115. {
  116. $response = [];
  117. $header = new IFCommonHeader();
  118. $header->resultCode = ResultCode::FAIL->value;
  119. $response[IFCommonHeader::COL_NAME_HEADER] = $header->toArray();
  120. return $response;
  121. }
  122. protected function setLogContext(Request $request)
  123. {
  124. $context = [
  125. '__requestUuid__' => strval(Str::uuid()),
  126. '__path__' => $request->path(),
  127. '__ip__' => $request->ip(),
  128. ];
  129. if (app()->environment([EnvironmentName::LOCAL->value, EnvironmentName::STAGING->value])) {
  130. $context["__requestParam__"] = $request->all();
  131. }
  132. Log::withContext($context);
  133. }
  134. protected function switchDb()
  135. {
  136. $customer = MstCustomer::whereCustomerId($this->header->customerCode)->firstOrFail();
  137. HtpmsCustomerConnectionSwitch::switch($customer->id);
  138. }
  139. }