|
- <?php
-
- namespace App\Http\Controllers\Server;
-
- use App\Codes\EnvironmentName;
- use App\Exceptions\AppCommonException;
- use App\Http\Controllers\Controller;
- use App\Models\Htpms\MstCustomer;
- use App\Models\HtpmsCustomer\HtpmsCustomerConnectionSwitch;
- use App\Transmission\ResultCode;
- use App\Transmission\Layouts\IFCommonHeader;
- use App\Transmission\Layouts\IFResponse;
- use Exception;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\Log;
- use Illuminate\Support\Str;
- use Illuminate\Validation\ValidationException;
-
- abstract class IFController extends Controller
- {
- protected IFCommonHeader $header;
-
- public function __constract()
- {
- $this->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);
- }
- }
|