2 class NotLoggedInException < Exception
4 def api(resources_kind, action, data=nil)
5 orvos_api_token = Thread.current[:orvos_api_token]
6 orvos_api_token = '' if orvos_api_token.nil?
7 dataargs = ['--data-urlencode',
8 "api_token=#{orvos_api_token}",
10 'Accept:application/json']
13 dataargs << '--data-urlencode'
14 if v.is_a? String or v.nil?
15 dataargs << "#{k}=#{v}"
16 elsif v == true or v == false
17 dataargs << "#{k}=#{v ? 1 : 0}"
19 dataargs << "#{k}=#{JSON.dump(v)}"
23 dataargs << '--data-urlencode' << '_method=GET'
26 resources_kind = class_kind(resources_kind).pluralize if resources_kind.is_a? Class
27 url = "#{self.orvos_v1_base}/#{resources_kind}#{action}"
36 resp = Oj.load(json, :symbol_keys => true)
38 if resp[:errors][0] == 'Not logged in'
39 raise NotLoggedInException.new
41 errors = resp[:errors]
42 errors = errors.join("\n\n") if errors.is_a? Array
43 raise "API errors:\n\n#{errors}\n"
49 def unpack_api_response(j, kind=nil)
50 if j.is_a? Hash and j[:items].is_a? Array and j[:kind].match(/(_list|List)$/)
51 j[:items].collect { |x| unpack_api_response x, j[:kind] }
52 elsif j.is_a? Hash and (kind || j[:kind])
53 oclass = self.kind_class(kind || j[:kind])
56 childkind = j["#{k.to_s}_kind".to_sym]
58 j[k] = self.unpack_api_response(j[k], childkind)
61 oclass.new.private_reload(j)
70 def orvos_login_url(params={})
71 if Rails.configuration.respond_to? :orvos_login_base
72 uri = Rails.configuration.orvos_login_base
74 uri = self.orvos_v1_base.sub(%r{/orvos/v\d+.*}, '/login')
77 uri += '?' << params.collect { |k,v|
78 CGI.escape(k.to_s) + '=' + CGI.escape(v.to_s)
83 def orvos_logout_url(params={})
84 orvos_login_url(params).sub('/login','/logout')
88 Rails.configuration.orvos_v1_base
92 @orvos_schema ||= api 'schema', ''
96 kind.match(/^orvos\#(.+?)(_list|List)?$/)[1].pluralize.classify.constantize rescue nil
99 def class_kind(resource_class)
100 resource_class.to_s.underscore