the-city-admin 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/api/address.rb +51 -0
- data/lib/api/address_list.rb +62 -0
- data/lib/api/api_object.rb +100 -0
- data/lib/api/barcode.rb +43 -0
- data/lib/api/checkin.rb +37 -0
- data/lib/api/checkin_list.rb +62 -0
- data/lib/api/family.rb +47 -0
- data/lib/api/family_member.rb +28 -0
- data/lib/api/group.rb +162 -0
- data/lib/api/group_address.rb +31 -0
- data/lib/api/group_address_list.rb +63 -0
- data/lib/api/group_checkin.rb +36 -0
- data/lib/api/group_checkin_list.rb +63 -0
- data/lib/api/group_event_attendance.rb +28 -0
- data/lib/api/group_event_attendance_list.rb +63 -0
- data/lib/api/group_export.rb +22 -0
- data/lib/api/group_export_list.rb +63 -0
- data/lib/api/group_invitation.rb +26 -0
- data/lib/api/group_invitation_list.rb +63 -0
- data/lib/api/group_list.rb +74 -0
- data/lib/api/group_role.rb +27 -0
- data/lib/api/group_role_list.rb +62 -0
- data/lib/api/group_tag.rb +20 -0
- data/lib/api/group_tag_list.rb +62 -0
- data/lib/api/metric.rb +50 -0
- data/lib/api/metric_list.rb +72 -0
- data/lib/api/metric_measurement.rb +29 -0
- data/lib/api/metric_measurement_list.rb +62 -0
- data/lib/api/role.rb +43 -0
- data/lib/api/role_list.rb +73 -0
- data/lib/api/skill.rb +21 -0
- data/lib/api/skill_list.rb +73 -0
- data/lib/api/skilled_user_id_list.rb +73 -0
- data/lib/api/skilled_user_list.rb +73 -0
- data/lib/api/tag.rb +32 -0
- data/lib/api/tag_group_list.rb +73 -0
- data/lib/api/tag_list.rb +73 -0
- data/lib/api/terminology.rb +32 -0
- data/lib/api/terminology_list.rb +73 -0
- data/lib/api/user.rb +207 -0
- data/lib/api/user_address.rb +31 -0
- data/lib/api/user_address_list.rb +62 -0
- data/lib/api/user_admin_privilege.rb +28 -0
- data/lib/api/user_admin_privilege_list.rb +63 -0
- data/lib/api/user_barcode.rb +20 -0
- data/lib/api/user_count.rb +40 -0
- data/lib/api/user_family_list.rb +71 -0
- data/lib/api/user_family_member.rb +28 -0
- data/lib/api/user_invitation.rb +26 -0
- data/lib/api/user_invitation_list.rb +63 -0
- data/lib/api/user_list.rb +72 -0
- data/lib/api/user_note.rb +31 -0
- data/lib/api/user_note_list.rb +63 -0
- data/lib/api/user_process.rb +21 -0
- data/lib/api/user_process_list.rb +63 -0
- data/lib/api/user_role.rb +34 -0
- data/lib/api/user_role_list.rb +74 -0
- data/lib/api/user_skill.rb +22 -0
- data/lib/api/user_skill_list.rb +74 -0
- data/lib/api/web_hook.rb +34 -0
- data/lib/api/web_hook_list.rb +74 -0
- data/lib/auto_load.rb +23 -0
- data/lib/cachers/cache_adapter.rb +50 -0
- data/lib/cachers/file/json_cache.rb +135 -0
- data/lib/common.rb +124 -0
- data/lib/exceptions.rb +5 -0
- data/lib/readers/address_list_reader.rb +21 -0
- data/lib/readers/address_reader.rb +22 -0
- data/lib/readers/api_reader.rb +28 -0
- data/lib/readers/checkin_list_reader.rb +21 -0
- data/lib/readers/checkin_reader.rb +22 -0
- data/lib/readers/family_reader.rb +21 -0
- data/lib/readers/group_address_list_reader.rb +25 -0
- data/lib/readers/group_checkin_list_reader.rb +25 -0
- data/lib/readers/group_event_attendance_list_reader.rb +25 -0
- data/lib/readers/group_export_list_reader.rb +25 -0
- data/lib/readers/group_invitation_list_reader.rb +23 -0
- data/lib/readers/group_list_reader.rb +25 -0
- data/lib/readers/group_reader.rb +21 -0
- data/lib/readers/group_role_list_reader.rb +23 -0
- data/lib/readers/group_tag_list_reader.rb +23 -0
- data/lib/readers/metric_list_reader.rb +22 -0
- data/lib/readers/metric_measurement_list_reader.rb +21 -0
- data/lib/readers/metric_measurement_reader.rb +22 -0
- data/lib/readers/metric_reader.rb +21 -0
- data/lib/readers/role_list_reader.rb +21 -0
- data/lib/readers/skill_list_reader.rb +21 -0
- data/lib/readers/skilled_user_id_list_reader.rb +22 -0
- data/lib/readers/skilled_user_list_reader.rb +22 -0
- data/lib/readers/tag_group_list_reader.rb +22 -0
- data/lib/readers/tag_list_reader.rb +22 -0
- data/lib/readers/tag_reader.rb +22 -0
- data/lib/readers/terminology_list_reader.rb +22 -0
- data/lib/readers/terminology_reader.rb +22 -0
- data/lib/readers/user_address_list_reader.rb +25 -0
- data/lib/readers/user_admin_privilege_list_reader.rb +23 -0
- data/lib/readers/user_count_reader.rb +32 -0
- data/lib/readers/user_family_list_reader.rb +24 -0
- data/lib/readers/user_invitation_list_reader.rb +23 -0
- data/lib/readers/user_list_reader.rb +25 -0
- data/lib/readers/user_note_list_reader.rb +23 -0
- data/lib/readers/user_process_list_reader.rb +23 -0
- data/lib/readers/user_reader.rb +24 -0
- data/lib/readers/user_role_list_reader.rb +23 -0
- data/lib/readers/user_skill_list_reader.rb +23 -0
- data/lib/readers/web_hook_list_reader.rb +21 -0
- data/lib/the_city_admin.rb +82 -0
- data/lib/writers/api_writer.rb +54 -0
- data/lib/writers/family_writer.rb +25 -0
- data/lib/writers/group_address_writer.rb +32 -0
- data/lib/writers/group_writer.rb +25 -0
- data/lib/writers/metric_measurement_writer.rb +25 -0
- data/lib/writers/metric_writer.rb +29 -0
- data/lib/writers/skill_writer.rb +25 -0
- data/lib/writers/tag_writer.rb +27 -0
- data/lib/writers/terminology_writer.rb +19 -0
- data/lib/writers/user_address_writer.rb +32 -0
- data/lib/writers/user_admin_privilege_writer.rb +24 -0
- data/lib/writers/user_invitation_writer.rb +23 -0
- data/lib/writers/user_note_writer.rb +25 -0
- data/lib/writers/user_role_writer.rb +28 -0
- data/lib/writers/user_skill_writer.rb +23 -0
- data/lib/writers/user_writer.rb +46 -0
- data/lib/writers/web_hook_writer.rb +20 -0
- metadata +184 -0
data/lib/auto_load.rb
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module TheCity
|
|
2
|
+
|
|
3
|
+
require THECITY_LIB_DIR + '/exceptions.rb'
|
|
4
|
+
|
|
5
|
+
api_path = THECITY_LIB_DIR + '/api/'
|
|
6
|
+
require api_path + 'api_object.rb'
|
|
7
|
+
Dir["#{api_path}/*.rb"].each { |f| require(f) }
|
|
8
|
+
|
|
9
|
+
cache_path = THECITY_LIB_DIR + '/cachers/'
|
|
10
|
+
require cache_path + 'cache_adapter.rb'
|
|
11
|
+
|
|
12
|
+
cache_file_path = THECITY_LIB_DIR + '/cachers/file/'
|
|
13
|
+
Dir["#{cache_file_path}/*.rb"].each { |f| require(f) }
|
|
14
|
+
|
|
15
|
+
readers_path = THECITY_LIB_DIR + '/readers/'
|
|
16
|
+
require readers_path + 'api_reader.rb'
|
|
17
|
+
Dir["#{readers_path}/*.rb"].each { |f| require(f) }
|
|
18
|
+
|
|
19
|
+
writers_path = THECITY_LIB_DIR + '/writers/'
|
|
20
|
+
require writers_path + 'api_writer.rb'
|
|
21
|
+
Dir["#{writers_path}/*.rb"].each { |f| require(f) }
|
|
22
|
+
|
|
23
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module TheCity
|
|
2
|
+
|
|
3
|
+
# This adapter is the standard for all caching objects.
|
|
4
|
+
class CacheAdapter
|
|
5
|
+
|
|
6
|
+
# Constructor
|
|
7
|
+
def initialize()
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# Save data to the cache.
|
|
12
|
+
#
|
|
13
|
+
# * <b>key</b> The key to use to save the cache.
|
|
14
|
+
# * <b>data</b> The JSON data to be saved.
|
|
15
|
+
# * <b>expire_on (optional)</b> The datetime to expire the cache.
|
|
16
|
+
#
|
|
17
|
+
# Returns true on success or a string error message on false.
|
|
18
|
+
def save_data(key, data, expire_on = nil)
|
|
19
|
+
raise 'The save_data method must be implemented'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# Get the data from the cache.
|
|
24
|
+
#
|
|
25
|
+
# * <b>key</b> The key to use to get the cache.
|
|
26
|
+
#
|
|
27
|
+
# Returns the data for the key in the same way it was stored.
|
|
28
|
+
def get_data(key)
|
|
29
|
+
raise 'The get_data method must be implemented'
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# Expire the cache.
|
|
34
|
+
#
|
|
35
|
+
# * <b>key</b> The key to use to expire the cache.
|
|
36
|
+
def expire_cache!(key)
|
|
37
|
+
raise 'The expire_cache method must be implemented'
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# Check if the cache has expired.
|
|
42
|
+
#
|
|
43
|
+
# * <b>key</b> The key to use to check if the cache has expired.
|
|
44
|
+
def is_cache_expired?(key)
|
|
45
|
+
raise 'The is_cache_expired method must be implemented'
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Project:: Admin-Ruby
|
|
2
|
+
# File:: json_cache.rb
|
|
3
|
+
|
|
4
|
+
require 'fileutils'
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
module TheCity
|
|
8
|
+
|
|
9
|
+
# This class caches the data in a JSON file.
|
|
10
|
+
class JsonCache < CacheAdapter
|
|
11
|
+
|
|
12
|
+
# Constructor.
|
|
13
|
+
def initialize()
|
|
14
|
+
super
|
|
15
|
+
@cache_dir = THECITY_STORAGE_DIR + subdomain + '/';
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# Save data to the cache.
|
|
20
|
+
#
|
|
21
|
+
# @param string key The key to use to save the cache.
|
|
22
|
+
# @param string data The JSON data to be saved.
|
|
23
|
+
# @param string expire_in The number of seconds to pass before expiring the cache.
|
|
24
|
+
#
|
|
25
|
+
# @return mixed Returns true on success or a string error message on false.
|
|
26
|
+
def save_data(key, data, expire_in = nil)
|
|
27
|
+
expire_in = 3600 if expire_in.nil? # 3600 seconds = 1 hour
|
|
28
|
+
expire_in += Time.now.to_i
|
|
29
|
+
|
|
30
|
+
_create_cache_directory_if_needed
|
|
31
|
+
expire_cache!(key)
|
|
32
|
+
|
|
33
|
+
filename = "#{key}-#{expire_in}-json.cache"
|
|
34
|
+
|
|
35
|
+
begin
|
|
36
|
+
File.open(@cache_dir + filename, 'w') {|f| f.write( Marshal.dump(data) ) }
|
|
37
|
+
rescue
|
|
38
|
+
return 'Unable to write to file'
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
return true
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# Get the file name where the cache is stored.
|
|
46
|
+
#
|
|
47
|
+
# @param string $key The key used for the cache.
|
|
48
|
+
#
|
|
49
|
+
# @return mixed Returns the name of the cache file if found or false.
|
|
50
|
+
def get_cache_file(key)
|
|
51
|
+
_find_file_key(key)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# Get the data from the cache.
|
|
56
|
+
#
|
|
57
|
+
# @param string key The key to use to get the cache.
|
|
58
|
+
#
|
|
59
|
+
# @return JSON data.
|
|
60
|
+
def get_data(key)
|
|
61
|
+
filename = _find_file_key(key)
|
|
62
|
+
return nil if filename.nil?
|
|
63
|
+
file = File.open(@cache_dir + filename, "rb")
|
|
64
|
+
contents = file.read
|
|
65
|
+
return Marshal.load(contents)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
# Expire the cache.
|
|
70
|
+
#
|
|
71
|
+
# @param string key The key to use to expire the cache.
|
|
72
|
+
#
|
|
73
|
+
# @throws Exception if unable to remove cache file.
|
|
74
|
+
def expire_cache!(key)
|
|
75
|
+
file = _find_file_key(key)
|
|
76
|
+
unless file.nil?
|
|
77
|
+
begin
|
|
78
|
+
File.unlink(@cache_dir + file)
|
|
79
|
+
rescue
|
|
80
|
+
raise new Exception("Unable to remove cache file: $file")
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
# Check if the cache has expired.
|
|
87
|
+
#
|
|
88
|
+
# @param string key The key to use to check if the cache has expired.
|
|
89
|
+
#
|
|
90
|
+
# @return boolean If the cache does not exist or is expired then true, otherwise false.
|
|
91
|
+
def is_cache_expired?(key)
|
|
92
|
+
time_stamp_position = 1;
|
|
93
|
+
fname = _find_file_key(key)
|
|
94
|
+
return true if fname.nil?
|
|
95
|
+
|
|
96
|
+
fname_a = fname.split('-')
|
|
97
|
+
if Time.now.to_i > fname_a[time_stamp_position].to_i
|
|
98
|
+
return true
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
return false;
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
private
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
# @ignore
|
|
109
|
+
def _create_cache_directory_if_needed
|
|
110
|
+
unless File.exist?( @cache_dir )
|
|
111
|
+
unless FileUtils.mkdir_p( @cache_dir )
|
|
112
|
+
raise new Exception('Failed to create cache directory')
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
# @ignore
|
|
119
|
+
def _find_file_key(key)
|
|
120
|
+
if File.exist?(@cache_dir)
|
|
121
|
+
return Dir.entries( @cache_dir ).detect{ |f| f.include?("#{key}-") }
|
|
122
|
+
end
|
|
123
|
+
return nil
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
# @ignore
|
|
128
|
+
def _all_cache_files(key)
|
|
129
|
+
Dir.entries( @cache_dir ).select{ |f| f.include?("-json.cache") }
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
end
|
|
135
|
+
|
data/lib/common.rb
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
module TheCity
|
|
2
|
+
require 'cgi'
|
|
3
|
+
|
|
4
|
+
def self.admin_request(method, path, params = {})
|
|
5
|
+
# data_params = params.inject({}) {|h, (k,v)| h.update({k => v.nil? ? v : v.to_s})}
|
|
6
|
+
# flattened_params = self._flatten_params(data_params)
|
|
7
|
+
|
|
8
|
+
flattened_params = self._flatten_params(params)
|
|
9
|
+
|
|
10
|
+
# puts "############################"
|
|
11
|
+
# puts "flattened_params: #{flattened_params}"
|
|
12
|
+
# puts "############################"
|
|
13
|
+
|
|
14
|
+
headers = self._build_admin_headers(method, path, flattened_params)
|
|
15
|
+
url = THE_CITY_ADMIN_PATH+path
|
|
16
|
+
|
|
17
|
+
response =
|
|
18
|
+
case method
|
|
19
|
+
when :post
|
|
20
|
+
Typhoeus::Request.post(url, {:headers => headers, :params => flattened_params})
|
|
21
|
+
when :get
|
|
22
|
+
Typhoeus::Request.get(url, {:headers => headers, :params => flattened_params})
|
|
23
|
+
when :put
|
|
24
|
+
Typhoeus::Request.put(url, {:headers => headers, :params => flattened_params})
|
|
25
|
+
when :delete
|
|
26
|
+
Typhoeus::Request.delete(url, {:headers => headers, :params => flattened_params})
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
unless response.success?
|
|
30
|
+
if response.curl_error_message != 'No error'
|
|
31
|
+
raise TheCityExceptions::UnableToConnectToTheCity.new(response.curl_error_message)
|
|
32
|
+
else
|
|
33
|
+
begin
|
|
34
|
+
error_messages = JSON.parse(response.body)['error_message']
|
|
35
|
+
rescue
|
|
36
|
+
raise TheCityExceptions::UnknownErrorConnectingToTheCity.new('Unknown error when connecting to The City')
|
|
37
|
+
else
|
|
38
|
+
raise TheCityExceptions::TheCityResponseError.new(error_messages)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
response
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def self._flatten_params(params, prefix='')
|
|
48
|
+
retval = []
|
|
49
|
+
if params.instance_of?(Array)
|
|
50
|
+
if params.empty?
|
|
51
|
+
retval << self._flatten_params('', "#{prefix.to_s}[0]")
|
|
52
|
+
else
|
|
53
|
+
params.each_with_index do |value, indx|
|
|
54
|
+
retval << self._flatten_params(value, "#{prefix.to_s}[#{indx}]")
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
elsif params.instance_of?(Hash)
|
|
58
|
+
params.each do |key, value|
|
|
59
|
+
retval << self._flatten_params(value, prefix.empty? ? key.to_s : "#{prefix}[#{key.to_s}]")
|
|
60
|
+
end
|
|
61
|
+
else # assume string
|
|
62
|
+
retval << "#{prefix}=#{params}"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
if prefix.empty?
|
|
66
|
+
hvals = {}
|
|
67
|
+
retval.flatten.sort.each { |v| hvals[v.split('=')[0]] = v.split('=')[1] }
|
|
68
|
+
hvals
|
|
69
|
+
else
|
|
70
|
+
retval.flatten.sort
|
|
71
|
+
end
|
|
72
|
+
#retval.flatten.sort
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def self._build_admin_headers(method, path, params)
|
|
78
|
+
# get_vars = '?' + params.to_a.sort.collect { |kv_pair| "#{kv_pair[0]}=#{kv_pair[1]}" }.join('&')
|
|
79
|
+
# get_vars = '' if get_vars == '?'
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
get_vars = '?' + params.to_a.sort.collect { |kv_pair|
|
|
83
|
+
if kv_pair[1].class == Array
|
|
84
|
+
puts "ARRAY"
|
|
85
|
+
kv_pair[1].each_with_index do |v, indx|
|
|
86
|
+
"#{kv_pair[0]}[#{indx}]=#{v}"
|
|
87
|
+
end
|
|
88
|
+
else
|
|
89
|
+
"#{kv_pair[0]}=#{kv_pair[1]}"
|
|
90
|
+
end
|
|
91
|
+
}.join('&')
|
|
92
|
+
get_vars = '' if get_vars == '?'
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
# puts "############################"
|
|
96
|
+
# puts "params: #{params}"
|
|
97
|
+
# puts '------------'
|
|
98
|
+
# puts "get_vars: #{get_vars}"
|
|
99
|
+
# puts "############################"
|
|
100
|
+
|
|
101
|
+
method_request = method.to_s.upcase
|
|
102
|
+
url = THE_CITY_ADMIN_PATH + path + get_vars
|
|
103
|
+
current_time = Time.now.to_i.to_s
|
|
104
|
+
string_to_sign = current_time.to_s + method_request + url
|
|
105
|
+
unencoded_hmac = OpenSSL::HMAC.digest('sha256', TheCity::AdminApi::API_KEY, string_to_sign)
|
|
106
|
+
unescaped_hmac = Base64.encode64(unencoded_hmac).chomp
|
|
107
|
+
hmac_signature = CGI.escape(unescaped_hmac)
|
|
108
|
+
|
|
109
|
+
headers = {'X-City-Sig' => hmac_signature,
|
|
110
|
+
'X-City-User-Token' => TheCity::AdminApi::API_TOKEN,
|
|
111
|
+
'X-City-Time' => current_time,
|
|
112
|
+
'Accept' => 'application/vnd.thecity.admin.v1+json'}
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
# This is causing issues.... not sure if it is needed (docs might be lieing)
|
|
116
|
+
# if [:post, :put].include?(method)
|
|
117
|
+
# headers['Content-Type'] = 'application/json'
|
|
118
|
+
# headers['Content-Length'] = params.to_json.length
|
|
119
|
+
# end
|
|
120
|
+
|
|
121
|
+
headers
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
end
|
data/lib/exceptions.rb
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module TheCity
|
|
2
|
+
|
|
3
|
+
class AddressListReader < ApiReader
|
|
4
|
+
|
|
5
|
+
# Constructor.
|
|
6
|
+
#
|
|
7
|
+
# @param options A hash of options for requesting data from the server.
|
|
8
|
+
# @param [CacheAdapter] cacher (optional) The cacher to be used to cache data.
|
|
9
|
+
def initialize(options = {}, cacher = nil)
|
|
10
|
+
page = options[:page] || 1
|
|
11
|
+
@class_key = "address_list_#{page}"
|
|
12
|
+
@url_data_path = "/addresses"
|
|
13
|
+
@url_data_params = {:page => page}
|
|
14
|
+
|
|
15
|
+
# The object to store and load the cache.
|
|
16
|
+
@cacher = cacher unless cacher.nil?
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module TheCity
|
|
2
|
+
|
|
3
|
+
class AddressReader < ApiReader
|
|
4
|
+
|
|
5
|
+
# Constructor.
|
|
6
|
+
#
|
|
7
|
+
# @param address_id The ID of the address to load.
|
|
8
|
+
# @param options (optional) Options for including more information.
|
|
9
|
+
# @param [CacheAdapter] cacher (optional) The cacher to be used to cache data.
|
|
10
|
+
def initialize(address_id, options = {}, cacher = nil)
|
|
11
|
+
@class_key = "address_#{address_id}"
|
|
12
|
+
@url_data_path = "/addresses/#{address_id}"
|
|
13
|
+
|
|
14
|
+
# The object to store and load the cache.
|
|
15
|
+
@cacher = cacher unless cacher.nil?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module TheCity
|
|
2
|
+
|
|
3
|
+
# This adapter is the standard for all loading objects.
|
|
4
|
+
class ApiReader
|
|
5
|
+
|
|
6
|
+
# Constructor
|
|
7
|
+
# def initialize
|
|
8
|
+
# end
|
|
9
|
+
|
|
10
|
+
# Loads the list
|
|
11
|
+
#
|
|
12
|
+
# @return the data loaded in a JSON object.
|
|
13
|
+
def load_feed
|
|
14
|
+
if !@cacher.nil? and !@cacher.is_cache_expired?( @class_key )
|
|
15
|
+
data = @cacher.get_data( @class_key )
|
|
16
|
+
else
|
|
17
|
+
@url_data_params ||= {}
|
|
18
|
+
response = TheCity::admin_request(:get, @url_data_path, @url_data_params)
|
|
19
|
+
data = JSON.parse(response.body)
|
|
20
|
+
@cacher.save_data(@class_key, data) unless @cacher.nil?
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
return data
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module TheCity
|
|
2
|
+
|
|
3
|
+
class CheckinListReader < ApiReader
|
|
4
|
+
|
|
5
|
+
# Constructor.
|
|
6
|
+
#
|
|
7
|
+
# @param options A hash of options for requesting data from the server.
|
|
8
|
+
# @param [CacheAdapter] cacher (optional) The cacher to be used to cache data.
|
|
9
|
+
def initialize(options = {}, cacher = nil)
|
|
10
|
+
page = options[:page] || 1
|
|
11
|
+
@class_key = "checkin_list_#{page}"
|
|
12
|
+
@url_data_path = "/checkins"
|
|
13
|
+
@url_data_params = {:page => page}
|
|
14
|
+
|
|
15
|
+
# The object to store and load the cache.
|
|
16
|
+
@cacher = cacher unless cacher.nil?
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module TheCity
|
|
2
|
+
|
|
3
|
+
class CheckinReader < ApiReader
|
|
4
|
+
|
|
5
|
+
# Constructor.
|
|
6
|
+
#
|
|
7
|
+
# @param checkin_id The ID of the checkin to load.
|
|
8
|
+
# @param options (optional) Options for including more information.
|
|
9
|
+
# @param [CacheAdapter] cacher (optional) The cacher to be used to cache data.
|
|
10
|
+
def initialize(checkin_id, options = {}, cacher = nil)
|
|
11
|
+
@class_key = "checkin_#{tag_id}"
|
|
12
|
+
@url_data_path = "/checkins/#{tag_id}"
|
|
13
|
+
|
|
14
|
+
# The object to store and load the cache.
|
|
15
|
+
@cacher = cacher unless cacher.nil?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
|