teamsupport 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.
- checksums.yaml +7 -0
- data/.yardopts +12 -0
- data/CHANGELOG.md +11 -0
- data/CONTRIBUTING.md +47 -0
- data/LICENSE.md +26 -0
- data/README.md +132 -0
- data/lib/teamsupport.rb +21 -0
- data/lib/teamsupport/arguments.rb +26 -0
- data/lib/teamsupport/base.rb +173 -0
- data/lib/teamsupport/client.rb +86 -0
- data/lib/teamsupport/creatable.rb +31 -0
- data/lib/teamsupport/customer.rb +66 -0
- data/lib/teamsupport/customer_product.rb +14 -0
- data/lib/teamsupport/error.rb +135 -0
- data/lib/teamsupport/headers.rb +51 -0
- data/lib/teamsupport/identity.rb +43 -0
- data/lib/teamsupport/null_object.rb +52 -0
- data/lib/teamsupport/product.rb +14 -0
- data/lib/teamsupport/rest/api.rb +19 -0
- data/lib/teamsupport/rest/client.rb +25 -0
- data/lib/teamsupport/rest/customers.rb +156 -0
- data/lib/teamsupport/rest/products.rb +113 -0
- data/lib/teamsupport/rest/request.rb +116 -0
- data/lib/teamsupport/rest/tickets.rb +134 -0
- data/lib/teamsupport/rest/utils.rb +325 -0
- data/lib/teamsupport/ticket.rb +81 -0
- data/lib/teamsupport/ticket_action.rb +16 -0
- data/lib/teamsupport/utils.rb +33 -0
- data/lib/teamsupport/version.rb +73 -0
- data/teamsupport.gemspec +27 -0
- metadata +158 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'teamsupport/base'
|
2
|
+
require 'teamsupport/creatable'
|
3
|
+
require 'teamsupport/identity'
|
4
|
+
|
5
|
+
module Teamsupport
|
6
|
+
class Product < Teamsupport::Identity
|
7
|
+
include Teamsupport::Creatable
|
8
|
+
|
9
|
+
# @return [Integer]
|
10
|
+
attr_reader :ID, :CreatorID, :ModifierID
|
11
|
+
# @return [String]
|
12
|
+
attr_reader :Name, :Description
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'teamsupport/rest/customers'
|
2
|
+
require 'teamsupport/rest/products'
|
3
|
+
require 'teamsupport/rest/tickets'
|
4
|
+
|
5
|
+
module Teamsupport
|
6
|
+
module REST
|
7
|
+
module API
|
8
|
+
# TODO: include Teamsupport::REST::Assets
|
9
|
+
# TODO: include Teamsupport::REST::Contacts
|
10
|
+
include Teamsupport::REST::Customers
|
11
|
+
# TODO: include Teamsupport::REST::Groups
|
12
|
+
include Teamsupport::REST::Products
|
13
|
+
# TODO: include Teamsupport::REST::Properties
|
14
|
+
include Teamsupport::REST::Tickets
|
15
|
+
# TODO: include Teamsupport::REST::Users
|
16
|
+
# TODO: include Teamsupport::REST::Wiki
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'teamsupport/client'
|
2
|
+
require 'teamsupport/rest/api'
|
3
|
+
require 'teamsupport/rest/request'
|
4
|
+
require 'teamsupport/rest/utils'
|
5
|
+
|
6
|
+
module Teamsupport
|
7
|
+
module REST
|
8
|
+
class Client < Teamsupport::Client
|
9
|
+
include Teamsupport::REST::API
|
10
|
+
|
11
|
+
# Checks for the existence of an authentication hash on the Client
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# teamsupport_client = Teamsupport::REST::Client.new(api_key: 'AK', api_secret: 'AS')
|
15
|
+
# teamsupport_client.auth?
|
16
|
+
#
|
17
|
+
# @return [Boolean]
|
18
|
+
#
|
19
|
+
# @api public
|
20
|
+
def auth?
|
21
|
+
super
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
require 'teamsupport/error'
|
2
|
+
require 'teamsupport/customer'
|
3
|
+
require 'teamsupport/rest/utils'
|
4
|
+
require 'teamsupport/utils'
|
5
|
+
|
6
|
+
module Teamsupport
|
7
|
+
module REST
|
8
|
+
module Customers
|
9
|
+
include Teamsupport::REST::Utils
|
10
|
+
include Teamsupport::Utils
|
11
|
+
|
12
|
+
# Returns all available customers for the TeamSupport organization
|
13
|
+
#
|
14
|
+
# @see http://help.teamsupport.com/1/en/topic/api
|
15
|
+
#
|
16
|
+
# @example
|
17
|
+
# teamsupport_api = Teamsupport::REST::Client.new(api_key: 'AK', api_secret: 'AS')
|
18
|
+
# teamsupport_api.customers()
|
19
|
+
#
|
20
|
+
# @authentication Requires Basic Authentication
|
21
|
+
#
|
22
|
+
# @raise [Teamsupport::Error::Unauthorized] Error raised when supplied API credentials are not valid.
|
23
|
+
#
|
24
|
+
# @return [Array<Teamsupport::Customer>]
|
25
|
+
#
|
26
|
+
# @param options [Hash] A customizable set of options.
|
27
|
+
#
|
28
|
+
# @option options [Integer] :count Specifies the number of records to retrieve.
|
29
|
+
#
|
30
|
+
# @api public
|
31
|
+
def customers(options = {})
|
32
|
+
perform_get_with_objects_from_collection('/api/json/customers.json', options, Teamsupport::Customer, :Customers)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Returns a customer
|
36
|
+
#
|
37
|
+
# @example
|
38
|
+
# teamsupport_api = Teamsupport::REST::Client.new(api_key: 'AK', api_secret: 'AS')
|
39
|
+
# teamsupport_api.customer('1')
|
40
|
+
#
|
41
|
+
# @authentication Requires Basic Authentication
|
42
|
+
#
|
43
|
+
# @raise [Teamsupport::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
44
|
+
#
|
45
|
+
# @return [Teamsupport::Customer] The requested customer.
|
46
|
+
#
|
47
|
+
# @param id [Integer] A customer ID.
|
48
|
+
# @param options [Hash] A customizable set of options.
|
49
|
+
#
|
50
|
+
# @api public
|
51
|
+
def customer(id, options = {})
|
52
|
+
perform_get_with_object_from_collection("/api/json/customers/#{id}.json", options, Teamsupport::Customer, :Customer)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Create a customer
|
56
|
+
#
|
57
|
+
# @example
|
58
|
+
# teamsupport_api = Teamsupport::REST::Client.new(api_key: 'AK', api_secret: 'AS')
|
59
|
+
# teamsupport_api.create_customer(Name: 'New Customer')
|
60
|
+
#
|
61
|
+
# @authentication Requires Basic Authentication
|
62
|
+
#
|
63
|
+
# @raise [Teamsupport::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
64
|
+
#
|
65
|
+
# @return [Teamsupport::Customer] The new customer.
|
66
|
+
#
|
67
|
+
# @param options [Hash] A customizable set of options.
|
68
|
+
#
|
69
|
+
# @api public
|
70
|
+
def create_customer(options = {})
|
71
|
+
perform_post_with_object_from_collection('/api/json/customers.json', options, Teamsupport::Customer, :Customer)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Updates the customer
|
75
|
+
#
|
76
|
+
# @example
|
77
|
+
# teamsupport_api = Teamsupport::REST::Client.new(api_key: 'AK', api_secret: 'AS')
|
78
|
+
# teamsupport_api.update_customer('1', Name: 'Updated Customer Name')
|
79
|
+
#
|
80
|
+
# @authentication Requires Basic Authentication
|
81
|
+
#
|
82
|
+
# @raise [Teamsupport::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
83
|
+
#
|
84
|
+
# @return [Teamsupport::Customer] The updated customer.
|
85
|
+
#
|
86
|
+
# @param id [Integer] A customer ID.
|
87
|
+
# @param options [Hash] A customizable set of options.
|
88
|
+
#
|
89
|
+
# @api public
|
90
|
+
def update_customer(id, options = {})
|
91
|
+
customer_hash = customer(id).to_h
|
92
|
+
perform_put_with_object_from_collection("/api/json/customers/#{id}.json", customer_hash.merge(options), Teamsupport::Customer, :Customer)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Deletes the customer
|
96
|
+
#
|
97
|
+
# @example
|
98
|
+
# teamsupport_api = Teamsupport::REST::Client.new(api_key: 'AK', api_secret: 'AS')
|
99
|
+
# teamsupport_api.delete_customer('1')
|
100
|
+
#
|
101
|
+
# @authentication Requires Basic Authentication
|
102
|
+
#
|
103
|
+
# @raise [Teamsupport::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
104
|
+
#
|
105
|
+
# @param id [Integer] A customer ID.
|
106
|
+
# @param options [Hash] A customizable set of options.
|
107
|
+
#
|
108
|
+
# @api public
|
109
|
+
def delete_customer(id, options = {})
|
110
|
+
perform_delete("/api/json/customers/#{id}.json", options)
|
111
|
+
end
|
112
|
+
|
113
|
+
# Returns the products for a customer
|
114
|
+
#
|
115
|
+
# @example
|
116
|
+
# teamsupport_api = Teamsupport::REST::Client.new(api_key: 'AK', api_secret: 'AS')
|
117
|
+
# teamsupport_api.customer_products('1')
|
118
|
+
#
|
119
|
+
# @authentication Requires Basic Authentication
|
120
|
+
#
|
121
|
+
# @raise [Teamsupport::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
122
|
+
#
|
123
|
+
# @return [Array<Teamsupport::Product>]
|
124
|
+
#
|
125
|
+
# @param id [Integer] A customer ID.
|
126
|
+
# @param options [Hash] A customizable set of options.
|
127
|
+
#
|
128
|
+
# @api public
|
129
|
+
def customer_products(id, options = {})
|
130
|
+
options = options.dup
|
131
|
+
perform_get_with_objects_from_collection("/api/json/customers/#{id}/products.json", options, Teamsupport::CustomerProduct, :OrganizationProducts)
|
132
|
+
end
|
133
|
+
|
134
|
+
# Returns the tickets for a customer
|
135
|
+
#
|
136
|
+
# @example
|
137
|
+
# teamsupport_api = Teamsupport::REST::Client.new(api_key: 'AK', api_secret: 'AS')
|
138
|
+
# teamsupport_api.customer_tickets('1')
|
139
|
+
#
|
140
|
+
# @authentication Requires Basic Authentication
|
141
|
+
#
|
142
|
+
# @raise [Teamsupport::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
143
|
+
#
|
144
|
+
# @return [Array<Teamsupport::Ticket>]
|
145
|
+
#
|
146
|
+
# @param id [Integer] A customer ID.
|
147
|
+
# @param options [Hash] A customizable set of options.
|
148
|
+
#
|
149
|
+
# @api public
|
150
|
+
def customer_tickets(id, options = {})
|
151
|
+
options = options.dup
|
152
|
+
perform_get_with_objects_from_collection("/api/json/customers/#{id}/tickets.json", options, Teamsupport::Ticket, :Tickets)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'teamsupport/error'
|
2
|
+
require 'teamsupport/product'
|
3
|
+
require 'teamsupport/rest/utils'
|
4
|
+
require 'teamsupport/utils'
|
5
|
+
|
6
|
+
module Teamsupport
|
7
|
+
module REST
|
8
|
+
module Products
|
9
|
+
include Teamsupport::REST::Utils
|
10
|
+
include Teamsupport::Utils
|
11
|
+
|
12
|
+
# Returns all available products for the TeamSupport organization
|
13
|
+
#
|
14
|
+
# @see http://help.teamsupport.com/1/en/topic/api
|
15
|
+
#
|
16
|
+
# @example
|
17
|
+
# teamsupport_api = Teamsupport::REST::Client.new(api_key: 'AK', api_secret: 'AS')
|
18
|
+
# teamsupport_api.products()
|
19
|
+
#
|
20
|
+
# @authentication Requires Basic Authentication
|
21
|
+
#
|
22
|
+
# @raise [Teamsupport::Error::Unauthorized] Error raised when supplied API credentials are not valid.
|
23
|
+
#
|
24
|
+
# @return [Array<Teamsupport::Product>]
|
25
|
+
#
|
26
|
+
# @param options [Hash] A customizable set of options.
|
27
|
+
# @option options [Integer] :count Specifies the number of records to retrieve.
|
28
|
+
#
|
29
|
+
# @api public
|
30
|
+
def products(options = {})
|
31
|
+
perform_get_with_objects_from_collection('/api/json/products.json', options, Teamsupport::Product, :Products)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns a product
|
35
|
+
#
|
36
|
+
# @example
|
37
|
+
# teamsupport_api = Teamsupport::REST::Client.new(api_key: 'AK', api_secret: 'AS')
|
38
|
+
# teamsupport_api.product('1')
|
39
|
+
#
|
40
|
+
# @authentication Requires Basic Authentication
|
41
|
+
#
|
42
|
+
# @raise [Teamsupport::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
43
|
+
#
|
44
|
+
# @return [Teamsupport::Product] The requested product.
|
45
|
+
#
|
46
|
+
# @param id [Integer] A product ID.
|
47
|
+
# @param options [Hash] A customizable set of options.
|
48
|
+
#
|
49
|
+
# @api public
|
50
|
+
def product(id, options = {})
|
51
|
+
perform_get_with_object_from_collection("/api/json/products/#{id}.json", options, Teamsupport::Product, :Product)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Create a product
|
55
|
+
#
|
56
|
+
# @example
|
57
|
+
# teamsupport_api = Teamsupport::REST::Client.new(api_key: 'AK', api_secret: 'AS')
|
58
|
+
# teamsupport_api.create_product(Name: 'New Product')
|
59
|
+
#
|
60
|
+
# @authentication Requires Basic Authentication
|
61
|
+
#
|
62
|
+
# @raise [Teamsupport::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
63
|
+
#
|
64
|
+
# @return [Teamsupport::Product] The new product.
|
65
|
+
#
|
66
|
+
# @param options [Hash] A customizable set of options.
|
67
|
+
#
|
68
|
+
# @api public
|
69
|
+
def create_product(options = {})
|
70
|
+
perform_post_with_object_from_collection('/api/json/products.json', options, Teamsupport::Product, :Product)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Updates the product
|
74
|
+
#
|
75
|
+
# @example
|
76
|
+
# teamsupport_api = Teamsupport::REST::Client.new(api_key: 'AK', api_secret: 'AS')
|
77
|
+
# teamsupport_api.update_product('1', Name: 'Updated Product Name')
|
78
|
+
#
|
79
|
+
# @authentication Requires Basic Authentication
|
80
|
+
#
|
81
|
+
# @raise [Teamsupport::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
82
|
+
#
|
83
|
+
# @return [Teamsupport::Product] The updated product.
|
84
|
+
#
|
85
|
+
# @param id [Integer] A product ID.
|
86
|
+
# @param options [Hash] A customizable set of options.
|
87
|
+
#
|
88
|
+
# @api public
|
89
|
+
def update_product(id, options = {})
|
90
|
+
product_hash = product(id).to_h
|
91
|
+
perform_put_with_object_from_collection("/api/json/products/#{id}.json", product_hash.merge(options), Teamsupport::Product, :Product)
|
92
|
+
end
|
93
|
+
|
94
|
+
# Deletes the product
|
95
|
+
#
|
96
|
+
# @example
|
97
|
+
# teamsupport_api = Teamsupport::REST::Client.new(api_key: 'AK', api_secret: 'AS')
|
98
|
+
# teamsupport_api.delete_product('1')
|
99
|
+
#
|
100
|
+
# @authentication Requires Basic Authentication
|
101
|
+
#
|
102
|
+
# @raise [Teamsupport::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
103
|
+
#
|
104
|
+
# @param id [Integer] A product ID.
|
105
|
+
# @param options [Hash] A customizable set of options.
|
106
|
+
#
|
107
|
+
# @api public
|
108
|
+
def delete_product(id, options = {})
|
109
|
+
perform_delete("/api/json/products/#{id}.json", options)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'addressable/uri'
|
2
|
+
require 'http'
|
3
|
+
require 'http/form_data'
|
4
|
+
require 'json'
|
5
|
+
require 'openssl'
|
6
|
+
require 'teamsupport/error'
|
7
|
+
require 'teamsupport/headers'
|
8
|
+
|
9
|
+
module Teamsupport
|
10
|
+
module REST
|
11
|
+
class Request
|
12
|
+
BASE_URL = 'https://app.teamsupport.com'.freeze
|
13
|
+
attr_accessor :client, :headers, :options, :path, :request_method, :uri
|
14
|
+
alias verb request_method
|
15
|
+
|
16
|
+
# Initialize a new REST Request object
|
17
|
+
#
|
18
|
+
# @param client [Teamsupport::Client]
|
19
|
+
# @param request_method [String, Symbol]
|
20
|
+
# @param path [String]
|
21
|
+
# @param options [Hash]
|
22
|
+
#
|
23
|
+
# @return [Teamsupport::REST::Request]
|
24
|
+
#
|
25
|
+
# @api private
|
26
|
+
def initialize(client, request_method, path, options = {})
|
27
|
+
@client = client
|
28
|
+
@uri = Addressable::URI.parse(path.start_with?('http') ? path : BASE_URL + path)
|
29
|
+
@request_method = request_method
|
30
|
+
@headers = Teamsupport::Headers.new(@client, @request_method, @uri, options).request_headers
|
31
|
+
@path = uri.path
|
32
|
+
@options = options
|
33
|
+
end
|
34
|
+
|
35
|
+
# Perform an HTTP REST request and return response body or raise the error
|
36
|
+
#
|
37
|
+
# @example
|
38
|
+
# Teamsupport::REST::Request.new(self, request_method, path, options).perform
|
39
|
+
#
|
40
|
+
# @return [Array, Hash]
|
41
|
+
#
|
42
|
+
# @api public
|
43
|
+
def perform
|
44
|
+
options_key = @request_method == :get ? :params : :body
|
45
|
+
# For non-GET requests need to send the options as JSON in the request body
|
46
|
+
response = http_client.headers(@headers).public_send(@request_method, @uri.to_s, options_key => @options)
|
47
|
+
response_body = response.body.empty? ? '' : symbolize_keys!(response.parse)
|
48
|
+
response_headers = response.headers
|
49
|
+
fail_or_return_response_body(response.code, response_body, response_headers)
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
# Check response and raise an error or return the response body if successful
|
55
|
+
#
|
56
|
+
# @param code [Strin]
|
57
|
+
# @param body [String]
|
58
|
+
# @param headers [String]
|
59
|
+
#
|
60
|
+
# @raise [Teamsupport::Error] Error raised based on response code/body/headers
|
61
|
+
#
|
62
|
+
# @return [Array, Hash]
|
63
|
+
#
|
64
|
+
# @api private
|
65
|
+
def fail_or_return_response_body(code, body, headers)
|
66
|
+
error = error(code, body, headers)
|
67
|
+
raise(error) if error
|
68
|
+
body
|
69
|
+
end
|
70
|
+
|
71
|
+
# Check response code/body/headers for errors and return Teamsupport::Error
|
72
|
+
#
|
73
|
+
# @param code [Strin]
|
74
|
+
# @param body [String]
|
75
|
+
# @param headers [String]
|
76
|
+
#
|
77
|
+
# @return [Teamsupport::Error, nil]
|
78
|
+
#
|
79
|
+
# @api private
|
80
|
+
def error(code, body, headers)
|
81
|
+
klass = Teamsupport::Error::ERRORS[code]
|
82
|
+
|
83
|
+
klass.from_response(body, headers) unless klass.nil?
|
84
|
+
end
|
85
|
+
|
86
|
+
# Convert array/hash keys to symbols
|
87
|
+
#
|
88
|
+
# @param object [Array, Hash]
|
89
|
+
#
|
90
|
+
# @return [Hash, Array]
|
91
|
+
#
|
92
|
+
# @api private
|
93
|
+
def symbolize_keys!(object)
|
94
|
+
if object.is_a?(Array)
|
95
|
+
object.each_with_index do |val, index|
|
96
|
+
object[index] = symbolize_keys!(val)
|
97
|
+
end
|
98
|
+
elsif object.is_a?(Hash)
|
99
|
+
object.keys.each do |key|
|
100
|
+
object[key.to_sym] = symbolize_keys!(object.delete(key))
|
101
|
+
end
|
102
|
+
end
|
103
|
+
object
|
104
|
+
end
|
105
|
+
|
106
|
+
# Returns the HTTP Client object
|
107
|
+
#
|
108
|
+
# @return [HTTP::Client, HTTP]
|
109
|
+
#
|
110
|
+
# @api private
|
111
|
+
def http_client
|
112
|
+
HTTP
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|