seatsio 1.0.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.
@@ -0,0 +1,11 @@
1
+ def create_change_best_available_object_status_request(number, status, categories = nil, extra_data = nil, hold_token = nil, order_id = nil)
2
+ result = {}
3
+ best_available = {'number': number}
4
+ best_available[:categories] = categories if categories != nil
5
+ best_available[:extraData] = extra_data if extra_data != nil
6
+ result[:status] = status
7
+ result[:bestAvailable] = best_available
8
+ result[:holdToken] = hold_token if hold_token != nil
9
+ result[:orderId] = order_id if order_id != nil
10
+ result
11
+ end
@@ -0,0 +1,30 @@
1
+ def create_change_object_status_request(object_or_objects, status, hold_token, order_id, event_key_or_keys)
2
+ result = {}
3
+ result[:objects] = normalize(object_or_objects)
4
+ result[:status] = status
5
+ result[:holdToken] = hold_token if hold_token != nil
6
+ result[:orderId] = order_id if order_id != nil
7
+ if event_key_or_keys.is_a? Array
8
+ result[:events] = event_key_or_keys
9
+ else
10
+ result[:events] = [event_key_or_keys]
11
+ end
12
+
13
+ result
14
+ end
15
+
16
+ def normalize(object_or_objects)
17
+ if object_or_objects.is_a? Array
18
+ if object_or_objects.length == 0
19
+ []
20
+ end
21
+
22
+ result = []
23
+ object_or_objects.each do |object|
24
+ result << object
25
+ end
26
+ return result
27
+
28
+ end
29
+ normalize([object_or_objects])
30
+ end
@@ -0,0 +1,150 @@
1
+ require "seatsio/exception"
2
+ require "base64"
3
+ require "seatsio/httpClient"
4
+ require "seatsio/domain"
5
+ require "json"
6
+ require "cgi"
7
+ require "seatsio/domain"
8
+ require "seatsio/events/change_object_status_request"
9
+ require "seatsio/events/change_best_available_object_status_request"
10
+
11
+ module Seatsio
12
+
13
+ class EventsClient
14
+ def initialize(secret_key, base_url)
15
+ @http_client = ::Seatsio::HttpClient.new(secret_key, base_url)
16
+ end
17
+
18
+ def create(key: nil, event_key: nil, book_whole_tables: nil, table_booking_modes: nil)
19
+ payload = build_event_request(chart_key: key, event_key: event_key, book_whole_tables: book_whole_tables, table_booking_modes: table_booking_modes)
20
+ response = @http_client.post("events", payload)
21
+ Domain::Event.new(response)
22
+ end
23
+
24
+ def update(key:, chart_key: nil, event_key: nil, book_whole_tables: nil, table_booking_modes: nil)
25
+ payload = build_event_request(chart_key: chart_key, event_key: event_key, book_whole_tables: book_whole_tables, table_booking_modes: table_booking_modes)
26
+ @http_client.post("/events/#{key}", payload)
27
+ end
28
+
29
+ def update_extra_data(key:, object:, extra_data: nil)
30
+ payload = build_extra_data_request(extra_data)
31
+ @http_client.post("events/#{key}/objects/#{object}/actions/update-extra-data", payload)
32
+ end
33
+
34
+ def update_extra_datas(key:, extra_data:)
35
+ payload = build_extra_data_request(extra_data)
36
+ @http_client.post("events/#{key}/actions/update-extra-data", payload)
37
+ end
38
+
39
+ def retrieve_object_status(key:, object_key:)
40
+ url = "events/#{key}/objects/#{CGI::escape(object_key).gsub('+','%20')}"
41
+ response = @http_client.get(url)
42
+ Domain::ObjectStatus.new(response)
43
+ end
44
+
45
+ # @param [Object] event_key_or_keys
46
+ # @param [Object] object_or_objects
47
+ # @param [Object] hold_token
48
+ # @param [Object] order_id
49
+ def book(event_key_or_keys, object_or_objects, hold_token = nil, order_id = nil)
50
+ self.change_object_status(event_key_or_keys, object_or_objects, Domain::ObjectStatus::BOOKED, hold_token, order_id)
51
+ end
52
+
53
+ def change_object_status(event_key_or_keys, object_or_objects, status, hold_token = nil, order_id = nil)
54
+ request = create_change_object_status_request(object_or_objects, status, hold_token, order_id, event_key_or_keys)
55
+ request[:params] = {
56
+ 'expand' => 'labels'
57
+ }
58
+ response = @http_client.post("seasons/actions/change-object-status", request)
59
+ Domain::ChangeObjectStatusResult.new(response)
60
+ end
61
+
62
+ def hold(event_key_or_keys, object_or_objects, hold_token, order_id = nil)
63
+ change_object_status(event_key_or_keys, object_or_objects, Domain::ObjectStatus::HELD, hold_token, order_id)
64
+ end
65
+
66
+ def change_best_available_object_status(key:, number:, status:, categories: nil, hold_token: nil, extra_data: nil, order_id: nil)
67
+ request = create_change_best_available_object_status_request(number, status, categories, extra_data, hold_token, order_id)
68
+ response = @http_client.post("events/#{key}/actions/change-object-status", request)
69
+ Domain::BestAvailableObjects.new(response)
70
+ end
71
+
72
+ def book_best_available(key:, number:, categories: nil, hold_token: nil, order_id: nil)
73
+ change_best_available_object_status(key: key, number: number,status: Domain::ObjectStatus::BOOKED,
74
+ categories: categories, hold_token: hold_token, order_id: order_id)
75
+ end
76
+
77
+ def hold_best_available(key:, number:, categories: nil, hold_token: nil, order_id: nil)
78
+ change_best_available_object_status(key: key, number: number, status: Domain::ObjectStatus::HELD,
79
+ categories: categories, hold_token: hold_token, order_id: order_id)
80
+ end
81
+
82
+ def release(event_key_or_keys, object_or_objects, hold_token = nil, order_id = nil)
83
+ change_object_status(event_key_or_keys, object_or_objects, Domain::ObjectStatus::FREE, hold_token, order_id)
84
+ end
85
+
86
+ def delete(key:)
87
+ @http_client.delete("/events/#{key}")
88
+ end
89
+
90
+
91
+ def retrieve(key:)
92
+ response = @http_client.get("events/#{key}")
93
+ Domain::Event.new(response)
94
+ end
95
+
96
+ def list
97
+ Pagination::Cursor.new(Domain::Event, 'events', @http_client)
98
+ end
99
+
100
+ def list_status_changes(key, object_id = nil)
101
+ if object_id != nil
102
+ status_changes_for_object key: key, object_id: object_id
103
+ else
104
+ Pagination::Cursor.new(Domain::StatusChange, "/events/#{key}/status-changes", @http_client)
105
+ end
106
+ end
107
+
108
+ def status_changes_for_object(key:, object_id:)
109
+ Pagination::Cursor.new(Domain::StatusChange, "/events/#{key}/objects/#{object_id}/status-changes", @http_client)
110
+ end
111
+
112
+ def mark_as_not_for_sale(key:, objects: nil, categories: nil)
113
+ request = build_parameters_for_mark_as_sale objects: objects, categories: categories
114
+ @http_client.post("events/#{key}/actions/mark-as-not-for-sale", request)
115
+ end
116
+
117
+ def mark_everything_as_for_sale(key: nil)
118
+ @http_client.post("events/#{key}/actions/mark-everything-as-for-sale")
119
+ end
120
+
121
+ def mark_as_for_sale(key:, objects: nil, categories: nil)
122
+ request = build_parameters_for_mark_as_sale objects: objects, categories: categories
123
+ @http_client.post("events/#{key}/actions/mark-as-for-sale", request)
124
+ end
125
+
126
+ private
127
+
128
+ def build_parameters_for_mark_as_sale(objects: nil, categories: nil)
129
+ request = {}
130
+ request[:objects] = objects if objects
131
+ request[:categories] = categories if categories
132
+ request
133
+ end
134
+
135
+ def build_extra_data_request(extra_data)
136
+ payload = {}
137
+ payload[:extraData] = extra_data if extra_data
138
+ payload
139
+ end
140
+
141
+ def build_event_request(chart_key: nil, event_key: nil, book_whole_tables: nil, table_booking_modes: nil)
142
+ result = {}
143
+ result["chartKey"] = chart_key if chart_key
144
+ result["eventKey"] = event_key if event_key
145
+ result["bookWholeTables"] = book_whole_tables if book_whole_tables != nil
146
+ result["tableBookingModes"] = table_booking_modes if table_booking_modes != nil
147
+ result
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,12 @@
1
+ module Seatsio
2
+ module Exception
3
+ class SeatsioException < StandardError
4
+ end
5
+
6
+ class NoMorePagesException < SeatsioException
7
+ end
8
+
9
+ class NotFoundException < SeatsioException
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,38 @@
1
+ require "seatsio/exception"
2
+ require "base64"
3
+ require "seatsio/httpClient"
4
+ require "seatsio/domain"
5
+ require "json"
6
+ require "cgi"
7
+ require "seatsio/domain"
8
+ require "seatsio/events/change_object_status_request"
9
+
10
+ module Seatsio
11
+
12
+ class HoldTokensClient
13
+ # @return [Seatsio::HoldTokensClient]
14
+ def initialize(secret_key, base_url)
15
+ @http_client = ::Seatsio::HttpClient.new(secret_key, base_url)
16
+ end
17
+
18
+ def create(expires_in_minutes: nil)
19
+ body = {}
20
+ if expires_in_minutes
21
+ body[:expiresInMinutes] = expires_in_minutes
22
+ end
23
+ response = @http_client.post('hold-tokens', body)
24
+ Domain::HoldToken.new(response)
25
+ end
26
+
27
+ def retrieve(hold_token: nil)
28
+ response = @http_client.get("/hold-tokens/#{hold_token}")
29
+ Domain::HoldToken.new(response)
30
+ end
31
+
32
+ def expire_in_minutes(hold_token: nil, expires_in_minutes: nil)
33
+ body = {"expiresInMinutes": expires_in_minutes}
34
+ response = @http_client.post("/hold-tokens/#{hold_token}", body)
35
+ Domain::HoldToken.new(response)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,71 @@
1
+ require "rest-client"
2
+ require "seatsio/exception"
3
+ require "base64"
4
+ require "cgi"
5
+ require "uri"
6
+
7
+ module Seatsio
8
+ class HttpClient
9
+ def initialize(secret_key, base_url)
10
+ @secret_key = Base64.encode64(secret_key)
11
+ @base_url = base_url
12
+ end
13
+
14
+ def execute(*args)
15
+ begin
16
+ headers = {:Authorization => "Basic #{@secret_key}"}
17
+ if args[2].include? :params
18
+ headers[:params] = args[2][:params]
19
+ end
20
+ #if args[2] != nil || args[0] == :post
21
+ # headers[:params] = args[2]
22
+ #end
23
+
24
+ url = "#{@base_url}/#{args[1]}"
25
+
26
+ request_options = {method: args[0], url: url, headers: headers}
27
+
28
+ if args[0] == :post
29
+ args[2].delete :params
30
+ request_options[:payload] = args[2].to_json
31
+ end
32
+
33
+ response = RestClient::Request.execute(request_options)
34
+
35
+ # If RAW
36
+ if args[3]
37
+ return response
38
+ end
39
+ JSON.parse(response) unless response.empty?
40
+ rescue RestClient::NotFound => e
41
+ raise Exception::NotFoundException.new(e.response)
42
+ rescue RestClient::ExceptionWithResponse => e
43
+ if e.response.include? "there is no page after" || e.response.empty?
44
+ raise Exception::NoMorePagesException
45
+ end
46
+ raise Exception::SeatsioException.new(e.response)
47
+ rescue RestClient::Exceptions::Timeout
48
+ raise Exception::SeatsioException.new("Timeout ERROR")
49
+ rescue SocketError
50
+ raise Exception::SeatsioException.new("Failed to connect to backend")
51
+ end
52
+ end
53
+
54
+ def get_raw(endpoint, params = {})
55
+ execute(:get, endpoint, params, true)
56
+ end
57
+
58
+ def get(endpoint, params = {})
59
+ payload = {:params => params}
60
+ execute(:get, endpoint, payload)
61
+ end
62
+
63
+ def post(endpoint, payload = {})
64
+ execute(:post, endpoint, payload)
65
+ end
66
+
67
+ def delete(endpoint)
68
+ execute(:delete, endpoint, {})
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,97 @@
1
+ require 'seatsio/exception'
2
+
3
+ module Seatsio
4
+ module Pagination
5
+ # Enumerable for every Domain
6
+ class Cursor
7
+ include Enumerable
8
+
9
+ attr_reader :params, :next_page_starts_after, :previous_page_ends_before
10
+
11
+ MAX = 20
12
+
13
+ def initialize(cls, endpoint, http_client, params = {})
14
+ @cls = cls
15
+ @endpoint = endpoint
16
+ @http_client = http_client
17
+ @params = params
18
+ @collection = []
19
+ @next_page_starts_after = nil
20
+ @previous_page_ends_before = nil
21
+ @first_page = false
22
+ end
23
+
24
+ def each(start = 0)
25
+ return to_enum(:each, start) unless block_given?
26
+
27
+ Array(@collection[start..-1]).each do |element|
28
+ yield(element)
29
+ end
30
+ return unless keep_running?
31
+ return if last?
32
+
33
+ start = [@collection.size, start].max
34
+ fetch_next_page
35
+ each(start, &Proc.new)
36
+ end
37
+
38
+ def set_query_param(key, value)
39
+ @params[key] = value
40
+ end
41
+
42
+ def first_page(limit = nil)
43
+ @first_page = true
44
+ set_query_param(:limit, limit) unless limit.nil?
45
+ self
46
+ end
47
+
48
+ def page_after(after_id = nil, limit = nil)
49
+ set_query_param(:start_after_id, after_id) unless after_id.nil?
50
+ set_query_param(:limit, limit) unless limit.nil?
51
+ self
52
+ end
53
+
54
+ def page_before(before_id = nil, limit = nil)
55
+ set_query_param(:end_before_id, before_id) unless before_id.nil?
56
+ set_query_param(:limit, limit) unless limit.nil?
57
+ self
58
+ end
59
+
60
+ private
61
+
62
+ def last?
63
+ @last_response_empty || @collection.size >= MAX
64
+ end
65
+
66
+ # @return [Bool]
67
+ def keep_running?
68
+ return false if @first_page && !@collection.empty?
69
+ return false if !params[:limit].nil? && !@collection.empty?
70
+ return false if @params.include?(:end_before_id) && !@collection.empty?
71
+
72
+ true
73
+ end
74
+
75
+ def fetch_next_page
76
+ response = @http_client.get(@endpoint, @params)
77
+
78
+ if response.nil?
79
+ @last_response_empty = true
80
+ return
81
+ end
82
+
83
+ @next_page_starts_after = response['next_page_starts_after'].to_i if response['next_page_starts_after']
84
+ @previous_page_ends_before = response['previous_page_ends_before'].to_i if response['previous_page_ends_before']
85
+ items = response['items']
86
+ parsed_items = []
87
+
88
+ items.each {|item| parsed_items << @cls.new(item)}
89
+
90
+ @collection += parsed_items
91
+ set_query_param(:start_after_id, items.last['id']) unless last?
92
+ rescue Seatsio::Exception::NoMorePagesException
93
+ @last_response_empty = true
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,89 @@
1
+ require "seatsio/exception"
2
+ require "base64"
3
+ require "seatsio/httpClient"
4
+ require "seatsio/domain"
5
+ require "json"
6
+ require "cgi"
7
+ require "seatsio/domain"
8
+
9
+ module Seatsio
10
+ class SubaccountsClient
11
+ def initialize(secret_key, base_url)
12
+ @http_client = ::Seatsio::HttpClient.new(secret_key, base_url)
13
+ end
14
+
15
+ def create(name: nil, email: nil)
16
+ body = {}
17
+ body['name'] = name if name
18
+ body['email'] = email if email
19
+
20
+ response = @http_client.post("subaccounts", body)
21
+ Domain::Subaccount.new(response)
22
+ end
23
+
24
+ def update(id:, name: nil, email: nil)
25
+ body = {}
26
+ body['name'] = name if name
27
+ body['email'] = email if email
28
+ @http_client.post("subaccounts/#{id}", body)
29
+ end
30
+
31
+ def list
32
+ cursor
33
+ end
34
+
35
+ def active
36
+ cursor status: 'active'
37
+ end
38
+
39
+ def inactive
40
+ cursor status: 'inactive'
41
+ end
42
+
43
+ def activate(id:)
44
+ @http_client.post("/subaccounts/#{id}/actions/activate")
45
+ end
46
+
47
+ def deactivate(id:)
48
+ @http_client.post("/subaccounts/#{id}/actions/deactivate")
49
+ end
50
+
51
+ def retrieve(id:)
52
+ response = @http_client.get("/subaccounts/#{id}")
53
+ Domain::Subaccount.new(response)
54
+ end
55
+
56
+ def copy_chart_to_parent(id: nil, chart_key: nil)
57
+ response = @http_client.post("/subaccounts/#{id}/charts/#{chart_key}/actions/copy-to/parent")
58
+ Domain::Chart.new(response)
59
+ end
60
+
61
+ def copy_chart_to_subaccount(from_id: nil, to_id: nil, chart_key: nil)
62
+ response = @http_client.post("/subaccounts/#{from_id}/charts/#{chart_key}/actions/copy-to/#{to_id}")
63
+ Domain::Chart.new(response)
64
+ end
65
+
66
+ def create_with_email(email: nil, name: nil)
67
+ do_create name: name, email: email
68
+ end
69
+
70
+ def regenerate_designer_key(id:)
71
+ @http_client.post("/subaccounts/#{id}/designer-key/actions/regenerate")
72
+ end
73
+
74
+ private
75
+
76
+ def do_create(name: nil, email: nil)
77
+ body = {}
78
+ body['name'] = name if name
79
+ body['email'] = email if email
80
+ response = @http_client.post('subaccounts', body)
81
+ Domain::Subaccount.new(response)
82
+ end
83
+
84
+ def cursor(status: nil)
85
+ endpoint = status ? "subaccounts/#{status}" : 'subaccounts'
86
+ Pagination::Cursor.new(Domain::Subaccount, endpoint, @http_client)
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,3 @@
1
+ def parse_date(date)
2
+ date
3
+ end
@@ -0,0 +1,3 @@
1
+ module Seatsio
2
+ VERSION = "1.0.0"
3
+ end
data/lib/seatsio.rb ADDED
@@ -0,0 +1,26 @@
1
+ require 'seatsio/version'
2
+ require 'seatsio/charts'
3
+ require 'seatsio/accounts'
4
+ require 'seatsio/subaccounts'
5
+ require 'seatsio/events'
6
+ require 'seatsio/hold_tokens'
7
+ require 'seatsio/chart_reports'
8
+ require 'seatsio/event_reports'
9
+
10
+ module Seatsio
11
+ # Main Seatsio Class
12
+ class Client
13
+ attr_reader :charts, :accounts, :subaccounts, :events,
14
+ :hold_tokens, :chart_reports, :event_reports
15
+
16
+ def initialize(secret_key, base_url = 'https://api.seatsio.net')
17
+ @charts = ChartsClient.new(secret_key, base_url)
18
+ @accounts = AccountsClient.new(secret_key, base_url)
19
+ @subaccounts = SubaccountsClient.new(secret_key, base_url)
20
+ @events = EventsClient.new(secret_key, base_url)
21
+ @hold_tokens = HoldTokensClient.new(secret_key, base_url)
22
+ @chart_reports = ChartReportsClient.new(secret_key, base_url)
23
+ @event_reports = EventReportsClient.new(secret_key, base_url)
24
+ end
25
+ end
26
+ end
data/seatsio.gemspec ADDED
@@ -0,0 +1,29 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "seatsio/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "seatsio"
8
+ spec.version = Seatsio::VERSION
9
+ spec.authors = ["Seats.io"]
10
+ spec.email = ["nahuel@seats.io"]
11
+
12
+ spec.summary = "the official Seats.io Ruby client library"
13
+ spec.description = "This is the official Ruby client library for the Seats.io V2 REST API"
14
+ spec.homepage = "http://seats.io"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+ spec.bindir = "exe"
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.16"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency "minitest", "~> 5.0"
26
+ spec.add_development_dependency "rest-client", '~> 2.0', '>= 2.0.2'
27
+ spec.add_development_dependency "coveralls", "~> 0.8.22"
28
+ spec.add_development_dependency 'webmock', '~> 3.4', '>= 3.4.2'
29
+ end