diff --git a/app/Http/Controllers/PaymentController.php b/app/Http/Controllers/PaymentController.php index 4c87d6dc15..01f5354817 100644 --- a/app/Http/Controllers/PaymentController.php +++ b/app/Http/Controllers/PaymentController.php @@ -613,7 +613,6 @@ class PaymentController extends BaseController // code... break; case 'email': - //dispatch email to queue $payment->service()->sendEmail(); if (! $bulk) { diff --git a/app/Http/Controllers/VendorPortal/VendorContactHashLoginController.php b/app/Http/Controllers/VendorPortal/VendorContactHashLoginController.php new file mode 100644 index 0000000000..21e11a9c09 --- /dev/null +++ b/app/Http/Controllers/VendorPortal/VendorContactHashLoginController.php @@ -0,0 +1,42 @@ +setRedirectPath()); + } + + public function errorPage() + { + return render('generic.error', ['title' => session()->get('title'), 'notification' => session()->get('notification')]); + } + + +} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 135355c377..0590a73841 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -42,6 +42,7 @@ use App\Http\Middleware\TrimStrings; use App\Http\Middleware\TrustProxies; use App\Http\Middleware\UrlSetDb; use App\Http\Middleware\UserVerified; +use App\Http\Middleware\VendorContactKeyLogin; use App\Http\Middleware\VendorLocale; use App\Http\Middleware\VerifyCsrfToken; use App\Http\Middleware\VerifyHash; @@ -166,6 +167,7 @@ class Kernel extends HttpKernel 'shop_token_auth' => ShopTokenAuth::class, 'phantom_secret' => PhantomSecret::class, 'contact_key_login' => ContactKeyLogin::class, + 'vendor_contact_key_login' => VendorContactKeyLogin::class, 'check_client_existence' => CheckClientExistence::class, 'user_verified' => UserVerified::class, 'document_db' => SetDocumentDb::class, diff --git a/app/Http/Middleware/VendorContactKeyLogin.php b/app/Http/Middleware/VendorContactKeyLogin.php new file mode 100644 index 0000000000..2c5dc0a974 --- /dev/null +++ b/app/Http/Middleware/VendorContactKeyLogin.php @@ -0,0 +1,155 @@ +check()) { + Auth::guard('vendor')->logout(); + $request->session()->invalidate(); + } + + if ($request->segment(2) && $request->segment(2) == 'magic_link' && $request->segment(3)) { + $payload = Cache::get($request->segment(3)); + + if (! $payload) { + abort(403, 'Link expired.'); + } + + $contact_email = $payload['email']; + + if ($vendor_contact = VendorContact::where('email', $contact_email)->where('company_id', $payload['company_id'])->first()) { + if (empty($vendor_contact->email)) { + $vendor_contact->email = Str::random(15).'@example.com'; + } + $vendor_contact->save(); + + auth()->guard('vendor')->loginUsingId($vendor_contact->id, true); + + if ($request->query('redirect') && ! empty($request->query('redirect'))) { + return redirect()->to($request->query('redirect')); + } + + return redirect($this->setRedirectPath()); + } + } elseif ($request->segment(3) && config('ninja.db.multi_db_enabled')) { + if (MultiDB::findAndSetDbByContactKey($request->segment(3))) { + if ($vendor_contact = VendorContact::where('contact_key', $request->segment(3))->first()) { + if (empty($vendor_contact->email)) { + $vendor_contact->email = Str::random(6).'@example.com'; + } + $vendor_contact->save(); + + auth()->guard('vendor')->loginUsingId($vendor_contact->id, true); + + if ($request->query('next')) { + return redirect()->to($request->query('next')); + } + + return redirect($this->setRedirectPath()); + } + } + } elseif ($request->segment(2) && $request->segment(2) == 'key_login' && $request->segment(3)) { + if ($vendor_contact = VendorContact::where('contact_key', $request->segment(3))->first()) { + if (empty($vendor_contact->email)) { + $vendor_contact->email = Str::random(6).'@example.com'; + $vendor_contact->save(); + } + + auth()->guard('vendor')->loginUsingId($vendor_contact->id, true); + + if ($request->query('next')) { + return redirect($request->query('next')); + } + + return redirect($this->setRedirectPath()); + } + } elseif ($request->has('vendor_hash') && config('ninja.db.multi_db_enabled')) { + if (MultiDB::findAndSetDbByClientHash($request->input('vendor_hash'))) { + if ($client = Vendor::where('vendor_hash', $request->input('vendor_hash'))->first()) { + $primary_contact = $client->primary_contact()->first(); + + if (empty($primary_contact->email)) { + $primary_contact->email = Str::random(6).'@example.com'; + } + $primary_contact->save(); + + auth()->guard('vendor')->loginUsingId($primary_contact->id, true); + + return redirect($this->setRedirectPath()); + } + } + } elseif ($request->has('vendor_hash')) { + if ($client = Vendor::where('vendor_hash', $request->input('vendor_hash'))->first()) { + $primary_contact = $client->primary_contact()->first(); + + if (empty($primary_contact->email)) { + $primary_contact->email = Str::random(6).'@example.com'; + } + $primary_contact->save(); + + auth()->guard('vendor')->loginUsingId($primary_contact->id, true); + + return redirect($this->setRedirectPath()); + } + } elseif ($request->segment(3)) { + if ($vendor_contact = VendorContact::where('contact_key', $request->segment(3))->first()) { + if (empty($vendor_contact->email)) { + $vendor_contact->email = Str::random(6).'@example.com'; + $vendor_contact->save(); + } + + auth()->guard('vendor')->loginUsingId($vendor_contact->id, true); + + if ($request->query('next')) { + return redirect($request->query('next')); + } + + return redirect($this->setRedirectPath()); + } + } + //28-02-2022 middleware should not allow this to progress as we should have redirected by this stage. + abort(404, 'Unable to authenticate.'); + + return $next($request); + } + + private function setRedirectPath() + { + + return 'vendors/purchase_orders'; + + } +} diff --git a/app/Models/VendorContact.php b/app/Models/VendorContact.php index 721ae72222..4311b3320b 100644 --- a/app/Models/VendorContact.php +++ b/app/Models/VendorContact.php @@ -154,4 +154,13 @@ class VendorContact extends Authenticatable implements HasLocalePreference { return $this->hasMany(PurchaseOrderInvitation::class); } + + public function getLoginLink() + { + + $domain = isset($this->company->portal_domain) ? $this->company->portal_domain : $this->company->domain(); + + return $domain.'/vendors/key_login/'.$this->contact_key; + + } } diff --git a/app/Services/Payment/SendEmail.php b/app/Services/Payment/SendEmail.php index 598fd92f3d..39c3e063f7 100644 --- a/app/Services/Payment/SendEmail.php +++ b/app/Services/Payment/SendEmail.php @@ -34,10 +34,10 @@ class SendEmail { $this->payment->load('company', 'client.contacts'); - $this->payment->client->contacts->each(function ($contact) { - if ($contact->email) { - EmailPayment::dispatch($this->payment, $this->payment->company, $contact); - } - }); + $contact = $this->payment->client->contacts()->first(); + + if ($contact->email) + EmailPayment::dispatch($this->payment, $this->payment->company, $contact); + } } diff --git a/app/Transformers/VendorContactTransformer.php b/app/Transformers/VendorContactTransformer.php index da9f5a6f3e..dbbdf6daed 100644 --- a/app/Transformers/VendorContactTransformer.php +++ b/app/Transformers/VendorContactTransformer.php @@ -42,6 +42,7 @@ class VendorContactTransformer extends EntityTransformer 'custom_value2' => $vendor->custom_value2 ?: '', 'custom_value3' => $vendor->custom_value3 ?: '', 'custom_value4' => $vendor->custom_value4 ?: '', + 'link' => $vendor->getLoginLink(), ]; } } diff --git a/routes/vendor.php b/routes/vendor.php index 68056bf44b..d26ce90ee3 100644 --- a/routes/vendor.php +++ b/routes/vendor.php @@ -15,9 +15,11 @@ use App\Http\Controllers\VendorPortal\InvitationController; use App\Http\Controllers\VendorPortal\PurchaseOrderController; use App\Http\Controllers\VendorPortal\UploadController; use App\Http\Controllers\VendorPortal\VendorContactController; +use App\Http\Controllers\VendorPortal\VendorContactHashLoginController; use Illuminate\Support\Facades\Route; Route::get('vendors', [VendorContactLoginController::class, 'catch'])->name('vendor.catchall')->middleware(['domain_db', 'contact_account','vendor_locale']); //catch all +Route::get('vendor/key_login/{contact_key}', [VendorContactHashLoginController::class, 'login'])->name('contact_login')->middleware(['domain_db','contact_key_login']); Route::group(['middleware' => ['invite_db'], 'prefix' => 'vendor', 'as' => 'vendor.'], function () { /*Invitation catches*/