msgraph-sdk-java icon indicating copy to clipboard operation
msgraph-sdk-java copied to clipboard

expand of appRoleAssignments on user get call yields no results

Open kdejaeger opened this issue 1 year ago • 2 comments

Describe the bug

I was trying to get a user together with it's appRoleAssignments in one call. The documentation is pointing out that the expand feature for appRoleAssignments is supported. But it doesn't work.

Expected behavior

I would expect the expand to return results.

How to reproduce

            User user = graphClient.usersWithUserPrincipalName(username).get(
                rc -> {
                    rc.queryParameters.select = new String[]{"id", "userPrincipalName", "displayName", "givenName", "surname", "accountEnabled"};
                    rc.queryParameters.expand = new String[]{"appRoleAssignments"};
                }
            );

or

graphClient.users().byUserId(username).get(
                rc -> {
                    rc.queryParameters.select = new String[]{"id", "userPrincipalName", "displayName", "givenName", "surname", "accountEnabled"};
                    rc.queryParameters.expand = new String[]{"appRoleAssignments"};
                }
            );

SDK Version

6.22.0

Latest version known to work for scenario above?

No response

Known Workarounds

For now I have to write this code to get it done:

            var user = graphClient.usersWithUserPrincipalName(username).get(
                rc -> rc.queryParameters.select = new String[]{"id", "userPrincipalName", "displayName", "givenName", "surname", "accountEnabled"}
            );
            user.setAppRoleAssignments(getAllAppRoleAssignments(user.getId())); // an 'expand' of appRoleAssignments in the above call gave an empty array :| ...
            return user;

    private List<AppRoleAssignment> getAllAppRoleAssignments(String userId) {
        var result = new ArrayList<AppRoleAssignment>();
        var page = graphClient.users().byUserId(userId).appRoleAssignments().get();
        while (page != null) {
            result.addAll(Optional.ofNullable(page.getValue()).orElse(emptyList()));
            var odataNextLink = page.getOdataNextLink();
            if (StringUtils.isBlank(odataNextLink)) {
                break;
            } else {
                page = graphClient.users().byUserId(userId).appRoleAssignments().withUrl(odataNextLink).get();
            }
        }
        return result;
    }

Debug output

Click to expand log ```
</details>


### Configuration

_No response_

### Other information

_No response_

kdejaeger avatar Dec 02 '24 17:12 kdejaeger

Hi @kdejaeger appRoleAssignments is not a property of a User therefore an expand won't work. Please direct me to docs that point to an $expand being possible.

Getting appRole assignments is a separate API

Ndiritu avatar Dec 17 '24 18:12 Ndiritu

It's more in the relationship section https://learn.microsoft.com/en-us/graph/api/resources/user?view=graph-rest-1.0#relationships . It litterally sais: " Represents the app roles a user is granted for an application. Supports $expand."

And in the documentation it suggests? expand works for properties and relationships: https://learn.microsoft.com/en-us/graph/query-parameters?tabs=http#expand-parameter

kdejaeger avatar Dec 20 '24 14:12 kdejaeger