User management

The operations performed on users, such as updating and deleting, have an effect on all products (chat, feeds and video).

Creating users

When creating users, there are a few important things to keep in mind:

  • The id field is mandatory, in most cases you want this to be the same ID you use on your database.
  • The role field is optional, by default it is set to user but you can specify any existing role.
  • Custom data can be added to users in the custom field.
  • name and image are optional and handled by all SDKs automatically to render users.
# Create/update users in batch
update_request = GetStream::Generated::Models::UpdateUsersRequest.new(
  users: {
    'user1' => {
      'id' => 'user1',
      'name' => 'Test User 1',
      'role' => 'user',
    },
    'user2' => {
      'id' => 'user2',
      'name' => 'Test User 2',
      'role' => 'user',
    },
  },
)

response = client.common.update_users(update_request)

Built-in fields for users

UserResponse

NameTypeDescriptionConstraints
avg_response_timeinteger--
ban_expiresnumberDate when ban expires-
bannedbooleanWhether a user is banned or notRequired
blocked_user_idsstring[]-Required
created_atnumberDate/time of creationRequired
customobjectCustom data for this objectRequired
deactivated_atnumberDate of deactivation-
deleted_atnumberDate/time of deletion-
devicesDeviceResponse[]List of devices user is using-
idstringUnique user identifierRequired
imagestring--
invisibleboolean-Required
languagestringPreferred language of a userRequired
last_activenumberDate of last activity-
namestringOptional name of user-
onlinebooleanWhether a user online or notRequired
privacy_settingsPrivacySettingsResponseUser privacy settings-
push_notificationsPushNotificationSettingsResponseUser push notification settings-
revoke_tokens_issued_beforenumberRevocation date for tokens-
rolestringDetermines the set of user permissionsRequired
shadow_bannedbooleanWhether a user is shadow bannedRequired
teamsstring[]List of teams user is a part ofRequired
teams_roleobject--
updated_atnumberDate/time of the last updateRequired

Updating users

You can update users in two ways:

  • Replace updates: replace the entire user object with the one provided to the API call
  • Partial update: choose which fields you want to change
# Partially update user
partial_request = GetStream::Generated::Models::UpdateUsersPartialRequest.new(
  users: [
    {
      'id' => 'userid',
      'set' => {
        'name' => 'Updated Name',
      },
    },
  ],
)

response = client.common.update_users_partial(partial_request)

Deactivating and deleting users

Depending on your use-case, you can choose to delete users or de-activating them. There are some differences between these two approach.

Deactivating users:

  • the user will not be allowed to perform API requests / connect
  • user data is retained on Stream’s side and returned from API
  • deactivated users can be re-activated

Deleting users:

  • the user will no longer be able to perform API requests / connect
  • the user is deleted and by default not returned from API
  • all data from the user is marked as deleted
  • by default the data is retained and “soft” deleted, you can optionally request hard deletion
  • deletion is not reversible

Note: Both deletion and deactivation are performed asynchronously by Stream API. A task ID is returned and you can use that to check the status of its processing.

Deactivating users

client.deactivateUser({
  user_id: '<id>',
});

// reactivate
client.reactivateUsers({
  user_ids: ['<id>'],
});

// deactivating users in bulk is performed asynchronously
const deactivateResponse = client.deactivateUsers({
  user_ids: ['<id1>', '<id2>'...],
});

Deactivating users in bulk can take some time, this is how you can check the progress:

# Example of monitoring the status of an async task
# The logic is same for all async tasks
response = _ # Result of a Stream async API request

# You need to poll this endpoint
task_response = client.get_task(response.data.task_id)
puts task_response.data.status == 'completed'

Deleting users

# Delete users
client.delete_users(
  GetStream::Generated::Models::DeleteUsersRequest.new(
    user_ids: ['<id>']
  )
)

# Restore users
client.restore_users(
  GetStream::Generated::Models::RestoreUsersRequest.new(
    user_ids: ['<id>']
  )
)

The delete users endpoints supports the following parameters to control which data needs to be deleted and how. By default users and their data are soft-deleted.

NameTypeDescriptionOptional
userEnum (soft, pruning, hard)- Soft: marks user as deleted and retains all user data.
- Pruning: marks user as deleted and nullifies user information.
- Hard: deletes user completely - this requires hard option for messages and conversation as well.
Yes
conversationsEnum (soft, hard)- Soft: marks all conversation channels as deleted (same effect as Delete Channels with ‘hard’ option disabled).
- Hard: deletes channel and all its data completely including messages (same effect as Delete Channels with ‘hard’ option enabled).
Yes
messagesEnum (soft, pruning, hard)- Soft: marks all user messages as deleted without removing any related message data.
- Pruning: marks all user messages as deleted, nullifies message information and removes some message data such as reactions and flags.
- Hard: deletes messages completely with all related information.
Yes
new_channel_owner_idstringChannels owned by hard-deleted users will be transferred to this userID. If you doesn’t provide a value, the channel owner will have a system generated ID like delete-user-8219f6578a7395gYes
callsEnum (soft, hard)- Soft: marks calls and related data as deleted.
- Hard: deletes calls and related data completely
Note that this applies only to 1:1 calls, not group calls
Yes

Deleting users in bulk can take some time, this is how you can check the progress:

# Example of monitoring the status of an async task
# The logic is same for all async tasks
response = _ # Result of a Stream async API request

# You need to poll this endpoint
task_response = client.get_task(response.data.task_id)
puts task_response.data.status == 'completed'