diff --git a/app/Http/Controllers/SecurityController.php b/app/Http/Controllers/SecurityController.php new file mode 100755 index 0000000..69edce1 --- /dev/null +++ b/app/Http/Controllers/SecurityController.php @@ -0,0 +1,137 @@ +validate([ + "email" => "required", + "password" => "required", + ]); + $user = \App\User::where("email", $request->input("email"))->first(); + if ($user != null) { + if (Hash::check($request->input('password'), $user->password)) { + // Set Session + $request->session()->put('user', $user->id); + $request->session()->put('name', $user->name); + $request->session()->put('email', $user->email); + + return response()->json([ + "message" => "Success login", + ], 200); + } else { + return response()->json([ + "message" => "Username or password is wrong", + ], 401); + } + } else { + return response()->json([ + "message" => "Username or password is wrong", + ], 401); + } + } + + public function formRegister(Request $request) + { + $request->validate([ + "name" => "required", + "email" => "required", + "password" => "required", + "password_confirm" => "required", + ]); + $user = \App\User::where("email", $request->input("email"))->first(); + if ($user != null) { + return response()->json([ + "message" => "User with email " . $user->email . " is exist", + ], 400); + } else { + if ($request->input('password') != $request->input('password_confirm')) { + return response()->json([ + "message" => "Confirm password is different with provided password", + ], 400); + } else { + $user = new \App\User(); + $user->name = $request->input("name"); + $user->email = $request->input("email"); + $user->password = Hash::make($request->input("password")); + if ($user->save()) { + return response()->json([ + "message" => "Register success, now you can login...", + ], 200); + } else { + return response()->json([ + "message" => "Failed to register new user", + ], 400); + } + } + } + } + + public function formForgotPassword(Request $request) + { + $request->validate([ + "email" => "required", + ]); + $user = \App\User::where("email", $request->input("email"))->first(); + if ($user != null) { + $name = $user->name; + $newPassword = Str::random(4); + $user->password = Hash::make($newPassword); + Mail::to($user->email)->send(new ForgotPassword($name, $newPassword)); + $user->save(); + return response()->json([ + "message" => "Please check your email", + ], 200); + } else { + return response()->json([ + "message" => "Email " . $request->input('email') . " is not exist", + ], 400); + } + } + + public function formChangePassword(Request $request) + { + $request->validate([ + "email" => "required", + "password" => "required", + "password_confirm" => "required", + ]); + $user = \App\User::where("email", $request->input("email"))->first(); + if ($user != null) { + if ($request->input('password') == $request->input('password_confirm')) { + $user->password = Hash::make($request->input('password')); + if ($user->save()) { + return response()->json([ + "message" => "Success change password", + ], 200); + } else { + return response()->json([ + "message" => "Failed change password", + ], 400); + } + } else { + return response()->json([ + "message" => "New password is not match with confirm password", + ], 400); + } + } else { + return response()->json([ + "message" => "Email " . $request->input('email') . " is not exist", + ], 400); + } + } + + public function formLogout(Request $request) + { + $request->session()->flush(); + return redirect('/'); + } +} diff --git a/app/Http/Controllers/UrlShortenerController.php b/app/Http/Controllers/UrlShortenerController.php index 12c3b51..0f4982a 100755 --- a/app/Http/Controllers/UrlShortenerController.php +++ b/app/Http/Controllers/UrlShortenerController.php @@ -12,6 +12,16 @@ use Illuminate\Support\Str; class UrlShortenerController extends Controller { + public function viewHome() + { + return view('home'); + } + + public function viewList() + { + return view('list'); + } + public function createShortURL(Request $request) { $request->validate([ @@ -44,6 +54,10 @@ class UrlShortenerController extends Controller $saveGeneratedURL = new UrlAddress(); $saveGeneratedURL['url_destination'] = $request->input('url'); $saveGeneratedURL['path_generated'] = $generatedPath; + $userSession = $request->session()->has('user'); + if ($userSession) { + $saveGeneratedURL['user_id'] = $userSession; + } if ($request->input('expired_date') != null && $request->input('expired_date') != "") { $saveGeneratedURL['date_expired'] = $request->input('expired_date'); diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 99eafe9..901100c 100755 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -55,6 +55,7 @@ class Kernel extends HttpKernel */ protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, + 'auth.web' => \App\Http\Middleware\WebAuthenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, diff --git a/app/Http/Middleware/WebAuthenticate.php b/app/Http/Middleware/WebAuthenticate.php new file mode 100755 index 0000000..2e95189 --- /dev/null +++ b/app/Http/Middleware/WebAuthenticate.php @@ -0,0 +1,24 @@ +session()->has('user')) { + return $next($request); + } else { + return redirect('login'); + } + } +} diff --git a/app/Mail/ForgotPassword.php b/app/Mail/ForgotPassword.php new file mode 100644 index 0000000..8a44642 --- /dev/null +++ b/app/Mail/ForgotPassword.php @@ -0,0 +1,37 @@ +name = $name; + $this->password = $password; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + return $this->view('template.email.forgot'); + } +} diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index d10e02e..d0e3fae 100755 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -21,7 +21,7 @@ use Illuminate\Support\Str; $factory->define(User::class, function (Faker $faker) { return [ 'name' => $faker->name, - 'email' => "admin@admin.com", + 'email' => "admin@email.com", 'email_verified_at' => now(), 'password' => Hash::make('123'), // password 'remember_token' => Str::random(10), diff --git a/resources/views/layout/default.blade.php b/resources/views/layout/default.blade.php index 0bc77bb..f556640 100755 --- a/resources/views/layout/default.blade.php +++ b/resources/views/layout/default.blade.php @@ -64,20 +64,40 @@ @@ -120,6 +140,152 @@ +@if(Session::get('user') == null) + {{-- Forgot Password Modal --}} + + + {{-- Sign In Modal --}} + + + {{-- Register Modal --}} + +@else + {{-- Change Password Modal --}} + +@endif + @@ -143,6 +309,177 @@ + + @yield('js') diff --git a/resources/views/list.blade.php b/resources/views/list.blade.php new file mode 100755 index 0000000..dc3b184 --- /dev/null +++ b/resources/views/list.blade.php @@ -0,0 +1,84 @@ +@extends('layout.default') + +@section('title') + My URL Shortener +@endsection + +@section('subtitle') + List all of your own URL Shortener +@endsection + +@section('content') +
+
+

+ +

+ +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#DestinationShort URLClickExpired DateProtectionAction
1.http://www.google.comhttp://shorturl.test/s/sasd5 + +
1.http://www.google.comhttp://shorturl.test/s/ssdf5 + +
+
+ +
+ +@endsection + +@section('js') + +@endsection diff --git a/resources/views/template/email/forgot.blade.php b/resources/views/template/email/forgot.blade.php new file mode 100644 index 0000000..269231d --- /dev/null +++ b/resources/views/template/email/forgot.blade.php @@ -0,0 +1,5 @@ +
+ Hi, {{ $name }}
+ This is your new password : {{ $password }}
+

You can change it after login back

+
diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php deleted file mode 100755 index 3fb48cc..0000000 --- a/resources/views/welcome.blade.php +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - Laravel - - - - - - - - -
- @if (Route::has('login')) - - @endif - -
-
- Laravel -
- - -
-
- - diff --git a/routes/web.php b/routes/web.php index f8e3564..d0d6fe6 100755 --- a/routes/web.php +++ b/routes/web.php @@ -13,9 +13,19 @@ use Illuminate\Support\Facades\Route; | */ -Route::get('/', function () { - return view('home'); -}); +Route::get('/', "UrlShortenerController@viewHome"); Route::post('/s/g', "UrlShortenerController@createShortURL"); Route::get('/s/{pathGenerated}', "UrlShortenerController@openDestination"); Route::post('/s/{pathGenerated}/open/protection', "UrlShortenerController@openProtectedDestination"); + +Route::middleware('auth.web')->group(function () { + Route::get('/list', "UrlShortenerController@viewList"); + + Route::post('/web/change/password', "SecurityController@formChangePassword"); +}); + +Route::post('/web/login', "SecurityController@formLogin"); +Route::post('/web/forgot', "SecurityController@formForgotPassword"); +Route::post('/web/register', "SecurityController@formRegister"); +Route::get('/web/logout', "SecurityController@formLogout"); +