From 705ec671a490fc33eb7f141c2bdfdd5d0ac584db Mon Sep 17 00:00:00 2001 From: brusnitsyn Date: Tue, 16 Jun 2026 15:24:40 +0900 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D1=83=20webhoo?= =?UTF-8?q?k=20=D0=BE=D1=82=20=D1=80=D0=B5=D0=BF=D0=BB=D0=B8=D0=BA=D0=B0?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 2 ++ .../Api/Syncio/SyncioWebhookController.php | 29 +++++++++++++++++++ bootstrap/app.php | 3 ++ config/services.php | 4 +++ routes/api.php | 4 +++ 5 files changed, 42 insertions(+) create mode 100644 app/Http/Controllers/Api/Syncio/SyncioWebhookController.php 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); + }); });