diff --git a/app/Http/Controllers/Api/Web/ProductController.php b/app/Http/Controllers/Api/Web/ProductController.php new file mode 100644 index 0000000..c6dd798 --- /dev/null +++ b/app/Http/Controllers/Api/Web/ProductController.php @@ -0,0 +1,63 @@ +getUri()); + + $data = Cache::remember($cacheKey, now()->addMinutes(env('CACHE_LIFE_TIME', 10)), function () use ($request) { + $product = Product::query(); + /** + * Product Sort by keys + */ + if (isset($request['sort']) && !is_null($request['sort'])) { + if ($request['sort'] === 'new') + $product = $product->orderByDesc('created_at'); + if ($request['sort'] === 'old') + $product = $product->orderBy('created_at'); + if ($request['sort'] === 'most_view') + $product = $product->orderByDesc('view'); + if ($request['sort'] === 'less_view') + $product = $product->orderBy('view'); + if ($request['sort'] === 'most_buy') + $product = $product->orderByDesc('sell'); + if ($request['sort'] === 'less_buy') + $product = $product->orderBy('sell'); + } + if (isset($request['category']) && !is_null($request['category'])) + $product = $product->where('category_id', Category::firstWhere('slug', $request['category'])->id); + + if (isset($request['search']) && !is_null($request['search'])) + $product = $product->where('name', 'LIKE', "%$request->search%"); + + if (isset($request['min_price']) && + isset($request['max_price']) && + !is_null($request['min_price']) && + !is_null($request['max_price']) + ) { + $product = $product->whereBetween('buy_price', [ + intval($request->min_price), + intval($request->max_price) + ]); + } + $request->merge([ + 'loadCategory' => true + ]); + return [ + 'products' => ProductResource::collection($product->paginate($request->input('per_page', 20)))->resource->toArray(), + ]; + }); + return success($data); + } +} diff --git a/app/Http/Resources/CategoryResource.php b/app/Http/Resources/CategoryResource.php index 5129d19..64c347f 100644 --- a/app/Http/Resources/CategoryResource.php +++ b/app/Http/Resources/CategoryResource.php @@ -21,9 +21,11 @@ class CategoryResource extends JsonResource /** * @var $this Category */ - $request->merge([ - 'loadCategory' => false - ]); + + if (!$request['loadCategory']) + $request->merge([ + 'loadCategory' => false + ]); return [ 'id' => $this->id, 'name' => $this->name, @@ -33,7 +35,7 @@ class CategoryResource extends JsonResource 'sort' => $this->sort, 'image' => $this->image, 'bg' => $this->bg, - 'products' => $this->when($request->input('loadProduct' , true) , ProductResource::collection($this->products)->additional(['request' => $request['loadCategory']]) ) + 'products' => $this->when($request->input('loadProduct', true), ProductResource::collection($this->products)->additional(['request' => $request['loadCategory']])) ]; } } diff --git a/app/Http/Resources/ProductResource.php b/app/Http/Resources/ProductResource.php index 85b50b7..3b0ea55 100644 --- a/app/Http/Resources/ProductResource.php +++ b/app/Http/Resources/ProductResource.php @@ -18,22 +18,26 @@ class ProductResource extends JsonResource /** * @var $this Product */ - $request->merge([ - 'loadProduct' => false - ]); + if (!$request['loadProduct']) + $request->merge([ + 'loadProduct' => false + ]); + return [ 'id' => $this->id, + 'name' => $this->name, 'slug' => $this->slug, 'description' => $this->description, 'table' => $this->table, 'sku' => $this->sku, 'virtual' => $this->virtual, 'downloadable' => $this->downloadable, - 'price' => $this->price, + 'price' => intval($this->price), 'buy_price' => $this->buy_price, - 'average_rating' => $this->average_rating, + 'average_rating' => floatval($this->average_rating), 'view' => $this->view, - 'category' => $this->when($request->input('loadCategory', true), new CategoryResource($this->category)) + 'category' => $this->when($request->input('loadCategory', true), new CategoryResource($this->category)), + 'image' => $this->imgUrl() ]; } } diff --git a/routes/api.php b/routes/api.php index c99478e..9e288ef 100644 --- a/routes/api.php +++ b/routes/api.php @@ -40,4 +40,5 @@ Route::prefix('v1')->name('v1.')->group( Route::post('visitor/display', [\App\Http\Controllers\Api\VisitorController::class, 'display'])->name('visitor.display'); Route::apiResource('web', \App\Http\Controllers\Api\Web\HomeController::class)->only('index'); + Route::apiResource('products' , \App\Http\Controllers\Api\Web\ProductController::class)->only('index'); });