withCount('interests') ->orderBy('name') ->get(); } public function findById(int $id): ?StoreItem { return StoreItem::with(['category', 'media', 'variations'])->find($id); } public function create(array $data): StoreItem { return DB::transaction(function () use ($data) { $variations = $data['variations'] ?? []; $item = StoreItem::create(Arr::except($data, ['variations'])); foreach ($variations as $variation) { $item->variations()->create($variation); } return $item->load(['category', 'media', 'variations']); }); } public function update(int $id, array $data): ?StoreItem { return DB::transaction(function () use ($id, $data) { $model = StoreItem::findOrFail($id); $variations = array_key_exists('variations', $data) ? $data['variations'] : null; $model->update(Arr::except($data, ['variations'])); if (!is_null($variations)) { $model->variations()->delete(); foreach ($variations as $variation) { $model->variations()->create($variation); } } return $model->fresh(['category', 'media', 'variations']); }); } public function delete(int $id): bool { $model = StoreItem::find($id); if (!$model) return false; return $model->delete(); } public function getAllPaginated(array $filters = [], int $perPage = 10): \Illuminate\Contracts\Pagination\LengthAwarePaginator { $query = StoreItem::with(['category', 'media', 'variations']) ->withCount('interests') ->orderBy('name'); if (!empty($filters['search'])) { $search = $filters['search']; $query->where('name', 'ilike', "%{$search}%"); } if (!empty($filters['status'])) { $query->where('status', $filters['status']); } if (!empty($filters['category_id'])) { $query->where('category_id', $filters['category_id']); } return $query->paginate($perPage); } public function toggleStatus(int $id): ?StoreItem { $model = StoreItem::find($id); if (!$model) return null; $model->status = $model->status->value === 'active' ? \App\Enums\StoreItemStatusEnum::INACTIVE : \App\Enums\StoreItemStatusEnum::ACTIVE; $model->save(); return $model->fresh(['category', 'media', 'variations']); } public function getMyInterests(): Collection { $userId = Auth::id(); return StoreItem::with(['category', 'media', 'variations']) ->withCount('interests') ->whereHas('interests', fn($q) => $q->where('user_id', $userId)) ->orderBy('name') ->get(); } public function toggleInterest(int $storeItemId): array { $userId = Auth::id(); $existing = StoreItemInterest::where('user_id', $userId) ->where('store_item_id', $storeItemId) ->first(); if ($existing) { $existing->delete(); return ['interested' => false]; } StoreItemInterest::create(['user_id' => $userId, 'store_item_id' => $storeItemId]); return ['interested' => true]; } public function getInterestsByItem(int $storeItemId): array { return StoreItemInterest::with('user') ->where('store_item_id', $storeItemId) ->get() ->map(fn($interest) => [ 'id' => $interest->user?->id, 'name' => $interest->user?->name, 'email' => $interest->user?->email, ]) ->values() ->toArray(); } public function addVariation(int $storeItemId, array $data): StoreItemVariation { $item = StoreItem::findOrFail($storeItemId); return $item->variations()->create($data); } public function updateVariation(int $storeItemId, int $variationId, array $data): StoreItemVariation { $variation = StoreItemVariation::where('store_item_id', $storeItemId) ->findOrFail($variationId); $variation->update($data); return $variation->fresh(); } public function deleteVariation(int $storeItemId, int $variationId): void { StoreItemVariation::where('store_item_id', $storeItemId) ->findOrFail($variationId) ->delete(); } }