Class: FHIR::ClientReply

Inherits:
Object
  • Object
show all
Defined in:
lib/fhir_client/model/client_reply.rb

Constant Summary collapse

@@path_regexes =
{
  '[type]' => "(#{FHIR::RESOURCES.join('|')})",
  '[id]' => FHIR::PRIMITIVES['id']['regex'],
  '[vid]' => FHIR::PRIMITIVES['id']['regex'],
  '[name]' => "([A-Za-z\-]+)"
}
@@rfs1123 =
/\A\s*
      (?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s*,\s*)?
      (\d{1,2})\s+
      (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+
      (\d{2,})\s+
      (\d{2})\s*
      :\s*(\d{2})\s*
      (?::\s*(\d{2}))?\s+
      ([+-]\d{4}|
UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|[A-IK-Z])/ix
@@header_regexes =
{
  'Content-Type' => Regexp.new("(#{FHIR::Formats::ResourceFormat::RESOURCE_XML.gsub('+', '\\\+')}|#{FHIR::Formats::ResourceFormat::RESOURCE_JSON.gsub('+', '\\\+')})(([ ;]+)(charset)([ =]+)(UTF-8|utf-8))?"),
  'Accept' => Regexp.new("(#{FHIR::Formats::ResourceFormat::RESOURCE_XML.gsub('+', '\\\+')}|#{FHIR::Formats::ResourceFormat::RESOURCE_JSON.gsub('+', '\\\+')})"),
  'Prefer' => Regexp.new('(return=minimal|return=representation)'),
  'ETag' => Regexp.new('(W\/)?"[\dA-Za-z]+"'),
  'If-Modified-Since' => @@rfs1123,
  'If-Match' => Regexp.new('(W\/)?"[\dA-Za-z]+"'),
  'If-None-Match' => Regexp.new('(W\/)?"[\dA-Za-z]+"'),
  'If-None-Exist' => Regexp.new('([\w\-]+(=[\w\-.:\/\|]*)?(&[\w\-]+(=[\w\-.:\/\|]*)?)*)?'),
  'Location' => Regexp.new("http(s)?:\/\/[A-Za-z0-9\/\\-\\.]+\/#{@@path_regexes['[type]']}\/#{@@path_regexes['[id]']}\/_history\/#{@@path_regexes['[vid]']}"),
  'Last-Modified' => @@rfs1123
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(request, response, client) ⇒ ClientReply

Returns a new instance of ClientReply.



51
52
53
54
55
56
# File 'lib/fhir_client/model/client_reply.rb', line 51

def initialize(request, response, client)
  @request = request
  @response = response
  @fhir_version = :stu3
  @fhir_version = client.fhir_version
end

Instance Attribute Details

#fhir_versionObject

Returns the value of attribute fhir_version.



49
50
51
# File 'lib/fhir_client/model/client_reply.rb', line 49

def fhir_version
  @fhir_version
end

#requestObject

:method => :get,
:url => 'http://bonfire.mitre.org/fhir/Patient/123/$everything',
:path => 'Patient/123/$everything'
:headers => {,
:payload => nil # body of request goes here in POST

}



40
41
42
# File 'lib/fhir_client/model/client_reply.rb', line 40

def request
  @request
end

#resourceObject

a FHIR resource



47
48
49
# File 'lib/fhir_client/model/client_reply.rb', line 47

def resource
  @resource
end

#resource_classObject

class of the :resource



48
49
50
# File 'lib/fhir_client/model/client_reply.rb', line 48

def resource_class
  @resource_class
end

#responseObject

:code => '200',
:headers => {,
:body => 'or json here'

}



46
47
48
# File 'lib/fhir_client/model/client_reply.rb', line 46

def response
  @response
end

Instance Method Details

#bodyObject



86
87
88
# File 'lib/fhir_client/model/client_reply.rb', line 86

def body
  @response[:body] unless @response.nil?
end

#codeObject



58
59
60
# File 'lib/fhir_client/model/client_reply.rb', line 58

def code
  @response[:code].to_i unless @response.nil?
end

#idObject



62
63
64
65
66
# File 'lib/fhir_client/model/client_reply.rb', line 62

def id
  return nil if @resource_class.nil?
  (self_link || @request[:url]) =~ %r{(?<=#{@resource_class.name.demodulize}\/)([^\/]+)}
  Regexp.last_match(1)
end

#is_valid?Boolean

Returns:

  • (Boolean)


97
98
99
# File 'lib/fhir_client/model/client_reply.rb', line 97

def is_valid?
  validate.empty?
end


82
83
84
# File 'lib/fhir_client/model/client_reply.rb', line 82

def self_link
  (@response[:headers]['content-location'] || @response[:headers]['location']) unless @response.nil? || @response[:headers].nil?
end

#to_hashObject



90
91
92
93
94
95
# File 'lib/fhir_client/model/client_reply.rb', line 90

def to_hash
  hash = {}
  hash['request'] = @request
  hash['response'] = @response
  hash
end

#validateObject



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/fhir_client/model/client_reply.rb', line 101

def validate
  rules = File.open(File.join(File.expand_path('..', File.dirname(File.absolute_path(__FILE__))), 'fhir_api_validation.json'), 'r:UTF-8', &:read)
  validation_rules = JSON.parse(rules)

  errors = []
  validation_rules.each do |rule|
    next unless rule['verb'] == @request[:method].to_s.upcase
    rule_match = false
    rule['path'].each do |path|
      rule_regex = path.gsub('/', '(\/)').gsub('?', '\?')
      @@path_regexes.each do |token, regex|
        rule_regex.gsub!(token, regex)
      end
      rule_match = true if Regexp.new(rule_regex) =~ @request[:path]
    end
    next unless rule_match
    # check the request headers
    errors << validate_headers("#{rule['interaction'].upcase} REQUEST", @request[:headers], rule['request']['headers'])
    # check the request body
    errors << validate_body("#{rule['interaction'].upcase} REQUEST", @request[:payload], rule['request']['body'])
    # check the response codes
    unless rule['response']['status'].include?(@response[:code].to_i)
      errors << "#{rule['interaction'].upcase} RESPONSE: Invalid response code: #{@response[:code]}"
    end
    next unless @response[:code].to_i < 400
    # check the response headers
    errors << validate_headers("#{rule['interaction'].upcase} RESPONSE", @response[:headers], rule['response']['headers'])
    # check the response body
    errors << validate_body("#{rule['interaction'].upcase} RESPONSE", @response[:body], rule['response']['body'])
  end
  errors.flatten
end

#versionObject



68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/fhir_client/model/client_reply.rb', line 68

def version
  version = nil
  link = self_link
  if link && link.include?('_history/')
    begin
      tokens = link.split('_history/')
      version = tokens.last.split('/').first
    rescue
      version = nil
    end
  end
  version
end