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.
		
		
		
		
		
			
		
			
				
					
					
						
							325 lines
						
					
					
						
							12 KiB
						
					
					
				
			
		
		
	
	
							325 lines
						
					
					
						
							12 KiB
						
					
					
				<?php
 | 
						|
 | 
						|
namespace App\Http\Controllers\Api\V1;
 | 
						|
 | 
						|
use App\CentralLogics\Helpers;
 | 
						|
use App\Http\Controllers\Controller;
 | 
						|
use App\Models\CustomerAddress;
 | 
						|
use App\Models\Order;
 | 
						|
use App\Models\Food;
 | 
						|
use App\Models\OrderDetail;
 | 
						|
use App\Models\User;
 | 
						|
use App\Models\UserInfo;
 | 
						|
use Illuminate\Http\Request;
 | 
						|
use Illuminate\Support\Facades\DB;
 | 
						|
use Illuminate\Support\Facades\Validator;
 | 
						|
use App\Models\Zone;
 | 
						|
use Grimzy\LaravelMysqlSpatial\Types\Point;
 | 
						|
class CustomerController extends Controller
 | 
						|
{
 | 
						|
    public function address_list(Request $request)
 | 
						|
    {
 | 
						|
        $limit = $request['limit']??10;
 | 
						|
        $offset = $request['offset']??1;
 | 
						|
 | 
						|
        $addresses = CustomerAddress::where('user_id', $request->user()->id)->latest()->paginate($limit, ['*'], 'page', $offset);
 | 
						|
 | 
						|
        $data =  [
 | 
						|
            'total_size' => $addresses->total(),
 | 
						|
            'limit' => $limit,
 | 
						|
            'offset' => $offset,
 | 
						|
            'addresses' => Helpers::address_data_formatting($addresses->items())
 | 
						|
        ];
 | 
						|
        return response()->json($data, 200);
 | 
						|
    }
 | 
						|
 | 
						|
    public function add_new_address(Request $request)
 | 
						|
    {
 | 
						|
        $validator = Validator::make($request->all(), [
 | 
						|
            'contact_person_name' => 'required',
 | 
						|
            'address_type' => 'required',
 | 
						|
            'contact_person_number' => 'required',
 | 
						|
            'address' => 'required',
 | 
						|
            'longitude' => 'required',
 | 
						|
            'latitude' => 'required',
 | 
						|
        ]);
 | 
						|
 | 
						|
        if ($validator->fails()) {
 | 
						|
            return response()->json(['errors' => Helpers::error_processor($validator)], 403);
 | 
						|
        }
 | 
						|
 | 
						|
        $point = new Point($request->latitude,$request->longitude);
 | 
						|
        $zone = Zone::contains('coordinates', $point)->get(['id']);
 | 
						|
        if(count($zone) == 0)
 | 
						|
        {
 | 
						|
            $errors = [];
 | 
						|
            array_push($errors, ['code' => 'coordinates', 'message' => translate('messages.service_not_available_in_this_area')]);
 | 
						|
            return response()->json([
 | 
						|
                'errors' => $errors
 | 
						|
            ], 403);
 | 
						|
        }
 | 
						|
 | 
						|
        $address = [
 | 
						|
            'user_id' => $request->user()->id,
 | 
						|
            'contact_person_name' => $request->contact_person_name,
 | 
						|
            'contact_person_number' => $request->contact_person_number,
 | 
						|
            'address_type' => $request->address_type,
 | 
						|
            'address' => $request->address,
 | 
						|
            'floor' => $request->floor,
 | 
						|
            'road' => $request->road,
 | 
						|
            'house' => $request->house,
 | 
						|
            'longitude' => $request->longitude,
 | 
						|
            'latitude' => $request->latitude,
 | 
						|
            'zone_id' => $zone[0]->id,
 | 
						|
            'created_at' => now(),
 | 
						|
            'updated_at' => now()
 | 
						|
        ];
 | 
						|
        DB::table('customer_addresses')->insert($address);
 | 
						|
        return response()->json(['message' => translate('messages.successfully_added'),'zone_ids'=>array_column($zone->toArray(), 'id')], 200);
 | 
						|
    }
 | 
						|
 | 
						|
    public function update_address(Request $request,$id)
 | 
						|
    {
 | 
						|
        $validator = Validator::make($request->all(), [
 | 
						|
            'contact_person_name' => 'required',
 | 
						|
            'address_type' => 'required',
 | 
						|
            'contact_person_number' => 'required',
 | 
						|
            'address' => 'required',
 | 
						|
            'longitude' => 'required',
 | 
						|
            'latitude' => 'required',
 | 
						|
        ]);
 | 
						|
 | 
						|
        if ($validator->fails()) {
 | 
						|
            return response()->json(['errors' => Helpers::error_processor($validator)], 403);
 | 
						|
        }
 | 
						|
        $point = new Point($request->latitude,$request->longitude);
 | 
						|
        $zone = Zone::contains('coordinates', $point)->first();
 | 
						|
        if(!$zone)
 | 
						|
        {
 | 
						|
            $errors = [];
 | 
						|
            array_push($errors, ['code' => 'coordinates', 'message' => translate('messages.service_not_available_in_this_area')]);
 | 
						|
            return response()->json([
 | 
						|
                'errors' => $errors
 | 
						|
            ], 403);
 | 
						|
        }
 | 
						|
        $address = [
 | 
						|
            'user_id' => $request->user()->id,
 | 
						|
            'contact_person_name' => $request->contact_person_name,
 | 
						|
            'contact_person_number' => $request->contact_person_number,
 | 
						|
            'address_type' => $request->address_type,
 | 
						|
            'address' => $request->address,
 | 
						|
            'floor' => $request->floor,
 | 
						|
            'road' => $request->road,
 | 
						|
            'house' => $request->house,
 | 
						|
            'longitude' => $request->longitude,
 | 
						|
            'latitude' => $request->latitude,
 | 
						|
            'zone_id' => $zone->id,
 | 
						|
            'created_at' => now(),
 | 
						|
            'updated_at' => now()
 | 
						|
        ];
 | 
						|
        DB::table('customer_addresses')->where('id',$id)->update($address);
 | 
						|
        return response()->json(['message' => translate('messages.updated_successfully'),'zone_id'=>$zone->id], 200);
 | 
						|
    }
 | 
						|
 | 
						|
    public function delete_address(Request $request)
 | 
						|
    {
 | 
						|
        $validator = Validator::make($request->all(), [
 | 
						|
            'address_id' => 'required'
 | 
						|
        ]);
 | 
						|
 | 
						|
        if ($validator->fails()) {
 | 
						|
            return response()->json(['errors' => Helpers::error_processor($validator)], 403);
 | 
						|
        }
 | 
						|
 | 
						|
        if (DB::table('customer_addresses')->where(['id' => $request['address_id'], 'user_id' => $request->user()->id])->first()) {
 | 
						|
            DB::table('customer_addresses')->where(['id' => $request['address_id'], 'user_id' => $request->user()->id])->delete();
 | 
						|
            return response()->json(['message' => translate('messages.successfully_removed')], 200);
 | 
						|
        }
 | 
						|
        return response()->json(['message' => translate('messages.not_found')], 404);
 | 
						|
    }
 | 
						|
 | 
						|
    public function get_order_list(Request $request)
 | 
						|
    {
 | 
						|
        $orders = Order::with('restaurant')->where(['user_id' => $request->user()->id])->get();
 | 
						|
        return response()->json($orders, 200);
 | 
						|
    }
 | 
						|
 | 
						|
    public function get_order_details(Request $request)
 | 
						|
    {
 | 
						|
        $validator = Validator::make($request->all(), [
 | 
						|
            'order_id' => 'required'
 | 
						|
        ]);
 | 
						|
 | 
						|
        if ($validator->fails()) {
 | 
						|
            return response()->json(['errors' => Helpers::error_processor($validator)], 403);
 | 
						|
        }
 | 
						|
 | 
						|
        $details = OrderDetail::where(['order_id' => $request['order_id']])->get();
 | 
						|
        foreach ($details as $det) {
 | 
						|
            $det['product_details'] = json_decode($det['product_details'], true);
 | 
						|
        }
 | 
						|
 | 
						|
        return response()->json($details, 200);
 | 
						|
    }
 | 
						|
 | 
						|
    public function info(Request $request)
 | 
						|
    {
 | 
						|
        $data = $request->user();
 | 
						|
        $data['userinfo'] = $data->userinfo;
 | 
						|
        $data['order_count'] =(integer)$request->user()->orders->count();
 | 
						|
        $data['member_since_days'] =(integer)$request->user()->created_at->diffInDays();
 | 
						|
        unset($data['orders']);
 | 
						|
        return response()->json($data, 200);
 | 
						|
    }
 | 
						|
 | 
						|
    public function update_profile(Request $request)
 | 
						|
    {
 | 
						|
        $validator = Validator::make($request->all(), [
 | 
						|
            'f_name' => 'required',
 | 
						|
            'l_name' => 'required',
 | 
						|
            'email' => 'required|unique:users,email,'.$request->user()->id,
 | 
						|
            'image' => 'nullable|max:2048',
 | 
						|
 | 
						|
        ], [
 | 
						|
            'f_name.required' => 'First name is required!',
 | 
						|
            'l_name.required' => 'Last name is required!',
 | 
						|
        ]);
 | 
						|
 | 
						|
        if ($validator->fails()) {
 | 
						|
            return response()->json(['errors' => Helpers::error_processor($validator)], 403);
 | 
						|
        }
 | 
						|
 | 
						|
        $image = $request->file('image');
 | 
						|
 | 
						|
        if ($request->has('image')) {
 | 
						|
            $imageName = Helpers::update('profile/', $request->user()->image, 'png', $request->file('image'));
 | 
						|
        } else {
 | 
						|
            $imageName = $request->user()->image;
 | 
						|
        }
 | 
						|
 | 
						|
        if ($request['password'] != null && strlen($request['password']) > 5) {
 | 
						|
            $pass = bcrypt($request['password']);
 | 
						|
        } else {
 | 
						|
            $pass = $request->user()->password;
 | 
						|
        }
 | 
						|
 | 
						|
        $userDetails = [
 | 
						|
            'f_name' => $request->f_name,
 | 
						|
            'l_name' => $request->l_name,
 | 
						|
            'email' => $request->email,
 | 
						|
            'image' => $imageName,
 | 
						|
            'password' => $pass,
 | 
						|
            'updated_at' => now()
 | 
						|
        ];
 | 
						|
 | 
						|
        User::where(['id' => $request->user()->id])->update($userDetails);
 | 
						|
        if($request->user()->userinfo) {
 | 
						|
            UserInfo::where(['user_id' => $request->user()->id])->update([
 | 
						|
                'f_name' => $request->f_name,
 | 
						|
                'l_name' => $request->l_name,
 | 
						|
                'email' => $request->email,
 | 
						|
                'image' => $imageName
 | 
						|
            ]);
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        return response()->json(['message' => translate('messages.successfully_updated')], 200);
 | 
						|
    }
 | 
						|
    public function update_interest(Request $request)
 | 
						|
    {
 | 
						|
        $validator = Validator::make($request->all(), [
 | 
						|
            'interest' => 'required|array',
 | 
						|
        ]);
 | 
						|
 | 
						|
        if ($validator->fails()) {
 | 
						|
            return response()->json(['errors' => Helpers::error_processor($validator)], 403);
 | 
						|
        }
 | 
						|
 | 
						|
        $userDetails = [
 | 
						|
            'interest' => json_encode($request->interest),
 | 
						|
        ];
 | 
						|
 | 
						|
        User::where(['id' => $request->user()->id])->update($userDetails);
 | 
						|
 | 
						|
        return response()->json(['message' => translate('messages.interest_updated_successfully')], 200);
 | 
						|
    }
 | 
						|
 | 
						|
    public function update_cm_firebase_token(Request $request)
 | 
						|
    {
 | 
						|
        $validator = Validator::make($request->all(), [
 | 
						|
            'cm_firebase_token' => 'required',
 | 
						|
        ]);
 | 
						|
 | 
						|
        if ($validator->fails()) {
 | 
						|
            return response()->json(['errors' => Helpers::error_processor($validator)], 403);
 | 
						|
        }
 | 
						|
 | 
						|
        DB::table('users')->where('id',$request->user()->id)->update([
 | 
						|
            'cm_firebase_token'=>$request['cm_firebase_token']
 | 
						|
        ]);
 | 
						|
 | 
						|
        return response()->json(['message' => translate('messages.updated_successfully')], 200);
 | 
						|
    }
 | 
						|
 | 
						|
    public function get_suggested_food(Request $request)
 | 
						|
    {
 | 
						|
        if (!$request->hasHeader('zoneId')) {
 | 
						|
            $errors = [];
 | 
						|
            array_push($errors, ['code' => 'zoneId', 'message' => 'Zone id is required!']);
 | 
						|
            return response()->json([
 | 
						|
                'errors' => $errors
 | 
						|
            ], 403);
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        $zone_id= json_decode($request->header('zoneId'), true);
 | 
						|
 | 
						|
        $interest = $request->user()->interest;
 | 
						|
        $interest = isset($interest) ? json_decode($interest):null;
 | 
						|
        // return response()->json($interest, 200);
 | 
						|
 | 
						|
        $products =  Food::active()->whereHas('restaurant', function($q)use($zone_id){
 | 
						|
            $q->whereIn('zone_id', $zone_id);
 | 
						|
        })
 | 
						|
        ->when(isset($interest), function($q)use($interest){
 | 
						|
            return $q->whereIn('category_id',$interest);
 | 
						|
        })
 | 
						|
        ->when($interest == null, function($q){
 | 
						|
            return $q->popular();
 | 
						|
        })->limit(5)->get();
 | 
						|
        $products = Helpers::product_data_formatting($products, true, false, app()->getLocale());
 | 
						|
        return response()->json($products, 200);
 | 
						|
    }
 | 
						|
 | 
						|
    public function update_zone(Request $request)
 | 
						|
    {
 | 
						|
        if (!$request->hasHeader('zoneId') && is_numeric($request->header('zoneId'))) {
 | 
						|
            $errors = [];
 | 
						|
            array_push($errors, ['code' => 'zoneId', 'message' => translate('messages.zone_id_required')]);
 | 
						|
            return response()->json([
 | 
						|
                'errors' => $errors
 | 
						|
            ], 403);
 | 
						|
        }
 | 
						|
 | 
						|
        $customer = $request->user();
 | 
						|
        $customer->zone_id = (integer)json_decode($request->header('zoneId'), true)[0];
 | 
						|
        $customer->save();
 | 
						|
        return response()->json([], 200);
 | 
						|
    }
 | 
						|
 | 
						|
    public function remove_account(Request $request)
 | 
						|
    {
 | 
						|
        $user = $request->user();
 | 
						|
 | 
						|
        if(Order::where('user_id', $user->id)->whereIn('order_status', ['pending','accepted','confirmed','processing','handover','picked_up'])->count())
 | 
						|
        {
 | 
						|
            return response()->json(['errors'=>[['code'=>'on-going', 'message'=>translate('messages.user_account_delete_warning')]]],403);
 | 
						|
        }
 | 
						|
        $request->user()->token()->revoke();
 | 
						|
        if($user->userinfo){
 | 
						|
            $user->userinfo->delete();
 | 
						|
        }
 | 
						|
        $user->delete();
 | 
						|
        return response()->json([]);
 | 
						|
    }
 | 
						|
}
 | 
						|
 |