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,8 +51,11 @@ public function run(): void ...@@ -51,8 +51,11 @@ 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')
->first()
?? Role::where('academy_id', $academy->id)
->where('slug', 'academy_owner') ->where('slug', 'academy_owner')
->first(); ->first();
...@@ -61,6 +64,8 @@ public function run(): void ...@@ -61,6 +64,8 @@ public function run(): void
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,11 +30,12 @@ public function run(): void ...@@ -30,11 +30,12 @@ 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;
} }
foreach ($roles as $role) {
// For wildcard roles, assign ALL permissions with specified scope // For wildcard roles, assign ALL permissions with specified scope
if ($permMap === '*') { if ($permMap === '*') {
$permIds = DB::table('permissions')->pluck('id', 'name')->toArray(); $permIds = DB::table('permissions')->pluck('id', 'name')->toArray();
...@@ -67,8 +68,9 @@ public function run(): void ...@@ -67,8 +68,9 @@ public function run(): void
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,12 +11,14 @@ class RolesAndPermissionsSeeder extends Seeder ...@@ -11,12 +11,14 @@ class RolesAndPermissionsSeeder extends Seeder
{ {
public function run(): void public function run(): void
{ {
$academy = Academy::where('slug', 'el-captain')->firstOrFail();
$this->seedPermissions(); $this->seedPermissions();
$academies = Academy::all();
foreach ($academies as $academy) {
$this->seedRoles($academy); $this->seedRoles($academy);
$this->assignPermissions($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