diff --git a/lib/chiketto.rb b/lib/chiketto.rb index 44a4462..1b79cdd 100644 --- a/lib/chiketto.rb +++ b/lib/chiketto.rb @@ -1,8 +1,6 @@ module Chiketto ENDPOINT = 'https://www.eventbriteapi.com/v3/' - require 'hash_ext' - require 'chiketto/exception' require 'chiketto/version' require 'chiketto/attribute' @@ -20,6 +18,10 @@ module Chiketto require 'chiketto/ticket_class' require 'chiketto/user' require 'chiketto/venue' + require 'chiketto/contact_list' + require 'chiketto/contact' + require 'chiketto/webhook' + require 'chiketto/order' class << self attr_writer :api_key diff --git a/lib/chiketto/attendee.rb b/lib/chiketto/attendee.rb index 8090697..5d10ac6 100644 --- a/lib/chiketto/attendee.rb +++ b/lib/chiketto/attendee.rb @@ -2,12 +2,15 @@ module Chiketto class Attendee < Resource attr_accessor :quantity, :status, + :checked_in, + :costs, :ticket_class_id, :event_id, :order_id, :assigned_number, :answers, - :barcodes + :barcodes, + :cancelled attr_date :changed, :created @@ -15,5 +18,9 @@ class Attendee < Resource def profile AttendeeProfile.new @profile.to_h end + + def event + Event.new @event.to_h + end end end diff --git a/lib/chiketto/attendee_profile.rb b/lib/chiketto/attendee_profile.rb index d030c2b..956d155 100644 --- a/lib/chiketto/attendee_profile.rb +++ b/lib/chiketto/attendee_profile.rb @@ -13,6 +13,8 @@ class AttendeeProfile < Resource :blog, :gender, :birth_date, + :home_phone, + :work_phone, :cell_phone def addresses diff --git a/lib/chiketto/contact.rb b/lib/chiketto/contact.rb new file mode 100644 index 0000000..518d28c --- /dev/null +++ b/lib/chiketto/contact.rb @@ -0,0 +1,9 @@ +module Chiketto + class Contact < Resource + attr_reader :first_name, + :last_name, + :email + + attr_date :created + end +end diff --git a/lib/chiketto/contact_list.rb b/lib/chiketto/contact_list.rb new file mode 100644 index 0000000..6c81503 --- /dev/null +++ b/lib/chiketto/contact_list.rb @@ -0,0 +1,32 @@ +module Chiketto + class ContactList < Resource + attr_reader :name, + :user_id + + def contacts + raise Exception.new("ContactList must have an id and user_id to get its Contacts") unless id && user_id + + contacts = self.class.paginated(:contacts, id, { user_id: user_id }) + contacts.map { |c| Contact.new c } + end + + def add_contact(params) + raise Exception.new("ContactList must have an id and user_id to add a Contact") unless id && user_id + response = self.class.post("users/#{user_id}/contact_lists/#{id}/contacts", params) + response["created"] + end + + def delete_contact(email) + raise Exception.new("ContactList must have an id and user_id to delete its Contacts") unless id && user_id + response = self.class.delete("users/#{user_id}/contact_lists/#{id}/contacts", { email: email }) + response["deleted"] + end + + private + + def self.find_contacts(id, params) + user_id = params.delete(:user_id) + get "users/#{user_id}/contact_lists/#{id}/contacts", params + end + end +end diff --git a/lib/chiketto/event.rb b/lib/chiketto/event.rb index 26352c6..3ca34ae 100644 --- a/lib/chiketto/event.rb +++ b/lib/chiketto/event.rb @@ -20,8 +20,8 @@ def self.create(params) Event.new response end - def self.find(id) - event = get "events/#{id}" + def self.find(id, params = {}) + event = get "events/#{id}", params Event.new event end diff --git a/lib/chiketto/order.rb b/lib/chiketto/order.rb new file mode 100644 index 0000000..ba4f7c3 --- /dev/null +++ b/lib/chiketto/order.rb @@ -0,0 +1,27 @@ +module Chiketto + class Order < Resource + attr_accessor :name, + :first_name, + :last_name, + :email, + :costs, + :status, + :event_id + + attr_date :created, + :changed + + def event + Event.new @event.to_h + end + + def attendees + @attendees.map { |attendee| Attendee.new attendee } + end + + def self.find(id, params = {}) + order = get "orders/#{id}", params + Order.new order + end + end +end diff --git a/lib/chiketto/resource.rb b/lib/chiketto/resource.rb index cb32f0b..84a5574 100644 --- a/lib/chiketto/resource.rb +++ b/lib/chiketto/resource.rb @@ -1,5 +1,4 @@ require 'json' -require 'open-uri' require 'net/http' module Chiketto @@ -15,35 +14,59 @@ def initialize(args = {}) end def self.get(uri, params = {}) - uri = endpoint(uri) + query(params) - resource = open uri - JSON.parse resource.read + http_call(Net::HTTP::Get, uri, params) end def self.post(uri, params = {}) - uri = URI.parse endpoint(uri) + query(params) - resource = open_post uri - JSON.parse resource + http_call(Net::HTTP::Post, uri, params) + end + + def self.delete(uri, params = {}) + http_call(Net::HTTP::Delete, uri, params) end def self.endpoint(uri) ENDPOINT + uri + token end - def self.open_post(uri) + def self.http_call(type, uri, params) + uri = URI.parse endpoint(uri) + query(params) http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true - request = Net::HTTP::Post.new(uri.request_uri) + http.ssl_version = :TLSv1_2 + request = type.new(uri.request_uri) request.add_field 'Authorization', "Bearer #{Chiketto.api_key}" response = http.request(request) if response.code !~ /20\d/ raise Chiketto::Exception, JSON.parse(response.body) end - response.body + JSON.parse response.body end def self.query(params) - params.to_params + query_params = '' + stack = [] + + params.each do |k, v| + if v.is_a?(Hash) + stack << [k, v] + else + query_params << "#{k}=#{CGI::escape(v || "")}&" + end + end + + stack.each do |parent, hash| + hash.each do |k, v| + if v.is_a?(Hash) + stack << ["#{parent}[#{k}]", v] + else + query_params << "#{parent}[#{k}]=#{CGI::escape(v || "")}&" + end + end + end + + query_params.chop! + "&#{query_params}" end def self.token diff --git a/lib/chiketto/user.rb b/lib/chiketto/user.rb index 0bbec6d..7451c1b 100644 --- a/lib/chiketto/user.rb +++ b/lib/chiketto/user.rb @@ -22,6 +22,11 @@ def events(params = {}) events.map { |e| Event.new e } end + def owned_events(params ={}) + events = User.paginated_owned_events @id, params + events.map { |e| Event.new e } + end + def event_attendees(params = {}) attendees = User.paginated_attendees @id, params attendees.map { |e| Attendee.new e } @@ -32,6 +37,21 @@ def organizers organizers['organizers'].map { |o| Organizer.new o } end + def contact_lists(params = {}) + contact_lists = User.paginated(:contact_lists, @id, params) + contact_lists.map { |cl| ContactList.new cl } + end + + def find_contact_list(contact_list_id) + contact_list = User.get "users/#{@id}/contact_lists/#{contact_list_id}" + ContactList.new contact_list + end + + def create_contact_list(params) + response = User.post "users/#{@id}/contact_lists/", params + ContactList.new response + end + private def self.find_attendees(id, params) @@ -39,6 +59,10 @@ def self.find_attendees(id, params) end def self.find_events(id, params) + get "users/#{id}/events", params + end + + def self.find_owned_events(id, params) get "users/#{id}/owned_events", params end @@ -46,6 +70,10 @@ def self.find_organizers(id) get "users/#{id}/organizers" end + def self.find_contact_lists(id, params) + get "users/#{id}/contact_lists", params + end + def self.paginated_events(id, params) paginated(:events, id, params) end diff --git a/lib/chiketto/webhook.rb b/lib/chiketto/webhook.rb new file mode 100644 index 0000000..db56a0d --- /dev/null +++ b/lib/chiketto/webhook.rb @@ -0,0 +1,31 @@ +module Chiketto + class Webhook < Resource + attr_accessor :endpoint_url, + :actions, + :user_id, + :event_id + + attr_date :created + + def delete + response = Webhook.delete "webhooks/#{id}" + response["success"] + end + + def self.all(params = {}) + hooks = paginated(:webhooks, nil, params) + hooks.map { |wh| Webhook.new wh } + end + + def self.create(params) + webhook = post 'webhooks', params + Webhook.new webhook + end + + private + + def self.find_webhooks(id, params) + get 'webhooks', params + end + end +end diff --git a/lib/hash_ext.rb b/lib/hash_ext.rb deleted file mode 100644 index b6001ba..0000000 --- a/lib/hash_ext.rb +++ /dev/null @@ -1,27 +0,0 @@ -class Hash - def to_params - params = '' - stack = [] - - each do |k, v| - if v.is_a?(Hash) - stack << [k, v] - else - params << "#{k}=#{CGI::escape(v)}&" - end - end - - stack.each do |parent, hash| - hash.each do |k, v| - if v.is_a?(Hash) - stack << ["#{parent}[#{k}]", v] - else - params << "#{parent}[#{k}]=#{CGI::escape(v)}&" - end - end - end - - params.chop! - "&#{params}" - end -end diff --git a/test/attendee_profile_test.rb b/test/attendee_profile_test.rb index c680664..f3fd89a 100644 --- a/test/attendee_profile_test.rb +++ b/test/attendee_profile_test.rb @@ -16,6 +16,8 @@ def test_exposes_data assert_respond_to attendee_profile, :blog assert_respond_to attendee_profile, :gender assert_respond_to attendee_profile, :birth_date + assert_respond_to attendee_profile, :home_phone + assert_respond_to attendee_profile, :work_phone assert_respond_to attendee_profile, :cell_phone assert_respond_to attendee_profile, :addresses end diff --git a/test/attendee_test.rb b/test/attendee_test.rb index 993198e..cb344d1 100644 --- a/test/attendee_test.rb +++ b/test/attendee_test.rb @@ -6,12 +6,15 @@ def test_exposes_data assert_respond_to attendee, :ticket_class_id assert_respond_to attendee, :quantity assert_respond_to attendee, :status + assert_respond_to attendee, :checked_in + assert_respond_to attendee, :costs assert_respond_to attendee, :profile assert_respond_to attendee, :event_id assert_respond_to attendee, :order_id assert_respond_to attendee, :assigned_number assert_respond_to attendee, :answers assert_respond_to attendee, :barcodes + assert_respond_to attendee, :cancelled end def test_attr_date_types @@ -26,6 +29,11 @@ def test_attendee_returns_profile assert_kind_of Chiketto::AttendeeProfile, attendee.profile end + def test_attendee_returns_event + attendee = Chiketto::Attendee.new + assert_kind_of Chiketto::Event, attendee.event + end + def test_assigned_number_is_handled attendee = Chiketto::Attendee.new assigned_number: 1 assert_equal attendee.assigned_number, 1 diff --git a/test/contact_list_test.rb b/test/contact_list_test.rb new file mode 100644 index 0000000..9f4dc8d --- /dev/null +++ b/test/contact_list_test.rb @@ -0,0 +1,54 @@ +require 'test_helper' + +class ContactListTest < MiniTest::Test + USER_ID = 56727857661 + CONTACT_LIST_ID = 859438 + + def test_contact_list_exposes_data + contact_list = Chiketto::ContactList.new + assert_respond_to contact_list, :name + end + + def test_contact_list_has_contacts + contact_list = Chiketto::ContactList.new({ id: CONTACT_LIST_ID, user_id: USER_ID }) + VCR.use_cassette 'contact-list-contacts' do + assert_kind_of Chiketto::Contact, contact_list.contacts.first + end + end + + def test_contact_list_without_user_id_contacts_raises_error + contact_list = Chiketto::ContactList.new({ id: CONTACT_LIST_ID }) + assert_raises Chiketto::Exception do + contact_list.contacts + end + end + + def test_contact_list_add_contact_returns_true + contact_list = Chiketto::ContactList.new({ id: CONTACT_LIST_ID, user_id: USER_ID }) + params = { "contact.email" => "foo@bar.com", "contact.first_name" => "foo", "contact.last_name" => "bar" } + VCR.use_cassette 'contact-list-add-contact' do + assert_kind_of TrueClass, contact_list.add_contact(params) + end + end + + def test_contact_list_without_user_id_add_contact_raises_error + contact_list = Chiketto::ContactList.new({ id: CONTACT_LIST_ID }) + assert_raises Chiketto::Exception do + contact_list.add_contact({}) + end + end + + def test_contact_list_delete_contact_returns_true + contact_list = Chiketto::ContactList.new({ id: CONTACT_LIST_ID, user_id: USER_ID }) + VCR.use_cassette 'contact-list-delete-contact' do + assert_kind_of TrueClass, contact_list.delete_contact("foo@bar.com") + end + end + + def test_contact_list_without_user_id_delete_contact_raises_error + contact_list = Chiketto::ContactList.new({ id: CONTACT_LIST_ID }) + assert_raises Chiketto::Exception do + contact_list.delete_contact("") + end + end +end diff --git a/test/contact_test.rb b/test/contact_test.rb new file mode 100644 index 0000000..c1a57f4 --- /dev/null +++ b/test/contact_test.rb @@ -0,0 +1,16 @@ +require 'test_helper' + +class ContactTest < MiniTest::Test + def test_exposes_data + contact = Chiketto::Contact.new + assert_respond_to contact, :first_name + assert_respond_to contact, :last_name + assert_respond_to contact, :email + assert_respond_to contact, :created + end + + def test_attr_date_types + contact = Chiketto::Contact.new created: "2014-02-11T02:52:10Z" + assert_kind_of DateTime, contact.created + end +end diff --git a/test/order_test.rb b/test/order_test.rb new file mode 100644 index 0000000..2462af9 --- /dev/null +++ b/test/order_test.rb @@ -0,0 +1,43 @@ +require 'test_helper' + +class OrderTest < MiniTest::Test + ORDER_ID = 431012219 + + def find_order + VCR.use_cassette 'order-find' do + Chiketto::Order.find ORDER_ID + end + end + + def test_exposes_data + order = Chiketto::Order.new + assert_respond_to order, :id + assert_respond_to order, :name + assert_respond_to order, :first_name + assert_respond_to order, :last_name + assert_respond_to order, :email + assert_respond_to order, :costs + assert_respond_to order, :status + assert_respond_to order, :event_id + end + + def test_attr_date_types + order = Chiketto::Order.new created: "2014-02-11T02:52:10Z", changed: "2014-02-11T02:52:10Z" + assert_kind_of DateTime, order.created + assert_kind_of DateTime, order.changed + end + + def test_order_find + assert_kind_of Chiketto::Order, find_order + end + + def test_order_has_event + order = find_order + assert_kind_of Chiketto::Event, order.event + end + + def test_order_has_attendees + order = find_order + assert_kind_of Chiketto::Attendee, order.attendees.first + end +end diff --git a/test/user_test.rb b/test/user_test.rb index b50744a..0e66da8 100644 --- a/test/user_test.rb +++ b/test/user_test.rb @@ -2,6 +2,7 @@ class UserTest < MiniTest::Test USER_ID = 72013652427 + CONTACT_LIST_ID = 411987 def find_me VCR.use_cassette 'user-me' do @@ -64,4 +65,32 @@ def test_user_has_organizers assert_kind_of Chiketto::Organizer, @user.organizers.first end end + + def test_user_has_contact_lists + find_me + + VCR.use_cassette 'user-contact-lists' do + assert_kind_of Chiketto::ContactList, @user.contact_lists.first + end + end + + def test_user_find_contact_list_returns_contact_list + find_me + + VCR.use_cassette 'user-find-contact-list' do + assert_kind_of Chiketto::ContactList, @user.find_contact_list(CONTACT_LIST_ID) + end + end + + def test_create_contact_list + find_me + + VCR.use_cassette 'user-create-contact-list' do + contact_list = @user.create_contact_list({ + 'contact_list.name' => 'Test Contact List Creation' + }) + assert_kind_of Chiketto::ContactList, contact_list + assert_equal 'Test Contact List Creation', contact_list.name + end + end end diff --git a/test/webhook_test.rb b/test/webhook_test.rb new file mode 100644 index 0000000..b1d60cf --- /dev/null +++ b/test/webhook_test.rb @@ -0,0 +1,37 @@ +require 'test_helper' + +class WebhookTest < MiniTest::Test + def test_exposes_data + webhook = Chiketto::Webhook.new + assert_respond_to webhook, :id + assert_respond_to webhook, :endpoint_url + assert_respond_to webhook, :user_id + assert_respond_to webhook, :event_id + assert_respond_to webhook, :created + end + + def test_attr_date_types + webhook = Chiketto::Webhook.new created: "2014-02-11T02:52:10Z" + assert_kind_of DateTime, webhook.created + end + + def test_all + VCR.use_cassette 'webhooks-all' do + assert_kind_of Chiketto::Webhook, Chiketto::Webhook.all.first + end + end + + def test_create + VCR.use_cassette 'webhooks-create' do + webhook = Chiketto::Webhook.create 'endpoint_url' => 'http://requestb.in/y3jdgay3' + assert_kind_of Chiketto::Webhook, webhook + end + end + + def test_delete + webhook = Chiketto::Webhook.new id: 19185 + VCR.use_cassette 'webhooks-delete' do + assert_kind_of TrueClass, webhook.delete + end + end +end