diff --git a/api.md b/api.md
index de30479..b5ebe1a 100644
--- a/api.md
+++ b/api.md
@@ -1,810 +1,810 @@
-# User Service API
-
-Table of Contents
-
- * [Query](#query)
- * [Mutation](#mutation)
- * [Objects](#objects)
- * [AccessToken](#accesstoken)
- * [ExternalUserIdWithUser](#externaluseridwithuser)
- * [Notification](#notification)
- * [PaginationInfo](#paginationinfo)
- * [PublicUserInfo](#publicuserinfo)
- * [Settings](#settings)
- * [UserInfo](#userinfo)
- * [Inputs](#inputs)
- * [DateTimeFilter](#datetimefilter)
- * [GenerateAccessTokenInput](#generateaccesstokeninput)
- * [IntFilter](#intfilter)
- * [NotificationInput](#notificationinput)
- * [Pagination](#pagination)
- * [SettingsInput](#settingsinput)
- * [StringFilter](#stringfilter)
- * [Enums](#enums)
- * [ExternalServiceProviderDto](#externalserviceproviderdto)
- * [Gamification](#gamification)
- * [GlobalUserRole](#globaluserrole)
- * [SortDirection](#sortdirection)
- * [Scalars](#scalars)
- * [Boolean](#boolean)
- * [Date](#date)
- * [DateTime](#datetime)
- * [Int](#int)
- * [LocalTime](#localtime)
- * [String](#string)
- * [Time](#time)
- * [UUID](#uuid)
- * [Url](#url)
-
-
| Field | -Argument | -Type | -Description | -
|---|---|---|---|
| findPublicUserInfos | -[PublicUserInfo]! | -- -Gets the publicly available information for a list of users with the specified IDs. -If a user does not exist, null is returned for that user. - - | -|
| ids | -[UUID!]! | -- | |
| currentUserInfo | -UserInfo! | -- -Gets the user information of the currently authorized user. - - | -|
| findUserInfos | -[UserInfo]! | -- -Gets all of the users' information for a list of users with the specified IDs. -Only available to privileged users. -If a user does not exist, null is returned for that user. - - | -|
| ids | -[UUID!]! | -- | |
| isAccessTokenAvailable | -Boolean! | -- -Checks whether an access token for a given third-party provider exists and is still valid for the currently authenticated user. -Returns `true` if: -- The access token exists and is not expired, OR -- The refresh token exists and is not expired. - - | -|
| provider | -ExternalServiceProviderDto! | -- | |
| _internal_noauth_getAccessToken | -AccessToken! | -- -Retrieves the access token of the specified user for a specified third-party provider. - -- If the access token is expired but a valid refresh token is available, the system will attempt to generate a new access token. -- Throws an exception if neither a valid access token nor a valid refresh token is available. - -⚠️ This query is **only accessible internally**. ⚠️ - - | -|
| userId | -UUID! | -- | |
| provider | -ExternalServiceProviderDto! | -- | |
| _internal_noauth_getExternalUserIds | -[ExternalUserIdWithUser!]! | -- -Retrieves the external user IDs for a list of users with the specified IDs. -If a user does not exist, null is returned for that user. -If the user does not have an external user ID for the specified provider, null is returned for that user. -⚠️ This query is **only accessible internally** and the caller must be at least a tutor of a course. The permission must be validated by the caller method. ⚠️ - - | -|
| userIds | -[UUID!]! | -- | |
| provider | -ExternalServiceProviderDto | -- | |
| findUserSettings | -Settings! | -- | |
| userId | -UUID | -- | |
| findUsersSettings | -[Settings]! | -- | |
| usersIds | -[UUID]! | -- | |
| Field | -Argument | -Type | -Description | -
|---|---|---|---|
| generateAccessToken | -Boolean! | -- -Generates an access token for the given provider using an authorization code obtained from the OAuth flow. -This should be called **only after** the user completes authorization and the frontend retrieves the auth code. -After the access token is generated, the user is redirected to the redirect URI. - - | -|
| input | -GenerateAccessTokenInput! | -- | |
| updateSettings | -Settings! | -- | |
| userId | -UUID! | -- | |
| input | -SettingsInput! | -- | |
| defaultSettings | -Settings! | -- | |
| userId | -UUID! | -- | |
| Field | -Argument | -Type | -Description | -
|---|---|---|---|
| accessToken | -String! | -- | |
| externalUserId | -String | -- | |
| Field | -Argument | -Type | -Description | -
|---|---|---|---|
| userId | -UUID! | -- | |
| externalUserId | -String! | -- | |
| Field | -Argument | -Type | -Description | -
|---|---|---|---|
| gamification | -Boolean | -- | |
| lecture | -Boolean | -- | |
| Field | -Argument | -Type | -Description | -
|---|---|---|---|
| page | -Int! | -- -The current page number. - - | -|
| size | -Int! | -- -The number of elements per page. - - | -|
| totalElements | -Int! | -- -The total number of elements across all pages. - - | -|
| totalPages | -Int! | -- -The total number of pages. - - | -|
| hasNext | -Boolean! | -- -Whether there is a next page. - - | -|
| Field | -Argument | -Type | -Description | -
|---|---|---|---|
| id | -UUID! | -- | |
| userName | -String! | -- | |
| Field | -Argument | -Type | -Description | -
|---|---|---|---|
| gamification | -Gamification | -- | |
| notification | -Notification | -- | |
| Field | -Argument | -Type | -Description | -
|---|---|---|---|
| id | -UUID! | -- | |
| userName | -String! | -- | |
| firstName | -String! | -- | |
| lastName | -String! | -- | |
| realmRoles | -[GlobalUserRole!]! | -- | |
| Field | -Type | -Description | -|
|---|---|---|---|
| after | -DateTime | -- -If specified, filters for dates after the specified value. - - | -|
| before | -DateTime | -- -If specified, filters for dates before the specified value. - - | -|
| Field | -Type | -Description | -|
|---|---|---|---|
| provider | -ExternalServiceProviderDto! | -- | |
| authorizationCode | -String! | -- | |
| Field | -Type | -Description | -|
|---|---|---|---|
| equals | -Int | -- -An integer value to match exactly. - - | -|
| greaterThan | -Int | -- -If specified, filters for values greater than to the specified value. - - | -|
| lessThan | -Int | -- -If specified, filters for values less than to the specified value. - - | -|
| Field | -Type | -Description | -|
|---|---|---|---|
| gamification | -Boolean | -- | |
| lecture | -Boolean | -- | |
| Field | -Type | -Description | -|
|---|---|---|---|
| page | -Int! | -- -The page number, starting at 0. -If not specified, the default value is 0. -For values greater than 0, the page size must be specified. -If this value is larger than the number of pages, an empty page is returned. - - | -|
| size | -Int! | -- -The number of elements per page. - - | -|
| Field | -Type | -Description | -|
|---|---|---|---|
| gamification | -Gamification | -- | |
| notification | -NotificationInput | -- | |
| Field | -Type | -Description | -|
|---|---|---|---|
| equals | -String | -- -A string value to match exactly. - - | -|
| contains | -String | -- -A string value that must be contained in the field that is being filtered. - - | -|
| ignoreCase | -Boolean! | -- -If true, the filter is case-insensitive. - - | -|
| Value | -Description | -
|---|---|
| GITHUB | -- |
| Value | -Description | -
|---|---|
| GAMIFICATION_ENABLED | -- |
| ADAPTIVE_GAMIFICATION_ENABLED | -- |
| ALL_GAMIFICATION_DISABLED | -- |
| Value | -Description | -
|---|---|
| SUPER_USER | -- |
| COURSE_CREATOR | -- |
| Value | -Description | -
|---|---|
| ASC | -- |
| DESC | -- |
| Field | +Argument | +Type | +Description | +
|---|---|---|---|
| findPublicUserInfos | +[PublicUserInfo]! | ++ +Gets the publicly available information for a list of users with the specified IDs. +If a user does not exist, null is returned for that user. + + | +|
| ids | +[UUID!]! | ++ | |
| currentUserInfo | +UserInfo! | ++ +Gets the user information of the currently authorized user. + + | +|
| findUserInfos | +[UserInfo]! | ++ +Gets all of the users' information for a list of users with the specified IDs. +Only available to privileged users. +If a user does not exist, null is returned for that user. + + | +|
| ids | +[UUID!]! | ++ | |
| isAccessTokenAvailable | +Boolean! | ++ +Checks whether an access token for a given third-party provider exists and is still valid for the currently authenticated user. +Returns `true` if: +- The access token exists and is not expired, OR +- The refresh token exists and is not expired. + + | +|
| provider | +ExternalServiceProviderDto! | ++ | |
| _internal_noauth_getAccessToken | +AccessToken! | ++ +Retrieves the access token of the specified user for a specified third-party provider. + +- If the access token is expired but a valid refresh token is available, the system will attempt to generate a new access token. +- Throws an exception if neither a valid access token nor a valid refresh token is available. + +⚠️ This query is **only accessible internally**. ⚠️ + + | +|
| userId | +UUID! | ++ | |
| provider | +ExternalServiceProviderDto! | ++ | |
| _internal_noauth_getExternalUserIds | +[ExternalUserIdWithUser!]! | ++ +Retrieves the external user IDs for a list of users with the specified IDs. +If a user does not exist, null is returned for that user. +If the user does not have an external user ID for the specified provider, null is returned for that user. +⚠️ This query is **only accessible internally** and the caller must be at least a tutor of a course. The permission must be validated by the caller method. ⚠️ + + | +|
| userIds | +[UUID!]! | ++ | |
| provider | +ExternalServiceProviderDto | ++ | |
| findUserSettings | +Settings! | ++ | |
| userId | +UUID | ++ | |
| findUsersSettings | +[Settings]! | ++ | |
| usersIds | +[UUID]! | ++ | |
| Field | +Argument | +Type | +Description | +
|---|---|---|---|
| generateAccessToken | +Boolean! | ++ +Generates an access token for the given provider using an authorization code obtained from the OAuth flow. +This should be called **only after** the user completes authorization and the frontend retrieves the auth code. +After the access token is generated, the user is redirected to the redirect URI. + + | +|
| input | +GenerateAccessTokenInput! | ++ | |
| updateSettings | +Settings! | ++ | |
| userId | +UUID! | ++ | |
| input | +SettingsInput! | ++ | |
| defaultSettings | +Settings! | ++ | |
| userId | +UUID! | ++ | |
| Field | +Argument | +Type | +Description | +
|---|---|---|---|
| accessToken | +String! | ++ | |
| externalUserId | +String | ++ | |
| Field | +Argument | +Type | +Description | +
|---|---|---|---|
| userId | +UUID! | ++ | |
| externalUserId | +String! | ++ | |
| Field | +Argument | +Type | +Description | +
|---|---|---|---|
| gamification | +Boolean | ++ | |
| lecture | +Boolean | ++ | |
| Field | +Argument | +Type | +Description | +
|---|---|---|---|
| page | +Int! | ++ +The current page number. + + | +|
| size | +Int! | ++ +The number of elements per page. + + | +|
| totalElements | +Int! | ++ +The total number of elements across all pages. + + | +|
| totalPages | +Int! | ++ +The total number of pages. + + | +|
| hasNext | +Boolean! | ++ +Whether there is a next page. + + | +|
| Field | +Argument | +Type | +Description | +
|---|---|---|---|
| id | +UUID! | ++ | |
| userName | +String! | ++ | |
| Field | +Argument | +Type | +Description | +
|---|---|---|---|
| gamification | +Gamification | ++ | |
| notification | +Notification | ++ | |
| Field | +Argument | +Type | +Description | +
|---|---|---|---|
| id | +UUID! | ++ | |
| userName | +String! | ++ | |
| firstName | +String! | ++ | |
| lastName | +String! | ++ | |
| realmRoles | +[GlobalUserRole!]! | ++ | |
| Field | +Type | +Description | +|
|---|---|---|---|
| after | +DateTime | ++ +If specified, filters for dates after the specified value. + + | +|
| before | +DateTime | ++ +If specified, filters for dates before the specified value. + + | +|
| Field | +Type | +Description | +|
|---|---|---|---|
| provider | +ExternalServiceProviderDto! | ++ | |
| authorizationCode | +String! | ++ | |
| Field | +Type | +Description | +|
|---|---|---|---|
| equals | +Int | ++ +An integer value to match exactly. + + | +|
| greaterThan | +Int | ++ +If specified, filters for values greater than to the specified value. + + | +|
| lessThan | +Int | ++ +If specified, filters for values less than to the specified value. + + | +|
| Field | +Type | +Description | +|
|---|---|---|---|
| gamification | +Boolean | ++ | |
| lecture | +Boolean | ++ | |
| Field | +Type | +Description | +|
|---|---|---|---|
| page | +Int! | ++ +The page number, starting at 0. +If not specified, the default value is 0. +For values greater than 0, the page size must be specified. +If this value is larger than the number of pages, an empty page is returned. + + | +|
| size | +Int! | ++ +The number of elements per page. + + | +|
| Field | +Type | +Description | +|
|---|---|---|---|
| gamification | +Gamification | ++ | |
| notification | +NotificationInput | ++ | |
| Field | +Type | +Description | +|
|---|---|---|---|
| equals | +String | ++ +A string value to match exactly. + + | +|
| contains | +String | ++ +A string value that must be contained in the field that is being filtered. + + | +|
| ignoreCase | +Boolean! | ++ +If true, the filter is case-insensitive. + + | +|
| Value | +Description | +
|---|---|
| GITHUB | ++ |
| Value | +Description | +
|---|---|
| GAMIFICATION_ENABLED | ++ |
| ADAPTIVE_GAMIFICATION_ENABLED | ++ |
| ALL_GAMIFICATION_DISABLED | ++ |
| Value | +Description | +
|---|---|
| SUPER_USER | ++ |
| COURSE_CREATOR | ++ |
| Value | +Description | +
|---|---|
| ASC | ++ |
| DESC | ++ |