| @@ -0,0 +1,32 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\KintoneWebHook; | |||||
| use App\Http\Controllers\Web\WebController; | |||||
| use App\Kintone\KintoneWebHookReceiver; | |||||
| use App\Kintone\Models\KintoneModel; | |||||
| use Illuminate\Http\Request; | |||||
| use Illuminate\Http\Response; | |||||
| abstract class KintoneWebHookController extends WebController | |||||
| { | |||||
| protected KintoneModel $kintoneModel; | |||||
| protected KintoneWebHookEventType $eventType; | |||||
| abstract protected function handle(); | |||||
| protected function run(Request $request): Response | |||||
| { | |||||
| $receiver = new KintoneWebHookReceiver(); | |||||
| $this->kintoneModel = $receiver->readWebHookRequest($request); | |||||
| if ($receiver->model !== null) { | |||||
| $this->kintoneModel = $receiver->model; | |||||
| $this->eventType = $receiver->type; | |||||
| $this->handle(); | |||||
| } | |||||
| return response(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,16 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\KintoneWebHook; | |||||
| use App\Kintone\Models\SeasonTicketContractSelection; | |||||
| class SeasonTicketContractSelectionController extends KintoneWebHookController | |||||
| { | |||||
| protected SeasonTicketContractSelection $kintoneModel; | |||||
| protected function handle() | |||||
| { | |||||
| logger("OK WEBHOOK"); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,12 @@ | |||||
| <?php | |||||
| namespace App\Kintone; | |||||
| enum KintoneWebHookEventType: string | |||||
| { | |||||
| case ADD_RECORD = "ADD_RECORD"; | |||||
| case UPDATE_RECORD = "UPDATE_RECORD"; | |||||
| case UPDATE_STATUS = "UPDATE_STATUS"; | |||||
| case DELETE_RECORD = "DELETE_RECORD"; | |||||
| case ADD_RECORD_COMMENT = "ADD_RECORD_COMMENT"; | |||||
| } | |||||
| @@ -0,0 +1,63 @@ | |||||
| <?php | |||||
| namespace App\Kintone; | |||||
| use App\Kintone\Models\KintoneModel; | |||||
| use Exception; | |||||
| use Illuminate\Http\Request; | |||||
| use Illuminate\Support\Collection; | |||||
| use Illuminate\Support\Facades\Log; | |||||
| class KintoneWebHookReceiver | |||||
| { | |||||
| /** | |||||
| * key:appId | |||||
| * value:KintoneModelのクラス名 | |||||
| * @var Collection<string, string> | |||||
| */ | |||||
| 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(); | |||||
| } | |||||
| } | |||||
| @@ -15,3 +15,7 @@ use App\Util\RouteHelper; | |||||
| RouteHelper::post('/email/send', App\Http\Controllers\Web\Email\EmailSendController::class); | 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); | 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); | |||||
| @@ -13,8 +13,11 @@ use App\Util\RouteHelper; | |||||
| | | | | ||||
| */ | */ | ||||
| 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にゆだねる | // ルーティングで適合しない場合はフロント側のRoutingにゆだねる | ||||
| RouteHelper::get('/{any?}', App\Http\Controllers\Web\IndexController::class)->where('any', '.*'); | RouteHelper::get('/{any?}', App\Http\Controllers\Web\IndexController::class)->where('any', '.*'); | ||||