From d0ce5772c2ca125c50961b4300fae1c18dec0606 Mon Sep 17 00:00:00 2001 From: Muhammad Fajar Date: Tue, 25 Oct 2022 18:13:02 +0700 Subject: [PATCH] add api linksehat/dashboard --- .../Controllers/Api/DashboardController.php | 48 +++++++++++++++++++ .../Providers/RouteServiceProvider.php | 1 + Modules/Linksehat/Routes/api.php | 16 ++++--- .../Dashboard/ArticleResource.php | 28 +++++++++++ .../Transformers/Dashboard/DoctorResource.php | 27 +++++++++++ .../Dashboard/HospitalResource.php | 29 +++++++++++ 6 files changed, 143 insertions(+), 6 deletions(-) create mode 100644 Modules/Linksehat/Http/Controllers/Api/DashboardController.php create mode 100644 Modules/Linksehat/Transformers/Dashboard/ArticleResource.php create mode 100644 Modules/Linksehat/Transformers/Dashboard/DoctorResource.php create mode 100644 Modules/Linksehat/Transformers/Dashboard/HospitalResource.php diff --git a/Modules/Linksehat/Http/Controllers/Api/DashboardController.php b/Modules/Linksehat/Http/Controllers/Api/DashboardController.php new file mode 100644 index 00000000..b4db497b --- /dev/null +++ b/Modules/Linksehat/Http/Controllers/Api/DashboardController.php @@ -0,0 +1,48 @@ +with([ + 'practitioner.person', 'speciality' + ]) + ->whereHas('speciality')->get()->random(5); + + + $queryHospitals = Organization::query() + ->without('meta') + ->where('organizations.type', 'hospital') + ->leftJoin('addresses', function ($q) { + $q->on('organizations.main_address_id', '=', 'addresses.id'); + $q->where('addresses.addressable_type', '=', Organization::class); + }) + ->selectRaw("organizations.*, 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") + ->limit(5) + ->get(); + + $doctors = DoctorResource::collection($queryDoctors); + $hospitals = HospitalResource::collection($queryHospitals); + $articles = ArticleResource::collection(json_decode(Http::get('https://linksehat.com/api/medical-assistance-articles'))); + + return response()->json([ + 'success' => true, + 'statusCode' => 200, + 'message' => 'Success', + 'data' => compact('doctors', 'hospitals', 'articles'), + ]); + } +} diff --git a/Modules/Linksehat/Providers/RouteServiceProvider.php b/Modules/Linksehat/Providers/RouteServiceProvider.php index 421f1d37..a921c6f7 100644 --- a/Modules/Linksehat/Providers/RouteServiceProvider.php +++ b/Modules/Linksehat/Providers/RouteServiceProvider.php @@ -62,6 +62,7 @@ class RouteServiceProvider extends ServiceProvider protected function mapApiRoutes() { Route::middleware('api') + ->prefix('api') ->namespace($this->moduleNamespace) ->group(module_path('Linksehat', '/Routes/api.php')); } diff --git a/Modules/Linksehat/Routes/api.php b/Modules/Linksehat/Routes/api.php index 39487993..d61e3e75 100644 --- a/Modules/Linksehat/Routes/api.php +++ b/Modules/Linksehat/Routes/api.php @@ -2,6 +2,7 @@ use Illuminate\Http\Request; use Modules\Linksehat\Http\Controllers\Api\AuthController; +use Modules\Linksehat\Http\Controllers\Api\DashboardController; use Modules\Linksehat\Http\Controllers\Api\DoctorController; use Modules\Linksehat\Http\Controllers\Api\HospitalController; use Modules\Linksehat\Http\Controllers\Api\ProfileController; @@ -16,31 +17,34 @@ use Modules\Linksehat\Http\Controllers\Api\ProfileController; | is assigned the "api" middleware group. Enjoy building your API! | */ + Route::prefix('linksehat')->group(function () { + Route::get('dashboard', [DashboardController::class, 'index']); + Route::post('otp-request', [AuthController::class, 'otpRequest']); Route::post('mock-otp', [AuthController::class, 'mockOtp']); Route::post('login', [AuthController::class, 'login']); Route::post('register', [AuthController::class, 'register']); - + // Route::get('articles', [ArticleController::class, 'index']); // Route::get('articles/id', [ArticleController::class, 'show']); - + Route::get('hospitals', [HospitalController::class, 'index']); Route::get('hospitals/{id}', [HospitalController::class, 'show']); - + Route::get('doctors/online', [DoctorController::class, 'index'])->name('doctors.online'); Route::get('doctors', [DoctorController::class, 'index'])->name('doctors.index'); Route::get('doctors/{id}', [DoctorController::class, 'show'])->name('doctors.show'); Route::post('doctors/{id}/schedule', [DoctorController::class, 'schedule'])->name('doctors.schedule'); - + // Route::middleware('auth:api')->get('/linksehat', function (Request $request) { // return $request->user(); // }); - + Route::middleware('auth:sanctum')->group(function () { Route::get('profile', [ProfileController::class, 'index'])->name('profile'); Route::post('profile', [ProfileController::class, 'update'])->name('profile.update'); }); -}); \ No newline at end of file +}); diff --git a/Modules/Linksehat/Transformers/Dashboard/ArticleResource.php b/Modules/Linksehat/Transformers/Dashboard/ArticleResource.php new file mode 100644 index 00000000..70bb1f2f --- /dev/null +++ b/Modules/Linksehat/Transformers/Dashboard/ArticleResource.php @@ -0,0 +1,28 @@ + $this->nID, + 'sSlug' => $this->sSlug, + 'title' => $this->sJudulArtikel, + 'deskripsi' => $this->sMetaDeskripsi, + 'photos' => [ + 'title' => $this->sSlug, + 'url' => $this->sImages + ] + ]; + } +} diff --git a/Modules/Linksehat/Transformers/Dashboard/DoctorResource.php b/Modules/Linksehat/Transformers/Dashboard/DoctorResource.php new file mode 100644 index 00000000..f7305833 --- /dev/null +++ b/Modules/Linksehat/Transformers/Dashboard/DoctorResource.php @@ -0,0 +1,27 @@ + $this->practitioner->person->id, + 'name' => $this->practitioner->person->name, + 'specialis' => $this->speciality->name, + 'photos' => [ + 'title' => 'doctors-avatar-' . $this->id, + 'url' => asset('images/default-doctor-avatar.png') + ] + ]; + } +} diff --git a/Modules/Linksehat/Transformers/Dashboard/HospitalResource.php b/Modules/Linksehat/Transformers/Dashboard/HospitalResource.php new file mode 100644 index 00000000..23ebe6c9 --- /dev/null +++ b/Modules/Linksehat/Transformers/Dashboard/HospitalResource.php @@ -0,0 +1,29 @@ + $this->id, + 'name' => $this->name, + 'address' => $this->currentAddress ?? null, + 'distance' => $this->distance < 1 ? round($this->distance * 1000, 2) . " m" : round($this->distance, 2) . " km", + 'photos' => [ + 'title' => Str::slug($this->name), + 'url' => asset('images/default-doctor-avatar.png') + ] + ]; + } +}