From 495c0ea2d8c77604a714ba80dc43a2a1923f65e1 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 19 May 2026 07:16:17 +0000 Subject: [PATCH] Feat: add app roles management and relationships - Added `app_roles` migration to manage role assignments for connected apps, supporting role duration and indexing. - Introduced `AppRole` pivot model for managing `ConnectedApp` and `Role` relationships. - Updated `ConnectedApp` and `Role` models with `BelongsToMany` relationships for role associations. - Adjusted `permission` config to use custom `Role` model. --- app/Models/AppRole.php | 39 +++++++++++++++++++ app/Models/ConnectedApp.php | 15 ++++++- app/Models/Role.php | 23 +++++++++++ config/permission.php | 3 +- .../2026_05_18_113635_app_roles.php | 33 ++++++++++++++++ 5 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 app/Models/AppRole.php create mode 100644 app/Models/Role.php create mode 100644 database/migrations/2026_05_18_113635_app_roles.php diff --git a/app/Models/AppRole.php b/app/Models/AppRole.php new file mode 100644 index 0000000..4c2708e --- /dev/null +++ b/app/Models/AppRole.php @@ -0,0 +1,39 @@ + + */ + public function app(): BelongsTo + { + return $this->belongsTo(ConnectedApp::class, 'app_id'); + } + + /** + * @return BelongsTo + */ + public function role(): BelongsTo + { + return $this->belongsTo(Role::class, 'role_id'); + } +} diff --git a/app/Models/ConnectedApp.php b/app/Models/ConnectedApp.php index 96ccfc3..70b633c 100644 --- a/app/Models/ConnectedApp.php +++ b/app/Models/ConnectedApp.php @@ -5,7 +5,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Attributes\Fillable; -use Illuminate\Database\Eloquent\{Model, Relations\BelongsTo, SoftDeletes}; +use Illuminate\Database\Eloquent\{Model, Relations\BelongsTo, Relations\BelongsToMany, SoftDeletes}; use Illuminate\Database\Eloquent\Relations\HasOne; use Spatie\Activitylog\Models\Concerns\LogsActivity; use Spatie\Activitylog\Support\LogOptions; @@ -13,6 +13,7 @@ /** * @property int $id * @property string $name + * @property AppRole $pivot */ #[Fillable([ 'name', @@ -60,4 +61,16 @@ public function getActivitylogOptions(): LogOptions string $eventName ) => ":causer.name {$eventName} connected app ':subject.name'"); } + + public function roles(): BelongsToMany + { + return $this->belongsToMany( + Role::class, + 'app_roles', + 'app_id', + 'role_id', + ) + ->using(AppRole::class) + ->withPivot('duration'); + } } diff --git a/app/Models/Role.php b/app/Models/Role.php new file mode 100644 index 0000000..aa3555f --- /dev/null +++ b/app/Models/Role.php @@ -0,0 +1,23 @@ +belongsToMany( + ConnectedApp::class, + 'app_roles', + 'role_id', + 'app_id' + ) + ->using(AppRole::class) + ->withPivot('id', 'duration'); + } +} diff --git a/config/permission.php b/config/permission.php index e1fddc5..d08cef3 100644 --- a/config/permission.php +++ b/config/permission.php @@ -2,8 +2,9 @@ declare(strict_types=1); +use app\Models\Role; use Spatie\Permission\DefaultTeamResolver; -use Spatie\Permission\Models\{Permission, Role}; +use Spatie\Permission\Models\Permission; return [ diff --git a/database/migrations/2026_05_18_113635_app_roles.php b/database/migrations/2026_05_18_113635_app_roles.php new file mode 100644 index 0000000..d3048e0 --- /dev/null +++ b/database/migrations/2026_05_18_113635_app_roles.php @@ -0,0 +1,33 @@ +id(); + $table->foreignIdFor(ConnectedApp::class, 'app_id'); + $table->foreignId('role_id')->comment('role_id from spatie roles table'); + $table->integer('duration')->comment('in days'); + $table->index(['app_id', 'role_id']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('app_roles'); + } +};