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
$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();
->first()
?? Role::where('academy_id', $academy->id)
->where('slug', 'academy_owner')
->first();
if ($ownerRole) {
$admin->update(['role_id' => $ownerRole->id, 'is_super_admin' => true]);
if (!$admin->roles()->where('role_id', $ownerRole->id)->exists()) {
$admin->roles()->attach($ownerRole->id);
}
} else {
$admin->update(['is_super_admin' => true]);
}
}
}
......@@ -30,45 +30,47 @@ 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;
}
// For wildcard roles, assign ALL permissions with specified scope
if ($permMap === '*') {
$permIds = DB::table('permissions')->pluck('id', 'name')->toArray();
$inserts = [];
foreach ($permIds as $name => $pid) {
$inserts[] = [
'role_id' => $role->id,
'permission_id' => $pid,
'scope' => 'all',
'created_at' => $now,
];
}
} else {
$allPermIds = DB::table('permissions')->pluck('id', 'name')->toArray();
$inserts = [];
foreach ($permMap as $permName => $scope) {
if (!isset($allPermIds[$permName])) {
continue;
foreach ($roles as $role) {
// For wildcard roles, assign ALL permissions with specified scope
if ($permMap === '*') {
$permIds = DB::table('permissions')->pluck('id', 'name')->toArray();
$inserts = [];
foreach ($permIds as $name => $pid) {
$inserts[] = [
'role_id' => $role->id,
'permission_id' => $pid,
'scope' => 'all',
'created_at' => $now,
];
}
} else {
$allPermIds = DB::table('permissions')->pluck('id', 'name')->toArray();
$inserts = [];
foreach ($permMap as $permName => $scope) {
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();
foreach (array_chunk($inserts, 100) as $chunk) {
DB::table('permission_role')->insert($chunk);
DB::table('permission_role')->where('role_id', $role->id)->delete();
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,11 +11,13 @@ class RolesAndPermissionsSeeder extends Seeder
{
public function run(): void
{
$academy = Academy::where('slug', 'el-captain')->firstOrFail();
$this->seedPermissions();
$this->seedRoles($academy);
$this->assignPermissions($academy);
$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