Class: Jets::Resource::ApiGateway::Method

Inherits:
Base
  • Object
show all
Includes:
Authorization
Defined in:
lib/jets/resource/api_gateway/method.rb,
lib/jets/resource/api_gateway/method/authorization.rb

Direct Known Subclasses

Cors

Defined Under Namespace

Modules: Authorization

Instance Method Summary collapse

Methods inherited from Base

#resource

Constructor Details

#initialize(route) ⇒ Method

route - Jets::Route



10
11
12
# File 'lib/jets/resource/api_gateway/method.rb', line 10

def initialize(route)
  @route = route
end

Instance Method Details

#corsObject



70
71
72
# File 'lib/jets/resource/api_gateway/method.rb', line 70

def cors
  Cors.new(@route)
end

#definitionObject



14
15
16
17
18
19
20
21
# File 'lib/jets/resource/api_gateway/method.rb', line 14

def definition
  {
    method_logical_id => {
      type: "AWS::ApiGateway::Method",
      properties: props
    }
  }
end

#method_logical_idObject



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/jets/resource/api_gateway/method.rb', line 44

def method_logical_id
  # https://stackoverflow.com/questions/6104240/how-do-i-strip-non-alphanumeric-characters-from-a-string-and-keep-spaces
  # Add path to the logical id to allow 2 different paths to be connected to the same controller action.
  # Example:
  #
  #   root "jets/public#show"
  #   any "*catchall", to: "jets/public#show"
  #
  # Without the path in the logical id, the logical id would be ShowApiMethod for both routes and only the
  # last one would be created in the CloudFormation template.
  path = @route.path.gsub('*','')
          .gsub(/[^0-9a-z]/i, ' ')
          .gsub(/\s+/, '_')
  path = nil if path == ''
  http_verb = @route.method.downcase
  [path, "{namespace}_#{http_verb}_api_method"].compact.join('_')
end

#propsObject



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/jets/resource/api_gateway/method.rb', line 23

def props
  props = {
    resource_id: "!Ref #{resource_id}",
    rest_api_id: "!Ref #{RestApi.logical_id}",
    http_method: @route.method,
    request_parameters: {},
    authorization_type: authorization_type,
    api_key_required: api_key_required?,
    integration: {
      integration_http_method: "POST",
      type: "AWS_PROXY",
      uri: "!Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${{namespace}LambdaFunction.Arn}/invocations"
    },
    method_responses: []
  }
  props[:authorizer_id] = authorizer_id if authorizer_id
  props[:authorization_scopes] = authorization_scopes if authorization_scopes

  props
end

#replacementsObject



62
63
64
65
66
67
68
# File 'lib/jets/resource/api_gateway/method.rb', line 62

def replacements
  # mimic task to grab replacements, we want the namespace to be the lambda function's namespace
  resources = [definition]
  task = Jets::Lambda::Task.new(@route.controller_name, @route.action_name,
           resources: resources)
  task.replacements
end