shipengine_ruby 0.0.1

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.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +305 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +9 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +6 -0
  7. data/Gemfile.lock +111 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +14 -0
  10. data/Rakefile +8 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/lib/shipengine/client.rb +71 -0
  14. data/lib/shipengine/configuration.rb +26 -0
  15. data/lib/shipengine/constants.rb +203 -0
  16. data/lib/shipengine/domains/addresses.rb +33 -0
  17. data/lib/shipengine/domains/batches.rb +103 -0
  18. data/lib/shipengine/domains/carriers.rb +67 -0
  19. data/lib/shipengine/domains/carriers_accounts.rb +49 -0
  20. data/lib/shipengine/domains/labels.rb +94 -0
  21. data/lib/shipengine/domains/manifests.rb +49 -0
  22. data/lib/shipengine/domains/package_pickups.rb +49 -0
  23. data/lib/shipengine/domains/package_types.rb +58 -0
  24. data/lib/shipengine/domains/rates.rb +49 -0
  25. data/lib/shipengine/domains/service_points.rb +31 -0
  26. data/lib/shipengine/domains/shipments.rb +103 -0
  27. data/lib/shipengine/domains/shipsurance.rb +49 -0
  28. data/lib/shipengine/domains/tags.rb +49 -0
  29. data/lib/shipengine/domains/tokens.rb +22 -0
  30. data/lib/shipengine/domains/tracking.rb +40 -0
  31. data/lib/shipengine/domains/warehouses.rb +58 -0
  32. data/lib/shipengine/domains/webhooks.rb +58 -0
  33. data/lib/shipengine/domains.rb +19 -0
  34. data/lib/shipengine/enums/address_residential_indicator_types.rb +20 -0
  35. data/lib/shipengine/enums/address_status.rb +34 -0
  36. data/lib/shipengine/enums/batch_status.rb +34 -0
  37. data/lib/shipengine/enums/carriers_names.rb +91 -0
  38. data/lib/shipengine/enums/label_status.rb +22 -0
  39. data/lib/shipengine/enums/message_types.rb +30 -0
  40. data/lib/shipengine/enums/validate_address_types.rb +19 -0
  41. data/lib/shipengine/enums/webhooks_types.rb +52 -0
  42. data/lib/shipengine/enums.rb +9 -0
  43. data/lib/shipengine/errors/error_code.rb +224 -0
  44. data/lib/shipengine/errors/error_source.rb +39 -0
  45. data/lib/shipengine/errors/error_type.rb +49 -0
  46. data/lib/shipengine/exceptions.rb +79 -0
  47. data/lib/shipengine/faraday/raise_http_exception.rb +83 -0
  48. data/lib/shipengine/utils/validate.rb +102 -0
  49. data/lib/shipengine/utils.rb +3 -0
  50. data/lib/shipengine/version.rb +7 -0
  51. data/lib/shipengine.rb +26 -0
  52. data/shipengine.gemspec +41 -0
  53. metadata +249 -0
@@ -0,0 +1,203 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ostruct"
4
+
5
+ module ShipEngine
6
+ module Constants
7
+ API_KEY = ENV.fetch("API_KEY", "TEST_35vcTMIX0/e7rs1t86zzYwF+tnq2jrYewIyRZp+pxAs")
8
+
9
+ PROD_URL = "https://api.shipengine.com"
10
+
11
+ Paths = Struct.new(
12
+ :v1,
13
+ keyword_init: true
14
+ )
15
+ NamespaceV1 = Struct.new(
16
+ :addresses,
17
+ :batches,
18
+ :carriers_accounts,
19
+ :carriers,
20
+ :shipsurance,
21
+ :labels,
22
+ :manifests,
23
+ :package_pickups,
24
+ :package_types,
25
+ :rates,
26
+ :service_points,
27
+ :shipments,
28
+ :tags,
29
+ :tokens,
30
+ :tracking,
31
+ :warehouses,
32
+ :webhooks,
33
+ keyword_init: true
34
+ )
35
+ Addresses = Struct.new(
36
+ :parse_address,
37
+ :validate_address,
38
+ keyword_init: true
39
+ )
40
+ Batches = Struct.new(
41
+ :root,
42
+ :batch_by_external_id,
43
+ keyword_init: true
44
+ )
45
+ CarriersAccounts = Struct.new(
46
+ :root,
47
+ keyword_init: true
48
+ )
49
+ Carriers = Struct.new(
50
+ :root,
51
+ keyword_init: true
52
+ )
53
+ Shipsurance = Struct.new(
54
+ :root,
55
+ :add_funds,
56
+ :balance,
57
+ keyword_init: true
58
+ )
59
+ Labels = Struct.new(
60
+ :root,
61
+ :label_by_external_shipment_id,
62
+ :purchase_label_with_rate_id,
63
+ :purchase_label_with_shipment_id,
64
+ keyword_init: true
65
+ )
66
+ Manifests = Struct.new(
67
+ :root,
68
+ :manifest_request,
69
+ keyword_init: true
70
+ )
71
+ PackagePickups = Struct.new(
72
+ :root,
73
+ keyword_init: true
74
+ )
75
+ PackageTypes = Struct.new(
76
+ :root,
77
+ keyword_init: true
78
+ )
79
+ Rates = Struct.new(
80
+ :root,
81
+ keyword_init: true
82
+ )
83
+ ServicePoints = Struct.new(
84
+ :root,
85
+ keyword_init: true
86
+ )
87
+ Shipments = Struct.new(
88
+ :root,
89
+ :shipment_by_external_id,
90
+ :parse_shipping_info,
91
+ keyword_init: true
92
+ )
93
+ Tags = Struct.new(
94
+ :root,
95
+ keyword_init: true
96
+ )
97
+ Tokens = Struct.new(
98
+ :root,
99
+ keyword_init: true
100
+ )
101
+ Tracking = Struct.new(
102
+ :root,
103
+ keyword_init: true
104
+ )
105
+ Warehouses = Struct.new(
106
+ :root,
107
+ keyword_init: true
108
+ )
109
+ Webhooks = Struct.new(
110
+ :root,
111
+ keyword_init: true
112
+ )
113
+
114
+ PATHS = Paths.new(
115
+ v1: NamespaceV1.new(
116
+ addresses: Addresses.new(
117
+ parse_address: "/v1/addresses/recognize",
118
+ validate_address: "/v1/addresses/validate",
119
+ ),
120
+ batches: Batches.new(
121
+ root: "/v1/batches",
122
+ batch_by_external_id: "/v1/batches/external_batch_id",
123
+ ),
124
+ carriers_accounts: CarriersAccounts.new(
125
+ root: "/v1/connections/carriers",
126
+ ),
127
+ carriers: Carriers.new(
128
+ root: "/v1/carriers",
129
+ ),
130
+ shipsurance: Shipsurance.new(
131
+ root: "/v1/connections/insurance/shipsurance",
132
+ add_funds: "/v1/insurance/shipsurance/add_funds",
133
+ balance: "/v1/insurance/shipsurance/balance",
134
+ ),
135
+ labels: Labels.new(
136
+ root: "/v1/labels",
137
+ label_by_external_shipment_id: "/v1/labels/external_shipment_id",
138
+ purchase_label_with_rate_id: "/v1/labels/rates",
139
+ purchase_label_with_shipment_id: "/v1/labels/shipment",
140
+ ),
141
+ manifests: Manifests.new(
142
+ root: "/v1/manifests",
143
+ manifest_request: "/v1/manifests/requests",
144
+ ),
145
+ package_pickups: PackagePickups.new(
146
+ root: "/v1/pickups",
147
+ ),
148
+ package_types: PackageTypes.new(
149
+ root: "/v1/packages",
150
+ ),
151
+ rates: Rates.new(
152
+ root: "/v1/rates",
153
+ ),
154
+ service_points: ServicePoints.new(
155
+ root: "/v1/service_points",
156
+ ),
157
+ shipments: Shipments.new(
158
+ root: "/v1/shipments",
159
+ shipment_by_external_id: "/v1/shipments/external_shipment_id",
160
+ parse_shipping_info: "/v1/shipments/recognize",
161
+ ),
162
+ tags: Tags.new(
163
+ root: "/v1/tags",
164
+ ),
165
+ tokens: Tokens.new(
166
+ root: "/v1/tokens/ephemeral",
167
+ ),
168
+ tracking: Tracking.new(
169
+ root: "/v1/tracking",
170
+ ),
171
+ warehouses: Warehouses.new(
172
+ root: "/v1/warehouses",
173
+ ),
174
+ webhooks: Webhooks.new(
175
+ root: "/v1/environment/webhooks",
176
+ )
177
+ )
178
+ )
179
+
180
+ RETRIES = 1
181
+
182
+ TIMEOUT = 30_000
183
+
184
+ PAGE_SIZE = 50
185
+
186
+ # Regex pattern to match a valid *ISO-8601* string with timezone.
187
+ VALID_ISO_STRING = /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]+)?(Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$/.freeze
188
+
189
+ # Regex pattern to match a valid *ISO-8601* string with no timezone.
190
+ VALID_ISO_STRING_WITH_NO_TZ = /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]+)?([+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$/.freeze
191
+
192
+ module Country
193
+ # rubocop:disable Layout/LineLength
194
+ @countries = ["AF", "AX", "AL", "DZ", "AS", "AD", "AO", "AI", "AQ", "AG", "AR", "AM", "AW", "AU", "AT", "AZ", "BS", "BH", "BD", "BB", "BY", "BE", "BZ", "BJ", "BM", "BT", "BO", "BA", "BW", "BV", "BR", "IO", "BN", "BG", "BF", "BI", "KH", "CM", "CA", "CV", "KY", "CF", "TD", "CL", "CN", "CX", "CC", "CO", "KM", "CG", "CD", "CK", "CR", "CI", "HR", "CU", "CY", "CZ", "DK", "DJ", "DM", "DO", "EC", "EG", "SV", "GQ", "ER", "EE", "ET", "FK", "FO", "FJ", "FI", "FR", "GF", "PF", "TF", "GA", "GM", "GE", "DE", "GH", "GI", "GR", "GL", "GD", "GP", "GU", "GT", "GG", "GN", "GW", "GY", "HT", "HM", "VA", "HN", "HK", "HU", "IS", "IN", "ID", "IR", "IQ", "IE", "IM", "IL", "IT", "JM", "JP", "JE", "JO", "KZ", "KE", "KI", "KR", "KW", "KG", "LA", "LV", "LB", "LS", "LR", "LY", "LI", "LT", "LU", "MO", "MK", "MG", "MW", "MY", "MV", "ML", "MT", "MH", "MQ", "MR", "MU", "YT", "MX", "FM", "MD", "MC", "MN", "ME", "MS", "MA", "MZ", "MM", "NA", "NR", "NP", "NL", "NC", "NZ", "NI", "NE", "NG", "NU", "NF", "MP", "NO", "OM", "PK", "PW", "PS", "PA", "PG", "PY", "PE", "PH", "PN", "PL", "PT", "PR", "QA", "RE", "RO", "RU", "RW", "BL", "SH", "KN", "LC", "MF", "PM", "VC", "WS", "SM", "ST", "SA", "SN", "RS", "SC", "SL", "SG", "SK", "SI", "SB", "SO", "ZA", "GS", "ES", "LK", "SD", "SR", "SJ", "SZ", "SE", "CH", "SY", "TW", "TJ", "TZ", "TH", "TL", "TG", "TK", "TO", "TT", "TN", "TR", "TM", "TC", "TV", "UG", "UA", "AE", "GB", "US", "UM", "UY", "UZ", "VU", "VE", "VN", "VG", "VI", "WF", "EH", "YE", "ZM", "ZW"].freeze
195
+ # rubocop:enable Layout/LineLength
196
+
197
+ # @param [String] country - 2 letter country code
198
+ def self.valid?(country)
199
+ @countries.include?(country.upcase)
200
+ end
201
+ end
202
+ end
203
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hashie"
4
+
5
+ module ShipEngine
6
+ module Domain
7
+ class Addresses
8
+ def initialize
9
+ @client = ShipEngine::Client.new
10
+ end
11
+
12
+ def parse_address(address)
13
+ response = @client.put(
14
+ path: ShipEngine::Constants::PATHS.v1.addresses.parse_address,
15
+ options: address
16
+ )
17
+
18
+ Hashie::Mash.new(response.body)
19
+ end
20
+
21
+ def validate_address(addresses)
22
+ clean_addresses = addresses.map(&:compact)
23
+
24
+ response = @client.post(
25
+ path: ShipEngine::Constants::PATHS.v1.addresses.validate_address,
26
+ options: clean_addresses
27
+ )
28
+
29
+ response.body.map { |address| Hashie::Mash.new(address) }
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hashie"
4
+
5
+ module ShipEngine
6
+ module Domain
7
+ class Batches
8
+ def initialize
9
+ @client = ShipEngine::Client.new
10
+ end
11
+
12
+ def list_batches(params: {})
13
+ response = @client.get(
14
+ path: ShipEngine::Constants::PATHS.v1.batches.root,
15
+ options: params
16
+ )
17
+
18
+ Hashie::Mash.new(response.body)
19
+ end
20
+
21
+ def create_batch(params:)
22
+ response = @client.post(
23
+ path: ShipEngine::Constants::PATHS.v1.batches.root,
24
+ options: params
25
+ )
26
+
27
+ Hashie::Mash.new(response.body)
28
+ end
29
+
30
+ def batch_by_external_id(external_batch_id:, params: {})
31
+ response = @client.get(
32
+ path: "#{ShipEngine::Constants::PATHS.v1.batches.batch_by_external_id}/#{external_batch_id}",
33
+ options: params
34
+ )
35
+
36
+ Hashie::Mash.new(response.body)
37
+ end
38
+
39
+ def delete_batch_by_id(batch_id:, params: {})
40
+ response = @client.delete(
41
+ path: "#{ShipEngine::Constants::PATHS.v1.batches.root}/#{batch_id}",
42
+ options: params
43
+ )
44
+
45
+ Hashie::Mash.new(response.body)
46
+ end
47
+
48
+ def batch_by_id(batch_id:, params: {})
49
+ response = @client.get(
50
+ path: "#{ShipEngine::Constants::PATHS.v1.batches.root}/#{batch_id}",
51
+ options: params
52
+ )
53
+
54
+ Hashie::Mash.new(response.body)
55
+ end
56
+
57
+ def update_batch_by_id(batch_id:, params: {})
58
+ response = @client.put(
59
+ path: "#{ShipEngine::Constants::PATHS.v1.batches.root}/#{batch_id}",
60
+ options: params
61
+ )
62
+
63
+ Hashie::Mash.new(response.body)
64
+ end
65
+
66
+ def add_to_batch(batch_id:, params: {})
67
+ response = @client.post(
68
+ path: "#{ShipEngine::Constants::PATHS.v1.batches.root}/#{batch_id}/add",
69
+ options: params
70
+ )
71
+
72
+ Hashie::Mash.new(response.body)
73
+ end
74
+
75
+ def batch_errors(batch_id:, params: {})
76
+ response = @client.get(
77
+ path: "#{ShipEngine::Constants::PATHS.v1.batches.root}/#{batch_id}/errors",
78
+ options: params
79
+ )
80
+
81
+ Hashie::Mash.new(response.body)
82
+ end
83
+
84
+ def process_batch_id_labels(batch_id:, params: {})
85
+ response = @client.post(
86
+ path: "#{ShipEngine::Constants::PATHS.v1.batches.root}/#{batch_id}/process/labels",
87
+ options: params
88
+ )
89
+
90
+ Hashie::Mash.new(response.body)
91
+ end
92
+
93
+ def remove_from_batch(batch_id:, params: {})
94
+ response = @client.post(
95
+ path: "#{ShipEngine::Constants::PATHS.v1.batches.root}/#{batch_id}/remove",
96
+ options: params
97
+ )
98
+
99
+ Hashie::Mash.new(response.body)
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hashie"
4
+
5
+ module ShipEngine
6
+ module Domain
7
+ class Carriers
8
+ def initialize
9
+ @client = ShipEngine::Client.new
10
+ end
11
+
12
+ def list_carriers(params: {})
13
+ response = @client.get(
14
+ path: ShipEngine::Constants::PATHS.v1.carriers.root,
15
+ options: params
16
+ )
17
+
18
+ Hashie::Mash.new(response.body)
19
+ end
20
+
21
+ def carrier_by_id(carrier_id:, params: {})
22
+ response = @client.get(
23
+ path: "#{ShipEngine::Constants::PATHS.v1.carriers.root}/#{carrier_id}",
24
+ options: params
25
+ )
26
+
27
+ Hashie::Mash.new(response.body)
28
+ end
29
+
30
+ def add_funds_to_carrier(carrier_id:, params: {})
31
+ response = @client.put(
32
+ path: "#{ShipEngine::Constants::PATHS.v1.carriers.root}/#{carrier_id}/add_funds",
33
+ options: params
34
+ )
35
+
36
+ Hashie::Mash.new(response.body)
37
+ end
38
+
39
+ def carrier_options(carrier_id:, params: {})
40
+ response = @client.get(
41
+ path: "#{ShipEngine::Constants::PATHS.v1.carriers.root}/#{carrier_id}/options",
42
+ options: params
43
+ )
44
+
45
+ Hashie::Mash.new(response.body)
46
+ end
47
+
48
+ def list_carrier_package_types(carrier_id:, params: {})
49
+ response = @client.get(
50
+ path: "#{ShipEngine::Constants::PATHS.v1.carriers.root}/#{carrier_id}/packages",
51
+ options: params
52
+ )
53
+
54
+ Hashie::Mash.new(response.body)
55
+ end
56
+
57
+ def list_carrier_services(carrier_id:, params: {})
58
+ response = @client.get(
59
+ path: "#{ShipEngine::Constants::PATHS.v1.carriers.root}/#{carrier_id}/services",
60
+ options: params
61
+ )
62
+
63
+ Hashie::Mash.new(response.body)
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hashie"
4
+
5
+ module ShipEngine
6
+ module Domain
7
+ class CarriersAccounts
8
+ def initialize
9
+ @client = ShipEngine::Client.new
10
+ end
11
+
12
+ def connect_carrier_account(carrier_name:, params: {})
13
+ response = @client.post(
14
+ path: "#{ShipEngine::Constants::PATHS.v1.carriers_accounts.root}/#{carrier_name}",
15
+ options: params
16
+ )
17
+
18
+ Hashie::Mash.new(response.body)
19
+ end
20
+
21
+ def disconnect_carrier_account(carrier_name:, carrier_id:, params: {})
22
+ response = @client.delete(
23
+ path: "#{ShipEngine::Constants::PATHS.v1.carriers_accounts.root}/#{carrier_name}/#{carrier_id}",
24
+ options: params
25
+ )
26
+
27
+ Hashie::Mash.new(response.body)
28
+ end
29
+
30
+ def carrier_settings(carrier_name:, carrier_id:, params: {})
31
+ response = @client.get(
32
+ path: "#{ShipEngine::Constants::PATHS.v1.carriers_accounts.root}/#{carrier_name}/#{carrier_id}/settings",
33
+ options: params
34
+ )
35
+
36
+ Hashie::Mash.new(response.body)
37
+ end
38
+
39
+ def update_carrier_settings(carrier_name:, carrier_id:, params: {})
40
+ response = @client.put(
41
+ path: "#{ShipEngine::Constants::PATHS.v1.carriers_accounts.root}/#{carrier_name}/#{carrier_id}/settings",
42
+ options: params
43
+ )
44
+
45
+ Hashie::Mash.new(response.body)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hashie"
4
+
5
+ module ShipEngine
6
+ module Domain
7
+ class Labels
8
+ def initialize
9
+ @client = ShipEngine::Client.new
10
+ end
11
+
12
+ def list_labels(params: {})
13
+ response = @client.get(
14
+ path: ShipEngine::Constants::PATHS.v1.labels.root,
15
+ options: params
16
+ )
17
+
18
+ Hashie::Mash.new(response.body)
19
+ end
20
+
21
+ def purchase_label(params: {})
22
+ response = @client.post(
23
+ path: ShipEngine::Constants::PATHS.v1.labels.root,
24
+ options: params
25
+ )
26
+
27
+ Hashie::Mash.new(response.body)
28
+ end
29
+
30
+ def label_by_external_shipment_id(shipment_id:, params: {})
31
+ response = @client.get(
32
+ path: "#{ShipEngine::Constants::PATHS.v1.labels.label_by_external_shipment_id}/#{shipment_id}",
33
+ options: params
34
+ )
35
+
36
+ Hashie::Mash.new(response.body)
37
+ end
38
+
39
+ def purchase_label_with_rate_id(rate_id:, params: {})
40
+ response = @client.post(
41
+ path: "#{ShipEngine::Constants::PATHS.v1.labels.purchase_label_with_rate_id}/#{rate_id}",
42
+ options: params
43
+ )
44
+
45
+ Hashie::Mash.new(response.body)
46
+ end
47
+
48
+ def purchase_label_with_shipment_id(shipment_id:, params: {})
49
+ response = @client.post(
50
+ path: "#{ShipEngine::Constants::PATHS.v1.labels.purchase_label_with_shipment_id}/#{shipment_id}",
51
+ options: params
52
+ )
53
+
54
+ Hashie::Mash.new(response.body)
55
+ end
56
+
57
+ def label_by_id(label_id:, params: {})
58
+ response = @client.get(
59
+ path: "#{ShipEngine::Constants::PATHS.v1.labels.root}/#{label_id}",
60
+ options: params
61
+ )
62
+
63
+ Hashie::Mash.new(response.body)
64
+ end
65
+
66
+ def create_return_label(label_id:, params: {})
67
+ response = @client.post(
68
+ path: "#{ShipEngine::Constants::PATHS.v1.labels.root}/#{label_id}/return",
69
+ options: params
70
+ )
71
+
72
+ Hashie::Mash.new(response.body)
73
+ end
74
+
75
+ def label_tracking_information(label_id:, params: {})
76
+ response = @client.get(
77
+ path: "#{ShipEngine::Constants::PATHS.v1.labels.root}/#{label_id}/track",
78
+ options: params
79
+ )
80
+
81
+ Hashie::Mash.new(response.body)
82
+ end
83
+
84
+ def void_label_by_id(label_id:, params: {})
85
+ response = @client.put(
86
+ path: "#{ShipEngine::Constants::PATHS.v1.labels.root}/#{label_id}/void",
87
+ options: params
88
+ )
89
+
90
+ Hashie::Mash.new(response.body)
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hashie"
4
+
5
+ module ShipEngine
6
+ module Domain
7
+ class Manifests
8
+ def initialize
9
+ @client = ShipEngine::Client.new
10
+ end
11
+
12
+ def list_manifests(params: {})
13
+ response = @client.get(
14
+ path: ShipEngine::Constants::PATHS.v1.manifests.root,
15
+ options: params
16
+ )
17
+
18
+ Hashie::Mash.new(response.body)
19
+ end
20
+
21
+ def create_manifest(params: {})
22
+ response = @client.post(
23
+ path: ShipEngine::Constants::PATHS.v1.manifests.root,
24
+ options: params
25
+ )
26
+
27
+ Hashie::Mash.new(response.body)
28
+ end
29
+
30
+ def manifest_by_id(manifest_id:, params: {})
31
+ response = @client.get(
32
+ path: "#{ShipEngine::Constants::PATHS.v1.manifests.root}/#{manifest_id}",
33
+ options: params
34
+ )
35
+
36
+ Hashie::Mash.new(response.body)
37
+ end
38
+
39
+ def manifest_request_by_id(manifest_request_id:, params: {})
40
+ response = @client.get(
41
+ path: "#{ShipEngine::Constants::PATHS.v1.manifests.manifest_request}/#{manifest_request_id}",
42
+ options: params
43
+ )
44
+
45
+ Hashie::Mash.new(response.body)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hashie"
4
+
5
+ module ShipEngine
6
+ module Domain
7
+ class PackagePickups
8
+ def initialize
9
+ @client = ShipEngine::Client.new
10
+ end
11
+
12
+ def list_package_pickups(params: {})
13
+ response = @client.get(
14
+ path: ShipEngine::Constants::PATHS.v1.package_pickups.root,
15
+ options: params
16
+ )
17
+
18
+ Hashie::Mash.new(response.body)
19
+ end
20
+
21
+ def schedule_pickup(params: {})
22
+ response = @client.post(
23
+ path: ShipEngine::Constants::PATHS.v1.package_pickups.root,
24
+ options: params
25
+ )
26
+
27
+ Hashie::Mash.new(response.body)
28
+ end
29
+
30
+ def pickup_by_id(pickup_id:, params: {})
31
+ response = @client.get(
32
+ path: "#{ShipEngine::Constants::PATHS.v1.package_pickups.root}/#{pickup_id}",
33
+ options: params
34
+ )
35
+
36
+ Hashie::Mash.new(response.body)
37
+ end
38
+
39
+ def delete_schedule_pickup(pickup_id:, params: {})
40
+ response = @client.delete(
41
+ path: "#{ShipEngine::Constants::PATHS.v1.package_pickups.root}/#{pickup_id}",
42
+ options: params
43
+ )
44
+
45
+ Hashie::Mash.new(response.body)
46
+ end
47
+ end
48
+ end
49
+ end