From 62d58a9cdaff53bf7f36b05c267cac4067e58279 Mon Sep 17 00:00:00 2001 From: arfenis Date: Fri, 2 Aug 2024 12:38:13 -0400 Subject: [PATCH 1/6] merge --- .../Inventory/Products/Models/Products.php | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/Domains/Inventory/Products/Models/Products.php b/src/Domains/Inventory/Products/Models/Products.php index 4027cf421..e86d0128e 100644 --- a/src/Domains/Inventory/Products/Models/Products.php +++ b/src/Domains/Inventory/Products/Models/Products.php @@ -6,6 +6,7 @@ use Awobaz\Compoships\Compoships; use Baka\Traits\HasLightHouseCache; +use Baka\Support\Str; use Baka\Traits\SlugTrait; use Baka\Traits\UuidTrait; use Baka\Users\Contracts\UserInterface; @@ -16,6 +17,9 @@ use Kanvas\Apps\Models\Apps; use Kanvas\Connectors\Shopify\Traits\HasShopifyCustomField; use Kanvas\Inventory\Attributes\Models\Attributes; +use Kanvas\Inventory\Attributes\DataTransferObject\Attributes as AttributesDto; +use Kanvas\Inventory\Attributes\Actions\CreateAttribute; +use Kanvas\Inventory\Products\Actions\AddAttributeAction; use Kanvas\Inventory\Categories\Models\Categories; use Kanvas\Inventory\Models\BaseModel; use Kanvas\Inventory\Products\Factories\ProductFactory; @@ -250,4 +254,38 @@ public static function newFactory() { return new ProductFactory(); } + + /** + * Add/create new attributes from a product. + * @psalm-suppress MixedAssignment + * @psalm-suppress MixedArrayAccess + * @psalm-suppress MixedPropertyFetch + */ + public function addAttributes(UserInterface $user, array $attributes): void + { + foreach ($attributes as $attribute) { + if (empty($attribute['value'])) { + continue; + } + + if (isset($attribute['id'])) { + $attributeModel = Attributes::getById((int) $attribute['id'], $this->app); + } else { + $attributesDto = AttributesDto::from([ + 'app' => app(Apps::class), + 'user' => $user, + 'company' => $this->product->company, + 'name' => $attribute['name'], + 'value' => $attribute['value'], + 'isVisible' => false, + 'isSearchable' => false, + 'isFiltrable' => false, + 'slug' => Str::slug($attribute['name']), + ]); + $attributeModel = (new CreateAttribute($attributesDto, $user))->execute(); + } + + (new AddAttributeAction($this, $attributeModel, $attribute['value']))->execute(); + } + } } From c8c58762db47c8e84f82730af5d9f84f415698df Mon Sep 17 00:00:00 2001 From: arfenis Date: Fri, 2 Aug 2024 13:32:12 -0400 Subject: [PATCH 2/6] save product model for data manipulation --- app/GraphQL/Inventory/Mutations/Products/Products.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/GraphQL/Inventory/Mutations/Products/Products.php b/app/GraphQL/Inventory/Mutations/Products/Products.php index a706d5413..8f3226c8b 100644 --- a/app/GraphQL/Inventory/Mutations/Products/Products.php +++ b/app/GraphQL/Inventory/Mutations/Products/Products.php @@ -55,9 +55,9 @@ public function update(mixed $root, array $req): ProductsModel $product = ProductsRepository::getById((int) $req['id'], $company); $productDto = ProductDto::viaRequest($req['input'], $product->company); - $action = new UpdateProductAction($product, $productDto, auth()->user()); + $productModel = (new UpdateProductAction($product, $productDto, auth()->user()))->execute(); - return $action->execute(); + return $productModel; } /** From 6ffd97f91d2246cd78d2b7e7e29dcee51ad47d87 Mon Sep 17 00:00:00 2001 From: arfenis Date: Fri, 2 Aug 2024 13:32:27 -0400 Subject: [PATCH 3/6] delete and repopulate attribute data on product update --- .../Inventory/Products/Actions/UpdateProductAction.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Domains/Inventory/Products/Actions/UpdateProductAction.php b/src/Domains/Inventory/Products/Actions/UpdateProductAction.php index ef8e7a569..6083abfe9 100644 --- a/src/Domains/Inventory/Products/Actions/UpdateProductAction.php +++ b/src/Domains/Inventory/Products/Actions/UpdateProductAction.php @@ -73,6 +73,11 @@ public function execute(): Products } } + if ($this->productDto->attributes || empty($this->productDto->attributes)) { + $this->product->attributeValues()->forceDelete(); + $this->product->addAttributes($this->user, $this->productDto->attributes); + } + DB::connection('inventory')->commit(); } catch (Throwable $e) { DB::connection('inventory')->rollback(); From 18587663bae431f25c57729adb798dccf9dfe455 Mon Sep 17 00:00:00 2001 From: arfenis Date: Fri, 2 Aug 2024 13:32:46 -0400 Subject: [PATCH 4/6] force delete on product attribute --- src/Domains/Inventory/Products/Models/ProductsAttributes.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Domains/Inventory/Products/Models/ProductsAttributes.php b/src/Domains/Inventory/Products/Models/ProductsAttributes.php index 5a310e168..f2c0af40d 100644 --- a/src/Domains/Inventory/Products/Models/ProductsAttributes.php +++ b/src/Domains/Inventory/Products/Models/ProductsAttributes.php @@ -25,6 +25,7 @@ class ProductsAttributes extends BaseModel use HasCompositePrimaryKeyTrait; protected $table = 'products_attributes'; + protected $forceDeleting = true; protected $guarded = [ 'products_id', 'attributes_id', From 3706d3b2e80e3de81a3a8ea0e70f9aef7f9d28fa Mon Sep 17 00:00:00 2001 From: arfenis Date: Fri, 2 Aug 2024 13:51:55 -0400 Subject: [PATCH 5/6] feedback --- src/Domains/Inventory/Products/Models/Products.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Domains/Inventory/Products/Models/Products.php b/src/Domains/Inventory/Products/Models/Products.php index e86d0128e..db031e4dd 100644 --- a/src/Domains/Inventory/Products/Models/Products.php +++ b/src/Domains/Inventory/Products/Models/Products.php @@ -272,7 +272,7 @@ public function addAttributes(UserInterface $user, array $attributes): void $attributeModel = Attributes::getById((int) $attribute['id'], $this->app); } else { $attributesDto = AttributesDto::from([ - 'app' => app(Apps::class), + 'app' =>$this->app, 'user' => $user, 'company' => $this->product->company, 'name' => $attribute['name'], From 5bed7c9a9d44a160026e31c0ebdfd3260c8d9233 Mon Sep 17 00:00:00 2001 From: arfenis Date: Fri, 2 Aug 2024 13:55:52 -0400 Subject: [PATCH 6/6] stylo --- src/Domains/Inventory/Products/Models/Products.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Domains/Inventory/Products/Models/Products.php b/src/Domains/Inventory/Products/Models/Products.php index db031e4dd..707f2e437 100644 --- a/src/Domains/Inventory/Products/Models/Products.php +++ b/src/Domains/Inventory/Products/Models/Products.php @@ -272,7 +272,7 @@ public function addAttributes(UserInterface $user, array $attributes): void $attributeModel = Attributes::getById((int) $attribute['id'], $this->app); } else { $attributesDto = AttributesDto::from([ - 'app' =>$this->app, + 'app' => $this->app, 'user' => $user, 'company' => $this->product->company, 'name' => $attribute['name'],