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
$this->call(PermissionSeeder::class); // Authoritative permission+scope assignments
$this->call(PaymentNotificationTemplateSeeder::class);
// Assign academy_owner role to the admin user
$ownerRole = Role::where('academy_id', $academy->id)
// Assign academy_owner role to the admin user (check user's own academy first)
$ownerRole = Role::where('academy_id', $admin->academy_id)
->where('slug', 'academy_owner')
->first()
?? Role::where('academy_id', $academy->id)
->where('slug', 'academy_owner')
->first();
......@@ -61,6 +64,8 @@ public function run(): void
if (!$admin->roles()->where('role_id', $ownerRole->id)->exists()) {
$admin->roles()->attach($ownerRole->id);
}
} else {
$admin->update(['is_super_admin' => true]);
}
}
}
......@@ -30,11 +30,12 @@ public function run(): void
$rolePermissions = $this->getRolePermissions();
foreach ($rolePermissions as $roleSlug => $permMap) {
$role = DB::table('roles')->where('slug', $roleSlug)->first();
if (!$role) {
$roles = DB::table('roles')->where('slug', $roleSlug)->get();
if ($roles->isEmpty()) {
continue;
}
foreach ($roles as $role) {
// For wildcard roles, assign ALL permissions with specified scope
if ($permMap === '*') {
$permIds = DB::table('permissions')->pluck('id', 'name')->toArray();
......@@ -67,8 +68,9 @@ public function run(): void
foreach (array_chunk($inserts, 100) as $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
{
public function run(): void
{
$academy = Academy::where('slug', 'el-captain')->firstOrFail();
$this->seedPermissions();
$academies = Academy::all();
foreach ($academies as $academy) {
$this->seedRoles($academy);
$this->assignPermissions($academy);
}
}
// ─── 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