{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "Custom::ApiGatewayMethod sample template",
  "Parameters": {
    "RestApiCustomResourceLambdaName": {
      "Type": "String",
      "Default": "cfn-api-gateway-restapi-0-6-1",
      "Description": "The name of the ApiGatewayRestApi Lambda you deployed to test this stack."
    },
    "RestApiName": {
      "Type": "String",
      "Description": "Name for the API (required). Must be unique across your account for this Region."
    },
    "RestApiDescription": {
      "Type": "String",
      "Description": "Description for the API (optional)."
    },
    "RestApiBaseApiId": {
      "Type": "String",
      "Description": "API ID (not name, not ARN) from which to clone the base for the new API (optional). WARNING: Changing this value requires full replacement."
    },
    "MethodCustomResourceLambdaName": {
      "Type": "String",
      "Default": "cfn-api-gateway-method-0-3-0",
      "Description": "The name of the ApiGatewayMethod Lambda you deployed to test this stack."
    },
    "MethodAuthorizationType": {
      "Type": "String",
      "Default": "NONE",
      "Description": "Whether or not to require IAM authorization to invoke the method.",
      "AllowedValues": [
        "NONE",
        "AWS_IAM"
      ]
    },
    "MethodHttpMethod": {
      "Type": "String",
      "Default": "GET",
      "Description": "The HTTP method your deployed Method should use.",
      "AllowedValues": [
        "DELETE",
        "GET",
        "HEAD",
        "OPTIONS",
        "PATCH",
        "POST",
        "PUT"
      ]
    },
    "DoesMethodRequireApiKey": {
      "Type": "String",
      "Default": "NO",
      "Description": "Whether or not to require use of an API Key on the created method.",
      "AllowedValues": [
        "NO",
        "YES"
      ]
    }
  },
  "Conditions": {
    "NoApiDescription": {
      "Fn::Equals": [
        "",
        {
          "Ref": "RestApiDescription"
        }
      ]
    },
    "NoApiBaseApiId": {
      "Fn::Equals": [
        "",
        {
          "Ref": "RestApiBaseApiId"
        }
      ]
    },
    "MethodRequiresApiKey": {
      "Fn::Equals": [
        "YES",
        {
          "Ref": "DoesMethodRequireApiKey"
        }
      ]
    }
  },
  "Resources": {
    "MyRestApi": {
      "Type": "Custom::ApiGatewayRestApi",   
      "Properties": {
        "ServiceToken": {
          "Fn::Join": [
            ":",
            [
              "arn",
              "aws",
              "lambda",
              {
                "Ref": "AWS::Region"
              },
              {
                "Ref": "AWS::AccountId"
              },
              "function",
              {
                "Ref": "RestApiCustomResourceLambdaName"
              }
            ]
          ]
        },
        "Name": {
          "Ref": "RestApiName"
        },
        "Description": {
          "Fn::If": [
            "NoApiDescription",
            {
              "Ref": "AWS::NoValue"
            },
            {
              "Ref": "RestApiDescription"
            }
          ]
        },
        "BaseApiId": {
          "Fn::If": [
            "NoApiBaseApiId",
            {
              "Ref": "AWS::NoValue"
            },
            {
              "Ref": "RestApiBaseApiId"
            }
          ]
        }
      }
    },
    "MyMethod": {
      "Type": "Custom::ApiGatewayMethod",
      "Properties": {
        "ServiceToken": {
          "Fn::Join": [
            ":",
            [
              "arn",
              "aws",
              "lambda",
              {
                "Ref": "AWS::Region"
              },
              {
                "Ref": "AWS::AccountId"
              },
              "function",
              {
                "Ref": "MethodCustomResourceLambdaName"
              }
            ]
          ]
        },
        "ApiKeyRequired": {
          "Fn::If": [
            "MethodRequiresApiKey",
            true,
            false
          ]
        },
        "AuthorizationType": {
          "Ref": "MethodAuthorizationType"
        },
        "HttpMethod": {
          "Ref": "MethodHttpMethod"
        },
        "ResourceId": {
          "Fn::GetAtt": [
            "MyRestApi",
            "RootResourceId"
          ]
        },
        "RestApiId": {
          "Ref": "MyRestApi"
        },
        "RequestModels": {
          "application/json": "Empty"
        },
        "RequestParameters": {
          "method.request.querystring.fooparam": true
        }
      }
    }
  },
  "Outputs": {
    "MyRestApiId": {
      "Description": "The unique ID value across your entire account for the created API.",
      "Value": {
        "Ref": "MyRestApi"
      }
    },
    "MyRestApiRootResource": {
      "Description": "The 10 char alphanum ID of the / resource for MyRestApi",
      "Value": {
        "Fn::GetAtt": [
          "MyRestApi",
          "RootResourceId"
        ]
      }
    },
    "MyMethodConsoleUrl": {
      "Description": "The AWS Console URL for inspecting the created method.",
      "Value": {
        "Fn::Join": [
          "",
          [
            "https://console.aws.amazon.com/apigateway/home?region=",
            {
              "Ref": "AWS::Region"
            },
            "#/restapis/",
            {
              "Ref": "MyRestApi"
            },
            "/resources/",
            {
              "Fn::GetAtt": [
                "MyRestApi",
                "RootResourceId"
              ]
            },
            "/methods/",
            {
              "Ref": "MethodHttpMethod"
            }
          ]
        ]
      }
    }
  }
}
