@@ -3,6 +3,7 @@ package evo
33import (
44 "errors"
55 "fmt"
6+
67 "github.com/getevo/evo/lib/log"
78 "github.com/getevo/evo/lib/validate"
89 "gorm.io/gorm"
@@ -12,22 +13,42 @@ var memoryRolePermissions = cMap{}
1213
1314func updateRolePermissions () {
1415 memoryRolePermissions .Init ()
16+
17+ // Load all roles at once
1518 var roles []Role
1619 db .Find (& roles )
20+
21+ // Load all role permissions at once
22+ var rolePerms []RolePermission
23+ db .Find (& rolePerms )
24+
25+ // Load all permissions at once
26+ var permissions []Permission
27+ db .Find (& permissions )
28+
29+ // Create maps for quick lookup
30+ rolePermMap := make (map [uint ][]RolePermission )
31+ for _ , rp := range rolePerms {
32+ rolePermMap [rp .RoleID ] = append (rolePermMap [rp .RoleID ], rp )
33+ }
34+
35+ permissionMap := make (map [uint ]Permission )
36+ for _ , perm := range permissions {
37+ permissionMap [perm .ID ] = perm
38+ }
39+
40+ // Process roles and their permissions
1741 for _ , role := range roles {
18- var rolePerms []RolePermission
19- db .Where ("role_id = ?" , role .ID ).Find (& rolePerms )
20- var permissions Permissions
21- for _ , perm := range rolePerms {
22- var p Permission
23- if errors .Is (db .Where ("id = ?" , perm .PermissionID ).Take (& p ).Error , gorm .ErrRecordNotFound ) {
24- log .Warning ("Roles: found inconsistency, automatically remove permission id %d to fix." , perm .PermissionID )
25- db .Delete (RolePermission {}, "id = ?" , perm .PermissionID )
42+ var perms Permissions
43+ for _ , rp := range rolePermMap [role .ID ] {
44+ if perm , exists := permissionMap [rp .PermissionID ]; exists {
45+ perms = append (perms , perm )
2646 } else {
27- permissions = append (permissions , p )
47+ log .Warning ("Roles: found inconsistency, automatically remove permission id %d to fix." , rp .PermissionID )
48+ db .Delete (& RolePermission {}, "id = ?" , rp .ID )
2849 }
2950 }
30- memoryRolePermissions .Set (role .ID , & permissions )
51+ memoryRolePermissions .Set (role .ID , & perms )
3152 }
3253}
3354
0 commit comments