fresh_service_api_v2_client 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f907ae6b108ec816a765681f148d5277149919255136d52202afcd6db7db4fac
4
+ data.tar.gz: a756eb8fba3108d0f10f7b6cdec66ba86d43f2045fc275b6411a4c3028b10a0e
5
+ SHA512:
6
+ metadata.gz: 62dcabeb3230e320d7ef464056a21542174c45a55cbcac191145b088818c19386357b8b1a85c61916cec256f88609fc7e865cc460bc6b19dffa9da883a08dfa6
7
+ data.tar.gz: b305b01bd36e318701e07dd06d64ee0d04a7d5de0a1cf07f6da2acc175f91879d87a6948bfed7f2a27aa5b64c920ee0c42ae560e36d54c899fa64204ea8934af
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FreshService
4
+ class Client
5
+ module V2
6
+ module Group
7
+ module Create
8
+ # Create a group
9
+ #
10
+ # @param = [name, description, unassigned_for, agent_ids, members, approval_required]
11
+ #
12
+ # @return Faraday Response
13
+ # @see https://api.freshservice.com/#create_a_group
14
+ def create_group(options = {})
15
+ post "/groups", options
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FreshService
4
+ class Client
5
+ module V2
6
+ module Group
7
+ module View
8
+ # View a Group
9
+ #
10
+ # @param = [group_id]
11
+ #
12
+ # @return Faraday Response
13
+ # @see https://api.freshservice.com/#view_a_group
14
+ def view_group(group_id, options = {})
15
+ get "/groups/#{group_id}", options
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FreshService
4
+ class Client
5
+ module V2
6
+ module ServiceRequest
7
+ module Create
8
+ # Create a ServiceRequest
9
+ #
10
+ # @param for service request
11
+ # | Attribute | Type | Description |
12
+ # | display_id | number | Service Item ID inside service catalog |
13
+ # | quantity | number | Quantity needed by the requested |
14
+ # | requested_for | email | Email id of the requester on whose behalf the service request is created |
15
+ # | email | email | Email id of the requester |
16
+ # | child_items | - | Provide the display id as service_item_id for each child item. |
17
+ # | custom_fields | - | Values of custom fields present in the service item form |
18
+ #
19
+ # @return Faraday Response
20
+ # @see https://api.freshservice.com/#create_service_request
21
+ def create_service_request(display_id, options = {})
22
+ post "/service_catalog/items/#{display_id}/place_request", options
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FreshService
4
+ class Client
5
+ module V2
6
+ module ServiceRequest
7
+ module Update
8
+ # Update a ServiceRequest
9
+ #
10
+ # @param ServiceRequest update refer create service request
11
+ #
12
+ # @return Faraday Response
13
+ # @see https://api.freshservice.com/#update_req_items_of_sr
14
+ def update_service_request(ticket_id, item_id, options = {})
15
+ put "/tickets/#{ticket_id}/requested_items/#{item_id}", options
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FreshService
4
+ class Client
5
+ module V2
6
+ module Ticket
7
+ module Create
8
+ # Create a ticket
9
+ #
10
+ # @param = [name, requester_id, email, phone, subject, type, status, priority, description,
11
+ # responder_id, attachments, cc_emails, custom_fields, due_by, email_config_id,
12
+ # fr_due_by, group_id, source, tags, department_id, category, sub_category,
13
+ # item_category, associate_ci, assets, urgency, impact, problem]
14
+ #
15
+ # @return Faraday Response
16
+ # @see https://api.freshservice.com/#create_ticket
17
+ def create_ticket(options = {})
18
+ post "/tickets", options
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FreshService
4
+ class Client
5
+ module V2
6
+ module Ticket
7
+ module Update
8
+ # Update a ticket
9
+ #
10
+ # @param Refer create ticket
11
+ #
12
+ # @return Faraday Response
13
+ # @see https://api.freshservice.com/#update_ticket_priority
14
+ def update_ticket(ticket_id, options = {})
15
+ put "/tickets/#{ticket_id}", options
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FreshService
4
+ class Client
5
+ module V2
6
+ module Ticket
7
+ module View
8
+ # View a ticket
9
+ #
10
+ # @param = [ticket_id]
11
+ #
12
+ # @return Faraday Response
13
+ # @see https://api.freshservice.com/#view_a_ticket
14
+ def view_ticket(ticket_id, options = {})
15
+ get "/tickets/#{ticket_id}", options
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fresh_service/default"
4
+ require "fresh_service/connection"
5
+ require "fresh_service/configurable"
6
+ require "fresh_service/client/v2/ticket/create"
7
+ require "fresh_service/client/v2/ticket/update"
8
+ require "fresh_service/client/v2/ticket/view"
9
+ require "fresh_service/client/v2/group/create"
10
+ require "fresh_service/client/v2/group/view"
11
+ require "fresh_service/client/v2/service_request/create"
12
+ require "fresh_service/client/v2/service_request/update"
13
+ require "fresh_service/error"
14
+
15
+ module FreshService
16
+ # Client for the FreshService API
17
+ #
18
+ # @see https://api.freshservice.com/
19
+ class Client
20
+ include FreshService::Default
21
+ include FreshService::Connection
22
+ include FreshService::Configurable
23
+ include FreshService::Client::V2::Ticket::Create
24
+ include FreshService::Client::V2::Ticket::Update
25
+ include FreshService::Client::V2::Ticket::View
26
+ include FreshService::Client::V2::Group::Create
27
+ include FreshService::Client::V2::Group::View
28
+ include FreshService::Client::V2::ServiceRequest::Create
29
+ include FreshService::Client::V2::ServiceRequest::Update
30
+
31
+ def initialize(options = {})
32
+ # Use options passed in, but fall back to module defaults
33
+ FreshService::Configurable.keys.each do |key|
34
+ value = options.key?(key) ? options[key] : FreshService.instance_variable_get(:"@#{key}")
35
+ value = value.presence || FreshService::Default.send(:"#{key}")
36
+ instance_variable_set(:"@#{key}", value)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FreshService
4
+ # Configuration options for {Client}, defaulting to values
5
+ # in {Default}
6
+ module Configurable
7
+ attr_accessor :organisation, :env, :api_key, :content_type,
8
+ :api_endpoint, :user_agent
9
+
10
+ class << self
11
+ # List of configurable keys for {FreshService::Client}
12
+ # @return [Array] of option keys
13
+ def keys
14
+ @keys ||= %i[
15
+ organisation
16
+ env
17
+ api_key
18
+ content_type
19
+ api_endpoint
20
+ user_agent
21
+ ]
22
+ end
23
+ end
24
+
25
+ # Set configuration options using a block
26
+ def configure
27
+ yield self
28
+ end
29
+
30
+ # Reset configuration options to default values
31
+ def reset!
32
+ FreshService::Configurable.keys.each do |key|
33
+ instance_variable_set(:"@#{key}", FreshService::Default.options[key])
34
+ end
35
+ self
36
+ end
37
+ alias setup reset!
38
+
39
+ # Compares client options to a Hash of requested options
40
+ #
41
+ # @param opts [Hash] Options to compare with current client options
42
+ # @return [Boolean]
43
+ def same_options?(opts)
44
+ opts.hash == options.hash
45
+ end
46
+
47
+ private
48
+
49
+ def options
50
+ Hash[FreshService::Configurable.keys.map { |key| [key, instance_variable_get(:"@#{key}")] }]
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "addressable/uri"
5
+ require "faraday"
6
+
7
+ # Network layer for API clients.
8
+ module FreshService
9
+ module Connection
10
+ # 408 -> Request Timeout
11
+ # 502 -> Bad Gateway
12
+ # 503 -> Service Unavailable
13
+ # 504 -> Gateway Timeout
14
+ RETRY_HTTP_CODES = [408, 502, 503, 504].freeze
15
+
16
+ # Make a HTTP GET request
17
+ #
18
+ # @param url [String] The path, relative to {#api_endpoint}
19
+ # @param options [Hash] Query and header params for request
20
+ # @return response body object
21
+ def get(url, body = {})
22
+ request :get, url, body
23
+ end
24
+
25
+ # Make a HTTP POST request
26
+ #
27
+ # @param url [String] The path, relative to {#api_endpoint}
28
+ # @param body [Hash] Body for request
29
+ # @return response body object
30
+ def post(url, body = {})
31
+ request :post, url, body
32
+ end
33
+
34
+ # Make a HTTP PUT request
35
+ #
36
+ # @param url [String] The path, relative to {#api_endpoint}
37
+ # @param body [Hash] Body for request
38
+ # @return response body object
39
+ def put(url, body = {})
40
+ request :put, url, body
41
+ end
42
+
43
+ private
44
+
45
+ def request(method, path, body = {})
46
+ agent = setup_connection(path)
47
+ response = agent.send(method) { |req| req.body = body.to_json }
48
+ response_body = JSON.parse(response.body)
49
+
50
+ if response_body["code"] == "access_denied"
51
+ raise Error::AuthenticationFailed
52
+ else
53
+ response_body
54
+ end
55
+ end
56
+
57
+ def setup_connection(path)
58
+ url = Addressable::URI.parse(api_endpoint + path).normalize.to_s
59
+ @agent = Faraday.new(url) do |req|
60
+ req.request :basic_auth, api_key, ""
61
+ req.headers["User-Agent"] = user_agent
62
+ req.headers["Content-Type"] = content_type
63
+ req.adapter Faraday.default_adapter
64
+ req.request :retry, retry_options
65
+ end
66
+ end
67
+
68
+ def retry_options
69
+ {
70
+ max: 3, interval: 0.05,
71
+ interval_randomness: 0.5, backoff_factor: 2,
72
+ retry_statuses: RETRY_HTTP_CODES
73
+ }
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fresh_service/version"
4
+
5
+ module FreshService
6
+ # Default configuration options for {Client}
7
+ module Default
8
+ class << self
9
+ # Configuration options
10
+ # @return [Hash]
11
+ def options
12
+ Hash[FreshService::Configurable.keys.map { |key| [key, send(key)] }]
13
+ end
14
+
15
+ # Default FreshService api_key from ENV
16
+ # @return [String]
17
+ def api_key
18
+ ENV["FRESH_SERVICE_API_KEY"]
19
+ end
20
+
21
+ # Default ENV
22
+ # @return [String]
23
+ def env
24
+ Rails.env
25
+ rescue StandardError
26
+ "development"
27
+ end
28
+
29
+ # Default BASE PACKAGE_URL
30
+ # @return [String]
31
+ def api_version_url
32
+ "api/v2"
33
+ end
34
+
35
+ # Default user_agent
36
+ # @return [String]
37
+ def user_agent
38
+ "fresh-service-#{FreshService::VERSION}"
39
+ end
40
+
41
+ # Default api_endpoint FreshService URL for company
42
+ # @return [String]
43
+ def api_endpoint
44
+ "https://#{organisation}.freshservice.com/#{api_version_url}"
45
+ end
46
+
47
+ # Default HTTP content_type
48
+ # @return [String]
49
+ def content_type
50
+ "application/json"
51
+ end
52
+
53
+ def organisation
54
+ ENV["FRESH_SERVICE_ORG"]
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FreshService
4
+ class Error < StandardError
5
+ class AuthenticationFailed < self; end
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FreshService
4
+ # Current major release.
5
+ # @return [Integer]
6
+ MAJOR = 1
7
+
8
+ # Current minor release.
9
+ # @return [Integer]
10
+ MINOR = 0
11
+
12
+ # Current patch level.
13
+ # @return [Integer]
14
+ PATCH = 0
15
+
16
+ # Full release version.
17
+ # @return [String]
18
+ VERSION = [MAJOR, MINOR, PATCH].join(".").freeze
19
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fresh_service/client"
4
+ require "fresh_service/default"
5
+
6
+ # Ruby toolkit for the FreshService API
7
+ module FreshService
8
+ class << self
9
+ include FreshService::Configurable
10
+
11
+ # API client based on configured options {Configurable}
12
+ #
13
+ # @return [FreshService::Client] API wrapper
14
+ def client
15
+ return @client if defined?(@client) && @client.same_options?(options)
16
+
17
+ @client = FreshService::Client.new(options)
18
+ end
19
+ end
20
+ end
21
+
22
+ FreshService.setup
metadata ADDED
@@ -0,0 +1,211 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fresh_service_api_v2_client
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Vikas Prasad
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-08-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: addressable
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.2.10
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.2.10
41
+ - !ruby/object:Gem::Dependency
42
+ name: simplecov
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: webmock
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 3.14.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 3.14.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: activesupport
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 4.2.7
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 4.2.7
83
+ - !ruby/object:Gem::Dependency
84
+ name: faraday
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 0.17.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 0.17.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: faraday_middleware
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 0.11.0.1
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 0.11.0.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: byebug
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 11.1.3
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 11.1.3
125
+ - !ruby/object:Gem::Dependency
126
+ name: rake
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '13.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '13.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '3.10'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '3.10'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rubocop-rails
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description: Simple wrapper for the FreshService API
168
+ email:
169
+ - vikas95prasad@gmail.com
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - lib/fresh_service.rb
175
+ - lib/fresh_service/client.rb
176
+ - lib/fresh_service/client/v2/group/create.rb
177
+ - lib/fresh_service/client/v2/group/view.rb
178
+ - lib/fresh_service/client/v2/service_request/create.rb
179
+ - lib/fresh_service/client/v2/service_request/update.rb
180
+ - lib/fresh_service/client/v2/ticket/create.rb
181
+ - lib/fresh_service/client/v2/ticket/update.rb
182
+ - lib/fresh_service/client/v2/ticket/view.rb
183
+ - lib/fresh_service/configurable.rb
184
+ - lib/fresh_service/connection.rb
185
+ - lib/fresh_service/default.rb
186
+ - lib/fresh_service/error.rb
187
+ - lib/fresh_service/version.rb
188
+ homepage: https://rubygems.org/gems/fresh_service_api_v2_client
189
+ licenses:
190
+ - MIT
191
+ metadata: {}
192
+ post_install_message:
193
+ rdoc_options: []
194
+ require_paths:
195
+ - lib
196
+ required_ruby_version: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: 2.6.0
201
+ required_rubygems_version: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: 1.3.5
206
+ requirements: []
207
+ rubygems_version: 3.1.6
208
+ signing_key:
209
+ specification_version: 4
210
+ summary: Ruby toolkit for working with the Fresh Service API v2
211
+ test_files: []