summaryrefslogtreecommitdiff
path: root/web/lib/api.rb
diff options
context:
space:
mode:
authorJochen Topf <jochen@topf.org>2013-01-02 19:33:54 +0100
committerJochen Topf <jochen@topf.org>2013-01-02 19:33:54 +0100
commit387d3cfb7c150591f167bae16ca7f7128062aed8 (patch)
tree2695534b5ec3eb94a29d5e1fb9e2a352f9c32a80 /web/lib/api.rb
parent4ddaaeb4d6acb9d48be3ca48cc18daff7191fa8d (diff)
downloadtaginfo-387d3cfb7c150591f167bae16ca7f7128062aed8.tar
taginfo-387d3cfb7c150591f167bae16ca7f7128062aed8.tar.gz
Move paging parameter handling into new class
Diffstat (limited to 'web/lib/api.rb')
-rw-r--r--web/lib/api.rb111
1 files changed, 111 insertions, 0 deletions
diff --git a/web/lib/api.rb b/web/lib/api.rb
new file mode 100644
index 0000000..28fe786
--- /dev/null
+++ b/web/lib/api.rb
@@ -0,0 +1,111 @@
+
+class API
+
+ @@paths = {}
+
+ attr_accessor :version, :path, :parameters, :paging, :filter, :sort, :result, :description, :example, :ui
+
+ def self.paths
+ @@paths
+ end
+
+ def initialize(version, path, doc)
+ @version = version
+ @path = path
+ @doc = doc
+
+ doc.each_pair do |k,v|
+ instance_variable_set("@#{k}".to_sym, v)
+ end
+
+ @@paths[version] = {} unless @@paths[version]
+ @@paths[version][path] = self
+ end
+
+ def complete_path
+ '/api/' + version.to_s + '/' + path
+ end
+
+ def show_paging
+ paging || 'no'
+ end
+
+ def show_parameters
+ return '<span class="empty">none</span>' unless parameters
+ list = []
+ parameters.keys.sort{ |a,b| a.to_s <=> b.to_s }.each do |p|
+ list << "<tt>#{p}</tt> &mdash; #{parameters[p]}"
+ end
+ list.join('<br/>')
+ end
+
+ def show_filter
+ return '<span class="empty">none</span>' unless filter
+ list = []
+ filter.keys.sort{ |a,b| a.to_s <=> b.to_s }.each do |f|
+ list << "<tt>#{f}</tt> &mdash; #{filter[f][:doc]}"
+ end
+ list.join('<br/>')
+ end
+
+ def show_example
+ return '' if example.nil?
+ params = []
+ example.each_pair do |k,v|
+ params << "#{k}=#{v}"
+ end
+ if params.empty?
+ return complete_path
+ else
+ return complete_path + '?' + params.join('&')
+ end
+ end
+
+ def show_ui
+ return '' if example.nil?
+ ui
+ end
+
+ def show_sort
+ return '<span class="empty">none</span>' unless sort
+ sort.map{ |s| "<tt>#{s}</tt>" }.join(', ')
+ end
+
+ def show_result
+ return '<span class="empty">unknown</span>' if result.nil?
+ return result if result.is_a?(String)
+ '<pre>' + JSON.pretty_generate(result).gsub(/"(STRING|INT|FLOAT|BOOL)"/, '\1') + '</pre>'
+ end
+
+end
+
+class APIParameters
+
+ attr_reader :page, :results_per_page
+
+ def initialize(p)
+ if p[:rp].nil? || p[:rp] == '0' || p[:rp] == '' || p[:page].nil? || p[:page] == '0' || p[:page] == ''
+ @page = 0
+ @results_per_page = 0
+ else
+ if p[:rp] !~ /^[0-9]{1,3}$/
+ raise ArgumentError, 'results per page must be integer between 0 and 999'
+ end
+ if p[:page] !~ /^[0-9]{1,4}$/
+ raise ArgumentError, 'page must be integer between 0 and 9999'
+ end
+ @page = p[:page].to_i
+ @results_per_page = p[:rp].to_i
+ end
+ end
+
+ def do_paging?
+ @results_per_page != 0
+ end
+
+ def first_result
+ @results_per_page * (@page - 1)
+ end
+
+end
+