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([]);
|
|
}
|
|
}
|
|
|