|
|
@@ -4,7 +4,9 @@ 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;
|
|
|
|
|
|
@@ -12,46 +14,92 @@ class StoreItemService
|
|
|
{
|
|
|
public function getAll(): Collection
|
|
|
{
|
|
|
- return StoreItem::with('category')->orderBy('name')->get();
|
|
|
+ return StoreItem::with(['category', 'media', 'variations'])
|
|
|
+ ->withCount('interests')
|
|
|
+ ->orderBy('name')
|
|
|
+ ->get();
|
|
|
}
|
|
|
|
|
|
public function findById(int $id): ?StoreItem
|
|
|
{
|
|
|
- return StoreItem::with(['category', 'media'])->find($id);
|
|
|
+ return StoreItem::with(['category', 'media', 'variations'])->find($id);
|
|
|
}
|
|
|
|
|
|
public function create(array $data): StoreItem
|
|
|
{
|
|
|
- return StoreItem::create($data);
|
|
|
+ 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();
|
|
|
+ }
|
|
|
|
|
|
- if (!$model) {
|
|
|
- return null;
|
|
|
+ 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']);
|
|
|
}
|
|
|
|
|
|
- $model->update($data);
|
|
|
- return $model->fresh(['category']);
|
|
|
+ if (!empty($filters['category_id'])) {
|
|
|
+ $query->where('category_id', $filters['category_id']);
|
|
|
+ }
|
|
|
+
|
|
|
+ return $query->paginate($perPage);
|
|
|
}
|
|
|
|
|
|
- public function delete(int $id): bool
|
|
|
+ public function toggleStatus(int $id): ?StoreItem
|
|
|
{
|
|
|
$model = StoreItem::find($id);
|
|
|
+ if (!$model) return null;
|
|
|
|
|
|
- if (!$model) {
|
|
|
- return false;
|
|
|
- }
|
|
|
+ $model->status = $model->status->value === 'active'
|
|
|
+ ? \App\Enums\StoreItemStatusEnum::INACTIVE
|
|
|
+ : \App\Enums\StoreItemStatusEnum::ACTIVE;
|
|
|
+ $model->save();
|
|
|
|
|
|
- return $model->delete();
|
|
|
+ return $model->fresh(['category', 'media', 'variations']);
|
|
|
}
|
|
|
|
|
|
public function getMyInterests(): Collection
|
|
|
{
|
|
|
$userId = Auth::id();
|
|
|
- return StoreItem::with('category')
|
|
|
+ return StoreItem::with(['category', 'media', 'variations'])
|
|
|
+ ->withCount('interests')
|
|
|
->whereHas('interests', fn($q) => $q->where('user_id', $userId))
|
|
|
->orderBy('name')
|
|
|
->get();
|
|
|
@@ -60,7 +108,6 @@ class StoreItemService
|
|
|
public function toggleInterest(int $storeItemId): array
|
|
|
{
|
|
|
$userId = Auth::id();
|
|
|
-
|
|
|
$existing = StoreItemInterest::where('user_id', $userId)
|
|
|
->where('store_item_id', $storeItemId)
|
|
|
->first();
|
|
|
@@ -73,4 +120,39 @@ class StoreItemService
|
|
|
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();
|
|
|
+ }
|
|
|
}
|