From bae91e6120b39fddca89da3cb72926eb69776eba Mon Sep 17 00:00:00 2001 From: R Date: Fri, 23 Sep 2022 09:35:39 +0700 Subject: [PATCH] Fix Rating --- .../Http/Controllers/Api/DoctorController.php | 37 +++++++++++++++++-- .../Linksehat/Transformers/DoctorResource.php | 2 +- .../Transformers/HospitalResource.php | 2 +- ...PractitionerRoleToDoctorDetailResource.php | 2 +- .../PractitionerRoleToDoctorResource.php | 25 +++++++------ 5 files changed, 49 insertions(+), 19 deletions(-) diff --git a/Modules/Linksehat/Http/Controllers/Api/DoctorController.php b/Modules/Linksehat/Http/Controllers/Api/DoctorController.php index 5b3fdab2..10379fa0 100644 --- a/Modules/Linksehat/Http/Controllers/Api/DoctorController.php +++ b/Modules/Linksehat/Http/Controllers/Api/DoctorController.php @@ -5,6 +5,7 @@ namespace Modules\Linksehat\Http\Controllers\Api; use App\Helpers\Helper; use App\Models\Practitioner; use App\Models\PractitionerRole; +use DB; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; @@ -21,7 +22,23 @@ class DoctorController extends Controller public function index(Request $request) { $doctors = PractitionerRole::query() - ->with(['practitioner.person', 'speciality', 'practitioner.metas', 'metas', 'organization']) + ->with(['practitioner.person', 'speciality', 'practitioner.metas', 'metas', + 'organization' => function ($query) use ($request) { + if ($request->has('lat') && !empty($request->lat) && $request->has('lng') && !empty($request->lng)) { + return $query->leftJoin('addresses', function($q) { + $q->on('organizations.main_address_id', '=', 'addresses.id'); + $q->where('addresses.addressable_type', '=', Organization::class); + }) + ->select([ + "organizations.*", + "addresses.lat", + "addresses.lng", + // DB::raw("ST_Distance_Sphere(point(addresses.lng,addresses.lat), point(".$request->lng.",".$request->lat.")) /1000 as distance_km"), + DB::raw("6371 * acos (cos ( radians($request->lat) ) * cos( radians( addresses.lat ) ) * cos( radians( addresses.lng ) - radians($request->lng) ) + sin ( radians($request->lat) ) * sin( radians( addresses.lat ) )) as distance_km") + ]); + } + }, + ]) ->when($request->search ?? null, function($query, $search) { $query->whereHas('practitioner.person', function($person) use ($search) { $person->where('name', 'LIKE', '%'.$search.'%'); @@ -40,7 +57,7 @@ class DoctorController extends Controller $limit = 20; } - $doctors = $doctors->paginate($limit); + $doctors = $doctors->paginate($limit); return response()->json([ 'message' => 'Sukses mengambil data Dokter', @@ -72,14 +89,26 @@ class DoctorController extends Controller * @param int $id * @return Renderable */ - public function show($id) + public function show(Request $request, $id) { $doctor = Practitioner::query() ->with([ 'practitionerRoles', 'practitionerRoles.metas', 'practitionerRoles.speciality', - 'practitionerRoles.organization', + 'practitionerRoles.organization' => function ($query) use ($request) { + if ($request->has('lat') && !empty($request->lat) && $request->has('lng') && !empty($request->lng)) { + $query->leftJoin('addresses', function($q) { + $q->on('organizations.main_address_id', '=', 'addresses.id'); + $q->where('addresses.addressable_type', '=', Organization::class); + }); + $query->select([ + "organizations.*", + // DB::raw("ST_Distance_Sphere(point(addresses.lng,addresses.lat), point(".$request->lng.",".$request->lat.")) /1000 as distance_km"), + DB::raw("6371 * acos (cos ( radians($request->lat) ) * cos( radians( addresses.lat ) ) * cos( radians( addresses.lng ) - radians($request->lng) ) + sin ( radians($request->lat) ) * sin( radians( addresses.lat ) )) as distance_km") + ]); + } + }, 'practitionerRoles.practices', 'practitionerRoles.availabilities', 'person', diff --git a/Modules/Linksehat/Transformers/DoctorResource.php b/Modules/Linksehat/Transformers/DoctorResource.php index 273157d7..c384ce68 100644 --- a/Modules/Linksehat/Transformers/DoctorResource.php +++ b/Modules/Linksehat/Transformers/DoctorResource.php @@ -52,7 +52,7 @@ class DoctorResource extends JsonResource 'keilmuan' => $this->meta->keilmuan ?? '', 'description' => $this->meta->description ?? '', 'practices' => $practices, - 'rating' => rand(350, 500) / 10, + 'rating' => rand(350, 500) / 100, ]; } } diff --git a/Modules/Linksehat/Transformers/HospitalResource.php b/Modules/Linksehat/Transformers/HospitalResource.php index 747d117f..dbab5ab1 100644 --- a/Modules/Linksehat/Transformers/HospitalResource.php +++ b/Modules/Linksehat/Transformers/HospitalResource.php @@ -24,7 +24,7 @@ class HospitalResource extends JsonResource 'lng' => $this->currentAddress->lng ?? null, 'distance' => isset($this->distance_km) ? round($this->distance_km) . ' km' : null, 'city_name' => $this->currentAddress->city->name ?? null, - 'rating' => rand(350, 500) / 10, + 'rating' => rand(350, 500) / 100, 'phone' => $this->meta->phone, 'photo_url' => asset('images/default-hospital-image.png'), 'photos' => [ diff --git a/Modules/Linksehat/Transformers/PractitionerRoleToDoctorDetailResource.php b/Modules/Linksehat/Transformers/PractitionerRoleToDoctorDetailResource.php index 0d5e078b..b316eece 100644 --- a/Modules/Linksehat/Transformers/PractitionerRoleToDoctorDetailResource.php +++ b/Modules/Linksehat/Transformers/PractitionerRoleToDoctorDetailResource.php @@ -35,7 +35,7 @@ class PractitionerRoleToDoctorDetailResource extends JsonResource 'work_experience' => $this->meta->work_experience ?? '', 'keilmuan' => $this->meta->keilmuan ?? '', 'description' => $this->meta->description ?? '', - 'rating' => rand(350, 500) / 10, + 'rating' => rand(350, 500) / 100, 'is_chat_available' => $this->is_chat_available, 'is_video_available' => $this->is_video_available, diff --git a/Modules/Linksehat/Transformers/PractitionerRoleToDoctorResource.php b/Modules/Linksehat/Transformers/PractitionerRoleToDoctorResource.php index 37f6cd31..a6c4c392 100644 --- a/Modules/Linksehat/Transformers/PractitionerRoleToDoctorResource.php +++ b/Modules/Linksehat/Transformers/PractitionerRoleToDoctorResource.php @@ -15,17 +15,18 @@ class PractitionerRoleToDoctorResource extends JsonResource */ public function toArray($request) { - $organization = [ - 'id' => $this->organization->id, - 'name' => $this->organization->name, - 'code' => $this->organization->code, - 'description' => $this->organization->description, - 'address' => $this->organization->currentAddress->text ?? null, - 'lat' => $this->organization->currentAddress->lat ?? null, - 'lng' => $this->organization->currentAddress->lng ?? null, - 'distance' => '200 m', - 'city_name' => 'Kota Tangerang', - ]; + // $organization = [ + // 'id' => $this->organization->id, + // 'name' => $this->organization->name, + // 'code' => $this->organization->code, + // 'description' => $this->organization->description, + // 'address' => $this->organization->currentAddress->text ?? null, + // 'lat' => $this->organization->currentAddress->lat ?? null, + // 'lng' => $this->organization->currentAddress->lng ?? null, + // 'distance' => '200 m', + // 'city_name' => 'Kota Tangerang', + // ]; + $organization = HospitalResource::make($this->organization); $speciality = $this->speciality ? [ 'id' => $this->speciality->id ?? null, @@ -51,7 +52,7 @@ class PractitionerRoleToDoctorResource extends JsonResource 'avatar_url' => asset('images/default-doctor-avatar.png'), 'hospital' => $organization, 'speciality' => $speciality, - 'rating' => rand(350, 500) / 10, + 'rating' => rand(350, 500) / 100, 'is_chat_available' => $this->is_chat_available, 'is_video_available' => $this->is_video_available,