{
  "openapi": "3.0.1",
  "info": {
    "title": "${title}",
    "description": "${description}",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "${server_url}",
      "x-amazon-apigateway-endpoint-configuration": {
        "disableExecuteApiEndpoint": true
      }
    }
  ],
  "paths": {
    "/callback": {
      "post": {
        "operationId": "postCallback",
        "description": "Slack interactive component callback",
        "parameters": [
          {
            "$ref": "#/components/parameters/x-slack-request-timestamp"
          },
          {
            "$ref": "#/components/parameters/x-slack-signature"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-request-validator": "Validate query string parameters and headers",
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "uri": "arn:aws:apigateway:${region}:states:action/StartSyncExecution",
          "httpMethod": "POST",
          "credentials": "${role_arn}",
          "timeoutInMillis": 3000,
          "requestTemplates": {
            "application/json": "{\n  \"stateMachineArn\": \"$stageVariables.callbackStateMachineArn\",\n  \"input\": \"{\\\"routeKey\\\":\\\"$context.httpMethod $context.resourcePath\\\",\\\"signature\\\":\\\"$input.params('x-slack-signature')\\\",\\\"ts\\\":\\\"$input.params('x-slack-request-timestamp')\\\",\\\"body\\\":\\\"$util.base64Encode($input.body)\\\"}\"\n}",
            "application/x-www-form-urlencoded": "{\n  \"stateMachineArn\": \"$stageVariables.callbackStateMachineArn\",\n  \"input\": \"{\\\"routeKey\\\":\\\"$context.httpMethod $context.resourcePath\\\",\\\"signature\\\":\\\"$input.params('x-slack-signature')\\\",\\\"ts\\\":\\\"$input.params('x-slack-request-timestamp')\\\",\\\"body\\\":\\\"$util.base64Encode($input.body)\\\"}\"\n}"
          },
          "responses": {
            "default": {
              "statusCode": "200",
              "responseTemplates": {
                "application/json": "#if($input.path('$.status') != \"SUCCEEDED\")\n#set($context.responseOverride.status = 403)\n{\"message\":\"Forbidden\"}#else\n#set($output = $util.parseJson($input.path('$.output')))\n#set($context.responseOverride.status = $output.statusCode)\n#if($output.headers.location)#set($context.responseOverride.header.location = $output.headers.location)#end\n#if($output.body)$output.body#end\n#end"
              }
            }
          }
        }
      }
    },
    "/event": {
      "post": {
        "operationId": "postEvent",
        "description": "Slack event callback",
        "parameters": [
          {
            "$ref": "#/components/parameters/x-slack-request-timestamp"
          },
          {
            "$ref": "#/components/parameters/x-slack-signature"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-request-validator": "Validate query string parameters and headers",
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "uri": "arn:aws:apigateway:${region}:states:action/StartSyncExecution",
          "httpMethod": "POST",
          "credentials": "${role_arn}",
          "timeoutInMillis": 3000,
          "requestTemplates": {
            "application/json": "{\n  \"stateMachineArn\": \"$stageVariables.eventStateMachineArn\",\n  \"input\": \"{\\\"routeKey\\\":\\\"$context.httpMethod $context.resourcePath\\\",\\\"signature\\\":\\\"$input.params('x-slack-signature')\\\",\\\"ts\\\":\\\"$input.params('x-slack-request-timestamp')\\\",\\\"body\\\":\\\"$util.base64Encode($input.body)\\\"}\"\n}",
            "application/x-www-form-urlencoded": "{\n  \"stateMachineArn\": \"$stageVariables.eventStateMachineArn\",\n  \"input\": \"{\\\"routeKey\\\":\\\"$context.httpMethod $context.resourcePath\\\",\\\"signature\\\":\\\"$input.params('x-slack-signature')\\\",\\\"ts\\\":\\\"$input.params('x-slack-request-timestamp')\\\",\\\"body\\\":\\\"$util.base64Encode($input.body)\\\"}\"\n}"
          },
          "responses": {
            "default": {
              "statusCode": "200",
              "responseTemplates": {
                "application/json": "#if($input.path('$.status') != \"SUCCEEDED\")\n#set($context.responseOverride.status = 403)\n{\"message\":\"Forbidden\"}#else\n#set($output = $util.parseJson($input.path('$.output')))\n#set($context.responseOverride.status = $output.statusCode)\n#if($output.headers.location)#set($context.responseOverride.header.location = $output.headers.location)#end\n#if($output.body)$output.body#end\n#end"
              }
            }
          }
        }
      }
    },
    "/install": {
      "get": {
        "operationId": "getInstall",
        "description": "Begin OAuth flow",
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-request-validator": "Validate query string parameters and headers",
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "uri": "arn:aws:apigateway:${region}:states:action/StartSyncExecution",
          "httpMethod": "POST",
          "credentials": "${role_arn}",
          "timeoutInMillis": 3000,
          "requestTemplates": {
            "application/json": "{\n  \"stateMachineArn\": \"$stageVariables.installStateMachineArn\",\n  \"input\": \"{\\\"routeKey\\\":\\\"$context.httpMethod $context.resourcePath\\\"}\"\n}",
            "application/x-www-form-urlencoded": "{\n  \"stateMachineArn\": \"$stageVariables.installStateMachineArn\",\n  \"input\": \"{\\\"routeKey\\\":\\\"$context.httpMethod $context.resourcePath\\\"}\"\n}"
          },
          "responses": {
            "default": {
              "statusCode": "200",
              "responseTemplates": {
                "application/json": "#if($input.path('$.status') != \"SUCCEEDED\")\n#set($context.responseOverride.status = 403)\n{\"message\":\"Forbidden\"}#else\n#set($output = $util.parseJson($input.path('$.output')))\n#set($context.responseOverride.status = $output.statusCode)\n#if($output.headers.location)#set($context.responseOverride.header.location = $output.headers.location)#end\n#if($output.body)$output.body#end\n#end"
              }
            }
          }
        }
      }
    },
    "/menu": {
      "post": {
        "operationId": "postMenu",
        "description": "Slack interactive menu request",
        "parameters": [
          {
            "$ref": "#/components/parameters/x-slack-request-timestamp"
          },
          {
            "$ref": "#/components/parameters/x-slack-signature"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-request-validator": "Validate query string parameters and headers",
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "uri": "arn:aws:apigateway:${region}:states:action/StartSyncExecution",
          "httpMethod": "POST",
          "credentials": "${role_arn}",
          "timeoutInMillis": 3000,
          "requestTemplates": {
            "application/json": "{\n  \"stateMachineArn\": \"$stageVariables.menuStateMachineArn\",\n  \"input\": \"{\\\"routeKey\\\":\\\"$context.httpMethod $context.resourcePath\\\",\\\"signature\\\":\\\"$input.params('x-slack-signature')\\\",\\\"ts\\\":\\\"$input.params('x-slack-request-timestamp')\\\",\\\"body\\\":\\\"$util.base64Encode($input.body)\\\"}\"\n}",
            "application/x-www-form-urlencoded": "{\n  \"stateMachineArn\": \"$stageVariables.menuStateMachineArn\",\n  \"input\": \"{\\\"routeKey\\\":\\\"$context.httpMethod $context.resourcePath\\\",\\\"signature\\\":\\\"$input.params('x-slack-signature')\\\",\\\"ts\\\":\\\"$input.params('x-slack-request-timestamp')\\\",\\\"body\\\":\\\"$util.base64Encode($input.body)\\\"}\"\n}"
          },
          "responses": {
            "default": {
              "statusCode": "200",
              "responseTemplates": {
                "application/json": "#if($input.path('$.status') != \"SUCCEEDED\")\n#set($context.responseOverride.status = 403)\n{\"message\":\"Forbidden\"}#else\n#set($output = $util.parseJson($input.path('$.output')))\n#set($context.responseOverride.status = $output.statusCode)\n#if($output.headers.location)#set($context.responseOverride.header.location = $output.headers.location)#end\n#if($output.body)$output.body#end\n#end"
              }
            }
          }
        }
      }
    },
    "/oauth": {
      "get": {
        "operationId": "getOAuth",
        "description": "Complete OAuth flow",
        "parameters": [
          {
            "$ref": "#/components/parameters/code"
          },
          {
            "$ref": "#/components/parameters/state"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-request-validator": "Validate query string parameters and headers",
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "uri": "arn:aws:apigateway:${region}:states:action/StartSyncExecution",
          "httpMethod": "POST",
          "credentials": "${role_arn}",
          "timeoutInMillis": 3000,
          "requestTemplates": {
            "application/json": "{\n  \"stateMachineArn\": \"$stageVariables.oauthStateMachineArn\",\n  \"input\": \"{\\\"routeKey\\\":\\\"$context.httpMethod $context.resourcePath\\\",\\\"code\\\":\\\"$input.params('code')\\\",\\\"state\\\":\\\"$input.params('state')\\\"}\"\n}",
            "application/x-www-form-urlencoded": "{\n  \"stateMachineArn\": \"$stageVariables.oauthStateMachineArn\",\n  \"input\": \"{\\\"routeKey\\\":\\\"$context.httpMethod $context.resourcePath\\\",\\\"code\\\":\\\"$input.params('code')\\\",\\\"state\\\":\\\"$input.params('state')\\\"}\"\n}"
          },
          "responses": {
            "default": {
              "statusCode": "200",
              "responseTemplates": {
                "application/json": "#if($input.path('$.status') != \"SUCCEEDED\")\n#set($context.responseOverride.status = 403)\n{\"message\":\"Forbidden\"}#else\n#set($output = $util.parseJson($input.path('$.output')))\n#set($context.responseOverride.status = $output.statusCode)\n#if($output.headers.location)#set($context.responseOverride.header.location = $output.headers.location)#end\n#if($output.body)$output.body#end\n#end"
              }
            }
          }
        }
      }
    },
    "/slash": {
      "post": {
        "operationId": "postSlash",
        "description": "Slack slash command",
        "parameters": [
          {
            "$ref": "#/components/parameters/x-slack-request-timestamp"
          },
          {
            "$ref": "#/components/parameters/x-slack-signature"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-request-validator": "Validate query string parameters and headers",
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "uri": "arn:aws:apigateway:${region}:states:action/StartSyncExecution",
          "httpMethod": "POST",
          "credentials": "${role_arn}",
          "timeoutInMillis": 3000,
          "requestTemplates": {
            "application/json": "{\n  \"stateMachineArn\": \"$stageVariables.slashStateMachineArn\",\n  \"input\": \"{\\\"routeKey\\\":\\\"$context.httpMethod $context.resourcePath\\\",\\\"signature\\\":\\\"$input.params('x-slack-signature')\\\",\\\"ts\\\":\\\"$input.params('x-slack-request-timestamp')\\\",\\\"body\\\":\\\"$util.base64Encode($input.body)\\\"}\"\n}",
            "application/x-www-form-urlencoded": "{\n  \"stateMachineArn\": \"$stageVariables.slashStateMachineArn\",\n  \"input\": \"{\\\"routeKey\\\":\\\"$context.httpMethod $context.resourcePath\\\",\\\"signature\\\":\\\"$input.params('x-slack-signature')\\\",\\\"ts\\\":\\\"$input.params('x-slack-request-timestamp')\\\",\\\"body\\\":\\\"$util.base64Encode($input.body)\\\"}\"\n}"
          },
          "responses": {
            "default": {
              "statusCode": "200",
              "responseTemplates": {
                "application/json": "#if($input.path('$.status') != \"SUCCEEDED\")\n#set($context.responseOverride.status = 403)\n{\"message\":\"Forbidden\"}#else\n#set($output = $util.parseJson($input.path('$.output')))\n#set($context.responseOverride.status = $output.statusCode)\n#if($output.headers.location)#set($context.responseOverride.header.location = $output.headers.location)#end\n#if($output.body)$output.body#end\n#end"
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "parameters": {
      "code": {
        "name": "code",
        "in": "query",
        "required": true,
        "schema": {
          "type": "string"
        }
      },
      "state": {
        "name": "state",
        "in": "query",
        "required": true,
        "schema": {
          "type": "string"
        }
      },
      "x-slack-request-timestamp": {
        "name": "x-slack-request-timestamp",
        "in": "header",
        "required": true,
        "schema": {
          "type": "string"
        }
      },
      "x-slack-signature": {
        "name": "x-slack-signature",
        "in": "header",
        "required": true,
        "schema": {
          "type": "string"
        }
      }
    },
    "schemas": {
      "Empty": {
        "title": "Empty Schema",
        "type": "object"
      }
    }
  },
  "x-amazon-apigateway-request-validators": {
    "Validate query string parameters and headers": {
      "validateRequestBody": false,
      "validateRequestParameters": true
    }
  }
}