Sha256: cf7289464934d2688d213aa878be01b5d825a63a7c81d1d4e51abfe54c77d5ca

Contents?: true

Size: 1.92 KB

Versions: 93

Compression:

Stored size: 1.92 KB

Contents

module Jets::Resource::ApiGateway
  class Resource < Jets::Resource::Base
    def initialize(path, internal: false)
      @path = path # Examples: "posts/:id/edit" or "posts"
      @internal = internal
    end

    def definition
      {
        resource_logical_id => {
          type: "AWS::ApiGateway::Resource",
          properties: {
            parent_id: parent_id,
            path_part: path_part,
            rest_api_id: "!Ref #{RestApi.logical_id(@internal)}",
          }
        }
      }
    end

    def outputs
      {
        logical_id => "!Ref #{logical_id}",
      }
    end

    def resource_logical_id
      if @path == ''
        "RootResourceId"
      else
        "#{path_logical_id(@path)}ApiResource"
      end
    end

    # For parameter description
    def desc
      path.empty? ? 'Homepage route: /' : "Route for: /#{path}"
    end

    def parent_id
      if @path.include?('/') # posts/:id or posts/:id/edit
        parent_path = @path.split('/')[0..-2].join('/')
        parent_logical_id = path_logical_id(parent_path)
        "!Ref #{parent_logical_id}ApiResource"
      else
        "!GetAtt #{RestApi.logical_id(@internal)}.RootResourceId"
      end
    end

    def path_part
      last_part = path.split('/').last
      last_part.split('/').map {|s| transform_capture(s) }.join('/') if last_part
    end

    # Modify the path to conform to API Gateway capture expressions
    def path
      @path.split('/').map {|s| transform_capture(s) }.join('/')
    end

    def transform_capture(text)
      if text.starts_with?(':')
        text = text.sub(':','')
        text = "{#{text}}" # :foo => {foo}
      end
      if text.starts_with?('*')
        text = text.sub('*','')
        text = "{#{text}+}" # *foo => {foo+}
      end
      text
    end

  private
    # Similar path_logical_id method in resource/route.rb
    def path_logical_id(path)
      path.gsub('/','_').gsub(':','').gsub('*','').camelize
    end
  end
end

Version data entries

93 entries across 93 versions & 2 rubygems

Version Path
jets-1.9.28 lib/jets/resource/api_gateway/resource.rb
jets-1.9.27 lib/jets/resource/api_gateway/resource.rb
jets-1.9.26 lib/jets/resource/api_gateway/resource.rb
jets-1.9.25 lib/jets/resource/api_gateway/resource.rb
jets-1.9.24 lib/jets/resource/api_gateway/resource.rb
jets-1.9.23 lib/jets/resource/api_gateway/resource.rb
jets-1.9.22 lib/jets/resource/api_gateway/resource.rb
jets-1.9.21 lib/jets/resource/api_gateway/resource.rb
jets-1.9.20 lib/jets/resource/api_gateway/resource.rb
jets-1.9.19 lib/jets/resource/api_gateway/resource.rb
jets-1.9.18 lib/jets/resource/api_gateway/resource.rb
jets-1.9.17 lib/jets/resource/api_gateway/resource.rb
jets-1.9.16 lib/jets/resource/api_gateway/resource.rb
jets-1.9.15 lib/jets/resource/api_gateway/resource.rb
jets-1.9.14 lib/jets/resource/api_gateway/resource.rb
jets-1.9.13 lib/jets/resource/api_gateway/resource.rb
jets-1.9.12 lib/jets/resource/api_gateway/resource.rb
jets-1.9.11 lib/jets/resource/api_gateway/resource.rb
jets-1.9.10 lib/jets/resource/api_gateway/resource.rb
jets-1.9.9 lib/jets/resource/api_gateway/resource.rb