diff --git a/.env.example b/.env.example index a50950a..f63ede8 100644 --- a/.env.example +++ b/.env.example @@ -73,3 +73,5 @@ VITE_APP_VERSION="${APP_VERSION}" VITE_APP_TAG="${APP_TAG}" VITE_SENTRY_DNS= + +SYNCIO_SECRET= diff --git a/app/Http/Controllers/Api/Syncio/SyncioWebhookController.php b/app/Http/Controllers/Api/Syncio/SyncioWebhookController.php new file mode 100644 index 0000000..f2d5db5 --- /dev/null +++ b/app/Http/Controllers/Api/Syncio/SyncioWebhookController.php @@ -0,0 +1,29 @@ +header('X-Syncio-Secret') !== config('services.syncio.secret')) { + abort(403); + } + + $data = $request->json()->all(); + // $data['status'] 'success' | 'partial_success' | 'failed' + // $data['tables']['success'] кол-во успешных + // $data['errors'] массив ошибок + + // Дальше что нужно: + // ReplicationFinished::dispatch($data); // Job в очередь + // event(new ReplicationCompleted($data)); // Laravel Event + // Cache::put('replication_status', $data, now()->addHours(24)); + + return response()->noContent(); // 204 + } +} diff --git a/bootstrap/app.php b/bootstrap/app.php index 09bc208..0fbdaeb 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -17,6 +17,9 @@ return Application::configure(basePath: dirname(__DIR__)) HandleInertiaRequests::class, 'auth' => \App\Http\Middleware\Authenticate::class, ]); + $middleware->validateCsrfTokens(except: [ + 'api/syncio/webhook' + ]); }) ->withExceptions(function (Exceptions $exceptions): void { // diff --git a/config/services.php b/config/services.php index 6a90eb8..9967d34 100644 --- a/config/services.php +++ b/config/services.php @@ -35,4 +35,8 @@ return [ ], ], + 'syncio' => [ + 'secret' => env('SYNCIO_SECRET'), + ] + ]; diff --git a/routes/api.php b/routes/api.php index 39d4ec7..6482632 100644 --- a/routes/api.php +++ b/routes/api.php @@ -114,4 +114,8 @@ Route::middleware(['auth:sanctum'])->group(function () { Route::post('close', [\App\Http\Controllers\Web\DutyReportController::class, 'closeObservation']); }); }); + + Route::prefix('syncio')->group(function () { + Route::post('webhook', \App\Http\Controllers\Api\Syncio\SyncioWebhookController::class); + }); });