mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-03 21:47:32 -05: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