Class: ThreeScaleToolbox::OpenAPI::OAS3

Inherits:
Object
  • Object
show all
Defined in:
lib/3scale_toolbox/openapi/oas3.rb

Overview

OAS3 object

  • OAS3.title -> string

  • OAS3.description -> string

  • OAS3.version -> string

  • OAS3.base_path -> string

  • OAS3.host -> string

  • OAS3.scheme -> string

  • OAS3.operation -> array of operation hash

    • operation hash properties

      • :verb

      • :path

      • :description

      • :operation_id

  • OAS3.security -> security hash

    • security hash properties

      • :id -> string

      • :type -> string

      • :name -> string

      • :in_f -> string

      • :flows -> hash

        • :implicit_flow_enabled -> bool

        • :direct_access_grants_enabled -> bool

        • :service_accounts_enabled -> bool

        • :standard_flow_enabled -> bool

      • :scopes -> array of string

  • OAS3.service_backend_version -> string (‘1’,‘2’,‘oidc’)

  • OAS3.set_server_url -> def(spec, url)

  • OAS3.set_oauth2_urls-> def(spec, scheme_id, authorization_url, token_url)

Constant Summary collapse

META_SCHEMA_PATH =
File.expand_path('../../../resources/oas3_meta_schema.json', __dir__)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#definitionObject (readonly)

Returns the value of attribute definition.



47
48
49
# File 'lib/3scale_toolbox/openapi/oas3.rb', line 47

def definition
  @definition
end

Class Method Details

.build(path, raw, validate: true) ⇒ Object



41
42
43
44
45
# File 'lib/3scale_toolbox/openapi/oas3.rb', line 41

def self.build(path, raw, validate: true)
  self.validate(raw) if validate

  new(path, raw)
end

.validate(raw) ⇒ Object



36
37
38
39
# File 'lib/3scale_toolbox/openapi/oas3.rb', line 36

def self.validate(raw)
  meta_schema = JSON.parse(File.read(META_SCHEMA_PATH))
  JSON::Validator.validate!(meta_schema, raw)
end

Instance Method Details

#base_pathObject



61
62
63
64
65
66
67
# File 'lib/3scale_toolbox/openapi/oas3.rb', line 61

def base_path
  # If there are many? take first
  # From https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#openapi-object
  # If the servers property is not provided, or is an empty array,
  # the default value would be a Server Object with a url value of /
  server_objects(&:path).first || '/'
end

#descriptionObject



53
54
55
# File 'lib/3scale_toolbox/openapi/oas3.rb', line 53

def description
  definition.info['description']
end

#hostObject



69
70
71
72
73
74
75
# File 'lib/3scale_toolbox/openapi/oas3.rb', line 69

def host
  # If there are many? take first
  server_objects do |url|
    # URI::HTTP is parent of URI::HTTPS, so both covered
    "#{url.host}:#{url.port}" if url.kind_of?(URI::HTTP)
  end.first
end

#operationsObject



82
83
84
# File 'lib/3scale_toolbox/openapi/oas3.rb', line 82

def operations
  @operations ||= parse_operations
end

#schemeObject



77
78
79
80
# File 'lib/3scale_toolbox/openapi/oas3.rb', line 77

def scheme
  # If there are many? take first
  server_objects(&:scheme).first
end

#securityObject



86
87
88
# File 'lib/3scale_toolbox/openapi/oas3.rb', line 86

def security
  @security ||= parse_security
end

#service_backend_versionObject



90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/3scale_toolbox/openapi/oas3.rb', line 90

def service_backend_version
  # default authentication mode if no security requirement
  return '1' if security.nil?

  case security[:type]
  when 'oauth2'
    'oidc'
  when 'apiKey'
    '1'
  else
    raise ThreeScaleToolbox::Error, "Unexpected security scheme type #{security[:type]}"
  end
end

#set_oauth2_urls(spec, sec_scheme_id, authorization_url, token_url) ⇒ Object

Update given spec with urls It is expected identified security scheme to be oauth2 type



107
108
109
110
111
112
113
114
115
116
117
# File 'lib/3scale_toolbox/openapi/oas3.rb', line 107

def set_oauth2_urls(spec, sec_scheme_id, authorization_url, token_url)
  sec_scheme_obj = spec.dig('components', 'securitySchemes', sec_scheme_id)
  if sec_scheme_obj.nil? || sec_scheme_obj['type'] != 'oauth2'
    raise ThreeScaleToolbox::Error, "Expected security scheme {#{sec_scheme_id}} not found or not oauth2"
  end

  sec_scheme_obj['flows'].each do |flow_key, flow_obj|
    flow_obj['authorizationUrl'] = authorization_url if %w[implicit authorizationCode].include?(flow_key)
    flow_obj['tokenUrl'] = token_url if %w[password clientCredentials authorizationCode].include?(flow_key)
  end
end

#set_server_url(spec, url) ⇒ Object



119
120
121
# File 'lib/3scale_toolbox/openapi/oas3.rb', line 119

def set_server_url(spec, url)
  spec['servers'] = [{ 'url' => url }]
end

#titleObject



49
50
51
# File 'lib/3scale_toolbox/openapi/oas3.rb', line 49

def title
  definition.info['title']
end

#versionObject



57
58
59
# File 'lib/3scale_toolbox/openapi/oas3.rb', line 57

def version
  definition.info['version']
end