Files
getgreen-backend/app/Http/Controllers/API/CategoryController.php

142 lines
5.5 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use App\Http\Resources\BrandResource;
use App\Http\Resources\CategoryResource;
use App\Http\Resources\ProductPaginationResource;
use App\Models\Category;
use App\Models\Currency;
use Illuminate\Http\Request;
class CategoryController extends Controller
{
public function index()
{
$categories = Category::where('parent_id', null)->orderBy('position', 'asc')->get();
return CategoryResource::collection($categories);
}
public function products(Request $request, int $category_id)
{
$category = Category::find($category_id);
// check if category exists
if (!$category) {
return response()->json(['message' => 'Category not found'], 404);
}
$currency = Currency::latest()->first();
// add currency to cache
cache()->put('currency', $currency, now()->addMinutes(60));
// filter products by views (popular)
// filter products by price (cheaper, expensive)
// filter products by created_at (new)
// filter products by brand_id
// filter products by power (less_power, more_power)
$products = $category->products()->where('published', true);
if ($request->has('sort_by')) {
switch ($request->sort_by) {
case 'popular':
$products->orderBy('views', 'desc');
break;
case 'cheaper':
// If price_discount is not null, order by price_discount; otherwise, order by price
$products->orderByRaw('CASE WHEN price_discount IS NOT NULL THEN price_discount ELSE price END ASC');
break;
case 'expensive':
// If price_discount is not null, order by price_discount; otherwise, order by price
$products->orderByRaw('CASE WHEN price_discount IS NOT NULL THEN price_discount ELSE price END DESC');
break;
case 'new':
$products->orderBy('created_at', 'desc');
break;
case 'less_power':
$products->orderBy('power', 'asc');
break;
case 'more_power':
$products->orderBy('power', 'desc');
break;
}
}
// elseif ($category->is_filter_power) {
// $products->orderBy('power', 'asc');
// }
else { // default sort by price
$products->orderBy('price', 'asc');
}
if ($request->has('brand_id')) {
$products->where('brand_id', $request->brand_id);
}
// price range filter
if ($request->has('price_from') || $request->has('price_to')) {
$products->where(function ($query) use ($request, $currency) {
if ($request->has('price_from')) {
$query->where(function ($subQuery) use ($request, $currency) {
$subQuery->where(function ($q) use ($request, $currency) {
$q->whereNotNull('price_discount')
->where('price_discount', '>=', $request->price_from / $currency->dollar);
})->orWhere(function ($q) use ($request, $currency) {
$q->whereNull('price_discount')
->where('price', '>=', $request->price_from / $currency->dollar);
});
});
}
if ($request->has('price_to')) {
$query->where(function ($subQuery) use ($request, $currency) {
$subQuery->where(function ($q) use ($request, $currency) {
// dd($q->first());
$q->whereNotNull('price_discount')
->where('price_discount', '<=', $request->price_to / $currency->dollar);
})->orWhere(function ($q) use ($request, $currency) {
$q->whereNull('price_discount')
->where('price', '<=', $request->price_to / $currency->dollar);
});
});
}
});
}
$products = $products->paginate($request->limit ?? 20);
return (new ProductPaginationResource($products))->response();
}
public function filter($category_id, Request $request)
{
$category = Category::find($category_id);
$lang = $request->header('Accept-Language') ?? 'ru';
return response()->json([
'data' => [
'sort_by' => [
[
'name' => $lang == 'ru' ? 'Популярные' : 'Mashhur',
'slug' => 'popular'
],
[
'name' => $lang == 'ru' ? 'Сначало подешевле' : 'Avval arzonlari',
'slug' => 'cheaper'
],
[
'name' => $lang == 'ru' ? 'Сначало подороже' : 'Avval qimmatlari',
'slug' => 'expensive'
],
[
'name' => $lang == 'ru' ? 'Новые' : 'Yangi kelganlar',
'slug' => 'new'
]
],
'brands' => BrandResource::collection($category->brands)
]
]);
}
}