> ## Documentation Index
> Fetch the complete documentation index at: https://docs.quickblox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Users

> Learn how to manage your users with QuickBlox.

Visit [Key Concepts](/docs/key-concepts) page to learn the most important QuickBlox concepts.

## Before you begin

1. Register a [QuickBlox account](https://admin.quickblox.com/signin). This is a matter of a few minutes and you will be able to use this account to build your apps.
2. Configure QuickBlox SDK for your app. Check out [Setup](/sdks/flutter-setup) page for more details.
3. Create a user session to be able to use QuickBlox functionality. See [Authentication](/sdks/flutter-authentication) page to learn how to do it.

## Create user

It's recommended to manage user creation at your backend for production. To learn more you can refer to [QuickBlox API documentation](https://docs.quickblox.com/reference/create-user).

For POCs/MVPs or during development you may want to create users on the fly, you can use `createUser()` method.

Create a user using the code snippet below. Only login (or email) and password are required. Other fields are optional.

```Dart Dart theme={null}
String login = "chrispeterson";
String password = "superPassword";
String email = "[[email protected]](/cdn-cgi/l/email-protection)";
int blobId = 34253543;
int externalUserId = 2398734;
int facebookId = 2928734;
int twitterId = 92374392;
String fullName = "John Smith";
String phone = "+380772342381";
String webSite = "www.moo.com";
String customData = "";
String tagList = "";

try {
  QBUser? user = await QB.users.createUser(login, password, email, blobId: blobId, externalUserId: externalUserId, facebookId: facebookId, twitterId: twitterId, fullName: fullName, phone: phone, website: website, customData: customData, tagList: tagList);
} on PlatformException catch (e) {
  // Some error occurred, look at the exception message for more details
}
```

| Argument       | Required | Description       |
| -------------- | -------- | ----------------- |
| login          | yes      | User login.       |
| password       | yes      | User password.    |
| email          | no       | User email.       |
| blobId         | no       | User blob ID.     |
| externalUserId | no       | User external ID. |
| facebookId     | no       | User facebook ID. |
| twitterId      | no       | User twitter ID.  |
| fullName       | no       | User full name.   |
| phone          | no       | User phone.       |
| website        | no       | User website.     |
| customData     | no       | User custom data. |
| tagList        | no       | User tag list.    |

<Warning>
  **Security & Privacy**

  It's recommended to [disable permission](/docs/application#set-session-permissions) to create users with application session on **production apps** once user creation is implemented on your backend.

  Email, full name, facebookId and phone number are PII, [configure session permissions](/docs/application#set-session-permissions) according to your privacy requirements.
</Warning>

## Retrieve users

Get a list of users using the `getUsers()` method. The code snippet below shows how to get a list of users created between the two given dates, sorted in descending order, and limited to 100 users on the page.

```Dart Dart theme={null}
try {
  QBFilter filter = QBFilter();
  filter.type = QBUsersFilterTypes.DATE;
  filter.field = QBUsersFilterFields.CREATED_AT;
  filter.operator = QBUsersFilterOperators.BETWEEN;
  filter.value = "2021-08-01T10:00:00Z, 2021-08-12T10:00:00Z";

  QBSort sort = QBSort();
  sort.field = QBUsersSortFields.CREATED_AT;
  sort.type = QBUsersSortTypes.DATE;
  sort.ascending = false;

  int page = 5;
  int perPage = 100;

  List<QBUser?> userList = await QB.users.getUsers(filter: filter, sort: sort, page: page, perPage: perPage);
} on PlatformException catch (e) {
	// Some error occurred, look at the exception message for more details
}
```

The method `getUsers()` accepts two (optional) arguments of the object type that can have the following fields:

| Field   | Required |                                              |
| ------- | -------- | -------------------------------------------- |
| filter  | no       | Specifies filtering criteria for the field.  |
| sort    | no       | Specifies sorting criteria for the field.    |
| page    | no       | Number of pages with results to be returned. |
| perPage | no       | Number of records to return in one page.     |

If you want to retrieve only users updated after some specific date time, you can use operators. This is useful if you cache users somehow and do not want to obtain the whole list of your users on every app start. Thus, you can use [search](/sdks/flutter-users#search-operators) and [sort](/sdks/flutter-users#sort-operators) operators to list users on the page so that it is easier to see specific users.

### Search operators

You can use search operators to get more specific search results. The request below will return a list of users with a login other than the one specified.

```Dart Dart theme={null}
try {
  QBFilter filter = QBFilter();
  filter.type = QBUsersFilterTypes.STRING;
  filter.field = QBUsersFilterFields.LOGIN;
  filter.operator = QBUsersFilterOperators.NE;
  filter.value = "admin";

  List<QBUser?> userList = await QB.users.getUsers(filter: filter);
} on PlatformException catch (e) {
	// Some error occurred, look at the exception message for more details
}
```

Here are the search operators that you can use to search for the exact data that you need.

| Search operators | Applicable to types  | Applicable to fields                                                                                               | Description                                |
| ---------------- | -------------------- | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------ |
| lt               | number, string, date | id, created\_at, updated\_at, last\_request\_at, external\_user\_id, facebook\_id                                  | **Less Than** operator.                    |
| gt               | number, string, date | id, created\_at, updated\_at, last\_request\_at, external\_user\_id, facebook\_id                                  | **Greater Than** operator.                 |
| ge               | number, string, date | id, created\_at, updated\_at, last\_request\_at, external\_user\_id, facebook\_id                                  | **Greater Than** or **Equal** to operator. |
| le               | number, string, date | id, created\_at, updated\_at, last\_request\_at, external\_user\_id, facebook\_id                                  | **Less or Equal to** operator              |
| eq               | number, string, date | id, full\_name, email, login, phone, created\_at, updated\_at, last\_request\_at, external\_user\_id, facebook\_id | **Equal** to operator.                     |
| ne               | number, string, date | id, full\_name, email, login, phone, created\_at, updated\_at, last\_request\_at, external\_user\_id, facebook\_id | **Not Equal** to operator.                 |
| between          | number, string, date | id, created\_at, updated\_at, last\_request\_at, external\_user\_id, facebook\_id                                  | **Contained between values** operator.     |
| in               | number, string, date | id, full\_name, email, login, phone, created\_at, updated\_at, last\_request\_at, external\_user\_id, facebook\_id | **IN** array operator.                     |

### Sort operators

You can use sort operators to order the search results. The request below will return a list of users with the login sorted in descending order.

```Dart Dart theme={null}
try {
  QBSort sort = QBSort();
  sort.field = QBUsersSortFields.LOGIN;
  sort.type = QBUsersSortTypes.STRING;
  sort.ascending = false;

  List<QBUser?> userList = await QB.users.getUsers(sort: sort);
} on PlatformException catch (e) {
	// Some error occurred, look at the exception message for more details
}
```

Here are the sort options that you can use to order the search results:

| Sort options | Applicable to types | Applicable to fields                                                                                         | Description                                                         |
| ------------ | ------------------- | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------- |
| ascending    | All types           | id, full\_name, email, login, phone, website, created\_at, updated\_at,last\_request\_at, external\_user\_id | Sort results in ascending order by setting the ascending as true.   |
| descending   | All types           | id, full\_name, email, login, phone, website, created\_at, updated\_at,last\_request\_at, external\_user\_id | Sort results in descending order by setting the ascending as false. |

## Retrieve users by full name

To get a list of users by full name for a current account, user the following code snippet.

```Dart Dart theme={null}
String fullName = "test";
int page = 5;
int perPage = 100;

try {
  List<QBUser?> userList = await QB.users.getUsersByFullName(fullName, page: page, perPage: perPage
  );
} on PlatformException catch (e) {
  // Some error occurred, look at the exception message for more details
}
```

| Argument | Required | Description                                                            |
| -------- | -------- | ---------------------------------------------------------------------- |
| fullName | yes      | A string of fullName                                                   |
| page     | no       | Number of pages with results to be returned. Default: **1**.           |
| perPage  | no       | Number of records to return in one page. Min: **1**. Default: **100**. |

## Retrieve users by tag

To get a list of users by tag for a current account, use the following code snippet.

```Dart Dart theme={null}
List<String> tags = ["test"];
int page = 5;
int perPage = 100;

try {
  List<QBUser?> userList = await QB.users.getUsersByTag(tags, page: page, perPage: perPage
  );
} on PlatformException catch (e) {
  // Some error occurred, look at the exception message for more details
}
```

| Argument | Required | Description                                                            |
| -------- | -------- | ---------------------------------------------------------------------- |
| tags     | yes      | An array of tags. Min: **1**.                                          |
| page     | no       | Number of pages with results to be returned. Default: **1**.           |
| perPage  | no       | Number of records to return in one page. Min: **1**. Default: **100**. |

## Reset user password

<Note>
  This feature is coming soon. Please check back later. For more updates and questions, feel free to contact our [Customer Support Team](https://help.quickblox.com/).
</Note>

## Update user

Update a user profile by calling the `updateUser()` method. If you want to change your password, you need to provide 2 parameters: `password` and `newPassword`. The updated `user` entity will be returned. You can also update any other field of the user using the `updateUser()` method. Thus, the snippet below shows how to update a `tagList` and `customData` fields.

```Dart Dart theme={null}
String login = "chrispeterson";
String customData = "";
String tagList = "tagOne, tagTwo";

try {
  var someObject = {};
  someObject["name"] = "John Smith";
  someObject["age"] = "31";
  someObject["city"] = "New York";

  String customData = json.encode(someObject);

  QBUser? user = await QB.users.updateUser(login, customData: customData, tagList: tagList);
} on PlatformException catch (e) {
  // Some error occurred, look at the exception message for more details
}
```

| Argument   | Required | Description                                                                                                                                                                                                                                                                                                          |
| ---------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| login      | yes      | User login.                                                                                                                                                                                                                                                                                                          |
| customData | no       | User custom data. Should be a String. You can convert any data types to String, for example, JSON, XML , etc.                                                                                                                                                                                                        |
| tagList    | no       | User tags. A comma separated String without any spaces. A tag should contain alphanumeric characters and start with a letter. For example, the "tagOne" format is correct while the "tag one" format is incorrect. If more that 10 tags are provided, an error is returned: tag list should contain maximum 10 tags. |

## Set user avatar

To set a user avatar, just upload a file to the QuickBlox cloud storage and connect it to the user.

To upload the file to the QuickBlox cloud storage, call the `upload()` method and pass the `imageFileUrl` to it. The `imageFileUrl` is a path to the file in the device filesystem. Now that the file is uploaded, get the ID of the uploaded file.

To connect the file to the user, set the ID of the uploaded file to the `blobId` field of the `user` and call the `updateUser()` method. As a result, the user avatar gets updated.

```Dart Dart theme={null}
String imageFileUrl = "content://data/image.jpg";
String login = "chrispeterson";
int blobId = 324987234;

try {
  QBFile? file = await QB.content.upload(imageFileUrl);
  if (file != null){
    int blobId = file!.id;
    QBUser? updatedUser = QB.users.updateUser(login, blobId: blobId);
  }
} on PlatformException catch (e) {
  // Some error occurred, look at the exception message for more details
}
```

Pass the following arguments to the `updateUser()` method:

| Argument  | Required | Description   |
| --------- | -------- | ------------- |
| userLogin | yes      | User login.   |
| blobId    | no       | User blob ID. |

## Get user avatar

Now, other users can get access to your avatar by calling the `getPrivateURL()` method. As a result, you will receive a private URL in the response. See [this section](/sdks/flutter-content#get-file-url) to learn more about file URLs.

```Dart Dart theme={null}
// get access to the avatar that was set in user's "blobId" property
int avatarFileId = user.blobId;

try {
  QBFile? file = await QB.content.getInfo(avatarFileId);
  if (file != null){
    String uid  = file!.uid;
    String? fileUrl = await QB.content.getPrivateURL(uid);
  }
} on PlatformException catch (e) {
  // Some error occurred, look at the exception message for more details
}
```

## Delete user

A user can delete himself from the platform.

```Dart Dart theme={null}
try {
  await QB.users.deleteUser();
} on PlatformException catch (e) {
  // Some error occurred, look at the exception message for more details
}
```
