AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  Wild Rydes Asynchronous Messaging Workshop - Lab 3

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 70
    Runtime: python3.7
    Handler: app.lambda_handler 
    Tags:
      project: wild-rydes
      workshop: asynchronous-messaging-workshop
      author: aws
    
Resources:
  RequestForQuotesService:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: request-for-quotes-service/
      Environment:
        Variables:
          TABLE_NAME: !Ref RidesBookingTable
          TOPIC_ARN: !Ref RequestForQuotesTopic
      Policies:
        - DynamoDBCrudPolicy: # https://github.com/awslabs/serverless-application-model/blob/develop/samtranslator/policy_templates_data/policy_templates.json
            TableName:
              !Ref RidesBookingTable
        - SNSPublishMessagePolicy: # https://github.com/awslabs/serverless-application-model/blob/develop/samtranslator/policy_templates_data/policy_templates.json
            TopicName:
              !GetAtt RequestForQuotesTopic.TopicName
      Events:
        RideBooking:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /submit-instant-ride-rfq
            Method: post

  QueryForQuotesService:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: query-for-quotes-service/
      Environment:
        Variables:
          TABLE_NAME: !Ref RidesBookingTable
          TOPIC_ARN: !Ref RequestForQuotesTopic
      Policies:
        - DynamoDBCrudPolicy: # https://github.com/awslabs/serverless-application-model/blob/develop/samtranslator/policy_templates_data/policy_templates.json
            TableName:
              !Ref RidesBookingTable
        - SNSPublishMessagePolicy: # https://github.com/awslabs/serverless-application-model/blob/develop/samtranslator/policy_templates_data/policy_templates.json
            TopicName:
              !GetAtt RequestForQuotesTopic.TopicName
      Events:
        RideBooking:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /query-instant-ride-rfq/{id}
            Method: get

  RidesBookingTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: !Sub "RidesBooking-${AWS::StackName}"
      AttributeDefinitions:
      - AttributeName: id
        AttributeType: S
      - AttributeName: responder
        AttributeType: S
      KeySchema:
      - AttributeName: id
        KeyType: HASH
      - AttributeName: responder
        KeyType: RANGE
      BillingMode: PAY_PER_REQUEST

  RequestForQuotesTopic:
    Type: AWS::SNS::Topic

  RequestForQuotesResponseQueue:
    Type: AWS::SQS::Queue
    Properties:
      VisibilityTimeout: 120

  UnicornManagementResource1:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: generic-unicorn-management-service/
      Environment:
        Variables:
          SERVICE_NAME: UnicornManagementResource1
          QUEUE_URL: !Ref RequestForQuotesResponseQueue
      Policies:
        - AWSLambdaExecute
        - SQSSendMessagePolicy: # https://github.com/awslabs/serverless-application-model/blob/develop/samtranslator/policy_templates_data/policy_templates.json
            QueueName:
              !GetAtt RequestForQuotesResponseQueue.QueueName
      Events:
        SqsJobQueue:
          Type: SNS
          Properties:
            Topic: !Ref RequestForQuotesTopic

  UnicornManagementResource2:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: generic-unicorn-management-service/
      Environment:
        Variables:
          SERVICE_NAME: UnicornManagementResource2
          QUEUE_URL: !Ref RequestForQuotesResponseQueue
      Policies:
        - AWSLambdaExecute
        - SQSSendMessagePolicy: # https://github.com/awslabs/serverless-application-model/blob/develop/samtranslator/policy_templates_data/policy_templates.json
            QueueName:
              !GetAtt RequestForQuotesResponseQueue.QueueName
      Events:
        SqsJobQueue:
          Type: SNS
          Properties:
            Topic: !Ref RequestForQuotesTopic

  UnicornManagementResource3:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: generic-unicorn-management-service/
      Environment:
        Variables:
          SERVICE_NAME: UnicornManagementResource3
          QUEUE_URL: !Ref RequestForQuotesResponseQueue
      Policies:
        - AWSLambdaExecute
        - SQSSendMessagePolicy: # https://github.com/awslabs/serverless-application-model/blob/develop/samtranslator/policy_templates_data/policy_templates.json
            QueueName:
              !GetAtt RequestForQuotesResponseQueue.QueueName
      Events:
        SqsJobQueue:
          Type: SNS
          Properties:
            Topic: !Ref RequestForQuotesTopic

  UnicornManagementResource4:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: generic-unicorn-management-service/
      Environment:
        Variables:
          SERVICE_NAME: UnicornManagementResource4
          QUEUE_URL: !Ref RequestForQuotesResponseQueue
      Policies:
        - AWSLambdaExecute
        - SQSSendMessagePolicy: # https://github.com/awslabs/serverless-application-model/blob/develop/samtranslator/policy_templates_data/policy_templates.json
            QueueName:
              !GetAtt RequestForQuotesResponseQueue.QueueName
      Events:
        SqsJobQueue:
          Type: SNS
          Properties:
            Topic: !Ref RequestForQuotesTopic

  UnicornManagementResource5:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: generic-unicorn-management-service/
      Environment:
        Variables:
          SERVICE_NAME: UnicornManagementResource5
          QUEUE_URL: !Ref RequestForQuotesResponseQueue
      Policies:
        - AWSLambdaExecute
        - SQSSendMessagePolicy: # https://github.com/awslabs/serverless-application-model/blob/develop/samtranslator/policy_templates_data/policy_templates.json
            QueueName:
              !GetAtt RequestForQuotesResponseQueue.QueueName
      Events:
        SqsJobQueue:
          Type: SNS
          Properties:
            Topic: !Ref RequestForQuotesTopic

  UnicornManagementResource6:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: generic-unicorn-management-service/
      Environment:
        Variables:
          SERVICE_NAME: UnicornManagementResource6
          QUEUE_URL: !Ref RequestForQuotesResponseQueue
      Policies:
        - AWSLambdaExecute
        - SQSSendMessagePolicy: # https://github.com/awslabs/serverless-application-model/blob/develop/samtranslator/policy_templates_data/policy_templates.json
            QueueName:
              !GetAtt RequestForQuotesResponseQueue.QueueName
      Events:
        SqsJobQueue:
          Type: SNS
          Properties:
            Topic: !Ref RequestForQuotesTopic

  UnicornManagementResource7:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: generic-unicorn-management-service/
      Environment:
        Variables:
          SERVICE_NAME: UnicornManagementResource7
          QUEUE_URL: !Ref RequestForQuotesResponseQueue
      Policies:
        - AWSLambdaExecute
        - SQSSendMessagePolicy: # https://github.com/awslabs/serverless-application-model/blob/develop/samtranslator/policy_templates_data/policy_templates.json
            QueueName:
              !GetAtt RequestForQuotesResponseQueue.QueueName
      Events:
        SqsJobQueue:
          Type: SNS
          Properties:
            Topic: !Ref RequestForQuotesTopic

  UnicornManagementResource8:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: generic-unicorn-management-service/
      Environment:
        Variables:
          SERVICE_NAME: UnicornManagementResource8
          QUEUE_URL: !Ref RequestForQuotesResponseQueue
      Policies:
        - AWSLambdaExecute
        - SQSSendMessagePolicy: # https://github.com/awslabs/serverless-application-model/blob/develop/samtranslator/policy_templates_data/policy_templates.json
            QueueName:
              !GetAtt RequestForQuotesResponseQueue.QueueName
      Events:
        SqsJobQueue:
          Type: SNS
          Properties:
            Topic: !Ref RequestForQuotesTopic

  UnicornManagementResource9:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: generic-unicorn-management-service/
      Environment:
        Variables:
          SERVICE_NAME: UnicornManagementResource9
          QUEUE_URL: !Ref RequestForQuotesResponseQueue
      Policies:
        - AWSLambdaExecute
        - SQSSendMessagePolicy: # https://github.com/awslabs/serverless-application-model/blob/develop/samtranslator/policy_templates_data/policy_templates.json
            QueueName:
              !GetAtt RequestForQuotesResponseQueue.QueueName
      Events:
        SqsJobQueue:
          Type: SNS
          Properties:
            Topic: !Ref RequestForQuotesTopic

  UnicornManagementResource10:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: generic-unicorn-management-service/
      Environment:
        Variables:
          SERVICE_NAME: UnicornManagementResource10
          QUEUE_URL: !Ref RequestForQuotesResponseQueue
      Policies:
        - AWSLambdaExecute
        - SQSSendMessagePolicy: # https://github.com/awslabs/serverless-application-model/blob/develop/samtranslator/policy_templates_data/policy_templates.json
            QueueName:
              !GetAtt RequestForQuotesResponseQueue.QueueName
      Events:
        SqsJobQueue:
          Type: SNS
          Properties:
            Topic: !Ref RequestForQuotesTopic

  QuotesResponseService:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: quotes-response-service/
      Environment:
        Variables:
          TABLE_NAME: !Ref RidesBookingTable
      Policies:
        - AWSLambdaExecute
        - DynamoDBCrudPolicy: # https://github.com/awslabs/serverless-application-model/blob/develop/samtranslator/policy_templates_data/policy_templates.json
            TableName:
              !Ref RidesBookingTable
      Events:
        SQSQueue:
          Type: SQS
          Properties:
            Queue: !GetAtt RequestForQuotesResponseQueue.Arn
            BatchSize: 1

Outputs:
  RideBookingApiSubmitInstantRideRfqEndpoint:
    Description: "API Gateway endpoint URL for Prod stage for RideBookingService submit-instant-ride-rfq resource"
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/submit-instant-ride-rfq/"
  RideBookingApiQueryInstantRideRfqEndpoint:
    Description: "API Gateway endpoint URL for Prod stage for RideBookingService query-instant-ride-rfq resource"
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/query-instant-ride-rfq/{id}"
#  RideBookingService:
#    Description: "RideBookingService Lambda Function ARN"
#    Value: !GetAtt RideBookingService.Arn
  RequestForQuotesTopic:
    Description: "Amazon SNS topic ARN for RequestForQuotes topic"
    Value: !Ref RequestForQuotesTopic
  RidesBookingTable:
    Description: "Rides Booking table ID"
    Value: !Ref RidesBookingTable