- $allowedByRoleId = $currentEntity->permissions()
- ->whereIn('role_id', [0, ...$userRoleIds])
- ->pluck($action, 'role_id');
+ $relevantPermissions = $currentEntity->permissions()
+ ->where(function (Builder $query) use ($userRoleIds) {
+ $query->whereIn('role_id', $userRoleIds)
+ ->orWhere(function (Builder $query) {
+ $query->whereNull(['role_id', 'user_id']);
+ });
+ })
+ ->get(['role_id', 'user_id', $action])
+ ->all();
+
+ // TODO - Update below for user permissions
+
+ // 1. Default fallback set and allows, no role permissions -> True
+ // 2. Default fallback set and prevents, no role permissions -> False
+ // 3. Role permission allows, fallback set and allows -> True
+ // 3. Role permission allows, fallback set and prevents -> True
+ // 3. Role permission allows, fallback not set -> True
+ // 3. Role permission prevents, fallback set and allows -> False
+ // 3. Role permission prevents, fallback set and prevents -> False
+ // 3. Role permission prevents, fallback not set -> False
+ // 4. Nothing exists -> Continue
+
+ // If the default is set, we have to return something here.
+ $allowedById = [];
+ foreach ($relevantPermissions as $permission) {
+ $allowedById[$permission->role_id . ':' . $permission->user_id] = $permission->$action;
+ }