diff --git a/src/Jobs/InvalidateAutoCache.php b/src/Jobs/InvalidateAutoCache.php index ac13846..0429e99 100644 --- a/src/Jobs/InvalidateAutoCache.php +++ b/src/Jobs/InvalidateAutoCache.php @@ -3,13 +3,14 @@ namespace Tv2regionerne\StatamicCache\Jobs; use Illuminate\Bus\Queueable; +use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Tv2regionerne\StatamicCache\Facades\Store; -class InvalidateAutoCache implements ShouldQueue +class InvalidateAutoCache implements ShouldBeUnique, ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; @@ -27,4 +28,12 @@ public function handle(): void { Store::invalidateContent($this->tags); } + + /** + * Get the unique ID for the job. + */ + public function uniqueId(): string + { + return md5(json_encode($this->tags)); + } } diff --git a/src/Jobs/InvalidateAutoCacheChunk.php b/src/Jobs/InvalidateAutoCacheModel.php similarity index 60% rename from src/Jobs/InvalidateAutoCacheChunk.php rename to src/Jobs/InvalidateAutoCacheModel.php index d4dbeff..6148f32 100644 --- a/src/Jobs/InvalidateAutoCacheChunk.php +++ b/src/Jobs/InvalidateAutoCacheModel.php @@ -3,20 +3,21 @@ namespace Tv2regionerne\StatamicCache\Jobs; use Illuminate\Bus\Queueable; +use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Tv2regionerne\StatamicCache\Facades\Store; -class InvalidateAutoCacheChunk implements ShouldQueue +class InvalidateAutoCacheModel implements ShouldBeUnique, ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * Create a new job instance. */ - public function __construct(public $models) + public function __construct(public $model) { } @@ -25,6 +26,14 @@ public function __construct(public $models) */ public function handle(): void { - Store::invalidateModels($this->models); + Store::invalidateModel($this->model); + } + + /** + * Get the unique ID for the job. + */ + public function uniqueId(): string + { + return md5($model->url); } } diff --git a/src/Store/Manager.php b/src/Store/Manager.php index e08919b..2c31823 100644 --- a/src/Store/Manager.php +++ b/src/Store/Manager.php @@ -9,7 +9,7 @@ use Statamic\StaticCaching\Cacher; use Statamic\StaticCaching\StaticCacheManager; use Statamic\Support\Arr; -use Tv2regionerne\StatamicCache\Jobs\InvalidateAutoCacheChunk; +use Tv2regionerne\StatamicCache\Jobs\InvalidateAutoCacheModel; use Tv2regionerne\StatamicCache\Models\Autocache; class Manager @@ -129,30 +129,34 @@ public function getMappingData(?string $url = null): bool public function invalidateContent($ids): static { - $query = Autocache::query() + Autocache::query() ->where(function ($query) use ($ids) { foreach ($ids as $index => $id) { $query->{($index == 0 ? 'where' : 'orWhere').'JsonContains'}('content', [$id]); } + }) + ->chunk(100, function ($models) { + $models->each(fn ($model) => InvalidateAutoCacheModel::dispatch($model)); }); - $query->chunk(100, function ($models) { - InvalidateAutoCacheChunk::dispatch($models); - }); return $this; } + /* @deprecated - use invalidateModel instead */ public function invalidateModels($models): void { - $models->each(function (Autocache $model) { - Event::listen(function (UrlInvalidated $event) use ($model) { - if ($event->url == $model->url) { - $model->delete(); - } - }); + $models->each(fn ($model) => $this->invalidateModel($model)); + } - $this->invalidateCacheForUrl($model->url); + public function invalidateModel(Autocache $model): void + { + Event::listen(function (UrlInvalidated $event) use ($model) { + if ($event->url == $model->url) { + $model->delete(); + } }); + + $this->invalidateCacheForUrl($model->url); } public function invalidateCacheForUrl(string $url): void