| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- <?php
- namespace App\Services;
- use App\Models\StoreItem;
- use App\Models\StoreItemInterest;
- use App\Models\StoreItemVariation;
- use Illuminate\Database\Eloquent\Collection;
- use Illuminate\Support\Arr;
- use Illuminate\Support\Facades\Auth;
- use Illuminate\Support\Facades\DB;
- class StoreItemService
- {
- public function getAll(): Collection
- {
- return StoreItem::with(['category', 'media', 'variations'])
- ->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();
- }
- }
|