From bdd8c02c8ea66d1a42f93ed8232dccf5b9c5cee4 Mon Sep 17 00:00:00 2001 From: "sosuke.iwabuchi" Date: Wed, 25 Oct 2023 10:56:42 +0900 Subject: [PATCH] =?UTF-8?q?kintonewebhook=E9=96=A2=E9=80=A3=E3=80=81?= =?UTF-8?q?=E9=80=94=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../KintoneWebHookController.php | 32 ++++++++++ ...easonTicketContractSelectionController.php | 16 +++++ app/Kintone/KintoneWebHookEventType.php | 12 ++++ app/Kintone/KintoneWebHookReceiver.php | 63 +++++++++++++++++++ routes/apiFromKintone.php | 4 ++ routes/web.php | 5 +- 6 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 app/Http/Controllers/Web/KintoneWebHook/KintoneWebHookController.php create mode 100644 app/Http/Controllers/Web/KintoneWebHook/SeasonTicketContractSelectionController.php create mode 100644 app/Kintone/KintoneWebHookEventType.php create mode 100644 app/Kintone/KintoneWebHookReceiver.php 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', '.*');