You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
299 lines
11 KiB
299 lines
11 KiB
<?php
|
|
|
|
namespace App\Http\Controllers\Api\V1;
|
|
|
|
use App\CentralLogics\Helpers;
|
|
use App\CentralLogics\ProductLogic;
|
|
use App\CentralLogics\RestaurantLogic;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Food;
|
|
use App\Models\Restaurant;
|
|
use App\Models\Review;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use Illuminate\Support\Facades\Validator;
|
|
|
|
class ProductController extends Controller
|
|
{
|
|
public function get_latest_products(Request $request)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'restaurant_id' => 'required',
|
|
'category_id' => 'required',
|
|
'limit' => 'required',
|
|
'offset' => 'required',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
|
|
}
|
|
|
|
$type = $request->query('type', 'all');
|
|
|
|
$products = ProductLogic::get_latest_products($request['limit'], $request['offset'], $request['restaurant_id'], $request['category_id'], $type);
|
|
$products['products'] = Helpers::product_data_formatting($products['products'], true, false, app()->getLocale());
|
|
return response()->json($products, 200);
|
|
}
|
|
|
|
public function get_searched_products(Request $request)
|
|
{
|
|
if (!$request->hasHeader('zoneId')) {
|
|
$errors = [];
|
|
array_push($errors, ['code' => 'zoneId', 'message' => translate('messages.zone_id_required')]);
|
|
return response()->json([
|
|
'errors' => $errors
|
|
], 403);
|
|
}
|
|
$validator = Validator::make($request->all(), [
|
|
'name' => 'required'
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
|
|
}
|
|
$zone_id= json_decode($request->header('zoneId'), true);
|
|
|
|
$key = explode(' ', $request['name']);
|
|
|
|
$limit = $request['limit']??10;
|
|
$offset = $request['offset']??1;
|
|
|
|
$type = $request->query('type', 'all');
|
|
|
|
$products = Food::active()->type($type)
|
|
->whereHas('restaurant', function($q)use($zone_id){
|
|
$q->whereIn('zone_id', $zone_id);
|
|
})
|
|
->when($request->category_id, function($query)use($request){
|
|
$query->whereHas('category',function($q)use($request){
|
|
return $q->whereId($request->category_id)->orWhere('parent_id', $request->category_id);
|
|
});
|
|
})
|
|
->when($request->restaurant_id, function($query) use($request){
|
|
return $query->where('restaurant_id', $request->restaurant_id);
|
|
})
|
|
->where(function ($q) use ($key) {
|
|
foreach ($key as $value) {
|
|
$q->orWhere('name', 'like', "%{$value}%");
|
|
}
|
|
$q->orWhereHas('tags',function($query)use($key){
|
|
$query->where(function($q)use($key){
|
|
foreach ($key as $value) {
|
|
$q->where('tag', 'like', "%{$value}%");
|
|
};
|
|
});
|
|
});
|
|
})
|
|
->paginate($limit, ['*'], 'page', $offset);
|
|
|
|
$data = [
|
|
'total_size' => $products->total(),
|
|
'limit' => $limit,
|
|
'offset' => $offset,
|
|
'products' => $products->items()
|
|
];
|
|
|
|
$data['products'] = Helpers::product_data_formatting($data['products'], true, false, app()->getLocale());
|
|
return response()->json($data, 200);
|
|
}
|
|
|
|
public function get_popular_products(Request $request)
|
|
{
|
|
if (!$request->hasHeader('zoneId')) {
|
|
$errors = [];
|
|
array_push($errors, ['code' => 'zoneId', 'message' => translate('messages.zone_id_required')]);
|
|
return response()->json([
|
|
'errors' => $errors
|
|
], 403);
|
|
}
|
|
|
|
$type = $request->query('type', 'all');
|
|
|
|
$zone_id= json_decode($request->header('zoneId'), true);
|
|
$products = ProductLogic::popular_products($zone_id, $request['limit'], $request['offset'], $type);
|
|
$products['products'] = Helpers::product_data_formatting($products['products'], true, false, app()->getLocale());
|
|
return response()->json($products, 200);
|
|
}
|
|
|
|
public function get_most_reviewed_products(Request $request)
|
|
{
|
|
if (!$request->hasHeader('zoneId')) {
|
|
$errors = [];
|
|
array_push($errors, ['code' => 'zoneId', 'message' => translate('messages.zone_id_required')]);
|
|
return response()->json([
|
|
'errors' => $errors
|
|
], 403);
|
|
}
|
|
|
|
$type = $request->query('type', 'all');
|
|
|
|
$zone_id= json_decode($request->header('zoneId'), true);
|
|
$products = ProductLogic::most_reviewed_products($zone_id, $request['limit'], $request['offset'], $type);
|
|
$products['products'] = Helpers::product_data_formatting($products['products'], true, false, app()->getLocale());
|
|
return response()->json($products, 200);
|
|
}
|
|
|
|
public function get_product($id)
|
|
{
|
|
|
|
try {
|
|
$product = ProductLogic::get_product($id);
|
|
$product = Helpers::product_data_formatting($product, false, false, app()->getLocale());
|
|
return response()->json($product, 200);
|
|
} catch (\Exception $e) {
|
|
return response()->json([
|
|
'errors' => ['code' => 'product-001', 'message' => translate('messages.not_found')]
|
|
], 404);
|
|
}
|
|
}
|
|
|
|
public function get_related_products($id)
|
|
{
|
|
if (Food::find($id)) {
|
|
$products = ProductLogic::get_related_products($id);
|
|
$products = Helpers::product_data_formatting($products, true, false, app()->getLocale());
|
|
return response()->json($products, 200);
|
|
}
|
|
return response()->json([
|
|
'errors' => ['code' => 'product-001', 'message' => translate('messages.not_found')]
|
|
], 404);
|
|
}
|
|
|
|
public function get_set_menus()
|
|
{
|
|
try {
|
|
$products = Helpers::product_data_formatting(Food::active()->with(['rating'])->where(['set_menu' => 1, 'status' => 1])->get(), true, false, app()->getLocale());
|
|
return response()->json($products, 200);
|
|
} catch (\Exception $e) {
|
|
return response()->json([
|
|
'errors' => ['code' => 'product-001', 'message' => 'Set menu not found!']
|
|
], 404);
|
|
}
|
|
}
|
|
|
|
public function get_product_reviews($food_id)
|
|
{
|
|
$reviews = Review::with(['customer', 'food'])->where(['food_id' => $food_id])->active()->get();
|
|
|
|
$storage = [];
|
|
foreach ($reviews as $item) {
|
|
$item['attachment'] = json_decode($item['attachment']);
|
|
$item['food_name'] = null;
|
|
if($item->food)
|
|
{
|
|
$item['food_name'] = $item->food->name;
|
|
if(count($item->food->translations)>0)
|
|
{
|
|
$translate = array_column($item->food->translations->toArray(), 'value', 'key');
|
|
$item['food_name'] = $translate['name'];
|
|
}
|
|
}
|
|
|
|
unset($item['food']);
|
|
array_push($storage, $item);
|
|
}
|
|
|
|
return response()->json($storage, 200);
|
|
}
|
|
|
|
public function get_product_rating($id)
|
|
{
|
|
try {
|
|
$product = Food::find($id);
|
|
$overallRating = ProductLogic::get_overall_rating($product->reviews);
|
|
return response()->json(floatval($overallRating[0]), 200);
|
|
} catch (\Exception $e) {
|
|
return response()->json(['errors' => $e], 403);
|
|
}
|
|
}
|
|
|
|
public function submit_product_review(Request $request)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'food_id' => 'required',
|
|
'order_id' => 'required',
|
|
'comment' => 'required',
|
|
'rating' => 'required|numeric|max:5',
|
|
'attachment.*' => 'nullable|max:2048',
|
|
]);
|
|
|
|
$product = Food::find($request->food_id);
|
|
if (isset($product) == false) {
|
|
$validator->errors()->add('food_id', translate('messages.food_not_found'));
|
|
}
|
|
|
|
$multi_review = Review::where(['food_id' => $request->food_id, 'user_id' => $request->user()->id, 'order_id'=>$request->order_id])->first();
|
|
if (isset($multi_review)) {
|
|
return response()->json([
|
|
'errors' => [
|
|
['code'=>'review','message'=> translate('messages.already_submitted')]
|
|
]
|
|
], 403);
|
|
} else {
|
|
$review = new Review;
|
|
}
|
|
|
|
if ($validator->errors()->count() > 0) {
|
|
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
|
|
}
|
|
|
|
$image_array = [];
|
|
if (!empty($request->file('attachment'))) {
|
|
foreach ($request->file('attachment') as $image) {
|
|
if ($image != null) {
|
|
if (!Storage::disk('public')->exists('review')) {
|
|
Storage::disk('public')->makeDirectory('review');
|
|
}
|
|
array_push($image_array, Storage::disk('public')->put('review', $image));
|
|
}
|
|
}
|
|
}
|
|
|
|
$review->user_id = $request->user()->id;
|
|
$review->food_id = $request->food_id;
|
|
$review->order_id = $request->order_id;
|
|
$review->comment = $request->comment;
|
|
$review->rating = $request->rating;
|
|
$review->attachment = json_encode($image_array);
|
|
$review->save();
|
|
|
|
if($product->restaurant)
|
|
{
|
|
$restaurant_rating = RestaurantLogic::update_restaurant_rating($product->restaurant->rating, (int)$request->rating);
|
|
$product->restaurant->rating = $restaurant_rating;
|
|
$product->restaurant->save();
|
|
}
|
|
|
|
$product->rating = ProductLogic::update_rating($product->rating, (int)$request->rating);
|
|
$product->avg_rating = ProductLogic::get_avg_rating(json_decode($product->rating, true));
|
|
$product->save();
|
|
$product->increment('rating_count');
|
|
|
|
return response()->json(['message' => translate('messages.review_submited_successfully')], 200);
|
|
}
|
|
|
|
|
|
public function get_recommended(Request $request)
|
|
{
|
|
if (!$request->hasHeader('zoneId')) {
|
|
$errors = [];
|
|
array_push($errors, ['code' => 'zoneId', 'message' => translate('messages.zone_id_required')]);
|
|
return response()->json([
|
|
'errors' => $errors
|
|
], 403);
|
|
}
|
|
$validator = Validator::make($request->all(), [
|
|
'restaurant_id' => 'required'
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
|
|
}
|
|
$type = $request->query('type', 'all');
|
|
|
|
$zone_id= json_decode($request->header('zoneId'), true);
|
|
$products = ProductLogic::recommended_products($zone_id, $request->restaurant_id,$request['limit'], $request['offset'], $type);
|
|
$products['products'] = Helpers::product_data_formatting($products['products'], true, false, app()->getLocale());
|
|
return response()->json($products, 200);
|
|
}
|
|
}
|
|
|