diff --git a/app/Http/Controllers/Web/KintoneWebHook/KintoneWebHookController.php b/app/Http/Controllers/Web/KintoneWebHook/KintoneWebHookController.php new file mode 100644 index 0000000..fbcc669 --- /dev/null +++ b/app/Http/Controllers/Web/KintoneWebHook/KintoneWebHookController.php @@ -0,0 +1,32 @@ +kintoneModel = $receiver->readWebHookRequest($request); + + if ($receiver->model !== null) { + $this->kintoneModel = $receiver->model; + $this->eventType = $receiver->type; + $this->handle(); + } + + return response(); + } +} diff --git a/app/Http/Controllers/Web/KintoneWebHook/SeasonTicketContractSelectionController.php b/app/Http/Controllers/Web/KintoneWebHook/SeasonTicketContractSelectionController.php new file mode 100644 index 0000000..8a7ccb6 --- /dev/null +++ b/app/Http/Controllers/Web/KintoneWebHook/SeasonTicketContractSelectionController.php @@ -0,0 +1,16 @@ + + */ + private Collection $config; + + public ?KintoneModel $model = null; + + public ?KintoneWebHookEventType $type = null; + + public function __construct() + { + $this->config = collect(); + foreach (config("kintone.applications", []) as $className => $config) { + $appId = $config['appId']; + $this->config->put($appId, $className); + } + } + + public function readWebHookRequest(Request $request) + { + $data = $request->all(); + $appId = data_get($data, 'app.id'); + $this->type = KintoneWebHookEventType::from(data_get($data, "type", "")); + + // 削除とコメント追記は扱わない + if ($this->type === KintoneWebHookEventType::DELETE_RECORD || $this->type === KintoneWebHookEventType::ADD_RECORD_COMMENT) { + return; + } + + $model = $this->getModel($appId); + $record = data_get($data, 'record'); + + if (!$model->setDataFromRecordResponse($record)) { + Log::error($data); + throw new Exception("WebHook読込失敗"); + } + + $this->model = $model; + } + + private function getModel(string $appId): KintoneModel + { + $className = $this->config->get($appId); + if ($className === null) { + throw new Exception("モデル不正"); + } + return new $className(); + } +} diff --git a/routes/apiFromKintone.php b/routes/apiFromKintone.php index 0d569e3..6d8d173 100644 --- a/routes/apiFromKintone.php +++ b/routes/apiFromKintone.php @@ -15,3 +15,7 @@ use App\Util\RouteHelper; RouteHelper::post('/email/send', App\Http\Controllers\Web\Email\EmailSendController::class); RouteHelper::post('/season-ticket-contract-selection/notice-to-candidates', App\Http\Controllers\Web\SeasonTicketContract\Selection\NoticeToCandidatesController::class); + + +// ------FOR WEBHOOK------------------- +RouteHelper::get('/webhook/season-ticket-contract-selection', App\Http\Controllers\Web\KintoneWebHook\SeasonTicketContractSelectionController::class); diff --git a/routes/web.php b/routes/web.php index 28d9ea5..0d4342f 100644 --- a/routes/web.php +++ b/routes/web.php @@ -13,8 +13,11 @@ use App\Util\RouteHelper; | */ +// PDF +RouteHelper::get('/pdf', App\Http\Controllers\PDFController::class); + // 画像取得 -RouteHelper::get('/image/season-ticket-contract', App\Http\Controllers\Web\Image\SeasonTicketContractImageController::class); +RouteHelper::get('/image/season-ticket-contract/{id}', App\Http\Controllers\Web\Image\SeasonTicketContractImageController::class); // ルーティングで適合しない場合はフロント側のRoutingにゆだねる RouteHelper::get('/{any?}', App\Http\Controllers\Web\IndexController::class)->where('any', '.*');