The X-Profile module provides high performance search queries for customer and company data.
Through X-Profile, you can perform create, read, update, and delete (CRUD) operations with users, companies, and contacts. All such operations can be completed with various queries, which are listed and detailed in the sections below.
Just like other xAPI modules, X-Profile resides on a website's or application's back end and is managed with queries. It enables efficiently creating, updating, and deleting various entity profiles. The chart below shows how X-Profile works in case of creating a new user (customer):
List of available queries:
# | Endpoint | Arguments | Return |
---|---|---|---|
1 | organization | id |
Organization |
2 | contact | id |
Contact |
3 | role | roleName |
Role |
4 | user | id userName email loginProvider providerKey |
User |
With this query, you can get the organization (company) by its ID:
{
organization(id: "689a72757c754bef97cde51afc663430") {
id
name
ownerId
parentId
businessCategory
addresses {
name
addressType
isDefault
}
defaultBillingAddress {
name
}
defaultShippingAddress {
name
}
}
}
With this query, you can get the contact by its ID:
{
contact(id: "5f807280-bb1a-42b2-9a96-ed107269ea06") {
id
fullName
memberType
name
organizationId
emails
organizations {
name
}
addresses {
name
addressType
isDefault
}
defaultBillingAddress {
name
}
defaultShippingAddress {
name
}
}
}
With this query, you can get the role by its name:
{
role(roleName: "Store administrator") {
id
name
permissions
}
}
With this query, you can get the user by a few arguments
{
user(id: "9b605a3096ba4cc8bc0b8d80c397c59f") {
accessFailedCount
contact {
id
name
}
createdDate
email
isAdministrator
passwordHash
}
}
This Profile type schema represents queryable objects for X-Profile:
List of mutations:
# | Endpoint | Arguments | Description |
---|---|---|---|
1 | createContact | id name! memberType addresses phones emails groups fullName firstName! lastName! middleName salutation photoUrl timeZone defaultLanguage organizations |
Creates a contact (obsolete, use registrationRequest) |
2 | updateContact | id! name memberType addresses phones emails groups fullName firstName! lastName! middleName salutation photoUrl timeZone defaultLanguage organizations |
Updates a contact |
3 | deleteContact | contactId! |
Deletes a contact |
4 | lockOrganizationContact | userId! |
Set Locked status to a specified contact |
5 | unlockOrganizationContact | userId! |
Set Approved status to a specified contact |
6 | createUser | id email createdBy createdDate isAdministrator lockoutEnabled lockoutEnd logins memberId password phoneNumber phoneContactConfirmed photoUrl roles storeId twoFactorEnabled userName userType |
Creates a user |
7 | updateUser | accessFailedCount email! id! isAdministrator lockoutEnabled lockoutEnd memberId phoneNumber phoneNumberConfirmed photoUrl roles storeId twoFactorEnabled userName! userType! passwordHash securityStamp! |
Updates a user |
8 | changeOrganizationContactRole | userId! roleIds! |
Assign roles to a specified user |
9 | deleteUsers | userNames! |
Delete users |
10 | updateAddresses | contactId! addresses! |
Update an addresses |
11 | createOrganization | id name memberType addresses phones emails groups |
Creates an organization (obsolete, use registrationRequest) |
12 | updateOrganization | id! name memberType addresses phones emails groups |
Updates an organization |
13 | updateRole | concurrencyStamp id! name! description permissions! |
Updates a role |
14 | registrationRequest | storeId! company! contact account |
Registers customer or company |
15 | sendVerifyEmail | storeId! languageCode! userId email |
Send email verification email by either userid or email |
mutation($command: InputCreateContactType!) {
createContact(command: $command) {
id
name
firstName
lastName
}
}
{
"command": {
"firstName": "testGraphQlFirstName",
"lastName": "testGraphQlLastName",
"name": "testGraphQlName",
"dynamicProperties": [
{
"name": "Default shipping address",
"value": "test value"
}
]
}
}
mutation($command: InputUpdateContactType!){
updateContact(command: $command) {
id
name
}
}
{
"command": {
"id": "550e9b14-ddde-46fe-bc28-0afec83ade96",
"firstName": "testGraphQlFirstName2",
"lastName": "testGraphQlLastName2",
"dynamicProperties": [
{
"name": "Default shipping address",
"value": "test value"
}
]
}
}
mutation($command: InputDeleteContactType!){
deleteContact(command: $command)
}
{
"command": {
"contactId": "550e9b14-ddde-46fe-bc28-0afec83ade96"
}
}
mutation lockContact($command: InputLockUnlockOrganizationContactType!){
lockOrganizationContact(command: $command){
}
}
{
"command": {
"userId":"5f807280-bb1a-42b2-9a96-ed107269ea06"
}
}
mutation unlockContact($command: InputLockUnlockOrganizationContactType!){
unlockOrganizationContact(command: $command){
}
}
{
"command": {
"userId":"5f807280-bb1a-42b2-9a96-ed107269ea06"
}
}
mutation($command: InputCreateUserType!) {
createUser(command: $command) {
succeeded
}
}
{
"command": {
"email": "graphql@test.local",
"userName": "graphqlTestUserName",
"userType": "Customer"
}
}
mutation($command: InputUpdateUserType!) {
updateUser(command: $command) {
succeeded
errors{
code
description
}
}
}
{
"command": {
"id": "ae6f1cd7-957d-4b30-864c-8f40232a4df3",
"userName": "graphqlTestUserName2",
"userType": "Manager",
"securityStamp": "",
"email": "graphql2@test.local"
}
}
SecurityStamp is a random value that must change whenever user credentials, i.e. login or password, change.
mutation changeOrganizationContactRole($command: InputChangeOrganizationContactRoleType!){
changeOrganizationContactRole(command:$command){
succeeded
errors
{
code
description
}
}
}
{
"command":
{
"userId": "237a4784-d25f-419e-b4d7-cf151393d1cc",
"roleIds": ["org-maintainer","purchasing-agent"]
}
}
mutation($command: InputDeleteUserType!) {
deleteUsers(command: $command) {
succeeded
errors{
code
description
}
}
}
{
"command": {
"userNames": ["graphqlTestUserName2"]
}
}
mutation($command: InputUpdateContactAddressType!) {
updateAddresses(command: $command) {
addresses {
addressType
}
}
}
{
"command": {
"contactId": "820c58c5-b518-454b-aefd-2fc4616bd25e",
"addresses": [
{
"countryCode": "testCountryCode",
"countryName": "testCountryName",
"line1": "testLine1",
"postalCode": "testPostalCode",
"city": "testCity",
"addressType": 3
}
]
}
}
Address type: 1 stands for Billing, 2, for Shipping, and 3, for BillingAndShipping
mutation($command: InputCreateOrganizationType!) {
createOrganization(command: $command) {
id
name
memberType
}
}
{
"command": {
"name": "testOrganizationName",
"emails": ["testOrg.graphql.local"],
"dynamicProperties": [
{
"name": "Sector,
"value": "test value"
}
]
}
}
mutation($command: InputUpdateOrganizationType!) {
updateOrganization(command: $command) {
id
name
memberType
}
}
{
"command": {
"id": "5385b5b7-1772-4c08-8596-27503b8fdddd",
"name": "EditedTestOrganization",
"emails": ["test@graphql.local2"],
"dynamicProperties": [
{
"name": "Sector,
"value": "test value"
}
]
}
}
mutation($command: InputUpdateRoleType!) {
updateRole(command: $command) {
succeeded
errors {
code
description
}
}
}
{
"command": {
"id": "e75700bb597948cca7962e0bbcfdb97c",
"name": "Use api",
"permissions": [
{
"name": "platform:setting:read"
},
{
"name": "catalog:create"
}
],
"concurrencyStamp": ""
}
}
ConcurrencyStamp is a random value that must get changed whenever a role is assigned to the store.
mutation requestRegistration (command: InputRequestRegistrationType!) {
registrationRequest(command: $command) {
organization {
id
name
status
createdBy
ownerId
}
contact {
id
name
status
createdBy
}
account {
id
username
email
status
}
result {
succeede
errors
}
}
}
{
"command": {
"storeId": "store_id",
"contact": {
"firstName": "first_name",
"lastName": "last_name",
"phoneNumber": "phone_number"
},
"organization": {
"name": "company_name"
"description": "description"
"address": {
"city": "City"
"countryCode":"USA"
"countryName":"United States"
"email":"e@mail.test"
"firstName":"First_name"
"lastName:"Last_name"
"line1":"line1"
"postalCode":"123654"
}
}
"account": {
"username": "user_name",
"password": "password",
"email": "e@mail.test"
}
}
}
The mutation registers a company when all argumets have been provided, and registers a customer only when the company value is null. If a company is created, the customer becomes its member and owner. In this case customer gets the Organization maintainer role whose name or ID must be provided in appsettings.json.
The user that creates a company and/or customer is always displayed as frontend.
The company status is determined by the Company default status store setting, while contact and account statuses come from the Contact default status setting. Both settings must be provided in advance.
Example of the role name settings provided below.
{
...
"FrontendSecurity": {
"OrganizationMaintainerRole": "Organization maintainer"
},
...
}
Send email verification email. If userId is specified, the email property will be ignored. If a user is authorized then userId and email will be taken from the current profile.
mutation($command: InputSendVerifyEmailType!) {
sendVerifyEmail(command: $command)
}
{
"command": {
"storeId": "B2B-store",
"languageCode": "EN-US",
"userId": "4162ff51-c880-4e42-bc4b-4bfd120a0bdf"
}
}