categories(); return Inertia::render('Admin/Shop', [ ...$this->portalProps($request), 'categories' => $categories ->map(fn (ShopCategory $category): array => [ 'id' => $category->id, 'name' => $category->name, 'icon' => $category->icon, 'required_rank' => $category->requiredRank, 'flags' => $category->flags, 'enabled' => $category->enabled, 'products_count' => $category->products_count, 'update_url' => route('admin.shop.categories.update', $category), 'destroy_url' => route('admin.shop.categories.destroy', $category), ]) ->values() ->all(), 'products' => $catalog->products() ->map(fn (ShopProduct $product): array => [ 'id' => $product->id, 'category_ids' => $product->categories->pluck('id')->values()->all(), 'category_names' => $product->categories->pluck('name')->values()->all(), 'type' => (int) $product->type, 'name' => $product->name, 'tooltip_name' => $product->tooltipName, 'tooltip_type' => $product->tooltipType, 'tooltip_text' => $product->tooltipText, 'icon' => $product->icon, 'price' => (int) $product->price, 'hyperlink_id' => (int) $product->hyperlinkId, 'creature_entry' => (int) $product->creatureEntry, 'discount_amount' => (int) $product->discountAmount, 'flags' => (int) $product->flags, 'rewards' => collect(range(1, 8))->map(fn (int $slot): array => [ 'slot' => $slot, 'id' => (int) $product->{'reward_'.$slot}, 'count' => (int) $product->{'rewardcount_'.$slot}, ])->all(), 'is_new' => (bool) $product->new, 'enabled' => (bool) $product->enabled, 'update_url' => route('admin.shop.products.update', $product), 'destroy_url' => route('admin.shop.products.destroy', $product), ]) ->values() ->all(), 'categoryStoreUrl' => route('admin.shop.categories.store'), 'productStoreUrl' => route('admin.shop.products.store'), 'shopEnabled' => $availability->isEnabled(), 'availabilityUpdateUrl' => route('admin.shop.availability.update'), 'productTypes' => collect([ 1 => __('Предмет'), 3 => __('Маунт'), 4 => __('Питомец'), 5 => __('Бафф'), 7 => __('Услуга персонажа'), 8 => __('Буст'), 9 => __('Титул'), ])->map(fn (string $label, int $value): array => compact('value', 'label'))->values()->all(), ]); } public function updateAvailability(Request $request, StoreAvailabilityService $availability): RedirectResponse { $validated = $request->validate([ 'enabled' => ['required', 'boolean'], ]); $enabled = (bool) $validated['enabled']; $availability->setEnabled($enabled); return back()->with('status', $enabled ? __('Магазин и пополнение включены.') : __('Магазин и пополнение выключены.')); } public function storeCategory(SaveShopCategoryRequest $request, ShopCatalogService $catalog): RedirectResponse { $catalog->createCategory($request->validated()); return back()->with('status', __('Категория создана.')); } public function updateCategory(ShopCategory $category, SaveShopCategoryRequest $request, ShopCatalogService $catalog): RedirectResponse { $catalog->updateCategory($category, $request->validated()); return back()->with('status', __('Категория обновлена.')); } public function destroyCategory(ShopCategory $category, ShopCatalogService $catalog): RedirectResponse { $catalog->deleteCategory($category); return back()->with('status', __('Категория удалена.')); } public function storeProduct(SaveShopProductRequest $request, ShopCatalogService $catalog): RedirectResponse { $catalog->createProduct($request->validated()); return back()->with('status', __('Товар создан.')); } public function updateProduct(ShopProduct $product, SaveShopProductRequest $request, ShopCatalogService $catalog): RedirectResponse { $catalog->updateProduct($product, $request->validated()); return back()->with('status', __('Товар обновлён.')); } public function destroyProduct(ShopProduct $product, ShopCatalogService $catalog): RedirectResponse { $catalog->deleteProduct($product); return back()->with('status', __('Товар удалён.')); } }