# DynamoDB and Kinesis event source mappings

# These data and policy resources programmatically grant access to either dynamodb or kinesis streams
data "aws_iam_policy_document" "lambda_event_source_mapping_policy_data" {
  count = var.event_source_mapping_enabled ? 1 : 0

  statement {
    effect = "Allow"

    actions = [
      "${var.event_source_mapping_resource_type}:DescribeStream",
      "${var.event_source_mapping_resource_type}:GetRecords",
      "${var.event_source_mapping_resource_type}:GetShardIterator",
      "${var.event_source_mapping_resource_type}:ListStreams",
    ]

    # TF-UPGRADE-TODO: In Terraform v0.10 and earlier, it was sometimes necessary to
    # force an interpolation expression to be interpreted as a list by wrapping it
    # in an extra set of list brackets. That form was supported for compatibility in
    # v0.11, but is no longer supported in Terraform v0.12.
    #
    # If the expression in the following list itself returns a list, remove the
    # brackets to avoid interpretation as a list of lists. If the expression
    # returns a single list item then leave it as-is and remove this TODO comment.
    resources = [
      local.event_source_mapping_iam_resource_arn[var.event_source_mapping_resource_type],
    ]
  }
}

resource "aws_iam_role_policy" "lambda_event_source_mapping_policy" {
  count  = var.event_source_mapping_enabled ? 1 : 0
  name   = "${local.generated_function_name}-${var.event_source_mapping_resource_type}-${replace(var.event_source_mapping_stream_name, ":", "-")}-stream-RO"
  role   = aws_iam_role.lambda_execution_role.name
  policy = data.aws_iam_policy_document.lambda_event_source_mapping_policy_data[0].json
}

resource "aws_lambda_event_source_mapping" "event_source_mapping" {
  count                          = var.event_source_mapping_enabled ? 1 : 0
  batch_size                     = var.event_source_mapping_batch_size
  event_source_arn               = local.event_source_mapping_arn[var.event_source_mapping_resource_type]
  enabled                        = var.event_source_mapping_enabled
  function_name                  = aws_lambda_function.function.arn
  starting_position              = var.event_source_mapping_starting_position
  starting_position_timestamp    = var.event_source_mapping_starting_position_timestamp
  bisect_batch_on_function_error = var.event_source_mapping_bisect_batch_on_function_error
  parallelization_factor         = var.event_source_mapping_parallelization_factor
  maximum_retry_attempts         = var.event_source_mapping_maximum_retry_attempts
  maximum_record_age_in_seconds  = var.event_source_mapping_maximum_record_age_in_seconds

  dynamic "filter_criteria" {
    for_each = var.event_source_mapping_filter_criteria_pattern != "" ? [""] : []
    content {
      filter {
        pattern = var.event_source_mapping_filter_criteria_pattern
      }
    }
  }

  maximum_batching_window_in_seconds = var.event_source_mapping_batch_window
}
