From d0af2ee0fb267253d9949adfa86dea1484d58439 Mon Sep 17 00:00:00 2001 From: brusnitsyn Date: Tue, 16 Jun 2026 16:25:12 +0900 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5?= =?UTF-8?q?=20=D1=80=D0=B5=D0=BF=D0=BB=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Api/Syncio/SyncioWebhookController.php | 9 ++-- app/Jobs/RefreshMaterializedViews.php | 43 +++++++++++++++++++ 2 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 app/Jobs/RefreshMaterializedViews.php diff --git a/app/Http/Controllers/Api/Syncio/SyncioWebhookController.php b/app/Http/Controllers/Api/Syncio/SyncioWebhookController.php index f2d5db5..00e8992 100644 --- a/app/Http/Controllers/Api/Syncio/SyncioWebhookController.php +++ b/app/Http/Controllers/Api/Syncio/SyncioWebhookController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Api\Syncio; use App\Http\Controllers\Controller; +use App\Jobs\RefreshMaterializedViews; use Illuminate\Http\Request; class SyncioWebhookController extends Controller @@ -19,10 +20,10 @@ class SyncioWebhookController extends Controller // $data['tables']['success'] кол-во успешных // $data['errors'] массив ошибок - // Дальше что нужно: - // ReplicationFinished::dispatch($data); // Job в очередь - // event(new ReplicationCompleted($data)); // Laravel Event - // Cache::put('replication_status', $data, now()->addHours(24)); + // При успешной репликации обновляем материализованные представления + if (($data['status'] ?? null) === 'success') { + RefreshMaterializedViews::dispatch(); + } return response()->noContent(); // 204 } diff --git a/app/Jobs/RefreshMaterializedViews.php b/app/Jobs/RefreshMaterializedViews.php new file mode 100644 index 0000000..4d37c5a --- /dev/null +++ b/app/Jobs/RefreshMaterializedViews.php @@ -0,0 +1,43 @@ +views as $view) { + // CONCURRENTLY не блокирует чтение представления во время обновления, + // но требует наличия уникального индекса на представлении и не может + // выполняться внутри транзакции (DB::statement работает в autocommit). + DB::statement("REFRESH MATERIALIZED VIEW CONCURRENTLY {$view}"); + DB::statement("ANALYZE {$view}"); + } + } +}