Class: FHIR::ClientReply

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

Constant Summary collapse

@@validation_rules =
JSON.parse( File.open(File.join(File.expand_path('..',File.dirname(File.absolute_path(__FILE__))),'fhir_api_validation.json'),'r:UTF-8',&:read) )
@@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) ⇒ ClientReply

Returns a new instance of ClientReply.



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

def initialize(request, response)
  @request = request
  @response = response
end

Instance Attribute Details

#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

}



42
43
44
# File 'lib/model/client_reply.rb', line 42

def request
  @request
end

#resourceObject

a FHIR resource



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

def resource
  @resource
end

#resource_classObject

class of the :resource



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

def resource_class
  @resource_class
end

#responseObject

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

}



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

def response
  @response
end

Instance Method Details

#bodyObject



76
77
78
# File 'lib/model/client_reply.rb', line 76

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

#codeObject



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

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

#idObject



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

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

#is_valid?Boolean

Returns:

  • (Boolean)


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

def is_valid?
  validate.empty?
end


72
73
74
# File 'lib/model/client_reply.rb', line 72

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

#to_hashObject



80
81
82
83
84
85
# File 'lib/model/client_reply.rb', line 80

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

#validateObject



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/model/client_reply.rb', line 91

def validate
  errors = []
  @@validation_rules.each do |rule|
    if 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
      if 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
        if !rule['response']['status'].include?(@response[:code].to_i)
          errors << "#{rule['interaction'].upcase} RESPONSE: Invalid response code: #{@response[:code]}" 
        end
        if @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
      end
    end
  end
  errors.flatten
end

#versionObject



67
68
69
70
# File 'lib/model/client_reply.rb', line 67

def version
  self_link =~ %r{(?<=_history\/)(\w+)}
  $1
end