From 6a57b8179a32eea7e57fd0cb8bb5afe3cd78c073 Mon Sep 17 00:00:00 2001 From: Muhammad Fajar Date: Thu, 3 Nov 2022 15:52:51 +0700 Subject: [PATCH] fix resources hospital --- .../Controllers/Api/DashboardController.php | 4 +- .../Controllers/Api/HospitalController.php | 41 ++++++++++++----- .../Hospital/HospitalResource.php | 21 +++------ .../Hospital/HospitalResourceDetail.php | 45 ------------------- .../SpecialityForHospitalDetailResource.php | 24 ++++++++++ .../Speciality/SpecialityResource.php | 2 +- 6 files changed, 62 insertions(+), 75 deletions(-) delete mode 100755 Modules/Linksehat/Transformers/Hospital/HospitalResourceDetail.php create mode 100755 Modules/Linksehat/Transformers/Speciality/SpecialityForHospitalDetailResource.php diff --git a/Modules/Linksehat/Http/Controllers/Api/DashboardController.php b/Modules/Linksehat/Http/Controllers/Api/DashboardController.php index 508dc2f7..27756bc1 100755 --- a/Modules/Linksehat/Http/Controllers/Api/DashboardController.php +++ b/Modules/Linksehat/Http/Controllers/Api/DashboardController.php @@ -45,10 +45,10 @@ class DashboardController extends Controller ->active() ->hospital() ->when($request->lat && $request->lng, function ($query) use ($request) { - $query->selectRaw("organizations.id, organizations.name, addresses.text AS address, cities.name AS city_name, 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"); + $query->selectRaw("organizations.*, addresses.text AS address, addresses.lat, addresses.lng, cities.name AS city_name, 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"); $query->orderBy('distance', 'ASC'); }, function ($query) { - $query->select(['organizations.id', 'organizations.name', 'addresses.text AS address', 'cities.name AS city_name']); + $query->select(['organizations.*', 'addresses.text AS address', 'addresses.lat', 'addresses.lng', 'cities.name AS city_name']); $query->orderBy('organizations.name', 'asc'); }) ->limit($limit) diff --git a/Modules/Linksehat/Http/Controllers/Api/HospitalController.php b/Modules/Linksehat/Http/Controllers/Api/HospitalController.php index 5c1d68af..c2cedb96 100755 --- a/Modules/Linksehat/Http/Controllers/Api/HospitalController.php +++ b/Modules/Linksehat/Http/Controllers/Api/HospitalController.php @@ -4,6 +4,7 @@ namespace Modules\Linksehat\Http\Controllers\Api; use App\Helpers\Helper; use App\Models\Organization; +use App\Models\Speciality; use Illuminate\Contracts\Support\Renderable; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; @@ -100,23 +101,41 @@ class HospitalController extends Controller public function show(Request $request, $id) { $queryHospitals = Organization::query() + ->with(['practitionerRoles' => function ($query) { + $query->select(['organization_id', 'speciality_id']) + ->whereNot('speciality_id') + ->groupBy(['speciality_id']) + ->orderBy('speciality_id'); + }]) ->when($request->lat && $request->lng, function (Builder $query) use ($request) { - $query->selectRaw("organizations*, addresses.text AS address, cities.name AS city_name, 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"); - $query->orderBy('distance', 'ASC'); - }, function ($query) { - $query->select(['organizations.*', 'addresses.text AS address', 'cities.name AS city_name']); - $query->orderBy('organizations.name', 'asc'); + $query->getQuery() + ->selectRaw("organizations.*, addresses.text AS address, addresses.lat, addresses.lng, cities.name AS city_name, 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") + ->orderBy('distance', 'ASC'); + }, function (Builder $query) { + $query->getQuery() + ->select(['organizations.*', 'addresses.text AS address', 'addresses.lat', 'addresses.lng', 'cities.name AS city_name']) + ->groupBy(['organizations.id']) + ->orderBy('organizations.name'); }) - ->leftJoin('addresses', function ($q) { - $q->on('organizations.main_address_id', '=', 'addresses.id'); - $q->where('addresses.addressable_type', '=', Organization::class); + ->leftJoin('addresses', function ($query) { + $query->on('organizations.main_address_id', '=', 'addresses.id'); }) ->leftJoin('cities', function ($query) { $query->on('addresses.city_id', '=', 'cities.id'); - }); - $queryHospitals = $queryHospitals->orderBy('organizations.name', 'asc')->findOrFail($id); + }) + ->where('organizations.id', $id) + ->where('addresses.addressable_type', '=', Organization::class) + ->findOrFail($id); - return Helper::responseJson(new HospitalResource($queryHospitals)); + foreach ($queryHospitals->practitionerRoles as $practitionerRole) { + $specialitiesId[] = $practitionerRole->speciality_id; + } + + $queryHospitals['specialities'] = Speciality::query() + ->whereIn('id', $specialitiesId) + ->get(); + + return Helper::responseJson(['hospitals' => new HospitalResource($queryHospitals)]); } /** diff --git a/Modules/Linksehat/Transformers/Hospital/HospitalResource.php b/Modules/Linksehat/Transformers/Hospital/HospitalResource.php index 3387d067..b1345a2e 100755 --- a/Modules/Linksehat/Transformers/Hospital/HospitalResource.php +++ b/Modules/Linksehat/Transformers/Hospital/HospitalResource.php @@ -2,8 +2,8 @@ namespace Modules\Linksehat\Transformers\Hospital; -use App\Models\PractitionerRole; use Illuminate\Http\Resources\Json\JsonResource; +use Modules\Linksehat\Transformers\Speciality\SpecialityForHospitalDetailResource; class HospitalResource extends JsonResource { @@ -15,20 +15,6 @@ class HospitalResource extends JsonResource */ public function toArray($request) { - $querySpecialitys = PractitionerRole::query() - ->with(['speciality']) - ->where('organization_id', $this->id) - ->whereNotNull('speciality_id') - ->orderBy('speciality_id') - ->groupBy('speciality_id') - ->get(['speciality_id']); - - foreach ($querySpecialitys as $indexSpeciality => $speciality) { - $specialitys[$indexSpeciality]['id'] = $speciality->speciality->id; - $specialitys[$indexSpeciality]['name'] = $speciality->speciality->name; - $specialitys[$indexSpeciality]['avatar'] = asset('images/default-specialisasi-image.png'); - } - return [ 'id' => $this->id, 'name' => $this->name, @@ -45,7 +31,10 @@ class HospitalResource extends JsonResource 'photos' => [ 'title' => $this->name, 'photo_url' => url('images/default-hospital-image.png'), - ] + ], + $this->mergeWhen($this->specialities, [ + 'specialities' => SpecialityForHospitalDetailResource::collection($this->specialities) + ]) ]; } } diff --git a/Modules/Linksehat/Transformers/Hospital/HospitalResourceDetail.php b/Modules/Linksehat/Transformers/Hospital/HospitalResourceDetail.php deleted file mode 100755 index 30c5f4f8..00000000 --- a/Modules/Linksehat/Transformers/Hospital/HospitalResourceDetail.php +++ /dev/null @@ -1,45 +0,0 @@ -with(['speciality']) - ->where('organization_id', $this->id) - ->whereNotNull('speciality_id') - ->orderBy('speciality_id') - ->groupBy('speciality_id') - ->get(['speciality_id']); - - foreach ($querySpecialitys as $indexSpeciality => $speciality) { - $specialitys[$indexSpeciality]['id'] = $speciality->speciality->id; - $specialitys[$indexSpeciality]['name'] = $speciality->speciality->name; - $specialitys[$indexSpeciality]['avatar'] = asset('images/default-specialisasi-image.png'); - } - - return [ - 'id' => $this->id, - 'name' => $this->name, - 'address' => $address ?? null, - 'distance' => $this->distance ? ($this->distance < 1 ? round($this->distance * 1000, 2) . " m" : round($this->distance, 2) . " km") : null, - 'photos' => [ - 'title' => Str::slug($this->name), - 'url' => asset('images/default-hospital-image.png'), - ], - 'specialitys' => $specialitys - ]; - } -} diff --git a/Modules/Linksehat/Transformers/Speciality/SpecialityForHospitalDetailResource.php b/Modules/Linksehat/Transformers/Speciality/SpecialityForHospitalDetailResource.php new file mode 100755 index 00000000..d800aa21 --- /dev/null +++ b/Modules/Linksehat/Transformers/Speciality/SpecialityForHospitalDetailResource.php @@ -0,0 +1,24 @@ + $this->id, + 'name' => 'Spesialis ' . $this->name, + 'avatar' => url('images/default-hospital-image.png'), + ]; + } +} diff --git a/Modules/Linksehat/Transformers/Speciality/SpecialityResource.php b/Modules/Linksehat/Transformers/Speciality/SpecialityResource.php index 2a1ff5ef..4397af6b 100755 --- a/Modules/Linksehat/Transformers/Speciality/SpecialityResource.php +++ b/Modules/Linksehat/Transformers/Speciality/SpecialityResource.php @@ -36,7 +36,7 @@ class SpecialityResource extends JsonResource 'specialis' => 'Spesialis ' . (isset($this->speciality->name) ? $this->speciality->name : $this->speciality_name), 'experience' => rand(5, 12), 'rating' => rand(20, 100), - 'price' => Helper::currencyIdrFormat($prices) ?? null, + 'price' => $prices ? Helper::currencyIdrFormat($prices) : null, ]), $this->mergeWhen($this->name, [ 'title' => 'Spesialis ' . $this->name,