{
  "Comment": "Altafonte user creation state machine",
  "StartAt": "MapInput",
  "States": {
    "MapInput": {
      "Comment": "Map CSV from s3",
      "Type": "Map",
      "End": true,
      "ToleratedFailurePercentage": ${tolerated_failure_percentage},
      "MaxConcurrency": ${max_concurrency},
      "ItemReader": {
        "Resource": "arn:aws:states:::s3:getObject",
        "ReaderConfig": {
          "InputType": "CSV",
          "CSVHeaderLocation": "FIRST_ROW"
        },
        "Parameters": {
          "Bucket": "qa-altafonte-user-ingestion",
          "Key.$": "$.detail.object.key"
        }
      },
      "ItemSelector": {
        "email.$": "$$.Map.Item.Value.Email",
        "first_name.$": "$$.Map.Item.Value.FirstName",
        "last_name.$": "$$.Map.Item.Value.LastName",
        "tenant_uuid.$": "$$.Map.Item.Value.TenantUUID",
        "tenant_type.$": "$$.Map.Item.Value.TenantType",
        "is_master_contact.$": "$$.Map.Item.Value.IsMasterContact",
        "is_admin.$": "$$.Map.Item.Value.IsAdmin",
        "catalog.$": "$$.Map.Item.Value.Catalog",
        "marketing.$": "$$.Map.Item.Value.Marketing",
        "analytics.$": "$$.Map.Item.Value.Analytics",
        "accounting.$": "$$.Map.Item.Value.Accounting",
        "collaborators.$": "$$.Map.Item.Value.Collaborators",
        "banking.$": "$$.Map.Item.Value.Banking",
        "send_email.$": "$$.Map.Item.Value.SendEmail"
      },
      "ItemProcessor": {
        "ProcessorConfig": {
          "Mode": "DISTRIBUTED",
          "ExecutionType": "STANDARD"
        },
        "StartAt": "CheckRequiredFields",
        "States": {
          "CheckRequiredFields": {
            "Comment": "Check required fields are present",
            "Type": "Choice",
            "Choices": [
              {
                "And": [
                  {
                    "Variable": "$.email",
                    "StringGreaterThan": ""
                  },
                  {
                    "Variable": "$.first_name",
                    "StringGreaterThan": ""
                  },
                  {
                    "Variable": "$.last_name",
                    "StringGreaterThan": ""
                  },
                  {
                    "Variable": "$.tenant_uuid",
                    "StringGreaterThan": ""
                  },
                  {
                    "Variable": "$.tenant_type",
                    "StringGreaterThan": ""
                  },
                  {
                    "Variable": "$.is_master_contact",
                    "StringGreaterThan": ""
                  },
                  {
                    "Variable": "$.is_admin",
                    "StringGreaterThan": ""
                  },
                  {
                    "Variable": "$.catalog",
                    "StringGreaterThan": ""
                  },
                  {
                    "Variable": "$.marketing",
                    "StringGreaterThan": ""
                  },
                  {
                    "Variable": "$.analytics",
                    "StringGreaterThan": ""
                  },
                  {
                    "Variable": "$.accounting",
                    "StringGreaterThan": ""
                  },
                  {
                    "Variable": "$.collaborators",
                    "StringGreaterThan": ""
                  },
                  {
                    "Variable": "$.banking",
                    "StringGreaterThan": ""
                  },
                  {
                    "Variable": "$.send_email",
                    "StringGreaterThan": ""
                  },
                  {
                    "Or": [
                      {
                        "Variable": "$.send_email",
                        "StringEquals": "Y"
                      },
                      {
                        "Variable": "$.send_email",
                        "StringEquals": "N"
                      }
                    ]
                  }
                ],
                "Next": "CreateUser"
              }
            ],
            "Default": "SendFailureToKafka"
          },
          "CreateUser": {
            "Comment": "Create (or update) a user given a CSV row.",
            "Type": "Task",
            "Resource": "${lambda_create_user_arn}",
            "HeartbeatSeconds": 60,
            "TimeoutSeconds": 300,
            "Retry": [
              {
                "ErrorEquals": [
                  "RetryException",
                  "States.Timeout",
                  "Lambda.ServiceException",
                  "Lambda.AWSLambdaException",
                  "Lambda.SdkClientException",
                  "Lambda.TooManyRequestsException"
                ],
                "IntervalSeconds": ${lambda_interval_seconds},
                "MaxAttempts": ${lambda_retry_attempts},
                "BackoffRate": 3
              }
            ],
            "Next": "SendSuccessToKafka",
            "Catch": [
              {
                "ErrorEquals": [
                  "States.ALL"
                ],
                "Next": "SendFailureToKafka"
              }
            ]
          },
          "SendSuccessToKafka": {
            "Comment": "Send success result to Kafka",
            "Type": "Task",
            "Resource": "${lambda_send_success_arn}",
            "HeartbeatSeconds": 60,
            "TimeoutSeconds": 300,
            "Retry": [
              {
                "ErrorEquals": [
                  "RetryException",
                  "States.Timeout",
                  "Lambda.ServiceException",
                  "Lambda.AWSLambdaException",
                  "Lambda.SdkClientException",
                  "Lambda.TooManyRequestsException"
                ],
                "IntervalSeconds": ${lambda_interval_seconds},
                "MaxAttempts": ${lambda_retry_attempts},
                "BackoffRate": 3
              }
            ],
            "Catch": [
              {
                "ErrorEquals": [
                  "States.ALL"
                ],
                "Next": "FailState",
                "ResultPath": "$.send_success_errors"
              }
            ],
            "End": true
          },
          "SendFailureToKafka": {
            "Comment": "Send failure result to Kafka",
            "Type": "Task",
            "Resource": "${lambda_send_failure_arn}",
            "HeartbeatSeconds": 60,
            "TimeoutSeconds": 300,
            "Parameters": {
              "execution_arn.$": "$$.Execution.Id",
              "input.$": "$"
            },
            "Retry": [
              {
                "ErrorEquals": [
                  "RetryException",
                  "States.Timeout",
                  "Lambda.ServiceException",
                  "Lambda.AWSLambdaException",
                  "Lambda.SdkClientException",
                  "Lambda.TooManyRequestsException"
                ],
                "IntervalSeconds": ${lambda_interval_seconds},
                "MaxAttempts": ${lambda_retry_attempts},
                "BackoffRate": 3
              }
            ],
            "Catch": [
              {
                "ErrorEquals": [
                  "States.ALL"
                ],
                "Next": "FailState",
                "ResultPath": "$.send_failure_errors"
              }
            ],
            "Next": "FailState"
          },
          "FailState": {
            "Type": "Fail"
          }
        }
      }
    }
  }
}
