lasf fixes
This commit is contained in:
parent
013edd6e7c
commit
c20caa7ef9
|
|
@ -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')));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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']);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue