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}"); + } + } +}