basecrm 0.1.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +2 -2
  3. data/README.md +273 -17
  4. data/lib/basecrm.rb +185 -1
  5. data/lib/basecrm/configuration.rb +59 -0
  6. data/lib/basecrm/envelope.rb +7 -0
  7. data/lib/basecrm/errors.rb +65 -0
  8. data/lib/basecrm/http_client.rb +91 -0
  9. data/lib/basecrm/middlewares/oauth_bearer_token.rb +18 -0
  10. data/lib/basecrm/middlewares/raise_error.rb +31 -0
  11. data/lib/basecrm/model.rb +6 -0
  12. data/lib/basecrm/models/account.rb +31 -0
  13. data/lib/basecrm/models/address.rb +22 -0
  14. data/lib/basecrm/models/associated_contact.rb +19 -0
  15. data/lib/basecrm/models/contact.rb +88 -0
  16. data/lib/basecrm/models/deal.rb +58 -0
  17. data/lib/basecrm/models/lead.rb +79 -0
  18. data/lib/basecrm/models/loss_reason.rb +22 -0
  19. data/lib/basecrm/models/note.rb +28 -0
  20. data/lib/basecrm/models/pipeline.rb +19 -0
  21. data/lib/basecrm/models/source.rb +22 -0
  22. data/lib/basecrm/models/stage.rb +34 -0
  23. data/lib/basecrm/models/tag.rb +25 -0
  24. data/lib/basecrm/models/task.rb +46 -0
  25. data/lib/basecrm/models/user.rb +31 -0
  26. data/lib/basecrm/paginated_resource.rb +32 -0
  27. data/lib/basecrm/services/accounts_service.rb +33 -0
  28. data/lib/basecrm/services/associated_contacts_service.rb +91 -0
  29. data/lib/basecrm/services/contacts_service.rb +138 -0
  30. data/lib/basecrm/services/deals_service.rb +137 -0
  31. data/lib/basecrm/services/leads_service.rb +140 -0
  32. data/lib/basecrm/services/loss_reasons_service.rb +133 -0
  33. data/lib/basecrm/services/notes_service.rb +134 -0
  34. data/lib/basecrm/services/pipelines_service.rb +50 -0
  35. data/lib/basecrm/services/sources_service.rb +133 -0
  36. data/lib/basecrm/services/stages_service.rb +52 -0
  37. data/lib/basecrm/services/tags_service.rb +132 -0
  38. data/lib/basecrm/services/tasks_service.rb +141 -0
  39. data/lib/basecrm/services/users_service.rb +83 -0
  40. data/lib/basecrm/version.rb +3 -0
  41. data/spec/factories/associated_contact.rb +14 -0
  42. data/spec/factories/contact.rb +27 -0
  43. data/spec/factories/deal.rb +17 -0
  44. data/spec/factories/lead.rb +26 -0
  45. data/spec/factories/loss_reason.rb +11 -0
  46. data/spec/factories/note.rb +13 -0
  47. data/spec/factories/source.rb +11 -0
  48. data/spec/factories/tag.rb +12 -0
  49. data/spec/factories/task.rb +15 -0
  50. data/spec/services/accounts_service_spec.rb +16 -0
  51. data/spec/services/associated_contacts_service_spec.rb +43 -0
  52. data/spec/services/contacts_service_spec.rb +58 -0
  53. data/spec/services/deals_service_spec.rb +58 -0
  54. data/spec/services/leads_service_spec.rb +58 -0
  55. data/spec/services/loss_reasons_service_spec.rb +58 -0
  56. data/spec/services/notes_service_spec.rb +58 -0
  57. data/spec/services/pipelines_service_spec.rb +23 -0
  58. data/spec/services/sources_service_spec.rb +58 -0
  59. data/spec/services/stages_service_spec.rb +23 -0
  60. data/spec/services/tags_service_spec.rb +58 -0
  61. data/spec/services/tasks_service_spec.rb +58 -0
  62. data/spec/services/users_service_spec.rb +39 -0
  63. data/spec/spec_helper.rb +24 -12
  64. data/spec/support/client_helpers.rb +19 -0
  65. metadata +160 -71
  66. data/.gitignore +0 -20
  67. data/.rspec +0 -2
  68. data/.travis.yml +0 -6
  69. data/Gemfile +0 -4
  70. data/Rakefile +0 -8
  71. data/basecrm.gemspec +0 -23
  72. data/lib/base_crm.rb +0 -24
  73. data/lib/base_crm/account.rb +0 -11
  74. data/lib/base_crm/api_client_ext.rb +0 -6
  75. data/lib/base_crm/config.rb +0 -21
  76. data/lib/base_crm/contact.rb +0 -44
  77. data/lib/base_crm/custom_fieldable.rb +0 -32
  78. data/lib/base_crm/deal.rb +0 -50
  79. data/lib/base_crm/forecasting.rb +0 -12
  80. data/lib/base_crm/lead.rb +0 -36
  81. data/lib/base_crm/note.rb +0 -15
  82. data/lib/base_crm/noteable.rb +0 -15
  83. data/lib/base_crm/related_object_scope.rb +0 -35
  84. data/lib/base_crm/resource.rb +0 -14
  85. data/lib/base_crm/session.rb +0 -48
  86. data/lib/base_crm/source.rb +0 -14
  87. data/lib/base_crm/task.rb +0 -16
  88. data/lib/base_crm/taskable.rb +0 -15
  89. data/lib/base_crm/version.rb +0 -3
  90. data/spec/base_crm/account_spec.rb +0 -20
  91. data/spec/base_crm/contact_spec.rb +0 -92
  92. data/spec/base_crm/deal_spec.rb +0 -138
  93. data/spec/base_crm/forecasting_spec.rb +0 -34
  94. data/spec/base_crm/lead_spec.rb +0 -63
  95. data/spec/base_crm/note_spec.rb +0 -20
  96. data/spec/base_crm/resource_mixin_spec.rb +0 -26
  97. data/spec/base_crm/session_spec.rb +0 -97
  98. data/spec/base_crm/source_spec.rb +0 -20
  99. data/spec/base_crm/task_spec.rb +0 -21
  100. data/spec/support/noteable_shared_examples.rb +0 -64
  101. data/spec/support/taskable_shared_examples.rb +0 -69
@@ -0,0 +1,91 @@
1
+ # WARNING: This code is auto-generated from the BaseCRM API Discovery JSON Schema
2
+
3
+ module BaseCRM
4
+ class AssociatedContactsService
5
+ OPTS_KEYS_TO_PERSIST = Set[:contact_id, :role]
6
+
7
+ def initialize(client)
8
+ @client = client
9
+ end
10
+
11
+ # Retrieve deal's associated contacts
12
+ #
13
+ # get '/deals/{deal_id}/associated_contacts'
14
+ #
15
+ # If you want to use filtering or sorting (see #where).
16
+ # @return [Enumerable] Paginated resource you can use to iterate over all the resources.
17
+ def all(deal_id)
18
+ PaginatedResource.new(self, deal_id)
19
+ end
20
+
21
+ # Retrieve deal's associated contacts
22
+ #
23
+ # get '/deals/{deal_id}/associated_contacts'
24
+ #
25
+ # Returns all deal associated contacts
26
+ #
27
+ # @param deal_id [Integer] Unique identifier of a Deal
28
+ # @param options [Hash] Search options
29
+ # @option options [Integer] :page (1) Page number to start from. Page numbering starts at 1, and omitting the `page` parameter will return the first page.
30
+ # @option options [Integer] :per_page (25) Number of records to return per page. Default limit is *25* and the maximum number that can be returned is *100*.
31
+ # @return [Array<AssociatedContact>] The list of AssociatedContacts for the first page, unless otherwise specified.
32
+ def where(deal_id, options = {})
33
+ _, _, root = @client.get("/deals/#{deal_id}/associated_contacts", options)
34
+
35
+ root[:items].map{ |item| AssociatedContact.new(item[:data]) }
36
+ end
37
+
38
+
39
+ # Create an associated contact
40
+ #
41
+ # post '/deals/{deal_id}/associated_contacts'
42
+ #
43
+ # Creates a deal's associated contact and its role
44
+ # If the specified deal or contact does not exist, the request will return an error
45
+ #
46
+ # @param deal_id [Integer] Unique identifier of a Deal
47
+ # @param associated_contact [AssociatedContact, Hash] Either object of the AssociatedContact type or Hash. This object's attributes describe the object to be created.
48
+ # @return [AssociatedContact] The resulting object represting created resource.
49
+ def create(deal_id, associated_contact)
50
+ validate_type!(associated_contact)
51
+
52
+ attributes = sanitize(associated_contact)
53
+ _, _, root = @client.post("/deals/#{deal_id}/associated_contacts", attributes)
54
+
55
+ AssociatedContact.new(root[:data])
56
+ end
57
+
58
+
59
+ # Remove an associated contact
60
+ #
61
+ # delete '/deals/{deal_id}/associated_contacts/{contact_id}'
62
+ #
63
+ # Remove a deal's associated contact
64
+ # If a deal with the supplied unique identifier does not exist, it returns an error
65
+ # This operation cannot be undone
66
+ #
67
+ # @param deal_id [Integer] Unique identifier of a Deal
68
+ # @param contact_id [Integer] Unique identifier of a Contact
69
+ # @return [Boolean] Status of the operation.
70
+ def destroy(deal_id, contact_id)
71
+ status, _, _ = @client.delete("/deals/#{deal_id}/associated_contacts/#{contact_id}")
72
+ status == 204
73
+ end
74
+
75
+
76
+ private
77
+ def validate_type!(associated_contact)
78
+ raise TypeError unless associated_contact.is_a?(AssociatedContact) || associated_contact.is_a?(Hash)
79
+ end
80
+
81
+ def extract_params!(associated_contact, *args)
82
+ params = associated_contact.to_h.select{ |k, _| args.include?(k) }
83
+ raise ArgumentError, "one of required attributes is missing. Expected: #{args.join(',')}" if params.count != args.length
84
+ params
85
+ end
86
+
87
+ def sanitize(associated_contact)
88
+ associated_contact.to_h.select { |k, _| OPTS_KEYS_TO_PERSIST.include?(k) }
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,138 @@
1
+ # WARNING: This code is auto-generated from the BaseCRM API Discovery JSON Schema
2
+
3
+ module BaseCRM
4
+ class ContactsService
5
+ OPTS_KEYS_TO_PERSIST = Set[:address, :contact_id, :custom_fields, :customer_status, :description, :email, :facebook, :fax, :first_name, :industry, :is_organization, :last_name, :linkedin, :mobile, :name, :owner_id, :phone, :prospect_status, :skype, :tags, :title, :twitter, :website]
6
+
7
+ def initialize(client)
8
+ @client = client
9
+ end
10
+
11
+ # Retrieve all contacts
12
+ #
13
+ # get '/contacts'
14
+ #
15
+ # If you want to use filtering or sorting (see #where).
16
+ # @return [Enumerable] Paginated resource you can use to iterate over all the resources.
17
+ def all
18
+ PaginatedResource.new(self)
19
+ end
20
+
21
+ # Retrieve all contacts
22
+ #
23
+ # get '/contacts'
24
+ #
25
+ # Returns all contacts available to the user according to the parameters provided
26
+ #
27
+ # @param options [Hash] Search options
28
+ # @option options [String] :"address[city]" City name.
29
+ # @option options [String] :"address[country]" Country name.
30
+ # @option options [String] :"address[postal_code]" Zip code or equivalent
31
+ # @option options [Integer] :contact_id The unique identifier of the organization that the contact belongs to.
32
+ # @option options [String] :email Email address of the contact.
33
+ # @option options [String] :first_name First name of the contact.
34
+ # @option options [String] :ids Comma-separated list of the IDs for the contacts you want to be returned in your request.
35
+ # @option options [Boolean] :is_organization Indicates whether or not this contact refers to an organization or an individual.
36
+ # @option options [String] :last_name Last name of the contact.
37
+ # @option options [String] :name Name of the contact.
38
+ # @option options [Integer] :page (1) The page number to start from. Page numbering is 1-based and omitting the `page` parameter will return the first page.
39
+ # @option options [Integer] :per_page (25) The number of records to return per page. Default limit is *25* and maximum number that can be returned is *100*.
40
+ # @option options [String] :sort_by (last_name:asc) A field to sort by. **Default** ordering is **ascending**. If you want to change the sort order to descending, append `:desc` to the field e.g. `sort_by=last_name:desc`.
41
+ # @return [Array<Contact>] The list of Contacts for the first page, unless otherwise specified.
42
+ def where(options = {})
43
+ _, _, root = @client.get("/contacts", options)
44
+
45
+ root[:items].map{ |item| Contact.new(item[:data]) }
46
+ end
47
+
48
+
49
+ # Create a contact
50
+ #
51
+ # post '/contacts'
52
+ #
53
+ # Create a new contact
54
+ # A contact may represent a single individual or an organization
55
+ #
56
+ # @param contact [Contact, Hash] Either object of the Contact type or Hash. This object's attributes describe the object to be created.
57
+ # @return [Contact] The resulting object represting created resource.
58
+ def create(contact)
59
+ validate_type!(contact)
60
+
61
+ attributes = sanitize(contact)
62
+ _, _, root = @client.post("/contacts", attributes)
63
+
64
+ Contact.new(root[:data])
65
+ end
66
+
67
+
68
+ # Retrieve a single contact
69
+ #
70
+ # get '/contacts/{id}'
71
+ #
72
+ # Returns a single contact available to the user, according to the unique contact ID provided
73
+ # If the specified contact does not exist, the request will return an error
74
+ #
75
+ # @param id [Integer] Unique identifier of a Contact
76
+ # @return [Contact] Searched resource object.
77
+ def find(id)
78
+ _, _, root = @client.get("/contacts/#{id}")
79
+
80
+ Contact.new(root[:data])
81
+ end
82
+
83
+
84
+ # Update a contact
85
+ #
86
+ # put '/contacts/{id}'
87
+ #
88
+ # Updates contact information
89
+ # If the specified contact does not exist, the request will return an error
90
+ # **Notice** When updating contact tags, you need to provide all tags
91
+ # Any missing tag will be removed from a contact's tags
92
+ #
93
+ # @param contact [Contact, Hash] Either object of the Contact type or Hash. This object's attributes describe the object to be updated.
94
+ # @return [Contact] The resulting object represting updated resource.
95
+ def update(contact)
96
+ validate_type!(contact)
97
+ params = extract_params!(contact, :id)
98
+ id = params[:id]
99
+
100
+ attributes = sanitize(contact)
101
+ _, _, root = @client.put("/contacts/#{id}", attributes)
102
+
103
+ Contact.new(root[:data])
104
+ end
105
+
106
+
107
+ # Delete a contact
108
+ #
109
+ # delete '/contacts/{id}'
110
+ #
111
+ # Delete an existing contact
112
+ # If the specified contact does not exist, the request will return an error
113
+ # This operation cannot be undone
114
+ #
115
+ # @param id [Integer] Unique identifier of a Contact
116
+ # @return [Boolean] Status of the operation.
117
+ def destroy(id)
118
+ status, _, _ = @client.delete("/contacts/#{id}")
119
+ status == 204
120
+ end
121
+
122
+
123
+ private
124
+ def validate_type!(contact)
125
+ raise TypeError unless contact.is_a?(Contact) || contact.is_a?(Hash)
126
+ end
127
+
128
+ def extract_params!(contact, *args)
129
+ params = contact.to_h.select{ |k, _| args.include?(k) }
130
+ raise ArgumentError, "one of required attributes is missing. Expected: #{args.join(',')}" if params.count != args.length
131
+ params
132
+ end
133
+
134
+ def sanitize(contact)
135
+ contact.to_h.select { |k, _| OPTS_KEYS_TO_PERSIST.include?(k) }
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,137 @@
1
+ # WARNING: This code is auto-generated from the BaseCRM API Discovery JSON Schema
2
+
3
+ module BaseCRM
4
+ class DealsService
5
+ OPTS_KEYS_TO_PERSIST = Set[:contact_id, :currency, :custom_fields, :hot, :loss_reason_id, :name, :owner_id, :source_id, :stage_id, :tags, :value]
6
+
7
+ def initialize(client)
8
+ @client = client
9
+ end
10
+
11
+ # Retrieve all deals
12
+ #
13
+ # get '/deals'
14
+ #
15
+ # If you want to use filtering or sorting (see #where).
16
+ # @return [Enumerable] Paginated resource you can use to iterate over all the resources.
17
+ def all
18
+ PaginatedResource.new(self)
19
+ end
20
+
21
+ # Retrieve all deals
22
+ #
23
+ # get '/deals'
24
+ #
25
+ # Returns all deals available to the user according to the parameters provided
26
+ #
27
+ # @param options [Hash] Search options
28
+ # @option options [Integer] :contact_id Unique identifier of a primary contact.
29
+ # @option options [Integer] :creator_id Unique identifier of the user the deal was created by. Returns all deals created by the user.
30
+ # @option options [Boolean] :hot Indicator of whether or not the deal is hot.
31
+ # @option options [String] :ids Comma-separated list of deal IDs to be returned in a request.
32
+ # @option options [Integer] :organization_id Unique identifier of an organization.
33
+ # @option options [Integer] :owner_id Unique identifier of the user the deal is owned by. Returns all deals owned by the user.
34
+ # @option options [Integer] :page (1) Page number to start from. Page numbering starts at 1, and omitting the `page` parameter will return the first page.
35
+ # @option options [Integer] :per_page (25) Number of records to return per page. Default limit is *25* and the maximum number that can be returned is *100*.
36
+ # @option options [String] :sort_by (id:asc) A field to sort by. **Default** ordering is **ascending**. If you want to change the sort ordering to descending, append `:desc` to the field e.g. `sort_by=value:desc`.
37
+ # @option options [Integer] :source_id Id of the Source.
38
+ # @option options [Integer] :stage_id Id of the Stage.
39
+ # @return [Array<Deal>] The list of Deals for the first page, unless otherwise specified.
40
+ def where(options = {})
41
+ _, _, root = @client.get("/deals", options)
42
+
43
+ root[:items].map{ |item| Deal.new(item[:data]) }
44
+ end
45
+
46
+
47
+ # Create a deal
48
+ #
49
+ # post '/deals'
50
+ #
51
+ # Create a new deal
52
+ #
53
+ # @param deal [Deal, Hash] Either object of the Deal type or Hash. This object's attributes describe the object to be created.
54
+ # @return [Deal] The resulting object represting created resource.
55
+ def create(deal)
56
+ validate_type!(deal)
57
+
58
+ attributes = sanitize(deal)
59
+ _, _, root = @client.post("/deals", attributes)
60
+
61
+ Deal.new(root[:data])
62
+ end
63
+
64
+
65
+ # Retrieve a single deal
66
+ #
67
+ # get '/deals/{id}'
68
+ #
69
+ # Returns a single deal available to the user, according to the unique deal ID provided
70
+ # If the specified deal does not exist, the request will return an error
71
+ #
72
+ # @param id [Integer] Unique identifier of a Deal
73
+ # @return [Deal] Searched resource object.
74
+ def find(id)
75
+ _, _, root = @client.get("/deals/#{id}")
76
+
77
+ Deal.new(root[:data])
78
+ end
79
+
80
+
81
+ # Update a deal
82
+ #
83
+ # put '/deals/{id}'
84
+ #
85
+ # Updates deal information
86
+ # If the specified deal does not exist, the request will return an error
87
+ # <figure class="notice">
88
+ # In order to modify tags used on a record, you need to supply the entire set
89
+ # `tags` are replaced every time they are used in a request
90
+ # </figure>
91
+ #
92
+ # @param deal [Deal, Hash] Either object of the Deal type or Hash. This object's attributes describe the object to be updated.
93
+ # @return [Deal] The resulting object represting updated resource.
94
+ def update(deal)
95
+ validate_type!(deal)
96
+ params = extract_params!(deal, :id)
97
+ id = params[:id]
98
+
99
+ attributes = sanitize(deal)
100
+ _, _, root = @client.put("/deals/#{id}", attributes)
101
+
102
+ Deal.new(root[:data])
103
+ end
104
+
105
+
106
+ # Delete a deal
107
+ #
108
+ # delete '/deals/{id}'
109
+ #
110
+ # Delete an existing deal and remove all of the associated contacts from the deal in a single call
111
+ # If the specified deal does not exist, the request will return an error
112
+ # This operation cannot be undone
113
+ #
114
+ # @param id [Integer] Unique identifier of a Deal
115
+ # @return [Boolean] Status of the operation.
116
+ def destroy(id)
117
+ status, _, _ = @client.delete("/deals/#{id}")
118
+ status == 204
119
+ end
120
+
121
+
122
+ private
123
+ def validate_type!(deal)
124
+ raise TypeError unless deal.is_a?(Deal) || deal.is_a?(Hash)
125
+ end
126
+
127
+ def extract_params!(deal, *args)
128
+ params = deal.to_h.select{ |k, _| args.include?(k) }
129
+ raise ArgumentError, "one of required attributes is missing. Expected: #{args.join(',')}" if params.count != args.length
130
+ params
131
+ end
132
+
133
+ def sanitize(deal)
134
+ deal.to_h.select { |k, _| OPTS_KEYS_TO_PERSIST.include?(k) }
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,140 @@
1
+ # WARNING: This code is auto-generated from the BaseCRM API Discovery JSON Schema
2
+
3
+ module BaseCRM
4
+ class LeadsService
5
+ OPTS_KEYS_TO_PERSIST = Set[:address, :custom_fields, :description, :email, :facebook, :fax, :first_name, :industry, :last_name, :linkedin, :mobile, :organization_name, :owner_id, :phone, :skype, :status, :tags, :title, :twitter, :website]
6
+
7
+ def initialize(client)
8
+ @client = client
9
+ end
10
+
11
+ # Retrieve all leads
12
+ #
13
+ # get '/leads'
14
+ #
15
+ # If you want to use filtering or sorting (see #where).
16
+ # @return [Enumerable] Paginated resource you can use to iterate over all the resources.
17
+ def all
18
+ PaginatedResource.new(self)
19
+ end
20
+
21
+ # Retrieve all leads
22
+ #
23
+ # get '/leads'
24
+ #
25
+ # Returns all leads available to the user, according to the parameters provided
26
+ #
27
+ # @param options [Hash] Search options
28
+ # @option options [String] :"address[city]" City name.
29
+ # @option options [String] :"address[country]" Country name.
30
+ # @option options [String] :"address[postal_code]" Zip or Postal code
31
+ # @option options [Integer] :creator_id User ID. Returns all leads created by that user.
32
+ # @option options [String] :first_name First name of the lead.
33
+ # @option options [String] :ids Comma-separated list of lead IDs to be returned in a request.
34
+ # @option options [String] :last_name Last name of the lead.
35
+ # @option options [String] :organization_name Organization name of the lead.
36
+ # @option options [Integer] :owner_id User ID. Returns all leads owned by that user.
37
+ # @option options [Integer] :page (1) Page number to start from. Page numbering starts at 1 and omitting the `page` parameter will return the first page.
38
+ # @option options [Integer] :per_page (25) Number of records to return per page. The default limit is *25* and the maximum number that can be returned is *100*.
39
+ # @option options [String] :sort_by (updated_at:asc) A field to sort by. The **default** order is **ascending**. If you want to change the sort order to descending, append `:desc` to the field e.g. `sort_by=last_name:desc`.
40
+ # @option options [String] :status Status of the lead.
41
+ # @return [Array<Lead>] The list of Leads for the first page, unless otherwise specified.
42
+ def where(options = {})
43
+ _, _, root = @client.get("/leads", options)
44
+
45
+ root[:items].map{ |item| Lead.new(item[:data]) }
46
+ end
47
+
48
+
49
+ # Create a lead
50
+ #
51
+ # post '/leads'
52
+ #
53
+ # Creates a new lead
54
+ # A lead may represent a single individual or an organization
55
+ #
56
+ # @param lead [Lead, Hash] Either object of the Lead type or Hash. This object's attributes describe the object to be created.
57
+ # @return [Lead] The resulting object represting created resource.
58
+ def create(lead)
59
+ validate_type!(lead)
60
+
61
+ attributes = sanitize(lead)
62
+ _, _, root = @client.post("/leads", attributes)
63
+
64
+ Lead.new(root[:data])
65
+ end
66
+
67
+
68
+ # Retrieve a single lead
69
+ #
70
+ # get '/leads/{id}'
71
+ #
72
+ # Returns a single lead available to the user, according to the unique lead ID provided
73
+ # If the specified lead does not exist, this query returns an error
74
+ #
75
+ # @param id [Integer] Unique identifier of a Lead
76
+ # @return [Lead] Searched resource object.
77
+ def find(id)
78
+ _, _, root = @client.get("/leads/#{id}")
79
+
80
+ Lead.new(root[:data])
81
+ end
82
+
83
+
84
+ # Update a lead
85
+ #
86
+ # put '/leads/{id}'
87
+ #
88
+ # Updates lead information
89
+ # If the specified lead does not exist, this query returns an error
90
+ # <figure class="notice">
91
+ # In order to modify tags, you need to supply the entire set of tags
92
+ # `tags` are replaced every time they are used in a request
93
+ # </figure>
94
+ #
95
+ # @param lead [Lead, Hash] Either object of the Lead type or Hash. This object's attributes describe the object to be updated.
96
+ # @return [Lead] The resulting object represting updated resource.
97
+ def update(lead)
98
+ validate_type!(lead)
99
+ params = extract_params!(lead, :id)
100
+ id = params[:id]
101
+
102
+ attributes = sanitize(lead)
103
+ _, _, root = @client.put("/leads/#{id}", attributes)
104
+
105
+ Lead.new(root[:data])
106
+ end
107
+
108
+
109
+ # Delete a lead
110
+ #
111
+ # delete '/leads/{id}'
112
+ #
113
+ # Delete an existing lead
114
+ # If the specified lead does not exist, this query returns an error
115
+ # This operation cannot be undone
116
+ #
117
+ # @param id [Integer] Unique identifier of a Lead
118
+ # @return [Boolean] Status of the operation.
119
+ def destroy(id)
120
+ status, _, _ = @client.delete("/leads/#{id}")
121
+ status == 204
122
+ end
123
+
124
+
125
+ private
126
+ def validate_type!(lead)
127
+ raise TypeError unless lead.is_a?(Lead) || lead.is_a?(Hash)
128
+ end
129
+
130
+ def extract_params!(lead, *args)
131
+ params = lead.to_h.select{ |k, _| args.include?(k) }
132
+ raise ArgumentError, "one of required attributes is missing. Expected: #{args.join(',')}" if params.count != args.length
133
+ params
134
+ end
135
+
136
+ def sanitize(lead)
137
+ lead.to_h.select { |k, _| OPTS_KEYS_TO_PERSIST.include?(k) }
138
+ end
139
+ end
140
+ end