Viewing File: /home/ubuntu/shop-website-base/app/Http/Controllers/User/ProductController.php
<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Api\User\ProductApiController;
use Exception, DB, Validator, Setting, Log, Hash, Auth;
use App\Helpers\Helper, App\Helpers\CommonHelper;
use App\Models\Product, App\Models\User, App\Models\ProductGallery;
use App\Models\Cart, App\Models\UserBillingAddress;
use App\Models\Category, App\Models\SubCategory;
use App\Models\Order, App\Models\OrderProduct, App\Models\OrderPayment;
use App\Repositories\ProductRepository as ProductRepo;
use Twilio\Rest\Client;
class ProductController extends Controller {
protected $skip, $take;
protected $ProductAPI;
public function __construct(Request $request,ProductApiController $API) {
$this->ProductAPI = $API;
Log::info(url()->current());
Log::info("Request Data".print_r($request->all(), true));
$this->middleware('auth:user',['except' => ['add_to_cart','products','products_cart_remove','products_view','categories','products_list']]);
$this->loginUser = User::find($request->id);
$this->skip = $request->skip ?: 0;
$this->take = $request->take ?: (Setting::get('admin_take_count') ?: TAKE_COUNT);
}
/**
* @method products()
*
* @uses List Products
*
* @created
*
* @updated
*
* @param object $request
*
* @return user details
*/
public function products(Request $request) {
try {
$skip = $request->skip ? $request->skip : 0;
$base_query = Product::CommonResponse();
$title = tr('new_products');
if($request->category) {
$category = Category::where('unique_id',$request->category)->first();
$title = $category->name;
$base_query = $base_query->where('category_id',$category->id);
}
if($request->sub_category_id) {
$sub_category = SubCategory::find($request->sub_category_id);
$sub_category_name = $sub_category->name;
$category = Category::find($sub_category->category_id);
$title = $category->name;
$category_id = $category->id;
$base_query = $base_query->where('sub_category_id',$request->sub_category_id);
}
if($request->search_key) {
$search_key = $request->search_key;
$base_query = $base_query
->Where('products.name','LIKE','%'.$search_key.'%')
->orWhere('products.description','LIKE','%'.$search_key.'%');
}
if($request->sort_key){
switch ($request->sort_key) {
case SORT_BY_POPULARITY:
$base_query = $base_query->orderBy('used_quantity','DESC');
break;
case SORT_BY_ALPHABETICAL:
$base_query = $base_query->orderBy('name','asc');
break;
case SORT_BY_LOW_TO_HIGH:
$base_query = $base_query->orderBy('amount','asc');
break;
case SORT_BY_HIGH_TO_LOW:
$base_query = $base_query->orderBy('amount','desc');
break;
default:
$base_query = $base_query->orderBy('updated_at','desc');
break;
}
} else{
$base_query = $base_query->orderBy('updated_at','desc');
}
$base_query = $base_query->skip($skip)->take(8);
$total_products = $base_query->count();
$product = $base_query->get();
if($request->ajax()) {
$view = view('user.products._products')
->with('product', $product)
->with('total_current_products', count($product))
->with('total_products', $product)
->with('skip', $skip);
$data = ['total_products'=> count($product), 'total_current_products' => count($product),'view'=> $view->render()];
return $data;
}
return view('user.products.index')
->with('page','new_products')
->with('product',$product)
->with('total_current_products', count($product))
->with('total_products', $product)
->with('title',$title)
->with('sub_category_name',$sub_category_name ?? '')
->with('category_id',$category_id ?? '');
} catch (Exception $e) {
return redirect()->back()->withInput()->with('flash_error', $e->getMessage());
}
}
/**
* @method categories()
*
* @uses List Products
*
* @created
*
* @updated
*
* @param object $request
*
* @return user details
*/
public function categories(Request $request) {
try {
$skip = $request->skip ? $request->skip : 0;
$base_query = Category::orderBy('updated_at','desc')
->with('categoryProducts')->has('categoryProducts')
->skip($skip)->take(4);
$total_categories = $base_query->count();
$category = $base_query->get();
if($request->ajax()) {
$view = view('user.categories._categories')
->with('category', $category)
->with('total_current_category', count($category))
->with('total_categories', $category)
->with('skip', $skip);
$data = ['total_categories'=> $total_categories, 'total_current_category' => count($category),'view'=> $view->render()];
return $data;
}
return view('user.categories.index')
->with('category',$category)
->with('total_current_category', count($category))
->with('total_categories', $category);
} catch (Exception $e) {
return redirect()->back()->withInput()->with('flash_error', $e->getMessage());
}
}
/**
* @method add_to_wishlist()
*
* @uses List Products
*
* @created
*
* @updated
*
* @param object $request
*
* @return user details
*/
public function add_to_wishlist(Request $request) {
try {
$request->request->add([
'id' => Auth::guard('user')->user()->id,
]);
$response = $this->ProductAPI->product_wishlists_save($request)->getData();
return response()->json($response);
} catch (Exception $e) {
return redirect()->back()->withInput()->with('flash_error', $e->getMessage());
}
}
/**
* @method add_to_cart()
*
* @uses Product added to cart
*
* @created Bhawya
*
* @updated Bhawya
*
* @param object $request
*
* @return view page
*/
public function add_to_cart(Request $request) {
try {
if(Auth::guard('user')->check()) {
$request->request->add([
'id' => Auth::guard('user')->user()->id,
'quantity' => 0.5
]);
$response = $this->ProductAPI->add_to_cart($request)->getData();
} else {
$request->request->add([
'ip_address' => get_ip_address(),
'quantity' => 0.5
]);
$response = $this->ProductAPI->add_to_cart_unregistered($request)->getData();
}
return response()->json($response);
} catch (Exception $e) {
return redirect()->route('user.index')->with('flash_error', $e->getMessage());
}
}
/**
* @method products_cart_remove()
*
* @uses Product added to cart
*
* @created Bhawya
*
* @updated Bhawya
*
* @param object $request
*
* @return view page
*/
public function products_cart_remove(Request $request) {
try {
if(Auth::guard('user')->check()) {
$request->request->add([
'id' => Auth::guard('user')->user()->id,
]);
$response = $this->ProductAPI->carts_delete($request)->getData();
} else {
$request->request->add([
'ip_address' => get_ip_address(),
]);
$response = $this->ProductAPI->carts_delete($request)->getData();
}
if($response->success) {
return back()->with('flash_success', $response->message);
} else {
return back()->with('flash_error', $response->message);
}
} catch (Exception $e) {
return redirect()->route('user.index')->with('flash_error', $e->getMessage());
}
}
/**
* @method products_view()
*
* @uses List Products
*
* @created
*
* @updated
*
* @param object $request
*
* @return user details
*/
public function products_view($unique_id, Request $request) {
try {
$product = Product::where('products.unique_id', $unique_id)->CommonResponse()->where('products.status', APPROVED)->first();
if(!$product) {
throw new Exception(tr('product_not_available'), 101);
}
$product_gallery = ProductGallery::where('product_id',$product->product_id)->get();
$product['cart'] = [];
if(Auth::guard('user')->check()) {
$product['cart'] = Cart::where('carts.user_id', Auth::guard('user')->user()->id)->where('product_id', $product->product_id)->first();
} else {
$product['cart'] = Cart::where('carts.ip_address', get_ip_address())->where('product_id', $product->product_id)->first();
}
$base_query = Product::CommonResponse()->where('products.status', APPROVED)->orderBy('products.updated_at','desc');
$suggestion_products = $base_query->where('products.id', '!=', $product->product_id)->where('product_inventories.remaining_quantity', '>', 0)->skip(0)->take(6)->get();
return view('user.products.view')
->with('product', $product)
->with('product_gallery', $product_gallery)
->with('suggestion_products', $suggestion_products);
} catch (Exception $e) {
return redirect()->route('user.index')->with('flash_error', $e->getMessage());
}
}
/**
* @method my_cart()
*
* @uses List Products
*
* @created
*
* @updated
*
* @param object $request
*
* @return user details
*/
public function my_cart(Request $request) {
try {
$request->request->add([
'id' => Auth::guard('user')->user()->id,
]);
$query = Cart::where('carts.user_id', $request->id)
->CommonResponse()
->where('products.status', APPROVED);
$cart = $query->orderBy('carts.id','DESC')->get();
$total_price = formatted_amount($cart->sum('total_price'));
return view('user.checkout.carts_list')
->with('cart',$cart)
->with('total_price' , $total_price);
} catch (Exception $e) {
return redirect()->route('user.index')->with('flash_error', $e->getMessage());
}
}
/**
* @method cart_checkout()
*
* @uses List Products
*
* @created
*
* @updated
*
* @param object $request
*
* @return user details
*/
public function cart_checkout(Request $request) {
try {
$request->request->add([
'id' => Auth::guard('user')->user()->id,
]);
$user_delivery_address = UserBillingAddress::where('user_id', $request->id)
->where('status', APPROVED)->orderBy('id','DESC')->get();
$query = Cart::where('carts.user_id', $request->id)
->CommonResponse()
->where('products.status', APPROVED);
$cart = $query->orderBy('carts.id','DESC')->get();
$total_price = formatted_amount($cart->sum('total_price'));
return view('user.checkout.checkout')
->with('cart',$cart)
->with('total_price' , $total_price)
->with('user_delivery_address',$user_delivery_address);
} catch (Exception $e) {
return redirect()->route('user.index')->with('flash_error', $e->getMessage());
}
}
/**
* @method carts_checkout_save()
*
* @uses Save Payment
*
* @created Bhawya
*
* @updated Bhawya
*
* @param object $request
*
* @return view page
*/
public function carts_checkout_save(Request $request) {
try {
$request->request->add([
'id' => Auth::guard('user')->user()->id,
]);
$cart = Cart::where('carts.user_id', $request->id)->CommonResponse()
->where('products.status', APPROVED)
->first();
if(!$cart) {
throw new Exception(api_error(106),106);
}
if(!$request->user_billing_address_id) {
$rules = [
'street_address' => 'required',
'address' => 'required',
'zipcode' => 'required',
'city' => 'required',
];
Helper::custom_validator($request->all(),$rules);
$billing_details = ProductRepo::user_billing_address_save($request);
$request->request->add([
'user_billing_address_id' => $billing_details->id,
]);
}
$checkout_response = $this->ProductAPI->save_orders($request)->getData();
if($checkout_response->success) {
$order = Order::where('id',$checkout_response->data->order_id)->first();
$request->request->add([
'order_id' => $order->id
]);
ProductRepo::order_confirmation_mail($request);
$job_data['status'] = 'Confirmed';
$job_data['order'] = $order;
dispatch(new \App\Jobs\OrderMessageJob($job_data));
return view('user.orders.success')
->with('order',$order)
->with('flash_success', $checkout_response->message);
} else {
return back()->with('flash_error', $checkout_response->message);
}
} catch (Exception $e) {
return redirect()->route('user.cart_checkout')->with('flash_error', $e->getMessage());
}
}
/**
* @method featured_products()
*
* @uses List Products
*
* @created
*
* @updated
*
* @param object $request
*
* @return user details
*/
public function featured_products(Request $request) {
try {
$skip = $request->skip ? $request->skip : 0;
$base_query = Product::CommonResponse();
if($request->category_id) {
$category = Category::find($request->category_id);
} else {
$category = Category::where('status',APPROVED)->with('categoryProducts')->has('categoryProducts')->orderBy('updated_at','desc')->first();
}
$base_query = $base_query->where('category_id',$request->category_id);
$title = $category->name ?? tr('featured_products');
if($request->sub_category_id) {
$sub_category = SubCategory::find($request->sub_category_id);
$sub_category_name = $sub_category->name;
$base_query = $base_query->where('sub_category_id',$request->sub_category_id);
}
$base_query = $base_query->skip($skip)->take(4);
if($request->sort_key){
$popular_products = OrderProduct::selectRaw('product_id, count(*)')->groupBy('product_id')->orderByRaw('COUNT(*) DESC')->pluck('product_id')->toArray();
switch ($request->sort_key) {
case SORT_BY_POPULARITY:
$base_query = $base_query->whereIn('products.id',$popular_products);
break;
case SORT_BY_ALPHABETICAL:
$base_query = $base_query->orderBy('name','asc');
break;
case SORT_BY_LOW_TO_HIGH:
$base_query = $base_query->orderBy('amount','asc');
break;
case SORT_BY_HIGH_TO_LOW:
$base_query = $base_query->orderBy('amount','desc');
break;
default:
$base_query = $base_query->orderBy('updated_at','desc');
break;
}
}
else{
$base_query = $base_query->orderBy('updated_at','desc');
}
$total_products = $base_query->count();
$product = $base_query->get();
if($request->ajax()) {
$view = view('user.products._products')
->with('product', $product)
->with('total_current_products', count($product))
->with('total_products', $product)
->with('skip', $skip);
$data = ['total_products'=> $total_products, 'total_current_products' => count($product),'view'=> $view->render()];
return $data;
}
return view('user.products.featured_products')
->with('product',$product)
->with('total_current_products', count($product))
->with('total_products', $product)
->with('title',$title)
->with('sub_category_name',$sub_category_name ?? '');
} catch (Exception $e) {
return redirect()->back()->withInput()->with('flash_error', $e->getMessage());
}
}
/**
* @method cart_checkout()
*
* @uses List Products
*
* @created
*
* @updated
*
* @param object $request
*
* @return user details
*/
public function billing_details(Request $request) {
try {
$request->request->add([
'id' => Auth::guard('user')->user()->id,
]);
$order = Order::where('id',$request->order_id)->first();
if(!$order) {
throw new Exception(tr('order_not_found'), 1);
}
$order_products = OrderProduct::where('order_id',$order->id)->orderBy('created_at','desc')->get();
$order_payments = OrderPayment::where('order_id',$order->id)->first();
return view('user.orders.billing_details')
->with('order',$order)
->with('order_products',$order_products)
->with('order_payments',$order_payments);
} catch (Exception $e) {
return redirect()->route('user.index')->with('flash_error', $e->getMessage());
}
}
/**
* @method products_list()
*
* @uses List Products
*
* @created Ganesh
*
* @updated Ganesh
*
* @param object $request
*
* @return view page
*/
public function products_list(Request $request) {
try {
$base_query = Product::orderBy('name','asc')->where('products.name', 'LIKE', '%' . $request->get('query') .'%');
$products = $base_query->get();
return $this->sendResponse($message = '', '', $products);
} catch(Exception $e) {
return $this->sendError($e->getMessage(), $e->getCode());
}
}
}
Back to Directory
File Manager