@@ -30,18 +30,10 @@ trait UsesRoles
3030 */
3131 public function assign ($ role ): bool
3232 {
33- if (!array_key_exists ($ role , Config::get ('roles ' ))) {
34- return false ;
35- }
36-
37- if (in_array ($ role , $ this ->roles )) {
38- return true ;
39- }
33+ $ this ->setRolesAndPermissions ($ role );
4034
4135 $ roleKey = Config::get ('roles.key ' );
4236
43- $ this ->setRolesAndPermissions ($ role );
44-
4537 if (!($ this ->data [$ roleKey ] ?? null )) {
4638 $ this ->db ->query ("ALTER TABLE users ADD COLUMN $ roleKey TEXT NOT NULL DEFAULT '[]' " )->execute ();
4739 }
@@ -134,10 +126,7 @@ public function unassign($role): void
134126 is_array ($ role ) ? $ role : [$ role ]
135127 );
136128
137- $ this ->permissions = array_diff (
138- $ this ->permissions ,
139- $ this ->getRolePermissions ($ role )
140- );
129+ $ this ->permissions = $ this ->getRolePermissions ($ this ->roles );
141130
142131 $ this ->db
143132 ->update ('users ' )
@@ -151,18 +140,27 @@ public function unassign($role): void
151140 /**
152141 * Set the roles and permissions for a user
153142 *
154- * @param string|array $role The role(s) to set
143+ * @param string|array $roles The role(s) to set
155144 */
156- protected function setRolesAndPermissions ($ role ): void
145+ protected function setRolesAndPermissions ($ roles ): void
157146 {
158- $ this ->roles = array_merge (
159- $ this ->roles ,
160- is_array ($ role ) ? $ role : [$ role ]
161- );
147+ if (is_string ($ roles )) {
148+ $ roles = [$ roles ];
149+ }
150+
151+ foreach ($ roles as $ role ) {
152+ if (!array_key_exists ($ role , Config::get ('roles ' ))) {
153+ continue ;
154+ }
162155
163- foreach ($ this ->roles as $ role ) {
164- $ this ->permissions = array_merge ($ this ->permissions , $ this ->getRolePermissions ($ role ));
156+ if (in_array ($ role , $ this ->roles )) {
157+ continue ;
158+ }
159+
160+ $ this ->roles [] = $ role ;
165161 }
162+
163+ $ this ->permissions = $ this ->getRolePermissions ($ this ->roles );
166164 }
167165
168166 /**
@@ -171,14 +169,20 @@ protected function setRolesAndPermissions($role): void
171169 * @param string|array $role
172170 * @return array
173171 */
174- protected function getRolePermissions ($ role ): array
172+ protected function getRolePermissions ($ roles ): array
175173 {
176- if (is_string ($ role )) {
177- return Config::get ('roles ' )[$ role ] ?? [];
174+ $ allRoles = Config::get ('roles ' );
175+
176+ if (is_string ($ roles )) {
177+ return $ allRoles [$ roles ] ?? [];
178178 }
179179
180- return array_reduce ($ role , function ($ acc , $ role ) {
181- return array_merge ($ acc , Config::get ('roles ' )[$ role ] ?? []);
182- }, []);
180+ return array_values (array_unique (array_reduce ($ roles , function ($ carry , $ role ) use ($ allRoles ) {
181+ if (isset ($ allRoles [$ role ])) {
182+ $ carry = array_merge ($ carry , $ allRoles [$ role ]); // Merge permissions for the selected role
183+ }
184+
185+ return $ carry ;
186+ }, [])));
183187 }
184188}
0 commit comments