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'); + } +};