mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-05-31 02:04:33 -04:00
Add last_login timestamps for vendorcontacts and vendors
This commit is contained in:
parent
45c5e2195b
commit
59ed13122c
45
app/Events/Vendor/VendorContactLoggedIn.php
vendored
Normal file
45
app/Events/Vendor/VendorContactLoggedIn.php
vendored
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Invoice Ninja (https://invoiceninja.com).
|
||||||
|
*
|
||||||
|
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
|
||||||
|
*
|
||||||
|
* @license https://www.elastic.co/licensing/elastic-license
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\Events\Vendor;
|
||||||
|
|
||||||
|
use App\Models\Company;
|
||||||
|
use App\Models\VendorContact;
|
||||||
|
use Illuminate\Broadcasting\Channel;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
use Illuminate\Foundation\Events\Dispatchable;
|
||||||
|
use Illuminate\Broadcasting\InteractsWithSockets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class VendorContactLoggedIn.
|
||||||
|
*/
|
||||||
|
class VendorContactLoggedIn
|
||||||
|
{
|
||||||
|
use Dispatchable, InteractsWithSockets, SerializesModels;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new event instance.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function __construct(public VendorContact $contact, public Company $company, public array $event_vars)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the channels the event should broadcast on.
|
||||||
|
*
|
||||||
|
* @return Channel|array
|
||||||
|
*/
|
||||||
|
public function broadcastOn()
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
@ -11,14 +11,16 @@
|
|||||||
|
|
||||||
namespace App\Http\Middleware;
|
namespace App\Http\Middleware;
|
||||||
|
|
||||||
use App\Libraries\MultiDB;
|
|
||||||
use App\Models\Vendor;
|
|
||||||
use App\Models\VendorContact;
|
|
||||||
use Auth;
|
use Auth;
|
||||||
use Closure;
|
use Closure;
|
||||||
use Illuminate\Http\Request;
|
use App\Utils\Ninja;
|
||||||
use Illuminate\Support\Facades\Cache;
|
use App\Models\Vendor;
|
||||||
|
use App\Libraries\MultiDB;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use App\Models\VendorContact;
|
||||||
|
use Illuminate\Support\Facades\Cache;
|
||||||
|
use App\Events\Vednor\VendorContactLoggedIn;
|
||||||
|
|
||||||
class VendorContactKeyLogin
|
class VendorContactKeyLogin
|
||||||
{
|
{
|
||||||
@ -56,6 +58,8 @@ class VendorContactKeyLogin
|
|||||||
$vendor_contact->save();
|
$vendor_contact->save();
|
||||||
|
|
||||||
auth()->guard('vendor')->loginUsingId($vendor_contact->id, true);
|
auth()->guard('vendor')->loginUsingId($vendor_contact->id, true);
|
||||||
|
|
||||||
|
event(new VendorContactLoggedIn($vendor_contact, $vendor_contact->company, Ninja::eventVars()));
|
||||||
|
|
||||||
if ($request->query('redirect') && ! empty($request->query('redirect'))) {
|
if ($request->query('redirect') && ! empty($request->query('redirect'))) {
|
||||||
return redirect()->to($request->query('redirect'));
|
return redirect()->to($request->query('redirect'));
|
||||||
@ -72,7 +76,7 @@ class VendorContactKeyLogin
|
|||||||
$vendor_contact->save();
|
$vendor_contact->save();
|
||||||
|
|
||||||
auth()->guard('vendor')->loginUsingId($vendor_contact->id, true);
|
auth()->guard('vendor')->loginUsingId($vendor_contact->id, true);
|
||||||
|
event(new VendorContactLoggedIn($vendor_contact, $vendor_contact->company, Ninja::eventVars()));
|
||||||
if ($request->query('next')) {
|
if ($request->query('next')) {
|
||||||
return redirect()->to($request->query('next'));
|
return redirect()->to($request->query('next'));
|
||||||
}
|
}
|
||||||
|
45
app/Listeners/Vendor/UpdateVendorContactLastLogin.php
vendored
Normal file
45
app/Listeners/Vendor/UpdateVendorContactLastLogin.php
vendored
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Invoice Ninja (https://invoiceninja.com).
|
||||||
|
*
|
||||||
|
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
|
||||||
|
*
|
||||||
|
* @license https://www.elastic.co/licensing/elastic-license
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\Listeners\Vendor;
|
||||||
|
|
||||||
|
use App\Libraries\MultiDB;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
|
|
||||||
|
class UpdateVendorContactLastLogin
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Create the event listener.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the event.
|
||||||
|
*
|
||||||
|
* @param object $event
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function handle($event)
|
||||||
|
{
|
||||||
|
MultiDB::setDb($event->company->db);
|
||||||
|
|
||||||
|
$contact = $event->contact;
|
||||||
|
|
||||||
|
$contact->last_login = now();
|
||||||
|
$contact->vendor->last_login = now();
|
||||||
|
|
||||||
|
$contact->push();
|
||||||
|
}
|
||||||
|
}
|
@ -152,6 +152,7 @@ class Vendor extends BaseModel
|
|||||||
'updated_at' => 'timestamp',
|
'updated_at' => 'timestamp',
|
||||||
'created_at' => 'timestamp',
|
'created_at' => 'timestamp',
|
||||||
'deleted_at' => 'timestamp',
|
'deleted_at' => 'timestamp',
|
||||||
|
'last_login' => 'timestamp',
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $touches = [];
|
protected $touches = [];
|
||||||
|
@ -106,6 +106,7 @@ class VendorContact extends Authenticatable implements HasLocalePreference
|
|||||||
'updated_at' => 'timestamp',
|
'updated_at' => 'timestamp',
|
||||||
'created_at' => 'timestamp',
|
'created_at' => 'timestamp',
|
||||||
'deleted_at' => 'timestamp',
|
'deleted_at' => 'timestamp',
|
||||||
|
'last_login' => 'timestamp',
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
|
@ -70,13 +70,13 @@ use App\Events\Quote\QuoteWasRestored;
|
|||||||
use App\Events\Client\ClientWasCreated;
|
use App\Events\Client\ClientWasCreated;
|
||||||
use App\Events\Client\ClientWasDeleted;
|
use App\Events\Client\ClientWasDeleted;
|
||||||
use App\Events\Client\ClientWasUpdated;
|
use App\Events\Client\ClientWasUpdated;
|
||||||
use App\Events\Design\DesignWasDeleted;
|
|
||||||
use App\Events\Design\DesignWasUpdated;
|
|
||||||
use App\Events\Contact\ContactLoggedIn;
|
use App\Events\Contact\ContactLoggedIn;
|
||||||
use App\Events\Credit\CreditWasCreated;
|
use App\Events\Credit\CreditWasCreated;
|
||||||
use App\Events\Credit\CreditWasDeleted;
|
use App\Events\Credit\CreditWasDeleted;
|
||||||
use App\Events\Credit\CreditWasEmailed;
|
use App\Events\Credit\CreditWasEmailed;
|
||||||
use App\Events\Credit\CreditWasUpdated;
|
use App\Events\Credit\CreditWasUpdated;
|
||||||
|
use App\Events\Design\DesignWasDeleted;
|
||||||
|
use App\Events\Design\DesignWasUpdated;
|
||||||
use App\Events\Vendor\VendorWasCreated;
|
use App\Events\Vendor\VendorWasCreated;
|
||||||
use App\Events\Vendor\VendorWasDeleted;
|
use App\Events\Vendor\VendorWasDeleted;
|
||||||
use App\Events\Vendor\VendorWasUpdated;
|
use App\Events\Vendor\VendorWasUpdated;
|
||||||
@ -85,10 +85,10 @@ use App\Observers\SubscriptionObserver;
|
|||||||
use Illuminate\Mail\Events\MessageSent;
|
use Illuminate\Mail\Events\MessageSent;
|
||||||
use App\Events\Client\ClientWasArchived;
|
use App\Events\Client\ClientWasArchived;
|
||||||
use App\Events\Client\ClientWasRestored;
|
use App\Events\Client\ClientWasRestored;
|
||||||
use App\Events\Design\DesignWasRestored;
|
|
||||||
use App\Events\Credit\CreditWasArchived;
|
use App\Events\Credit\CreditWasArchived;
|
||||||
use App\Events\Credit\CreditWasRestored;
|
use App\Events\Credit\CreditWasRestored;
|
||||||
use App\Events\Design\DesignWasArchived;
|
use App\Events\Design\DesignWasArchived;
|
||||||
|
use App\Events\Design\DesignWasRestored;
|
||||||
use App\Events\Invoice\InvoiceWasViewed;
|
use App\Events\Invoice\InvoiceWasViewed;
|
||||||
use App\Events\Misc\InvitationWasViewed;
|
use App\Events\Misc\InvitationWasViewed;
|
||||||
use App\Events\Payment\PaymentWasVoided;
|
use App\Events\Payment\PaymentWasVoided;
|
||||||
@ -133,6 +133,7 @@ use App\Listeners\User\UpdateUserLastLogin;
|
|||||||
use App\Events\Document\DocumentWasArchived;
|
use App\Events\Document\DocumentWasArchived;
|
||||||
use App\Events\Document\DocumentWasRestored;
|
use App\Events\Document\DocumentWasRestored;
|
||||||
use App\Events\Invoice\InvoiceWasMarkedSent;
|
use App\Events\Invoice\InvoiceWasMarkedSent;
|
||||||
|
use App\Events\Vendor\VendorContactLoggedIn;
|
||||||
use App\Listeners\Quote\QuoteViewedActivity;
|
use App\Listeners\Quote\QuoteViewedActivity;
|
||||||
use App\Listeners\User\ArchivedUserActivity;
|
use App\Listeners\User\ArchivedUserActivity;
|
||||||
use App\Listeners\User\RestoredUserActivity;
|
use App\Listeners\User\RestoredUserActivity;
|
||||||
@ -220,6 +221,7 @@ use App\Listeners\Invoice\InvoiceEmailFailedActivity;
|
|||||||
use App\Events\PurchaseOrder\PurchaseOrderWasAccepted;
|
use App\Events\PurchaseOrder\PurchaseOrderWasAccepted;
|
||||||
use App\Events\PurchaseOrder\PurchaseOrderWasArchived;
|
use App\Events\PurchaseOrder\PurchaseOrderWasArchived;
|
||||||
use App\Events\PurchaseOrder\PurchaseOrderWasRestored;
|
use App\Events\PurchaseOrder\PurchaseOrderWasRestored;
|
||||||
|
use App\Listeners\Vendor\UpdateVendorContactLastLogin;
|
||||||
use App\Events\RecurringQuote\RecurringQuoteWasCreated;
|
use App\Events\RecurringQuote\RecurringQuoteWasCreated;
|
||||||
use App\Events\RecurringQuote\RecurringQuoteWasDeleted;
|
use App\Events\RecurringQuote\RecurringQuoteWasDeleted;
|
||||||
use App\Events\RecurringQuote\RecurringQuoteWasUpdated;
|
use App\Events\RecurringQuote\RecurringQuoteWasUpdated;
|
||||||
@ -615,6 +617,9 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
VendorWasUpdated::class => [
|
VendorWasUpdated::class => [
|
||||||
VendorUpdatedActivity::class,
|
VendorUpdatedActivity::class,
|
||||||
],
|
],
|
||||||
|
VendorContactLoggedIn::class => [
|
||||||
|
UpdateVendorContactLastLogin::class,
|
||||||
|
],
|
||||||
\SocialiteProviders\Manager\SocialiteWasCalled::class => [
|
\SocialiteProviders\Manager\SocialiteWasCalled::class => [
|
||||||
// ... Manager won't register drivers that are not added to this listener.
|
// ... Manager won't register drivers that are not added to this listener.
|
||||||
\SocialiteProviders\Apple\AppleExtendSocialite::class.'@handle',
|
\SocialiteProviders\Apple\AppleExtendSocialite::class.'@handle',
|
||||||
|
@ -44,6 +44,7 @@ class VendorContactTransformer extends EntityTransformer
|
|||||||
'custom_value3' => $vendor->custom_value3 ?: '',
|
'custom_value3' => $vendor->custom_value3 ?: '',
|
||||||
'custom_value4' => $vendor->custom_value4 ?: '',
|
'custom_value4' => $vendor->custom_value4 ?: '',
|
||||||
'link' => $vendor->getLoginLink(),
|
'link' => $vendor->getLoginLink(),
|
||||||
|
'last_login' => 'timestamp',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,13 +11,15 @@
|
|||||||
|
|
||||||
namespace Tests\Feature;
|
namespace Tests\Feature;
|
||||||
|
|
||||||
|
use Tests\TestCase;
|
||||||
|
use App\Utils\Ninja;
|
||||||
|
use Tests\MockAccountData;
|
||||||
use App\Utils\Traits\MakesHash;
|
use App\Utils\Traits\MakesHash;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
|
||||||
use Illuminate\Support\Facades\Session;
|
use Illuminate\Support\Facades\Session;
|
||||||
|
use App\Events\Vendor\VendorContactLoggedIn;
|
||||||
use Illuminate\Validation\ValidationException;
|
use Illuminate\Validation\ValidationException;
|
||||||
use Tests\MockAccountData;
|
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||||
use Tests\TestCase;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @test
|
* @test
|
||||||
@ -44,6 +46,34 @@ class VendorApiTest extends TestCase
|
|||||||
Model::reguard();
|
Model::reguard();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testVendorLoggedInEvents()
|
||||||
|
{
|
||||||
|
$v = \App\Models\Vendor::factory()->create([
|
||||||
|
'user_id' => $this->user->id,
|
||||||
|
'company_id' => $this->company->id
|
||||||
|
]);
|
||||||
|
|
||||||
|
$vc = \App\Models\VendorContact::factory()->create([
|
||||||
|
'user_id' => $this->user->id,
|
||||||
|
'company_id' => $this->company->id,
|
||||||
|
'vendor_id' => $v->id
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertNull($v->last_login);
|
||||||
|
$this->assertNull($vc->last_login);
|
||||||
|
|
||||||
|
event(new VendorContactLoggedIn($vc, $this->company, Ninja::eventVars()));
|
||||||
|
|
||||||
|
$this->expectsEvents([VendorContactLoggedIn::class]);
|
||||||
|
|
||||||
|
// $vc->fresh();
|
||||||
|
// $v->fresh();
|
||||||
|
|
||||||
|
// $this->assertNotNull($vc->fresh()->last_login);
|
||||||
|
// $this->assertNotNull($v->fresh()->last_login);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public function testVendorLocale()
|
public function testVendorLocale()
|
||||||
{
|
{
|
||||||
$v = \App\Models\Vendor::factory()->create([
|
$v = \App\Models\Vendor::factory()->create([
|
||||||
|
Loading…
x
Reference in New Issue
Block a user