Skip to content

Commit 9b0aa5b

Browse files
author
Miguel Angel
committed
feat: add user session model and listener
1 parent 501cc80 commit 9b0aa5b

8 files changed

Lines changed: 302 additions & 1 deletion

File tree

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
namespace ProcessMaker\Listeners;
4+
5+
use Illuminate\Contracts\Queue\ShouldQueue;
6+
use Illuminate\Queue\InteractsWithQueue;
7+
use ProcessMaker\Models\UserSession as Session;
8+
use Illuminate\Support\Str;
9+
use Jenssegers\Agent\Agent;
10+
11+
class UserSession
12+
{
13+
/**
14+
* Create the event listener.
15+
*/
16+
public function __construct()
17+
{
18+
//
19+
}
20+
21+
/**
22+
* Handle the event.
23+
*/
24+
public function handle(object $event): void
25+
{
26+
$agent = new Agent();
27+
28+
$session = new Session();
29+
$session->user_id = $event->user->id;
30+
$session->user_agent = request()->userAgent();
31+
$session->ip_address = request()->getClientIp() ?? request()->ip();
32+
$session->device_name = $agent->device();
33+
$session->device_type = $agent->deviceType();
34+
$session->device_platform = $agent->platform();
35+
$session->device_browser = $agent->browser();
36+
$session->token = Str::uuid()->toString();
37+
$session->save();
38+
39+
session(['user_session' => $session->token]);
40+
}
41+
}

‎ProcessMaker/Models/User.php‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Illuminate\Container\Container;
66
use Illuminate\Database\Eloquent\Factories\HasFactory;
7+
use Illuminate\Database\Eloquent\Relations\HasOne;
78
use Illuminate\Database\Eloquent\SoftDeletes;
89
use Illuminate\Foundation\Auth\User as Authenticatable;
910
use Illuminate\Notifications\Notifiable;
@@ -512,4 +513,9 @@ public function removeOldRunScriptTokens()
512513
->where('created_at', '<', now()->subWeek())
513514
->delete();
514515
}
516+
517+
public function session(): HasOne
518+
{
519+
return $this->hasOne(UserSession::class);
520+
}
515521
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace ProcessMaker\Models;
4+
5+
use Illuminate\Database\Eloquent\Factories\HasFactory;
6+
use ProcessMaker\Models\ProcessMakerModel;
7+
8+
class UserSession extends ProcessMakerModel
9+
{
10+
use HasFactory;
11+
12+
public function user()
13+
{
14+
return $this->belongsTo(User::class);
15+
}
16+
}

‎ProcessMaker/Providers/EventServiceProvider.php‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ class EventServiceProvider extends ServiceProvider
7676
'Illuminate\Auth\Events\Login' => [
7777
'ProcessMaker\Listeners\LoginListener',
7878
'ProcessMaker\Listeners\SecurityLogger',
79+
'ProcessMaker\Listeners\UserSession',
7980
],
8081
'Illuminate\Auth\Events\Logout' => [
8182
'ProcessMaker\Listeners\SecurityLogger',

‎composer.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"google/apiclient": "^2.12",
2121
"guzzlehttp/guzzle": "^7.4",
2222
"igaster/laravel-theme": "2.0.*",
23+
"jenssegers/agent": "^2.6",
2324
"laravel/framework": "^10.19",
2425
"laravel/horizon": "^5.12",
2526
"laravel/passport": "^11.5",

‎composer.lock‎

Lines changed: 198 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎config/app.php‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@
158158
Laravel\Scout\ScoutServiceProvider::class,
159159
Collective\Html\HtmlServiceProvider::class,
160160
TeamTNT\Scout\TNTSearchScoutServiceProvider::class,
161+
Jenssegers\Agent\AgentServiceProvider::class,
161162

162163
/**
163164
* ProcessMaker Service Providers
@@ -189,6 +190,7 @@
189190
'SkinManager' => ProcessMaker\Facades\SkinManager::class,
190191
'Theme' => Igaster\LaravelTheme\Facades\Theme::class,
191192
'WorkspaceManager' => ProcessMaker\Facades\WorkspaceManager::class,
193+
'Agent' => Jenssegers\Agent\Facades\Agent::class,
192194
])->toArray(),
193195

194196
'debug_blacklist' => [
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*/
12+
public function up(): void
13+
{
14+
Schema::create('user_sessions', function (Blueprint $table) {
15+
$table->increments('id');
16+
$table->unsignedInteger('user_id');
17+
$table->string('user_agent');
18+
$table->ipAddress('ip_address');
19+
$table->string('device_name', 30);
20+
$table->string('device_type', 30);
21+
$table->string('device_platform', 30);
22+
$table->string('device_browser', 30);
23+
$table->string('token');
24+
$table->timestamps();
25+
26+
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
27+
});
28+
}
29+
30+
/**
31+
* Reverse the migrations.
32+
*/
33+
public function down(): void
34+
{
35+
Schema::dropIfExists('user_sessions');
36+
}
37+
};

0 commit comments

Comments
 (0)