From fc3adf605ae035732f7f8aba2db31bcddb779ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Szcze=C5=9Bniak?= Date: Sat, 28 Mar 2026 16:42:32 +0100 Subject: [PATCH] Add ProductStatus enum for type-safe product status handling Introduces `Lunar\Enums\ProductStatus` backed enum with `Published` and `Draft` cases, replacing hardcoded status strings throughout the codebase. Changes: - Add `Lunar\Enums\ProductStatus` enum - Cast `Product::$status` to the enum - Update `scopeStatus()` to accept both enum and string (backwards compatible) - Update `ProductFactory` to use enum Co-Authored-By: Claude Opus 4.6 (1M context) --- database/factories/ProductFactory.php | 3 ++- src/Enums/ProductStatus.php | 9 +++++++++ src/Models/Product.php | 10 +++++++--- 3 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 src/Enums/ProductStatus.php diff --git a/database/factories/ProductFactory.php b/database/factories/ProductFactory.php index fb4260d..5654657 100644 --- a/database/factories/ProductFactory.php +++ b/database/factories/ProductFactory.php @@ -4,6 +4,7 @@ use Lunar\FieldTypes\Text; use Lunar\Models\Brand; +use Lunar\Enums\ProductStatus; use Lunar\Models\Product; use Lunar\Models\ProductType; @@ -15,7 +16,7 @@ public function definition(): array { return [ 'product_type_id' => ProductType::factory(), - 'status' => 'published', + 'status' => ProductStatus::Published, 'brand_id' => Brand::factory()->create()->id, 'attribute_data' => collect([ 'name' => new Text($this->faker->name), diff --git a/src/Enums/ProductStatus.php b/src/Enums/ProductStatus.php new file mode 100644 index 0000000..75a95ca --- /dev/null +++ b/src/Enums/ProductStatus.php @@ -0,0 +1,9 @@ + AsAttributeData::class, + 'status' => ProductStatus::class, ]; /** @@ -189,9 +191,11 @@ public function brand(): BelongsTo return $this->belongsTo(Brand::modelClass()); } - public function scopeStatus(Builder $query, string $status): Builder + public function scopeStatus(Builder $query, ProductStatus|string $status): Builder { - return $query->whereStatus($status); + $value = $status instanceof ProductStatus ? $status->value : $status; + + return $query->where('status', $value); } public function prices(): HasManyThrough