донат шоп, управление магазином, яндекс метрика
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use App\Models\ShopCategory;
|
||||
use App\Models\ShopProduct;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class ShopCatalogService
|
||||
{
|
||||
/** @return Collection<int, ShopCategory> */
|
||||
public function categories(): Collection
|
||||
{
|
||||
return ShopCategory::query()->ordered()->withCount('products')->get();
|
||||
}
|
||||
|
||||
/** @return Collection<int, ShopProduct> */
|
||||
public function products(): Collection
|
||||
{
|
||||
return ShopProduct::query()->with('categories')->ordered()->get();
|
||||
}
|
||||
|
||||
public function createCategory(array $data): ShopCategory
|
||||
{
|
||||
return ShopCategory::query()->create($this->categoryData($data));
|
||||
}
|
||||
|
||||
public function updateCategory(ShopCategory $category, array $data): ShopCategory
|
||||
{
|
||||
$category->update($this->categoryData($data));
|
||||
|
||||
return $category->refresh();
|
||||
}
|
||||
|
||||
public function deleteCategory(ShopCategory $category): void
|
||||
{
|
||||
DB::connection('store')->transaction(function () use ($category): void {
|
||||
$category->products()->detach();
|
||||
$category->delete();
|
||||
});
|
||||
}
|
||||
|
||||
public function createProduct(array $data): ShopProduct
|
||||
{
|
||||
return DB::connection('store')->transaction(function () use ($data): ShopProduct {
|
||||
$product = ShopProduct::query()->create($this->productData($data));
|
||||
$product->categories()->sync($data['category_ids']);
|
||||
|
||||
return $product->load('categories');
|
||||
});
|
||||
}
|
||||
|
||||
public function updateProduct(ShopProduct $product, array $data): ShopProduct
|
||||
{
|
||||
return DB::connection('store')->transaction(function () use ($product, $data): ShopProduct {
|
||||
$product->update($this->productData($data));
|
||||
$product->categories()->sync($data['category_ids']);
|
||||
|
||||
return $product->refresh()->load('categories');
|
||||
});
|
||||
}
|
||||
|
||||
public function deleteProduct(ShopProduct $product): void
|
||||
{
|
||||
DB::connection('store')->transaction(function () use ($product): void {
|
||||
$product->categories()->detach();
|
||||
$product->delete();
|
||||
});
|
||||
}
|
||||
|
||||
private function categoryData(array $data): array
|
||||
{
|
||||
return [
|
||||
'name' => trim($data['name']),
|
||||
'icon' => trim((string) ($data['icon'] ?? '')),
|
||||
'requiredRank' => (int) $data['requiredRank'],
|
||||
'flags' => (int) $data['flags'],
|
||||
'enabled' => (int) ($data['enabled'] ?? false),
|
||||
];
|
||||
}
|
||||
|
||||
private function productData(array $data): array
|
||||
{
|
||||
return [
|
||||
'type' => (int) $data['type'],
|
||||
'name' => trim($data['name']),
|
||||
'tooltipName' => trim((string) ($data['tooltipName'] ?? '')),
|
||||
'tooltipType' => trim((string) ($data['tooltipType'] ?? '')),
|
||||
'tooltipText' => trim((string) ($data['tooltipText'] ?? '')),
|
||||
'icon' => trim((string) ($data['icon'] ?? '')),
|
||||
'price' => (int) $data['price'],
|
||||
'currency' => 1,
|
||||
'hyperlinkId' => (int) ($data['hyperlinkId'] ?? 0),
|
||||
'creatureEntry' => (int) ($data['creatureEntry'] ?? 0),
|
||||
'discountAmount' => (int) ($data['discountAmount'] ?? 0),
|
||||
'flags' => (int) ($data['flags'] ?? 0),
|
||||
...collect(range(1, 8))->flatMap(fn (int $slot): array => [
|
||||
'reward_'.$slot => (int) ($data['reward_'.$slot] ?? 0),
|
||||
'rewardcount_'.$slot => (int) ($data['rewardcount_'.$slot] ?? 0),
|
||||
])->all(),
|
||||
'new' => (int) ($data['new'] ?? false),
|
||||
'enabled' => (int) ($data['enabled'] ?? false),
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user