{
  "Comment": "AWAL Plus User Creation State machine",
  "StartAt": "CheckIfSendEmailIsPassed",
  "States": {
    "CheckIfSendEmailIsPassed": {
      "Type": "Choice",
      "Choices": [
        {
          "And": [
            {
              "Variable": "$.send_email",
              "IsPresent": true
            },
            {
              "Variable": "$.send_email",
              "IsNull": false
            }
          ],
          "Next": "MapInputFromKafka"
        }
      ],
      "Default": "UseDefaultValueOfSendEmailFlag"
    },
    "UseDefaultValueOfSendEmailFlag": {
      "Type": "Pass",
      "Result": false,
      "ResultPath": "$.send_email",
      "Next": "MapInputFromKafka"
    },
    "MapInputFromKafka": {
      "Type": "Pass",
      "Parameters": {
        "email.$": "$.email",
        "owner.$": "$.owner",
        "first_name.$": "$.first_name",
        "last_name.$": "$.last_name",
        "vendor_name.$": "$.vendor_name",
        "vendor_id.$": "$.vendor_id",
        "correlation_id.$": "$.correlation_id",
        "localization": "en",
        "brand": "awal",
        "source": "event.awalPlusAccountCreation",
        "service_tier_uuid.$": "$.service_tier_uuid",
        "send_email.$": "$.send_email",
        "is_admin.$": "$.is_admin",
        "master_contact.$": "$.master_contact",
        "roles.$": "$.roles",
        "currency.$": "$.currency"
      },
      "Next": "CheckRequiredFields"
    },
    "CheckRequiredFields": {
      "Type": "Choice",
      "Choices": [
        {
          "And": [
            {
              "Variable": "$.brand",
              "IsPresent": true
            },
            {
              "Variable": "$.brand",
              "IsString": true
            },
            {
              "Variable": "$.email",
              "IsPresent": true
            },
            {
              "Variable": "$.email",
              "IsString": true
            },
            {
              "Variable": "$.owner",
              "IsPresent": true
            },
            {
              "Variable": "$.owner",
              "IsString": true
            },
            {
              "Variable": "$.first_name",
              "IsPresent": true
            },
            {
              "Variable": "$.first_name",
              "IsString": true
            },
            {
              "Variable": "$.last_name",
              "IsPresent": true
            },
            {
              "Variable": "$.last_name",
              "IsString": true
            },
            {
              "Variable": "$.correlation_id",
              "IsPresent": true
            },
            {
              "Variable": "$.correlation_id",
              "IsString": true
            },
            {
              "Variable": "$.source",
              "IsPresent": true
            },
            {
              "Variable": "$.source",
              "IsString": true
            },
            {
              "Variable": "$.localization",
              "IsPresent": true
            },
            {
              "Variable": "$.localization",
              "IsString": true
            }
          ],
          "Next": "CreateVendor"
        }
      ],
      "Default": "SendFailureToKafka"
    },
    "SendFailureToKafka": {
      "Type": "Task",
      "Resource": "${lambda_send_failure}",
      "HeartbeatSeconds": 60,
      "TimeoutSeconds": 3600,
      "ResultPath": "$.send_failure_result",
      "Retry": [
        {
          "ErrorEquals": [
            "RetryException",
            "States.Timeout",
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 5,
          "MaxAttempts": 2,
          "BackoffRate": 3
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "Next": "FailState",
          "ResultPath": "$.send_failure_errors"
        }
      ],
      "Next": "FailState"
    },
    "FailState": {
      "Type": "Fail"
    },
    "CreateVendor": {
      "Type": "Task",
      "Resource": "${lambda_create_vendor}",
      "HeartbeatSeconds": 60,
      "TimeoutSeconds": 3600,
      "ResultPath": "$.create_vendor_result",
      "Retry": [
        {
          "ErrorEquals": [
            "RetryException",
            "States.Timeout",
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 5,
          "MaxAttempts": 2,
          "BackoffRate": 3
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "Next": "SendFailureToKafka",
          "ResultPath": "$.create_vendor_errors"
        }
      ],
      "Next": "SyncAbacusAccount"
    },
    "SyncAbacusAccount": {
        "Type": "Task",
        "Resource": "${lambda_abacus_sync_account}",
        "Parameters": {
            "vendor_id.$": "$.create_vendor_result.vendor_id",
            "vendor_name.$": "$.vendor_name",
            "currency.$": "$.currency",
            "correlation_id.$": "$.correlation_id",
            "source.$": "$.source"
        },
        "HeartbeatSeconds": 60,
        "TimeoutSeconds": 3600,
        "ResultPath": "$.sync_abacus_account_result",
        "Retry": [
            {
                "ErrorEquals": [
                    "RetryException",
                    "States.Timeout",
                    "Lambda.ServiceException",
                    "Lambda.AWSLambdaException",
                    "Lambda.SdkClientException",
                    "Lambda.TooManyRequestsException"
                ],
                "IntervalSeconds": 5,
                "MaxAttempts": 2,
                "BackoffRate": 3
            }
        ],
        "Catch": [
            {
                "ErrorEquals": [
                    "States.ALL"
                ],
                "Next": "CreateUser",
                "ResultPath": "$.sync_abacus_account_errors"
            }
        ],
        "Next": "CreateUser"
    },
    "CreateUser": {
      "Type": "Task",
      "Resource": "${lambda_create_master_contact}",
      "HeartbeatSeconds": 60,
      "TimeoutSeconds": 3600,
      "ResultPath": "$.create_master_contact_result",
      "Parameters": {
        "first_name.$": "$.first_name",
        "last_name.$": "$.last_name",
        "email.$": "$.email",
        "brand.$": "$.brand",
        "vendor_id.$": "$.create_vendor_result.vendor_id",
        "localization.$": "$.localization",
        "source.$": "$.source",
        "is_admin.$": "$.is_admin",
        "master_contact.$": "$.master_contact",
        "roles.$": "$.roles"
      },
      "Retry": [
        {
          "ErrorEquals": [
            "RetryException",
            "States.Timeout",
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 5,
          "MaxAttempts": 2,
          "BackoffRate": 3
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "Next": "SendFailureToKafka",
          "ResultPath": "$.create_user_errors"
        }
      ],
      "Next": "ArrayToProperties"
    },
    "ArrayToProperties": {
      "Type": "Pass",
      "Parameters": {
          "email.$": "$.email",
          "brand.$": "$.brand",
          "owner.$": "$.owner",
          "correlation_id.$": "$.correlation_id",
          "identity_id.$": "$.create_master_contact_result.identity_id",
          "vendor_id.$": "$.create_vendor_result.vendor_id",
          "vendor_uuid.$": "$.create_master_contact_result.vendor_uuid",
          "label_profile_id.$": "$.create_master_contact_result.label_profile_id",
          "source.$": "$.source",
          "service_tier_uuid.$": "$.service_tier_uuid",
          "send_email.$": "$.send_email"
      },
      "Next": "CheckSendEmail"
    },
    "CheckSendEmail": {
            "Type": "Choice",
            "Choices": [
                {
                    "And": [
                        {
                            "Variable": "$.send_email",
                            "IsPresent": true
                        },
                        {
                            "Variable": "$.send_email",
                            "BooleanEquals": true
                        }
                    ],
                    "Next": "SendWelcomeEmail"
                }
            ],
            "Default": "SendSuccessToKafka"
        },
    "SendWelcomeEmail": {
      "Type": "Task",
      "Resource": "${lambda_send_org_invite_email}",
      "HeartbeatSeconds": 60,
      "TimeoutSeconds": 3600,
      "ResultPath": "$.send_org_invite_email_result",
      "Retry": [
        {
          "ErrorEquals": [
            "RetryException",
            "States.Timeout",
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 5,
          "MaxAttempts": 2,
          "BackoffRate": 3
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "Next": "SendFailureToKafka",
          "ResultPath": "$.send_org_invite_email_errors"
        }
      ],
      "Next": "SendSuccessToKafka"
    },
    "SendSuccessToKafka": {
      "Type": "Task",
      "Resource": "${lambda_send_success}",
      "HeartbeatSeconds": 60,
      "TimeoutSeconds": 3600,
      "ResultPath": "$.send_success_result",
      "Retry": [
        {
          "ErrorEquals": [
            "RetryException",
            "States.Timeout",
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 5,
          "MaxAttempts": 2,
          "BackoffRate": 3
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "Next": "FailState",
          "ResultPath": "$.send_success_errors"
        }
      ],
      "End": true
    }
  }
}

