diff --git a/app/Http/Controllers/Auth/ContactLoginController.php b/app/Http/Controllers/Auth/ContactLoginController.php index 8168052aab85..2bcf310dfa04 100644 --- a/app/Http/Controllers/Auth/ContactLoginController.php +++ b/app/Http/Controllers/Auth/ContactLoginController.php @@ -80,4 +80,5 @@ class ContactLoginController extends Controller return redirect('/client/login'); } + } diff --git a/app/Http/Controllers/ClientPortal/ContactHashLoginController.php b/app/Http/Controllers/ClientPortal/ContactHashLoginController.php new file mode 100644 index 000000000000..3a64b9f1d36d --- /dev/null +++ b/app/Http/Controllers/ClientPortal/ContactHashLoginController.php @@ -0,0 +1,35 @@ + \App\Http\Middleware\ContactRegister::class, 'shop_token_auth' => \App\Http\Middleware\Shop\ShopTokenAuth::class, 'phantom_secret' => \App\Http\Middleware\PhantomSecret::class, + 'contact_key_login' => \App\Http\Middleware\ContactKeyLogin::class, ]; } diff --git a/app/Http/Middleware/ContactKeyLogin.php b/app/Http/Middleware/ContactKeyLogin.php new file mode 100644 index 000000000000..4c2a6feb0fe2 --- /dev/null +++ b/app/Http/Middleware/ContactKeyLogin.php @@ -0,0 +1,56 @@ +input('contact_key')); + + if ($request->has('contact_key') && config('ninja.db.multi_db_enabled')) { + + if (MultiDB::findAndSetDbByContactKey($request->input('contact_key'))) { + + $client_contact = ClientContact::where('contact_key', $request->input('contact_key'))->first(); + Auth::guard('contact')->login($client_contact, true); + return redirect()->to('client/dashboard'); + + } + + } + else if ($request->has('contact_key')) { + + if($client_contact = ClientContact::where('contact_key', $request->input('contact_key'))->first()){ + Auth::guard('contact')->login($client_contact, true); + return redirect()->to('client/dashboard'); + } + + } + + return $next($request); + } +} diff --git a/app/Libraries/MultiDB.php b/app/Libraries/MultiDB.php index 58be6049e7cb..7aebf248f026 100644 --- a/app/Libraries/MultiDB.php +++ b/app/Libraries/MultiDB.php @@ -195,6 +195,20 @@ class MultiDB return false; } + public static function findAndSetDbByContactKey($contact_key) :bool + { + foreach (self::$dbs as $db) { + if ($client_contact = ClientContact::on($db)->where('contact_key', $contact_key)->first()) { + self::setDb($client_contact->company->db); + + return true; + } + } + + return false; + } + + public static function findAndSetDbByDomain($subdomain) :bool { foreach (self::$dbs as $db) { diff --git a/routes/client.php b/routes/client.php index c30b6217f1ee..05c15b24762e 100644 --- a/routes/client.php +++ b/routes/client.php @@ -19,6 +19,8 @@ Route::get('view/{entity_type}/{invitation_key}', 'ClientPortal\EntityViewContro Route::get('view/{entity_type}/{invitation_key}/password', 'ClientPortal\EntityViewController@password')->name('client.entity_view.password'); Route::post('view/{entity_type}/{invitation_key}/password', 'ClientPortal\EntityViewController@handlePassword'); +Route::get('client/key_login/{contact_key}', 'ClientPortal\ContactHashLoginController@login')->name('client.contact_login')->middleware(['contact_key_login']); + //todo implement domain DB Route::group(['middleware' => ['auth:contact', 'locale'], 'prefix' => 'client', 'as' => 'client.'], function () { Route::get('dashboard', 'ClientPortal\DashboardController@index')->name('dashboard'); // name = (dashboard. index / create / show / update / destroy / edit