diff --git a/packages/Sarga/API/Http/Controllers/Products.php b/packages/Sarga/API/Http/Controllers/Products.php index af2160841..e01b3dade 100644 --- a/packages/Sarga/API/Http/Controllers/Products.php +++ b/packages/Sarga/API/Http/Controllers/Products.php @@ -2,7 +2,6 @@ namespace Sarga\API\Http\Controllers; -use Illuminate\Support\Arr; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Sarga\API\Http\Resources\Catalog\ProductVariant; @@ -151,7 +150,7 @@ class Products extends ProductController ->where('channel', $channel) ->where('locale', $locale) ->take(10) - ->query(fn ($query) => $query->select('id','name') + ->query(fn ($query) => $query->select(DB::raw('product_id as id'),'name') // ->addSelect(DB::raw("\'product\' as type" )) ->orderBy('name')) ->get(); @@ -168,12 +167,17 @@ class Products extends ProductController } + public function searchProducts(){ return ProductResource::collection($this->productRepository->searchProductByAttribute(request('key'))); } public function discountedProducts(){ - return ProductResource::collection($this->productRepository->getDiscounted()); + return ProductResource::collection($this->productRepository->getDiscountedProducts(request()->input('category_id'))); + } + + public function popularProducts(){ + return ProductResource::collection($this->productRepository->getPopularProducts(request()->input('category_id'))); } } diff --git a/packages/Sarga/API/Http/routes.php b/packages/Sarga/API/Http/routes.php index ef492e145..8ea5a088b 100644 --- a/packages/Sarga/API/Http/routes.php +++ b/packages/Sarga/API/Http/routes.php @@ -52,6 +52,7 @@ Route::group(['prefix' => 'api'], function () { //Product routes Route::get('products', [Products::class, 'index']); Route::get('products-discounted', [Products::class, 'discountedProducts']); + Route::get('products-popular', [Products::class, 'popularProducts']); Route::get('products-search', [Products::class, 'searchProducts']); Route::get('suggestions', [Products::class, 'suggestions']); Route::get('products/{id}', [Products::class, 'get']); diff --git a/packages/Sarga/Shop/src/Repositories/ProductRepository.php b/packages/Sarga/Shop/src/Repositories/ProductRepository.php index 21c81ae9a..249789c9e 100644 --- a/packages/Sarga/Shop/src/Repositories/ProductRepository.php +++ b/packages/Sarga/Shop/src/Repositories/ProductRepository.php @@ -466,179 +466,58 @@ class ProductRepository extends WProductRepository return $results; } - public function getDiscounted() - { - $params = request()->input(); - if (core()->getConfigData('catalog.products.storefront.products_per_page')) { - $pages = explode(',', core()->getConfigData('catalog.products.storefront.products_per_page')); + public function getDiscountedProducts($categoryId = null){ + $count = core()->getConfigData('catalog.products.homepage.no_of_new_product_homepage'); - $perPage = isset($params['limit']) ? (! empty($params['limit']) ? $params['limit'] : 9) : current($pages); - } else { - $perPage = isset($params['limit']) && ! empty($params['limit']) ? $params['limit'] : 9; - } - - $page = Paginator::resolveCurrentPage('page'); - - $repository = app(ProductFlatRepository::class)->scopeQuery(function ($query) use ($params) { + $results = app(ProductFlatRepository::class)->scopeQuery(function ($query) use ($categoryId) { $channel = core()->getRequestedChannelCode(); - $locale = core()->getRequestedLocaleCode(); - $qb = $query->distinct() - ->select('product_flat.*') - ->leftJoin('product_categories', 'product_categories.product_id', '=', 'product_flat.product_id') + $query->distinct() + ->addSelect('product_flat.*') + ->where('product_flat.status', 1) + ->where('product_flat.visible_individually', 1) + ->whereNotNull('product_flat.special_price') ->where('product_flat.channel', $channel) - ->where('product_flat.locale', $locale) - ->whereNotNull('product_flat.url_key') - ->whereNotNull('product_flat.special_price'); + ->where('product_flat.locale', $locale); - if (! core()->getConfigData('catalog.products.homepage.out_of_stock_items')) { - $qb = $this->checkOutOfStockItem($qb); + if ($categoryId) { + $query->leftJoin('product_categories', 'product_categories.product_id', '=', 'product_flat.product_id') + ->whereIn('product_categories.category_id', explode(',', $categoryId)); } - - if (is_null(request()->input('status'))) { - $qb->where('product_flat.status', 1); - } - - if (is_null(request()->input('visible_individually'))) { - $qb->where('product_flat.visible_individually', 1); - } - - # sort direction - $orderDirection = 'asc'; - if (isset($params['order']) && in_array($params['order'], ['desc', 'asc'])) { - $orderDirection = $params['order']; - } else { - $sortOptions = $this->getDefaultSortByOption(); - - $orderDirection = ! empty($sortOptions) ? $sortOptions[1] : 'asc'; - } - - if (isset($params['sort'])) { - $qb = $this->checkSortAttributeAndGenerateQuery($qb, $params['sort'], $orderDirection); - } else { - $sortOptions = $this->getDefaultSortByOption(); - if (! empty($sortOptions)) { - $qb = $this->checkSortAttributeAndGenerateQuery($qb, $sortOptions[0], $orderDirection); - } - } - - if ($priceFilter = request('price')) { - $priceRange = explode(',', $priceFilter); - - if (count($priceRange) > 0) { - $customerGroupId = null; - - if (auth()->guard()->check()) { - $customerGroupId = auth()->guard()->user()->customer_group_id; - } else { - $customerGuestGroup = app('Webkul\Customer\Repositories\CustomerGroupRepository')->getCustomerGuestGroup(); - - if ($customerGuestGroup) { - $customerGroupId = $customerGuestGroup->id; - } - } - - $this->variantJoin($qb); - - $qb - ->leftJoin('catalog_rule_product_prices', 'catalog_rule_product_prices.product_id', '=', 'variants.product_id') - ->leftJoin('product_customer_group_prices', 'product_customer_group_prices.product_id', '=', 'variants.product_id') - ->where(function ($qb) use ($priceRange, $customerGroupId) { - $qb->where(function ($qb) use ($priceRange) { - $qb - ->where('variants.min_price', '>=', core()->convertToBasePrice($priceRange[0])) - ->where('variants.min_price', '<=', core()->convertToBasePrice(end($priceRange))); - }) - ->orWhere(function ($qb) use ($priceRange) { - $qb - ->where('catalog_rule_product_prices.price', '>=', core()->convertToBasePrice($priceRange[0])) - ->where('catalog_rule_product_prices.price', '<=', core()->convertToBasePrice(end($priceRange))); - }) - ->orWhere(function ($qb) use ($priceRange, $customerGroupId) { - $qb - ->where('product_customer_group_prices.value', '>=', core()->convertToBasePrice($priceRange[0])) - ->where('product_customer_group_prices.value', '<=', core()->convertToBasePrice(end($priceRange))) - ->where('product_customer_group_prices.customer_group_id', '=', $customerGroupId); - }); - }); - } - } - - $attributeFilters = $this->attributeRepository - ->getProductDefaultAttributes(array_keys( - request()->except(['price']) - )); - - if (count($attributeFilters) > 0) { - $this->variantJoin($qb); - - $qb->where(function ($filterQuery) use ($attributeFilters) { - foreach ($attributeFilters as $attribute) { - $filterQuery->orWhere(function ($attributeQuery) use ($attribute) { - - $column = DB::getTablePrefix() . 'product_attribute_values.' . ProductAttributeValueProxy::modelClass()::$attributeTypeFields[$attribute->type]; - - $filterInputValues = explode(',', request()->get($attribute->code)); - - # define the attribute we are filtering - $attributeQuery = $attributeQuery->where('product_attribute_values.attribute_id', $attribute->id); - - # apply the filter values to the correct column for this type of attribute. - if ($attribute->type != 'price') { - - $attributeQuery->where(function ($attributeValueQuery) use ($column, $filterInputValues) { - foreach ($filterInputValues as $filterValue) { - if (! is_numeric($filterValue)) { - continue; - } - $attributeValueQuery->orWhereRaw("find_in_set(?, {$column})", [$filterValue]); - } - }); - - } else { - $attributeQuery->where($column, '>=', core()->convertToBasePrice(current($filterInputValues))) - ->where($column, '<=', core()->convertToBasePrice(end($filterInputValues))); - } - }); - } - }); - - # this is key! if a product has been filtered down to the same number of attributes that we filtered on, - # we know that it has matched all of the requested filters. - $qb->groupBy('variants.id'); - $qb->havingRaw('COUNT(*) = ' . count($attributeFilters)); - } - - return $qb->groupBy('product_flat.id'); - - }); - - # apply scope query so we can fetch the raw sql and perform a count - $repository->applyScope(); - $countQuery = "select count(*) as aggregate from ({$repository->model->toSql()}) c"; - $count = collect(DB::select($countQuery, $repository->model->getBindings()))->pluck('aggregate')->first(); - - if ($count > 0) { - # apply a new scope query to limit results to one page - $repository->scopeQuery(function ($query) use ($page, $perPage) { - return $query->forPage($page, $perPage); - }); - - # manually build the paginator - $items = $repository->get(); - } else { - $items = []; - } - - $results = new LengthAwarePaginator($items, $count, $perPage, $page, [ - 'path' => request()->url(), - 'query' => request()->query(), - ]); + return $query->inRandomOrder(); + })->paginate($count ? $count : 4); return $results; } + + public function getPopularProducts($categoryId = null) + { + $count = core()->getConfigData('catalog.products.homepage.no_of_new_product_homepage'); + + $results = app(ProductFlatRepository::class)->scopeQuery(function ($query) use ($categoryId) { + $channel = core()->getRequestedChannelCode(); + $locale = core()->getRequestedLocaleCode(); + + $query->distinct() + ->addSelect('product_flat.*') + ->where('product_flat.status', 1) + ->where('product_flat.visible_individually', 1) + ->whereNotNull('product_flat.favoritesCount') + ->where('product_flat.channel', $channel) + ->where('product_flat.locale', $locale); + + if ($categoryId) { + $query->leftJoin('product_categories', 'product_categories.product_id', '=', 'product_flat.product_id') + ->whereIn('product_categories.category_id', explode(',', $categoryId)); + } + return $query->orderBy('product_flat.favoritesCount','desc'); + })->paginate($count ? $count : 4); + + return $results; + } + private function calculatePrice($price){ $originalPrice = Arr::get($price, 'originalPrice.value'); $discountedPrice = Arr::get($price, 'discountedPrice.value'); @@ -676,12 +555,14 @@ class ProductRepository extends WProductRepository } else $product['attribute_family_id'] = $product['type'] == 'configurable' ? 2 : 1; - if(!empty($data['brand']) && - $brand = $this->brandRepository->firstOrCreate([ - 'name' => $data['brand'], - 'code' => Str::slug($data['brand']), - ])) + if(!empty($data['brand'])) { + $code = Str::slug($data['brand']); + + if(! $brand = $this->brandRepository->findOneByField('code',$code)) + $brand = $this->brandRepository->create(['name' => $data['brand'], + 'code' => $code]); + $product['brand_id'] = $brand->id; } //create product