Sha256: a88b63326ee858690e24f2067902a47a4cfd5f932174fd81bbe2905dc33691b6

Contents?: true

Size: 1.99 KB

Versions: 11

Compression:

Stored size: 1.99 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
        Jets::Resource.truncate_id "#{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 " + Jets::Resource.truncate_id("#{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('*','').gsub('-','_').camelize
    end
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
jets-2.1.1 lib/jets/resource/api_gateway/resource.rb
jets-2.1.0 lib/jets/resource/api_gateway/resource.rb
jets-2.0.6 lib/jets/resource/api_gateway/resource.rb
jets-2.0.5 lib/jets/resource/api_gateway/resource.rb
jets-2.0.4 lib/jets/resource/api_gateway/resource.rb
jets-2.0.3 lib/jets/resource/api_gateway/resource.rb
jets-2.0.1 lib/jets/resource/api_gateway/resource.rb
jets-2.0.0 lib/jets/resource/api_gateway/resource.rb
jets-1.9.32 lib/jets/resource/api_gateway/resource.rb
jets-1.9.31 lib/jets/resource/api_gateway/resource.rb
jets-1.9.30 lib/jets/resource/api_gateway/resource.rb