AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  lambda-dagger-sample
  Sample SAM Template for lambda-dagger

Globals:
  Function:
    Tracing: Active
    CodeUri: target/dagger-lambda-function-1.0.0-SNAPSHOT.jar
    Runtime: java11
    Timeout: 30
    MemorySize: 1024
    Environment:
      Variables:
        JAVA_TOOL_OPTIONS: "-XX:+TieredCompilation -XX:TieredStopAtLevel=1"
        PRODUCT_TABLE_NAME: !Ref ProductsTable

Resources:
  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: prod
      Name: My Lambda Dagger Sample API

  GetProductByIdFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: software.amazonaws.example.product.handler.GetProductByIdHandler::handleRequest
      Policies:
        - DynamoDBReadPolicy:
            TableName: !Ref ProductsTable
      Events:
        GetRequestById:
          Type: Api
          Properties:
            RestApiId: !Ref MyApi
            Path: /products/{id}
            Method: get

  GetProductByIdFunctionLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub "/aws/lambda/${GetProductByIdFunction}"
      RetentionInDays: 7

  GetProductsFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: software.amazonaws.example.product.handler.GetAllProductsHandler::handleRequest
      Policies:
        - DynamoDBReadPolicy:
            TableName: !Ref ProductsTable
      Events:
        GetRequest:
          Type: Api
          Properties:
            RestApiId: !Ref MyApi
            Path: /products
            Method: get

  GetProductsFunctionLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub "/aws/lambda/${GetProductsFunction}"
      RetentionInDays: 7

  PutProductFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: software.amazonaws.example.product.handler.CreateProductHandler::handleRequest
      Policies:
        - DynamoDBCrudPolicy:
            TableName: !Ref ProductsTable
      Events:
        PutRequest:
          Type: Api
          Properties:
            RestApiId: !Ref MyApi
            Path: /products/{id}
            Method: put

  PutProductFunctionLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub "/aws/lambda/${PutProductFunction}"
      RetentionInDays: 7

  DeleteProductFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: software.amazonaws.example.product.handler.DeleteProductHandler::handleRequest
      Policies:
        - DynamoDBCrudPolicy:
            TableName: !Ref ProductsTable
      Events:
        PutRequest:
          Type: Api
          Properties:
            RestApiId: !Ref MyApi
            Path: /products/{id}
            Method: delete

  DeleteProductFunctionLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub "/aws/lambda/${DeleteProductFunction}"
      RetentionInDays: 7

  ProductsTable:
    Type: AWS::DynamoDB::Table
    Properties:
      AttributeDefinitions:
        - AttributeName: 'PK'
          AttributeType: 'S'
      KeySchema:
        - AttributeName: 'PK'
          KeyType: 'HASH'
      BillingMode: PAY_PER_REQUEST

Outputs:
  DaggerApiEndpoint:
    Description: "API Gateway endpoint URL for Prod stage for Dagger sample function"
    Value: !Sub "https://${MyApi}.execute-api.${AWS::Region}.amazonaws.com/prod/products"