From 9a7f26928f2f7f712bfdbb917c1e72b62ea40661 Mon Sep 17 00:00:00 2001 From: R Date: Wed, 2 Nov 2022 21:48:14 +0700 Subject: [PATCH 1/3] Add Json Response Helper --- .../Linksehat/Http/Controllers/Api/DoctorController.php | 5 +---- app/Helpers/Helper.php | 9 +++++++++ app/Models/User.php | 5 +++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Modules/Linksehat/Http/Controllers/Api/DoctorController.php b/Modules/Linksehat/Http/Controllers/Api/DoctorController.php index 687b0c50..d52ff1d6 100644 --- a/Modules/Linksehat/Http/Controllers/Api/DoctorController.php +++ b/Modules/Linksehat/Http/Controllers/Api/DoctorController.php @@ -61,10 +61,7 @@ class DoctorController extends Controller $doctors = $doctors->paginate($limit); - return response()->json([ - 'message' => 'Sukses mengambil data Dokter', - 'doctors' => Helper::paginateResources(PractitionerRoleToDoctorResource::collection($doctors)) - ]); + return Helper::makeJsonResponse(Helper::paginateResources(PractitionerRoleToDoctorResource::collection($doctors))); } /** diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index 85f56d8c..fc1359ee 100644 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -147,4 +147,13 @@ class Helper { return "Rp. " . number_format($price, 0, ',', '.'); } + + public static function makeJsonResponse($data, $statusCode = 200, $message = "Data berhasil diambil") + { + return response()->json([ + 'statusCode' => $statusCode, + 'message' => $message, + 'data' => $data + ], $statusCode); + } } diff --git a/app/Models/User.php b/app/Models/User.php index 44c947f3..d13f367c 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -79,4 +79,9 @@ class User extends Authenticatable { return $this->belongsTo(Person::class, 'person_id'); } + + public function ownedPersons() + { + return $this->hasMany(Person::class, 'owner_user_id'); + } } From d3edc6cb67fb1c011d6c66a8e44b29e1caa9943f Mon Sep 17 00:00:00 2001 From: Muhammad Fajar Date: Thu, 3 Nov 2022 05:11:57 +0700 Subject: [PATCH 2/3] api search hospital --- .../Http/Controllers/Api/SearchController.php | 81 +++++++++++++++++ .../Controllers/Api/SpecialityController.php | 87 ------------------- Modules/Linksehat/Routes/api.php | 7 +- .../Dashboard/HospitalResource.php | 29 ------- .../DoctorResourceDetail.php | 0 .../{ => Hospital}/HospitalResource.php | 16 +--- .../HospitalResourceDetail.php | 0 app/Models/Organization.php | 34 ++++++-- app/Models/PractitionerRole.php | 11 +++ 9 files changed, 130 insertions(+), 135 deletions(-) create mode 100644 Modules/Linksehat/Http/Controllers/Api/SearchController.php delete mode 100644 Modules/Linksehat/Transformers/Dashboard/HospitalResource.php rename Modules/Linksehat/Transformers/{Doctors => Doctor}/DoctorResourceDetail.php (100%) rename Modules/Linksehat/Transformers/{ => Hospital}/HospitalResource.php (52%) rename Modules/Linksehat/Transformers/{Hospitals => Hospital}/HospitalResourceDetail.php (100%) diff --git a/Modules/Linksehat/Http/Controllers/Api/SearchController.php b/Modules/Linksehat/Http/Controllers/Api/SearchController.php new file mode 100644 index 00000000..dbf2599a --- /dev/null +++ b/Modules/Linksehat/Http/Controllers/Api/SearchController.php @@ -0,0 +1,81 @@ +with(['prices']) + ->whereHas('prices', function ($query) { + $query->where('priceable_type', Practice::class); + }) + ->leftJoin('specialities', function ($query) { + $query->on('practitioner_roles.speciality_id', '=', 'specialities.id'); + }) + ->leftJoin('persons', function ($query) { + $query->on('practitioner_roles.practitioner_id', '=', 'persons.id'); + }) + ->whereRaw("(persons.name LIKE '%{$request->value}%' OR specialities.name LIKE '%{$request->value}%')") + ->where('organization_id', $request->organization_id) + ->get(['persons.name AS person_name', 'specialities.name AS speciality_name', 'practitioner_id', 'practitioner_roles.id']); + + return response()->json([ + 'status' => 'success', + 'statusCode' => Response::HTTP_OK, + 'message' => 'Data Berhasil di ambil', + 'data' => [ + 'doctors' => SpecialityResource::collection($doctors) + ] + ]); + } + + public function searchHospital(Request $request) + { + abort_if($request->has('value') != true || empty($request->value), 400, 'Missing Parameter value'); + + $queryHospitals = Organization::query() + ->when($request->lat && $request->lng, function (EloquentBuilder $query) use ($request) { + $query->getQuery() + ->selectRaw("organizations.id, organizations.name, addresses.text AS address, 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 (EloquentBuilder $query) { + $query->getQuery() + ->select(['organizations.id', 'organizations.name', 'addresses.text AS address']) + ->orderBy('organizations.name'); + }) + ->leftJoin('addresses', function (Builder $query) { + $query->on('organizations.main_address_id', '=', 'addresses.id'); + }) + ->leftJoin('practitioner_roles', function (Builder $query) { + $query->on('organizations.id', '=', 'practitioner_roles.organization_id'); + }) + ->leftJoin('specialities', function (Builder $query) { + $query->on('practitioner_roles.speciality_id', '=', 'specialities.id'); + }) + ->where('specialities.name', 'LIKE', "{$request->value}%") + ->where('addresses.addressable_type', '=', Organization::class) + ->whereNot('practitioner_roles.speciality_id') + ->groupBy(['practitioner_roles.organization_id', 'practitioner_roles.speciality_id']) + ->get(); + + return response()->json([ + 'status' => 'success', + 'statusCode' => Response::HTTP_OK, + 'message' => 'Data rumah sakit berhasil di ambil', + 'data' => HospitalResource::collection($queryHospitals) + ]); + } +} diff --git a/Modules/Linksehat/Http/Controllers/Api/SpecialityController.php b/Modules/Linksehat/Http/Controllers/Api/SpecialityController.php index 03e0d293..fa8cd9f4 100644 --- a/Modules/Linksehat/Http/Controllers/Api/SpecialityController.php +++ b/Modules/Linksehat/Http/Controllers/Api/SpecialityController.php @@ -51,91 +51,4 @@ class SpecialityController extends Controller ] ]); } - - public function searchSpecialityOrPerson(Request $request) - { - $doctors = PractitionerRole::query() - ->with(['prices']) - ->whereHas('prices', function ($query) { - $query->where('priceable_type', Practice::class); - }) - ->leftJoin('specialities', function ($query) { - $query->on('practitioner_roles.speciality_id', '=', 'specialities.id'); - }) - ->leftJoin('persons', function ($query) { - $query->on('practitioner_roles.practitioner_id', '=', 'persons.id'); - }) - ->whereRaw("(persons.name LIKE '%{$request->value}%' OR specialities.name LIKE '%{$request->value}%')") - ->where('organization_id', $request->organization_id) - ->get(['persons.name AS person_name', 'specialities.name AS speciality_name', 'practitioner_id', 'practitioner_roles.id']); - - return response()->json([ - 'status' => 'success', - 'statusCode' => Response::HTTP_OK, - 'message' => 'Data Berhasil di ambil', - 'data' => [ - 'doctors' => SpecialityResource::collection($doctors) - ] - ]); - } - - /** - * Show the form for creating a new resource. - * @return Renderable - */ - public function create() - { - // - } - - /** - * Store a newly created resource in storage. - * @param Request $request - * @return Renderable - */ - public function store(Request $request) - { - // - } - - /** - * Show the specified resource. - * @param int $id - * @return Renderable - */ - public function show(Request $request, $id) - { - // - } - - /** - * Show the form for editing the specified resource. - * @param int $id - * @return Renderable - */ - public function edit($id) - { - // - } - - /** - * Update the specified resource in storage. - * @param Request $request - * @param int $id - * @return Renderable - */ - public function update(Request $request, $id) - { - // - } - - /** - * Remove the specified resource from storage. - * @param int $id - * @return Renderable - */ - public function destroy($id) - { - // - } } diff --git a/Modules/Linksehat/Routes/api.php b/Modules/Linksehat/Routes/api.php index 42ea6a67..e55a2254 100644 --- a/Modules/Linksehat/Routes/api.php +++ b/Modules/Linksehat/Routes/api.php @@ -6,6 +6,7 @@ use Modules\Linksehat\Http\Controllers\Api\DoctorController; use Modules\Linksehat\Http\Controllers\Api\HospitalController; use Modules\Linksehat\Http\Controllers\Api\PersonController; use Modules\Linksehat\Http\Controllers\Api\ProfileController; +use Modules\Linksehat\Http\Controllers\Api\SearchController; use Modules\Linksehat\Http\Controllers\Api\SpecialityController; /* @@ -23,6 +24,11 @@ Route::prefix('linksehat')->group(function () { Route::get('dashboard/{query}/{limit?}', [DashboardController::class, 'index']); + Route::controller(SearchController::class)->group(function () { + Route::get('search-person-speciality', 'searchSpecialityOrPerson'); + Route::get('search-hospital', 'searchHospital'); + }); + Route::controller(AuthController::class)->group(function () { Route::post('otp-request', 'otpRequest'); Route::post('mock-otp', 'mockOtp'); @@ -34,7 +40,6 @@ Route::prefix('linksehat')->group(function () { Route::controller(SpecialityController::class)->group(function () { Route::get('specialities', 'index'); - Route::get('search', 'searchSpecialityOrPerson'); }); Route::controller(HospitalController::class)->group(function () { diff --git a/Modules/Linksehat/Transformers/Dashboard/HospitalResource.php b/Modules/Linksehat/Transformers/Dashboard/HospitalResource.php deleted file mode 100644 index 7de0dbd7..00000000 --- a/Modules/Linksehat/Transformers/Dashboard/HospitalResource.php +++ /dev/null @@ -1,29 +0,0 @@ - $this->id, - 'name' => $this->name ?? '', - 'address' => $this->currentAddress ?? '', - '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'), - ] - ]; - } -} diff --git a/Modules/Linksehat/Transformers/Doctors/DoctorResourceDetail.php b/Modules/Linksehat/Transformers/Doctor/DoctorResourceDetail.php similarity index 100% rename from Modules/Linksehat/Transformers/Doctors/DoctorResourceDetail.php rename to Modules/Linksehat/Transformers/Doctor/DoctorResourceDetail.php diff --git a/Modules/Linksehat/Transformers/HospitalResource.php b/Modules/Linksehat/Transformers/Hospital/HospitalResource.php similarity index 52% rename from Modules/Linksehat/Transformers/HospitalResource.php rename to Modules/Linksehat/Transformers/Hospital/HospitalResource.php index dbab5ab1..fc0e397a 100644 --- a/Modules/Linksehat/Transformers/HospitalResource.php +++ b/Modules/Linksehat/Transformers/Hospital/HospitalResource.php @@ -1,6 +1,6 @@ $this->id, 'name' => $this->name, - 'code' => $this->code, - 'description' => $this->description, - 'address' => $this->currentAddress->text ?? null, - 'lat' => $this->currentAddress->lat ?? null, - 'lng' => $this->currentAddress->lng ?? null, + 'address' => $this->address ?? null, 'distance' => isset($this->distance_km) ? round($this->distance_km) . ' km' : null, 'city_name' => $this->currentAddress->city->name ?? null, - 'rating' => rand(350, 500) / 100, 'phone' => $this->meta->phone, - 'photo_url' => asset('images/default-hospital-image.png'), 'photos' => [ - [ - 'title' => $this->name, - 'photo_url' => asset('images/default-hospital-image.png'), - ] + 'title' => $this->name, + 'photo_url' => url('images/default-hospital-image.png'), ] ]; } diff --git a/Modules/Linksehat/Transformers/Hospitals/HospitalResourceDetail.php b/Modules/Linksehat/Transformers/Hospital/HospitalResourceDetail.php similarity index 100% rename from Modules/Linksehat/Transformers/Hospitals/HospitalResourceDetail.php rename to Modules/Linksehat/Transformers/Hospital/HospitalResourceDetail.php diff --git a/app/Models/Organization.php b/app/Models/Organization.php index 0990877c..9462c15d 100644 --- a/app/Models/Organization.php +++ b/app/Models/Organization.php @@ -20,13 +20,35 @@ class Organization extends Model 'main_address_id', ]; - public $with = [ - 'metas' - ]; + // public $with = [ + // 'metas' + // ]; - public $appends = [ - 'meta' - ]; + // public $appends = [ + // 'meta' + // ]; + + /** + * Scope a query to only include active data. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return void + */ + public function scopeActive($query) + { + $query->where('status', 'active'); + } + + /** + * Scope a query to only include hospital data. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return void + */ + public function scopeHospital($query) + { + $query->where('organizations.type', 'hospital'); + } public function setCodeAttribute($value) { diff --git a/app/Models/PractitionerRole.php b/app/Models/PractitionerRole.php index 19efe922..6b0decdf 100644 --- a/app/Models/PractitionerRole.php +++ b/app/Models/PractitionerRole.php @@ -19,6 +19,17 @@ class PractitionerRole extends Model 'active', ]; + /** + * Scope a query to only include active data. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return void + */ + public function scopeActive($query) + { + $query->where('active', 1); + } + public function getIsChatAvailableAttribute() { return $this->practices->where('service_code', 'chat')->where('active', 1)->count() >= 1; From 0115d3fbb3a1a07890052914145583e49a2233c6 Mon Sep 17 00:00:00 2001 From: Muhammad Fajar Date: Thu, 3 Nov 2022 05:28:07 +0700 Subject: [PATCH 3/3] fix query hospital dashboard and search --- .../Http/Controllers/Api/DashboardController.php | 13 ++++++++----- .../Http/Controllers/Api/PersonController.php | 3 ++- .../Http/Controllers/Api/SearchController.php | 7 +++++-- .../Transformers/Hospital/HospitalResource.php | 4 ++-- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/Modules/Linksehat/Http/Controllers/Api/DashboardController.php b/Modules/Linksehat/Http/Controllers/Api/DashboardController.php index 70adf454..027f0ad6 100644 --- a/Modules/Linksehat/Http/Controllers/Api/DashboardController.php +++ b/Modules/Linksehat/Http/Controllers/Api/DashboardController.php @@ -8,8 +8,8 @@ use Illuminate\Routing\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Http; use Modules\Linksehat\Transformers\Dashboard\DoctorResource as DoctorResourceDashboard; -use Modules\Linksehat\Transformers\Dashboard\HospitalResource as HospitalResourceDashboard; use Modules\Linksehat\Transformers\Dashboard\ArticleResource as ArticleResourceDashboard; +use Modules\Linksehat\Transformers\Hospital\HospitalResource; use Symfony\Component\HttpFoundation\Response; class DashboardController extends Controller @@ -38,21 +38,24 @@ class DashboardController extends Controller $queryHospitals = Organization::query() ->leftJoin('addresses', function ($query) { $query->on('organizations.main_address_id', '=', 'addresses.id'); - $query->where('addresses.addressable_type', '=', Organization::class); }) + ->leftJoin('cities', function ($query) { + $query->on('addresses.city_id', '=', 'cities.id'); + }) + ->where('addresses.addressable_type', '=', Organization::class) ->where('organizations.type', 'hospital') ->where('organizations.status', 'active') ->when($request->lat && $request->lng, function ($query) use ($request) { - $query->selectRaw("organizations.id, organizations.name, addresses.text AS currentAddress, 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.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->orderBy('distance', 'ASC'); }, function ($query) { - $query->select(['organizations.id', 'organizations.name', 'addresses.text AS currentAddress']); + $query->select(['organizations.id', 'organizations.name', 'addresses.text AS address', 'cities.name AS city_name']); $query->orderBy('organizations.name', 'asc'); }) ->limit($limit) ->get(); - $data = HospitalResourceDashboard::collection($queryHospitals); + $data = HospitalResource::collection($queryHospitals); } elseif ($query === 'articles') { $data = ArticleResourceDashboard::collection(json_decode(Http::get('https://linksehat.com/api/medical-assistance-articles'))); } diff --git a/Modules/Linksehat/Http/Controllers/Api/PersonController.php b/Modules/Linksehat/Http/Controllers/Api/PersonController.php index 2679f316..cb67f65b 100644 --- a/Modules/Linksehat/Http/Controllers/Api/PersonController.php +++ b/Modules/Linksehat/Http/Controllers/Api/PersonController.php @@ -4,6 +4,7 @@ namespace Modules\Linksehat\Http\Controllers\Api; use App\Models\File; use App\Models\Person; +use Auth; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; @@ -19,7 +20,7 @@ class PersonController extends Controller */ public function index() { - $user = auth()->user(); + $user = Auth::user(); $user->load(['person', 'person.families', 'person.avatar']); $families = $user->person->families; diff --git a/Modules/Linksehat/Http/Controllers/Api/SearchController.php b/Modules/Linksehat/Http/Controllers/Api/SearchController.php index dbf2599a..47097084 100644 --- a/Modules/Linksehat/Http/Controllers/Api/SearchController.php +++ b/Modules/Linksehat/Http/Controllers/Api/SearchController.php @@ -49,11 +49,11 @@ class SearchController extends Controller $queryHospitals = Organization::query() ->when($request->lat && $request->lng, function (EloquentBuilder $query) use ($request) { $query->getQuery() - ->selectRaw("organizations.id, organizations.name, addresses.text AS address, 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") + ->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") ->orderBy('distance', 'ASC'); }, function (EloquentBuilder $query) { $query->getQuery() - ->select(['organizations.id', 'organizations.name', 'addresses.text AS address']) + ->select(['organizations.id', 'organizations.name', 'addresses.text AS address', 'cities.name AS city_name']) ->orderBy('organizations.name'); }) ->leftJoin('addresses', function (Builder $query) { @@ -65,6 +65,9 @@ class SearchController extends Controller ->leftJoin('specialities', function (Builder $query) { $query->on('practitioner_roles.speciality_id', '=', 'specialities.id'); }) + ->leftJoin('cities', function ($query) { + $query->on('addresses.city_id', '=', 'cities.id'); + }) ->where('specialities.name', 'LIKE', "{$request->value}%") ->where('addresses.addressable_type', '=', Organization::class) ->whereNot('practitioner_roles.speciality_id') diff --git a/Modules/Linksehat/Transformers/Hospital/HospitalResource.php b/Modules/Linksehat/Transformers/Hospital/HospitalResource.php index fc0e397a..43e6030a 100644 --- a/Modules/Linksehat/Transformers/Hospital/HospitalResource.php +++ b/Modules/Linksehat/Transformers/Hospital/HospitalResource.php @@ -18,8 +18,8 @@ class HospitalResource extends JsonResource 'id' => $this->id, 'name' => $this->name, 'address' => $this->address ?? null, - 'distance' => isset($this->distance_km) ? round($this->distance_km) . ' km' : null, - 'city_name' => $this->currentAddress->city->name ?? null, + 'distance' => $this->distance ? ($this->distance < 1 ? round($this->distance * 1000, 2) . " m" : round($this->distance, 2) . " km") : null, + 'city_name' => $this->city_name ?? null, 'phone' => $this->meta->phone, 'photos' => [ 'title' => $this->name,