AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: stepfunctions-eventbridge-lambda

Globals:
  Function:
    Runtime: java11
    MemorySize: 512
    Timeout: 25

#Lambda Functions
Resources:
  OrderState:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: OrderState
      Handler: com.example.OrderState::handleRequest
      CodeUri: target/sourceCode.zip

  ProcessOrder:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: ProcessOrder
      Handler: com.example.ProcessOrder::handleRequest
      CodeUri: target/sourceCode.zip

  #EventBridge custom Event Bus
  OrdersEventBus:
    Type: AWS::Events::EventBus
    Properties:
      Name: OrdersEventBus

  #EventBridge Event Rule
  ProcessOrderEventRule:
    Type: AWS::Events::Rule
    Properties:
      Name: ProcessOrderEventRule
      EventBusName: !GetAtt OrdersEventBus.Arn
      Targets:
        - Arn: !GetAtt ProcessOrder.Arn
          Id: "ProcessOrder"
      EventPattern:
        source:
          - "com.example.orders"

  ## Step Function
  StateMachine:
    Type: AWS::Serverless::StateMachine
    Properties:
      DefinitionUri: sfn-definition.asl.yml
      DefinitionSubstitutions:
        OrderState: !GetAtt OrderState.Arn
      Name: ProcessOrders
      Policies:
        - Version: "2012-10-17"
          Statement:
            - Effect: Allow
              Action:
                - "cloudwatch:*"
                - "logs:*"
                - "lambda:InvokeFunction"
                - "events:PutEvents"
              Resource: "*"

  ProcessOrderEventBridgeRuleInvokeLambda:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !Ref ProcessOrder
      Action: "lambda:InvokeFunction"
      Principal: "events.amazonaws.com"
      SourceArn: !GetAtt ProcessOrderEventRule.Arn