diff --git a/Modules/Linksehat/Config/.gitkeep b/Modules/Linksehat/Config/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Linksehat/Config/config.php b/Modules/Linksehat/Config/config.php new file mode 100644 index 00000000..a6ce97ac --- /dev/null +++ b/Modules/Linksehat/Config/config.php @@ -0,0 +1,6 @@ + 'Linksehat', + 'otp_valid_minutes' => 10 +]; diff --git a/Modules/Linksehat/Console/.gitkeep b/Modules/Linksehat/Console/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Linksehat/Database/Migrations/.gitkeep b/Modules/Linksehat/Database/Migrations/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Linksehat/Database/Seeders/.gitkeep b/Modules/Linksehat/Database/Seeders/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Linksehat/Database/Seeders/LinksehatDatabaseSeeder.php b/Modules/Linksehat/Database/Seeders/LinksehatDatabaseSeeder.php new file mode 100644 index 00000000..c940e344 --- /dev/null +++ b/Modules/Linksehat/Database/Seeders/LinksehatDatabaseSeeder.php @@ -0,0 +1,21 @@ +call("OthersTableSeeder"); + } +} diff --git a/Modules/Linksehat/Database/factories/.gitkeep b/Modules/Linksehat/Database/factories/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Linksehat/Entities/.gitkeep b/Modules/Linksehat/Entities/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Linksehat/Http/Controllers/.gitkeep b/Modules/Linksehat/Http/Controllers/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Linksehat/Http/Controllers/Api/AuthController.php b/Modules/Linksehat/Http/Controllers/Api/AuthController.php new file mode 100644 index 00000000..1f76add8 --- /dev/null +++ b/Modules/Linksehat/Http/Controllers/Api/AuthController.php @@ -0,0 +1,131 @@ +validate([ + 'phone' => 'required' + ]); + + $user = User::updateOrCreate([ + 'phone' => $request->phone + ], [ + 'phone' => $request->phone, + 'otp' => rand(1000, 9999), + 'otp_created_at' => now() + ]); + if (!$user) { + return response()->json([ + 'message' => "User dengan nomor telepon ".$request->phone." tidak ditemukan" + ], 404); + } + + return response()->json([ + 'message' => 'OTP Terkirim', + 'data' => [ + 'otp_valid_until' => $user->otp_created_at->addMinutes(config('linksehat.otp_valid_minutes')) + ] + ]); + } + + public function login(Request $request) + { + $request->validate([ + 'email' => 'email', + 'password' => 'required_with:email', + 'phone' => '', + 'otp' => 'required_with:phone', + ]); + + $loginType = null; + + if ($request->has('password') && !empty($request->password)) { + $user = User::query() + ->where('email', $request->email) + ->first(); + + $loginType = 'email'; + } + + if ($request->has('otp') && !empty($request->otp)) { + $user = User::query() + ->where('phone', $request->phone) + ->first(); + + $loginType = 'phone'; + } + + if (!$user) { + return response(['message' => 'User Tidak Ditemukan'], 404); + } + + if ($loginType == 'email') { + if (!Hash::check($request->password, $user->password)) { + return response(['message' => 'Password Salah'], 403); + } + } else if ($loginType == 'phone') { + if ($request->otp != $user->otp) { + return response(['message' => 'OTP Salah'], 403); + } + } else { + return response(['message' => 'Mode Login Tidak Dikenal'], 403); + } + + return response([ + 'message' => 'Selamat Datang', + 'user' => $user, + 'token' => $user->createToken('app')->plainTextToken + ]); + } + + public function register(Request $request) + { + $validator = Validator::make($request->all(), [ + 'email' => 'required|email|unique:users,email', + 'password' => [ + 'required', + 'confirmed', + 'min:8', + 'regex:/.*[0-9].*/', + 'regex:/.*[a-z].*/', + 'regex:/.*[A-Z].*/', + ] + ], [ + 'password.regex' => "Password harus minimal 8 karakter, kombinasi huruf besar kecil dan angka" + ])->validate(); + + try { + $user = User::create([ + 'email' => $request->email, + 'password' => Hash::make($request->password), + ]); + + return response()->json([ + 'message' => 'Akun berhasil dibuat, silahkan cek E-mail untuk konfirmasi' + ], 201); + } catch (\Exception $e) { + return response()->json([ + 'message' => 'Terjadi masalah ketika mendaftar', + 'error_message' => $e->getMessage() + ], 403); + } + } + + public function logout(Request $request) + { + $token = $request->bearerToken(); + Auth::user()->tokens()->where('id', $token)->delete(); + + return response(['message' => 'Berhasil Logout.']); + } +} diff --git a/Modules/Linksehat/Http/Controllers/LinksehatController.php b/Modules/Linksehat/Http/Controllers/LinksehatController.php new file mode 100644 index 00000000..0aae71ee --- /dev/null +++ b/Modules/Linksehat/Http/Controllers/LinksehatController.php @@ -0,0 +1,79 @@ +registerTranslations(); + $this->registerConfig(); + $this->registerViews(); + $this->loadMigrationsFrom(module_path($this->moduleName, 'Database/Migrations')); + } + + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + $this->app->register(RouteServiceProvider::class); + } + + /** + * Register config. + * + * @return void + */ + protected function registerConfig() + { + $this->publishes([ + module_path($this->moduleName, 'Config/config.php') => config_path($this->moduleNameLower . '.php'), + ], 'config'); + $this->mergeConfigFrom( + module_path($this->moduleName, 'Config/config.php'), $this->moduleNameLower + ); + } + + /** + * Register views. + * + * @return void + */ + public function registerViews() + { + $viewPath = resource_path('views/modules/' . $this->moduleNameLower); + + $sourcePath = module_path($this->moduleName, 'Resources/views'); + + $this->publishes([ + $sourcePath => $viewPath + ], ['views', $this->moduleNameLower . '-module-views']); + + $this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), $this->moduleNameLower); + } + + /** + * Register translations. + * + * @return void + */ + public function registerTranslations() + { + $langPath = resource_path('lang/modules/' . $this->moduleNameLower); + + if (is_dir($langPath)) { + $this->loadTranslationsFrom($langPath, $this->moduleNameLower); + } else { + $this->loadTranslationsFrom(module_path($this->moduleName, 'Resources/lang'), $this->moduleNameLower); + } + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() + { + return []; + } + + private function getPublishableViewPaths(): array + { + $paths = []; + foreach (\Config::get('view.paths') as $path) { + if (is_dir($path . '/modules/' . $this->moduleNameLower)) { + $paths[] = $path . '/modules/' . $this->moduleNameLower; + } + } + return $paths; + } +} diff --git a/Modules/Linksehat/Providers/RouteServiceProvider.php b/Modules/Linksehat/Providers/RouteServiceProvider.php new file mode 100644 index 00000000..5c7a5539 --- /dev/null +++ b/Modules/Linksehat/Providers/RouteServiceProvider.php @@ -0,0 +1,69 @@ +mapApiRoutes(); + + $this->mapWebRoutes(); + } + + /** + * Define the "web" routes for the application. + * + * These routes all receive session state, CSRF protection, etc. + * + * @return void + */ + protected function mapWebRoutes() + { + Route::middleware('web') + ->namespace($this->moduleNamespace) + ->group(module_path('Linksehat', '/Routes/web.php')); + } + + /** + * Define the "api" routes for the application. + * + * These routes are typically stateless. + * + * @return void + */ + protected function mapApiRoutes() + { + Route::prefix('api') + ->middleware('api') + ->namespace($this->moduleNamespace) + ->group(module_path('Linksehat', '/Routes/api.php')); + } +} diff --git a/Modules/Linksehat/Resources/assets/.gitkeep b/Modules/Linksehat/Resources/assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Linksehat/Resources/assets/js/app.js b/Modules/Linksehat/Resources/assets/js/app.js new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Linksehat/Resources/assets/sass/app.scss b/Modules/Linksehat/Resources/assets/sass/app.scss new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Linksehat/Resources/lang/.gitkeep b/Modules/Linksehat/Resources/lang/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Linksehat/Resources/views/.gitkeep b/Modules/Linksehat/Resources/views/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Linksehat/Resources/views/index.blade.php b/Modules/Linksehat/Resources/views/index.blade.php new file mode 100644 index 00000000..66c6143e --- /dev/null +++ b/Modules/Linksehat/Resources/views/index.blade.php @@ -0,0 +1,9 @@ +@extends('linksehat::layouts.master') + +@section('content') +
+ This view is loaded from module: {!! config('linksehat.name') !!} +
+@endsection diff --git a/Modules/Linksehat/Resources/views/layouts/master.blade.php b/Modules/Linksehat/Resources/views/layouts/master.blade.php new file mode 100644 index 00000000..52e851bb --- /dev/null +++ b/Modules/Linksehat/Resources/views/layouts/master.blade.php @@ -0,0 +1,19 @@ + + + + + + +