Edit File: HomeController.php
<?php namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use App\Http\Requests\Api\Group\SelectRequest; use App\Http\Resources\AdsResource; use App\Http\Resources\CategoriesResource; use App\Http\Resources\CitiesResource; use App\Http\Resources\CityResource; use App\Http\Resources\CommissionResource; use App\Http\Resources\CountriesResource; use App\Http\Resources\GroupResource; use App\Http\Resources\IntrosResource; use App\Http\Resources\OrdersResource; use App\Http\Resources\PaymentmethodResource; use App\Http\Resources\ProductResource; use App\Http\Resources\ProductsResource; use App\Http\Resources\StoresResource; use App\Http\Resources\GooglePlacesResource; use App\Models\Ads; use App\Models\UserAd; use App\Models\Category; use App\Models\City; use App\Models\Country; use App\Models\DelegateJoinrequest; use App\Models\Favourite; use App\Models\Intro; use App\Models\Nationality; use App\Models\Paymentmethod; use App\Models\Product; use App\Models\ProductGroup; use App\Models\Region; use App\Models\Setting; use App\Models\Store; use App\Models\StoreMenuCategory; use App\Models\Subscription; use App\Models\User; use App\Services\OrderService; use App\Services\Store\HomeServices; use App\Traits\ApiTrait; use Auth; use Carbon\Carbon; use DateTime; use DB; use Illuminate\Http\Request; use Illuminate\Support\Facades\Http; use App\Models\Order; use App\Models\Faq; use App\Http\Resources\FqsResource; use App\Http\Resources\HomeCategoriesResource; use stdClass; use function Webmozart\Assert\Tests\StaticAnalysis\object; class HomeController extends Controller { use ApiTrait; public function intro(Request $request) { $data = []; //intros $intros = Intro::get(); $data['intros'] = IntrosResource::collection($intros); return $this->dataReturn($data); } public function policy(Request $request) { $lang = $request->header('lang') ?? 'ar'; $data = []; $name = 'policy_' . $lang; //intros $policy = Setting::where('key', $name)->first()->value; $data['policy'] = html_entity_decode(strip_tags($policy)); return $this->dataReturn($data); } public function terms(Request $request) { $lang = $request->header('lang') ?? 'ar'; $data = []; $name = 'terms_' . $lang; //intros $terms = Setting::where('key', $name)->first()->value; $data['terms'] = html_entity_decode($terms); return $this->dataReturn($data); } public function about(Request $request) { $lang = $request->header('lang') ?? 'ar'; $data = []; $name = 'about_' . $lang; //intros $terms = Setting::where('key', $name)->first()->value; $data['about'] = html_entity_decode($terms); return $this->dataReturn($data); } public function storeAbout(Request $request) { $lang = $request->header('lang') ?? 'ar'; $data = []; $name = 'store_about_' . $lang; //intros $terms = Setting::where('key', $name)->first()->value; $data['about'] = html_entity_decode($terms); return $this->dataReturn($data); } public function storeTerms(Request $request) { $lang = $request->header('lang') ?? 'ar'; $data = []; $name = 'store_terms_' . $lang; //intros $terms = Setting::where('key', $name)->first()->value; $data['terms'] = html_entity_decode($terms); return $this->dataReturn($data); } public function adTerms(Request $request) { $lang = $request->header('lang') ?? 'ar'; $data = []; $name = 'ad_report_' . $lang; //intros $terms = Setting::where('key', $name)->first()->value; $data['terms'] = html_entity_decode(strip_tags($terms)); return $this->dataReturn($data); } public function storePolicy(Request $request) { $lang = $request->header('lang') ?? 'ar'; $data = []; $name = 'store_policy_' . $lang; //intros $terms = Setting::where('key', $name)->first()->value; $data['policy'] = html_entity_decode(strip_tags($terms)); return $this->dataReturn($data); } public function storeFqs(){ return $this->dataReturn(['faqs' =>FqsResource::collection(Faq::where('type' , 'store')->get())]); } public function fqs(){ return $this->dataReturn(['faqs' =>FqsResource::collection(Faq::where('type' , 'user')->get())]); } public function countries(Request $request) { $data = []; //intros $countries = Country::get(); $data['countries'] = CountriesResource::collection($countries); return $this->dataReturn($data); } public function storeHome(Request $request){ $user = auth('api')->user(); if ($user){ $user->update(['lang' => $request->header('lang') ?? 'ar']); } $orders = Order::where('store_id', $user->store->id)->where('status' , '!=' , 'closed')->where('store_status' , 'pending')->orderBy('created_at' , 'desc')->get(); return $this->dataReturn(OrdersResource::collection($orders)); } public function cities(Request $request) { $data = []; if (isset($request['region_id'])) { $cities = City::where('region_id', $request['region_id'])->get(); $data = CityResource::collection($cities); } elseif (isset($request['country_id'])) { $cities = DB::table('cities') ->join('regions', 'cities.region_id', '=', 'regions.id') ->join('countries', 'countries.id', '=', 'regions.country_id') ->where('countries.id', $request['country_id']) ->select('cities.*') ->distinct('cities.id') ->get(); $data = CityResource::collection($cities); } else { $cities = City::get(); $data = CitiesResource::collection($cities); } return $this->dataReturn($data); } public function categories() { $categories = Category::where(['status' => 'true'])->where('category_id' , null)->get(); return $this->dataReturn(CategoriesResource::collection($categories)); } public function subcategories($slug) { // $slug = Category::find($slug)?->slug; $categories = Category::where('category_id',$slug)->get(); return $this->dataReturn(CategoriesResource::collection($categories)); } public function home(Request $request) { $data = []; $user = auth('api')->user(); //ads $adsarr = []; $ads = Ads::where('status', 'accepted')->where('views' , 'false')->get(); if($user){ $user->update(['lang' => $request->header('lang') ?? 'ar']); $ad_ids = UserAd::where('user_id' , auth('api')->id())->pluck('ad_id')->toArray(); $ads = Ads::where('status', 'accepted')->where('views' , 'false')->whereNotIn('id' , $ad_ids)->orderBy('created_at' , 'desc')->get(); } if (count($ads) > 0) { $adsarr = AdsResource::collection($ads); $data[] = [ 'ads' => $adsarr, 'size' => '100', 'type' => 'normal', 'category' => 'ads', 'rows' => 1, ]; } //categories $categoriesarr = []; $categories = Category::where('status', 'true')->where('category_id' , null)->get(); if (count($categories) > 0) { $categoriesarr = HomeCategoriesResource::collection($categories); $data[] = [ 'categories' => $categoriesarr, 'size' => '100', 'type' => 'horizontal', 'category' => 'categories', 'rows' => 2, ]; } return $this->dataReturn($data); } public function nearstores(Request $request) { $lat = doubleval($request['lat']) ?? doubleval(23.8859); $long = doubleval($request['long']) ?? doubleval(45.0792); $settings = Setting::all()->pluck('value', 'key'); $max_distance = (int) $settings['distance']; $stores = Store::select("stores.*" , DB::raw("6371 * acos(cos(radians(" . $lat . ")) * cos(radians(stores.lat)) * cos(radians(stores.long) - radians(" . $long . ")) + sin(radians(" . $lat . ")) * sin(radians(stores.lat))) AS distance")) ->having("distance", '<', $max_distance) ->where('stores.deleted_at', null) ->whereHas('products') ->where(function ($query) use ($request) { if ($request['search']) { $query->where('stores.name->ar', 'like', '%' . $request['search'] . '%'); $query->orWhere('stores.name->en', 'like', '%' . $request['search'] . '%'); } if($request['category']){ $query->where('category' , $request['category']); } }) ->whereHas('user', function($q) { $q->where('approve', 'accept') ->where('status' , '!=' , 'block'); }) ->when($request['rate'] , function($q) use ($request) { if($request['rate'] == 'high'){ $q->orderBy('rate', 'desc'); }elseif($request['rate'] == 'low'){ $q->orderBy('rate', 'asc'); } }) ->when($request['distance'] , function($q) use ($request) { if($request['distance'] == 'near'){ $q->orderBy('distance', 'asc'); }else{ $q->orderBy('distance', 'desc'); } }) ->when(! $request['distance'] && ! $request['rate'], function($q) use ($request) { $q->orderBy('distance', 'asc'); }) ->groupBy("stores.name") ->paginate($this->paginateNum()); $data['stores'] = StoresResource::collection($stores); $data['pagination'] = $this->paginationModel($stores); return $this->dataReturn($data); } public function singleStore(Request $request) { $lat = doubleval($request['lat']) ?? doubleval(23.8859); $long = doubleval($request['long']) ?? doubleval(45.0792); $settings = Setting::all()->pluck('value', 'key'); $max_distance = (int) $settings['distance']; $store = Store::select("stores.*" , DB::raw("6371 * acos(cos(radians(" . $lat . ")) * cos(radians(stores.lat)) * cos(radians(stores.long) - radians(" . $long . ")) + sin(radians(" . $lat . ")) * sin(radians(stores.lat))) AS distance")) // ->having("distance", '<', $max_distance) ->where("stores.id", $request['store_id']) ->first(); if (!$store) { $msg = trans('stores.not_available'); return $this->failMsg($msg); } $store->updateCacheWithProducts(); $data['store'] = $store->cachedMenusWithProducts(); return $this->dataReturn($data); } public function storeBranches(Request $request) { $store = Store::find($request['store_id']); if (!$store) { $msg = trans('stores.not_available'); return $this->failMsg($msg); } $lat = doubleval($request['lat']) ?? doubleval(23.8859); $long = doubleval($request['long']) ?? doubleval(45.0792); $settings = Setting::all()->pluck('value', 'key'); $max_distance = (int) $settings['distance']; $parent_id = ($store->store_id == null) ? $store->id : $store->store_id; //get neareast branches $branches = Store:: select("stores.*" , DB::raw("6371 * acos(cos(radians(" . $lat . ")) * cos(radians(stores.lat)) * cos(radians(stores.long) - radians(" . $long . ")) + sin(radians(" . $lat . ")) * sin(radians(stores.lat))) AS distance")) ->having("distance", '<', $max_distance) ->where('store_id', '=', $parent_id) ->where('stores.has_contract', '=', 'true') ->where('id', '!=', $store->id) ->orwhere('id', '=', $parent_id) ->where('id', '!=', $store->id) ->whereHas('user') ->orderBy("distance", "asc") ->get(); $data['branches'] = StoresResource::collection($branches); return $this->dataReturn($data); } public function singleProduct(Request $request) { $product = Product::find($request['product_id']); if (!$product) { $msg = trans('stores.product_not_available'); return $this->failMsg($msg); } $data['product'] = new ProductResource($product); return $this->dataReturn($data); } public function identicalValues($arrayA, $arrayB) { sort($arrayA); sort($arrayB); return $arrayA == $arrayB; } public function selectGroup(SelectRequest $request) { $product = Product::find($request['product_id']); if (!$product) { $msg = trans('stores.product_not_available'); return $this->failMsg($msg); } $groups = $product->groups()->where('status', 'posted')->where('properities', '!=', null)->get(); foreach ($groups as $group) { if ($this->identicalValues(json_decode($group->properities), json_decode($request['properities']))) { $data['group'] = new GroupResource($group); return $this->dataReturn($data); } } $data['group'] = new stdClass(); return $this->dataReturn($data); $msg = trans('stores.group_not_available'); return $this->failMsg($msg); } public function paymentMethods(Request $request) { $payment_methods = Paymentmethod::where('status', 'active')->where('key' , '!=' , 'cash')->get(); $data = []; $data['payment_methods'] = PaymentmethodResource::collection($payment_methods); return $this->dataReturn($data); } public function getStoreFinance() { $data_return = new HomeServices(); $commissions = $data_return->get_finance(); $data = CommissionResource::collection($commissions); return $this->dataReturn($data); } }
Back to File Manager