Commit 4cecc6ef authored by Mahmoud Aglan's avatar Mahmoud Aglan

Fix seeders: support multiple academies, ensure admin gets permissions

- RolesAndPermissionsSeeder: seed roles for ALL academies (not just hardcoded 'el-captain' slug)
- PermissionSeeder: assign permissions to all role instances per slug (across academies)
- DatabaseSeeder: look for owner role in user's academy first, always set is_super_admin

Root cause: wizard-created academy had different slug than seeder expected, so roles/permissions
were never created for it, leaving the admin user with no permissions (403 on dashboard).
Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent 3f3e7b24
...@@ -51,16 +51,21 @@ public function run(): void ...@@ -51,16 +51,21 @@ public function run(): void
$this->call(PermissionSeeder::class); // Authoritative permission+scope assignments $this->call(PermissionSeeder::class); // Authoritative permission+scope assignments
$this->call(PaymentNotificationTemplateSeeder::class); $this->call(PaymentNotificationTemplateSeeder::class);
// Assign academy_owner role to the admin user // Assign academy_owner role to the admin user (check user's own academy first)
$ownerRole = Role::where('academy_id', $academy->id) $ownerRole = Role::where('academy_id', $admin->academy_id)
->where('slug', 'academy_owner') ->where('slug', 'academy_owner')
->first(); ->first()
?? Role::where('academy_id', $academy->id)
->where('slug', 'academy_owner')
->first();
if ($ownerRole) { if ($ownerRole) {
$admin->update(['role_id' => $ownerRole->id, 'is_super_admin' => true]); $admin->update(['role_id' => $ownerRole->id, 'is_super_admin' => true]);
if (!$admin->roles()->where('role_id', $ownerRole->id)->exists()) { if (!$admin->roles()->where('role_id', $ownerRole->id)->exists()) {
$admin->roles()->attach($ownerRole->id); $admin->roles()->attach($ownerRole->id);
} }
} else {
$admin->update(['is_super_admin' => true]);
} }
} }
} }
...@@ -30,45 +30,47 @@ public function run(): void ...@@ -30,45 +30,47 @@ public function run(): void
$rolePermissions = $this->getRolePermissions(); $rolePermissions = $this->getRolePermissions();
foreach ($rolePermissions as $roleSlug => $permMap) { foreach ($rolePermissions as $roleSlug => $permMap) {
$role = DB::table('roles')->where('slug', $roleSlug)->first(); $roles = DB::table('roles')->where('slug', $roleSlug)->get();
if (!$role) { if ($roles->isEmpty()) {
continue; continue;
} }
// For wildcard roles, assign ALL permissions with specified scope foreach ($roles as $role) {
if ($permMap === '*') { // For wildcard roles, assign ALL permissions with specified scope
$permIds = DB::table('permissions')->pluck('id', 'name')->toArray(); if ($permMap === '*') {
$inserts = []; $permIds = DB::table('permissions')->pluck('id', 'name')->toArray();
foreach ($permIds as $name => $pid) { $inserts = [];
$inserts[] = [ foreach ($permIds as $name => $pid) {
'role_id' => $role->id, $inserts[] = [
'permission_id' => $pid, 'role_id' => $role->id,
'scope' => 'all', 'permission_id' => $pid,
'created_at' => $now, 'scope' => 'all',
]; 'created_at' => $now,
} ];
} else { }
$allPermIds = DB::table('permissions')->pluck('id', 'name')->toArray(); } else {
$inserts = []; $allPermIds = DB::table('permissions')->pluck('id', 'name')->toArray();
foreach ($permMap as $permName => $scope) { $inserts = [];
if (!isset($allPermIds[$permName])) { foreach ($permMap as $permName => $scope) {
continue; if (!isset($allPermIds[$permName])) {
continue;
}
$inserts[] = [
'role_id' => $role->id,
'permission_id' => $allPermIds[$permName],
'scope' => $scope,
'created_at' => $now,
];
} }
$inserts[] = [
'role_id' => $role->id,
'permission_id' => $allPermIds[$permName],
'scope' => $scope,
'created_at' => $now,
];
} }
}
DB::table('permission_role')->where('role_id', $role->id)->delete(); DB::table('permission_role')->where('role_id', $role->id)->delete();
foreach (array_chunk($inserts, 100) as $chunk) { foreach (array_chunk($inserts, 100) as $chunk) {
DB::table('permission_role')->insert($chunk); DB::table('permission_role')->insert($chunk);
}
} }
$this->command->info(" Role '{$roleSlug}': " . count($inserts) . ' permissions assigned.'); $this->command->info("Role '{$roleSlug}': " . count($inserts) . ' permissions assigned.');
} }
} }
......
...@@ -11,11 +11,13 @@ class RolesAndPermissionsSeeder extends Seeder ...@@ -11,11 +11,13 @@ class RolesAndPermissionsSeeder extends Seeder
{ {
public function run(): void public function run(): void
{ {
$academy = Academy::where('slug', 'el-captain')->firstOrFail();
$this->seedPermissions(); $this->seedPermissions();
$this->seedRoles($academy);
$this->assignPermissions($academy); $academies = Academy::all();
foreach ($academies as $academy) {
$this->seedRoles($academy);
$this->assignPermissions($academy);
}
} }
// ─── Permissions ───────────────────────────────────────────── // ─── Permissions ─────────────────────────────────────────────
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment