new modules

This commit is contained in:
Mark Gregory
2026-07-24 09:25:27 +01:00
parent d7d2a3f610
commit 73f7a918c1
88 changed files with 2342 additions and 1 deletions
+6
View File
@@ -0,0 +1,6 @@
<?php
return [
'name' => 'Roles',
'enabled' => true,
];
@@ -0,0 +1,119 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
$tableNames = config('permission.table_names');
$columnNames = config('permission.column_names');
$pivotRole = $columnNames['role_pivot_key'] ?? 'role_id';
$pivotPermission = $columnNames['permission_pivot_key'] ?? 'permission_id';
$modelMorphKey = $columnNames['model_morph_key'] ?? 'model_id';
throw_if(
empty($tableNames),
RuntimeException::class,
'The Spatie permission configuration could not be loaded.'
);
Schema::create($tableNames['permissions'], function (Blueprint $table): void {
$table->id();
$table->string('name');
$table->string('guard_name');
$table->timestamps();
$table->unique(['name', 'guard_name']);
});
Schema::create($tableNames['roles'], function (Blueprint $table): void {
$table->id();
$table->string('name');
$table->string('guard_name');
$table->timestamps();
$table->unique(['name', 'guard_name']);
});
Schema::create($tableNames['model_has_permissions'], function (Blueprint $table) use (
$tableNames,
$pivotPermission,
$modelMorphKey
): void {
$table->unsignedBigInteger($pivotPermission);
$table->string('model_type');
$table->unsignedBigInteger($modelMorphKey);
$table->index([$modelMorphKey, 'model_type'], 'model_has_permissions_model_id_model_type_index');
$table->foreign($pivotPermission)
->references('id')
->on($tableNames['permissions'])
->cascadeOnDelete();
$table->primary(
[$pivotPermission, $modelMorphKey, 'model_type'],
'model_has_permissions_permission_model_type_primary'
);
});
Schema::create($tableNames['model_has_roles'], function (Blueprint $table) use (
$tableNames,
$pivotRole,
$modelMorphKey
): void {
$table->unsignedBigInteger($pivotRole);
$table->string('model_type');
$table->unsignedBigInteger($modelMorphKey);
$table->index([$modelMorphKey, 'model_type'], 'model_has_roles_model_id_model_type_index');
$table->foreign($pivotRole)
->references('id')
->on($tableNames['roles'])
->cascadeOnDelete();
$table->primary(
[$pivotRole, $modelMorphKey, 'model_type'],
'model_has_roles_role_model_type_primary'
);
});
Schema::create($tableNames['role_has_permissions'], function (Blueprint $table) use (
$tableNames,
$pivotRole,
$pivotPermission
): void {
$table->unsignedBigInteger($pivotPermission);
$table->unsignedBigInteger($pivotRole);
$table->foreign($pivotPermission)
->references('id')
->on($tableNames['permissions'])
->cascadeOnDelete();
$table->foreign($pivotRole)
->references('id')
->on($tableNames['roles'])
->cascadeOnDelete();
$table->primary([$pivotPermission, $pivotRole], 'role_has_permissions_permission_id_role_id_primary');
});
app('cache')->store(config('permission.cache.store') === 'default'
? null
: config('permission.cache.store'))
->forget(config('permission.cache.key'));
}
public function down(): void
{
$tableNames = config('permission.table_names');
Schema::dropIfExists($tableNames['role_has_permissions']);
Schema::dropIfExists($tableNames['model_has_roles']);
Schema::dropIfExists($tableNames['model_has_permissions']);
Schema::dropIfExists($tableNames['roles']);
Schema::dropIfExists($tableNames['permissions']);
}
};
@@ -0,0 +1,44 @@
<?php
namespace Modules\Roles\Database\Seeders;
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
use Spatie\Permission\PermissionRegistrar;
final class RolePermissionSeeder extends Seeder
{
public function run(): void
{
$registrar = app(PermissionRegistrar::class);
$registrar->forgetCachedPermissions();
$permissions = [
'administration.access',
'users.view',
'users.create',
'users.update',
'users.delete',
'roles.manage',
'settings.manage',
'audit.view',
'media.view',
'media.upload',
'media.update',
'media.delete',
'seo.manage',
'search.manage',
'themes.manage',
];
foreach ($permissions as $permission) {
Permission::findOrCreate($permission, 'web');
}
$administrator = Role::findOrCreate('admin', 'web');
$administrator->syncPermissions($permissions);
$registrar->forgetCachedPermissions();
}
}
@@ -0,0 +1,21 @@
<?php
namespace Modules\Roles\Providers;
use Illuminate\Support\ServiceProvider;
use Modules\Roles\Support\ModuleInfo;
final class RolesServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->register(RouteServiceProvider::class);
$this->mergeConfigFrom(module_path(ModuleInfo::name(), 'Config/config.php'), ModuleInfo::nameLower());
}
public function boot(): void
{
$this->loadMigrationsFrom(module_path(ModuleInfo::name(), 'Database/Migrations'));
$this->loadViewsFrom(module_path(ModuleInfo::name(), 'Resources/views'), ModuleInfo::nameLower());
}
}
@@ -0,0 +1,17 @@
<?php
namespace Modules\Roles\Providers;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;
final class RouteServiceProvider extends ServiceProvider
{
public function boot(): void
{
parent::boot();
$this->routes(function (): void {
Route::middleware('web')->group(module_path('Roles', 'Routes/web.php'));
});
}
}
+5
View File
@@ -0,0 +1,5 @@
<?php
use Illuminate\Support\Facades\Route;
// Module routes are intentionally registered by each feature as it is enabled.
+9
View File
@@ -0,0 +1,9 @@
<?php
namespace Modules\Roles\Support;
final class ModuleInfo
{
public static function name(): string { return 'Roles'; }
public static function nameLower(): string { return 'roles'; }
}
@@ -0,0 +1,5 @@
<?php
it('boots the Roles module', function (): void {
expect(config('roles.name'))->toBe('Roles');
});
+10
View File
@@ -0,0 +1,10 @@
{
"name": "absdev/roles-module",
"description": "Roles foundation module for the ABSDEV Laravel application platform.",
"type": "laravel-module",
"autoload": {
"psr-4": {
"Modules\\Roles\\": ""
}
}
}
+20
View File
@@ -0,0 +1,20 @@
{
"name": "Roles",
"alias": "roles",
"version": "1.0.0",
"description": "Roles foundation module for the ABSDEV Laravel application platform.",
"keywords": [
"laravel",
"modules",
"roles"
],
"priority": 10,
"providers": [
"Modules\\Roles\\Providers\\RolesServiceProvider"
],
"aliases": {},
"files": [],
"requires": [
"Core"
]
}