From 6d77a94806ceb8a437f71611ad106d05a6bbe82f Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Tue, 17 Feb 2026 21:06:38 +0700 Subject: [PATCH] refactor: Cache feed data for purchase form and observe Feed model changes --- .../Schemas/FeedPurchaseForm.php | 21 ++++--- app/Models/Feed.php | 3 + app/Observers/FeedObserver.php | 57 +++++++++++++++++++ 3 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 app/Observers/FeedObserver.php diff --git a/app/Filament/Resources/Manage/FeedPurchases/Schemas/FeedPurchaseForm.php b/app/Filament/Resources/Manage/FeedPurchases/Schemas/FeedPurchaseForm.php index 75e44d5..5ac2dc7 100644 --- a/app/Filament/Resources/Manage/FeedPurchases/Schemas/FeedPurchaseForm.php +++ b/app/Filament/Resources/Manage/FeedPurchases/Schemas/FeedPurchaseForm.php @@ -11,19 +11,26 @@ use Filament\Schemas\Components\Section; use Filament\Schemas\Components\View; use Filament\Schemas\Schema; +use Illuminate\Support\Facades\Cache; class FeedPurchaseForm { public static function configure(Schema $schema): Schema { - $feeds = Feed::with('unit') - ->latest() - ->get() - ->map(function ($feed) { - $feed->image = $feed->getFirstMediaUrl('feeds'); + $feeds = Cache::store('redis')->remember( + 'feeds_with_unit_for_purchase_form', + now()->addMonth(), + function () { + return Feed::with('unit') + ->latest() + ->get() + ->map(function ($feed) { + $feed->image = $feed->getFirstMediaUrl('feeds'); - return $feed; - }); + return $feed; + }); + } + ); $cartItems = FeedPurchaseItem::with('feed') ->whereNull('feed_purchase_id') diff --git a/app/Models/Feed.php b/app/Models/Feed.php index 86c0b4f..1ef815f 100644 --- a/app/Models/Feed.php +++ b/app/Models/Feed.php @@ -2,6 +2,8 @@ namespace App\Models; +use App\Observers\FeedObserver; +use Illuminate\Database\Eloquent\Attributes\ObservedBy; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -11,6 +13,7 @@ use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; +#[ObservedBy([FeedObserver::class])] class Feed extends Model implements HasMedia { use HasFactory, InteractsWithMedia, SoftDeletes; diff --git a/app/Observers/FeedObserver.php b/app/Observers/FeedObserver.php new file mode 100644 index 0000000..0082c79 --- /dev/null +++ b/app/Observers/FeedObserver.php @@ -0,0 +1,57 @@ +forget('feeds_with_unit_for_purchase_form'); + } + + /** + * Handle the Feed "created" event. + */ + public function created(Feed $feed): void + { + $this->clearFeedCache(); + } + + /** + * Handle the Feed "updated" event. + */ + public function updated(Feed $feed): void + { + $this->clearFeedCache(); + } + + /** + * Handle the Feed "deleted" event. + */ + public function deleted(Feed $feed): void + { + $this->clearFeedCache(); + } + + /** + * Handle the Feed "restored" event. + */ + public function restored(Feed $feed): void + { + $this->clearFeedCache(); + } + + /** + * Handle the Feed "force deleted" event. + */ + public function forceDeleted(Feed $feed): void + { + $this->clearFeedCache(); + } +}