desertcart 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.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/main.yml +18 -0
  3. data/.gitignore +11 -0
  4. data/.rspec +3 -0
  5. data/CHANGELOG.md +5 -0
  6. data/Gemfile +10 -0
  7. data/Gemfile.lock +138 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +107 -0
  10. data/Rakefile +8 -0
  11. data/bin/console +15 -0
  12. data/bin/setup +8 -0
  13. data/desertcart.gemspec +34 -0
  14. data/lib/desertcart/authentication_token/deserializer.rb +21 -0
  15. data/lib/desertcart/authentication_token/operations/find.rb +20 -0
  16. data/lib/desertcart/authentication_token/serializer.rb +21 -0
  17. data/lib/desertcart/client.rb +65 -0
  18. data/lib/desertcart/config.rb +14 -0
  19. data/lib/desertcart/deserializer.rb +9 -0
  20. data/lib/desertcart/marketplace/authorizations/operations/create.rb +30 -0
  21. data/lib/desertcart/marketplace/authorizations/serializer.rb +14 -0
  22. data/lib/desertcart/marketplace/movement/deserializer.rb +15 -0
  23. data/lib/desertcart/marketplace/movement/operations/create.rb +26 -0
  24. data/lib/desertcart/marketplace/movement/serializer.rb +20 -0
  25. data/lib/desertcart/marketplace/order_item/deserializer.rb +38 -0
  26. data/lib/desertcart/marketplace/order_item/operations/find.rb +44 -0
  27. data/lib/desertcart/marketplace/order_item/operations/update.rb +44 -0
  28. data/lib/desertcart/marketplace/order_item/searcher.rb +21 -0
  29. data/lib/desertcart/marketplace/order_item/serializer.rb +34 -0
  30. data/lib/desertcart/marketplace/order_item_acceptance/operations/create.rb +31 -0
  31. data/lib/desertcart/marketplace/order_item_acceptance/serializer.rb +15 -0
  32. data/lib/desertcart/marketplace/order_item_rejection/operations/create.rb +31 -0
  33. data/lib/desertcart/marketplace/order_item_rejection/serializer.rb +15 -0
  34. data/lib/desertcart/marketplace/pending_order_items/searcher.rb +25 -0
  35. data/lib/desertcart/marketplace/registration/operations/create.rb +34 -0
  36. data/lib/desertcart/marketplace/registration/serializer.rb +13 -0
  37. data/lib/desertcart/marketplace/shipping_address/deserializer.rb +18 -0
  38. data/lib/desertcart/marketplace/store/deserializer.rb +12 -0
  39. data/lib/desertcart/marketplace/store/operations/find.rb +22 -0
  40. data/lib/desertcart/marketplace/store/serializer.rb +12 -0
  41. data/lib/desertcart/operation/create.rb +49 -0
  42. data/lib/desertcart/operation/find.rb +63 -0
  43. data/lib/desertcart/operation/update.rb +49 -0
  44. data/lib/desertcart/operation.rb +39 -0
  45. data/lib/desertcart/resource.rb +6 -0
  46. data/lib/desertcart/resources/authentication_token.rb +14 -0
  47. data/lib/desertcart/resources/marketplace/authorization.rb +9 -0
  48. data/lib/desertcart/resources/marketplace/movement.rb +16 -0
  49. data/lib/desertcart/resources/marketplace/order_item.rb +34 -0
  50. data/lib/desertcart/resources/marketplace/order_item_acceptance.rb +10 -0
  51. data/lib/desertcart/resources/marketplace/order_item_rejection.rb +10 -0
  52. data/lib/desertcart/resources/marketplace/registration.rb +11 -0
  53. data/lib/desertcart/resources/marketplace/shipping_address.rb +15 -0
  54. data/lib/desertcart/resources/marketplace/store.rb +10 -0
  55. data/lib/desertcart/resources/session.rb +8 -0
  56. data/lib/desertcart/resources/user.rb +7 -0
  57. data/lib/desertcart/searcher.rb +70 -0
  58. data/lib/desertcart/serializer.rb +9 -0
  59. data/lib/desertcart/session/operations/create.rb +27 -0
  60. data/lib/desertcart/session/operations/find.rb +27 -0
  61. data/lib/desertcart/session/serializer.rb +10 -0
  62. data/lib/desertcart/user/deserializer.rb +10 -0
  63. data/lib/desertcart/user/serializer.rb +10 -0
  64. data/lib/desertcart/version.rb +5 -0
  65. data/lib/desertcart.rb +7 -0
  66. metadata +125 -0
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Desertcart
4
+ module Marketplace
5
+ class OrderItemAcceptance
6
+ class Serializer < Desertcart::Serializer
7
+ attribute :order_item_id do |args = {}|
8
+ resource = args.fetch(:resource)
9
+ resource.order_item.ledger_id
10
+ end
11
+ attribute :seller_reference_number
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../resources/marketplace/order_item'
4
+
5
+ module Desertcart
6
+ module Marketplace
7
+ class OrderItemRejection
8
+ module Operations
9
+ class Create < Desertcart::Operation::Create
10
+ class Contract < LedgerSync::Ledgers::Contract
11
+ params do
12
+ required(:order_item).maybe(:hash, Types::Reference)
13
+ optional(:reason).maybe(:string)
14
+ end
15
+ end
16
+
17
+ def ledger_namespace_path
18
+ 'marketplace'
19
+ end
20
+
21
+ def deserialized_resource
22
+ Desertcart::Marketplace::OrderItem::Deserializer.new.deserialize(
23
+ hash: response.body['order_item'],
24
+ resource: Desertcart::Marketplace::OrderItem.new
25
+ )
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Desertcart
4
+ module Marketplace
5
+ class OrderItemRejection
6
+ class Serializer < Desertcart::Serializer
7
+ attribute :order_item_id do |args = {}|
8
+ resource = args.fetch(:resource)
9
+ resource.order_item.ledger_id
10
+ end
11
+ attribute :reason
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Desertcart
4
+ module Marketplace
5
+ class PendingOrderItem
6
+ class Searcher < Searcher
7
+ def resource_class
8
+ @resource_class ||= Desertcart::Marketplace::OrderItem
9
+ end
10
+
11
+ def searcher_deserializer_class
12
+ @searcher_deserializer_class ||= resource_class::Deserializer
13
+ end
14
+
15
+ def ledger_resource_type
16
+ @ledger_resource_type ||= 'pending_order_items'
17
+ end
18
+
19
+ def ledger_namespace_path
20
+ 'marketplace'
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../resources/authentication_token'
4
+
5
+ module Desertcart
6
+ module Marketplace
7
+ class Registration
8
+ module Operations
9
+ class Create < Desertcart::Operation::Create
10
+ class Contract < LedgerSync::Ledgers::Contract
11
+ params do
12
+ required(:external_id).maybe(:string)
13
+ required(:ledger_id).filled(:string)
14
+ required(:name).filled(:string)
15
+ required(:url).filled(:string)
16
+ required(:country_code).filled(:string)
17
+ end
18
+ end
19
+
20
+ def ledger_namespace_path
21
+ 'marketplace'
22
+ end
23
+
24
+ def deserialized_resource
25
+ Desertcart::AuthenticationToken::Deserializer.new.deserialize(
26
+ hash: response.body['authentication_token'],
27
+ resource: Desertcart::AuthenticationToken.new
28
+ )
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Desertcart
4
+ module Marketplace
5
+ class Registration
6
+ class Serializer < Desertcart::Serializer
7
+ attribute :name
8
+ attribute :url
9
+ attribute :country_code
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Desertcart
4
+ module Marketplace
5
+ class ShippingAddress
6
+ class Deserializer < Desertcart::Deserializer
7
+ attribute :ledger_id, hash_attribute: 'shipping_address_id'
8
+ attribute :name
9
+ attribute 'address_line_1'
10
+ attribute 'address_line_2'
11
+ attribute :city
12
+ attribute :state
13
+ attribute :zip_code
14
+ attribute :country
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Desertcart
4
+ module Marketplace
5
+ class Store
6
+ class Deserializer < Desertcart::Deserializer
7
+ id
8
+ attribute :name
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Desertcart
4
+ module Marketplace
5
+ class Store
6
+ module Operations
7
+ class Find < Desertcart::Operation::Find
8
+ class Contract < LedgerSync::Ledgers::Contract
9
+ params do
10
+ required(:external_id).maybe(:string)
11
+ required(:ledger_id).filled(:string)
12
+ end
13
+ end
14
+
15
+ def ledger_namespace_path
16
+ 'marketplace'
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Desertcart
4
+ module Marketplace
5
+ class Store
6
+ class Serializer < Desertcart::Serializer
7
+ id
8
+ attribute :name
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../operation'
4
+
5
+ module Desertcart
6
+ class Operation
7
+ class Create
8
+ include Desertcart::Operation::Mixin
9
+
10
+ private
11
+
12
+ def create_in_ledger
13
+ return LedgerSync::Result.Success(response) if response.success?
14
+
15
+ fail(response.status)
16
+ end
17
+
18
+ def operate
19
+ create_in_ledger
20
+ .and_then { success }
21
+ end
22
+
23
+ def response
24
+ @response ||= client.create(
25
+ body: serializer.serialize(resource: resource),
26
+ path: ledger_resource_path
27
+ )
28
+ end
29
+
30
+ def success
31
+ super(
32
+ resource: deserialized_resource,
33
+ response: response
34
+ )
35
+ end
36
+
37
+ def fail(status)
38
+ failure(
39
+ LedgerSync::Error::OperationError.new(
40
+ operation: self,
41
+ response: response,
42
+ message: "Status code: #{status}"
43
+ ),
44
+ resource: @resource
45
+ )
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../operation'
4
+
5
+ module Desertcart
6
+ class Operation
7
+ class Find
8
+ include Desertcart::Operation::Mixin
9
+
10
+ private
11
+
12
+ def find_in_ledger
13
+ case response.status
14
+ when 200
15
+ LedgerSync::Result.Success(response)
16
+ when 404
17
+ not_found
18
+ else
19
+ fail(response.status)
20
+ end
21
+ end
22
+
23
+ def operate
24
+ find_in_ledger
25
+ .and_then { success }
26
+ end
27
+
28
+ def response
29
+ @response ||= client.read(
30
+ path: ledger_resource_path
31
+ )
32
+ end
33
+
34
+ def success
35
+ super(
36
+ resource: deserialized_resource,
37
+ response: response
38
+ )
39
+ end
40
+
41
+ def fail(status)
42
+ failure(
43
+ LedgerSync::Error::OperationError.new(
44
+ operation: self,
45
+ response: response,
46
+ message: "Status code: #{status}"
47
+ ),
48
+ resource: @resource
49
+ )
50
+ end
51
+
52
+ def not_found
53
+ failure(
54
+ LedgerSync::Error::OperationError::NotFoundError.new(
55
+ operation: self,
56
+ response: response
57
+ ),
58
+ resource: @resource
59
+ )
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../operation'
4
+
5
+ module Desertcart
6
+ class Operation
7
+ class Update
8
+ include Desertcart::Operation::Mixin
9
+
10
+ private
11
+
12
+ def update_in_ledger
13
+ return LedgerSync::Result.Success(response) if response.success?
14
+
15
+ fail(response.status)
16
+ end
17
+
18
+ def operate
19
+ update_in_ledger
20
+ .and_then { success }
21
+ end
22
+
23
+ def response
24
+ @response ||= client.update(
25
+ body: serializer.serialize(resource: resource),
26
+ path: ledger_resource_path
27
+ )
28
+ end
29
+
30
+ def success
31
+ super(
32
+ resource: deserialized_resource,
33
+ response: response
34
+ )
35
+ end
36
+
37
+ def fail(status)
38
+ failure(
39
+ LedgerSync::Error::OperationError.new(
40
+ operation: self,
41
+ response: response,
42
+ message: "Status code: #{status}"
43
+ ),
44
+ resource: @resource
45
+ )
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Desertcart
4
+ class Operation
5
+ module Mixin
6
+ def self.included(base)
7
+ base.include LedgerSync::Ledgers::Operation::Mixin
8
+ base.include InstanceMethods # To ensure these override parent methods
9
+ end
10
+
11
+ module InstanceMethods
12
+ def ledger_resource_path
13
+ @ledger_resource_path ||= [
14
+ ledger_namespace_path,
15
+ ledger_resource_type.pluralize,
16
+ resource.ledger_id
17
+ ].compact.join('/')
18
+ end
19
+
20
+ def ledger_namespace_path
21
+ @ledger_namespace_path ||= nil
22
+ end
23
+
24
+ def deserialized_resource
25
+ deserializer.deserialize(
26
+ hash: response.body[ledger_resource_type],
27
+ resource: resource
28
+ )
29
+ end
30
+
31
+ def ledger_resource_type
32
+ @ledger_resource_type ||= client.class.ledger_resource_type_for(
33
+ resource_class: resource.class
34
+ )
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Desertcart
4
+ class Resource < LedgerSync::Resource
5
+ end
6
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'user'
4
+ require_relative 'marketplace/store'
5
+
6
+ module Desertcart
7
+ class AuthenticationToken < Desertcart::Resource
8
+ attribute :token, type: LedgerSync::Type::String
9
+ attribute :expires_at, type: LedgerSync::Type::String
10
+
11
+ references_one :user, to: Desertcart::User
12
+ references_one :store, to: Desertcart::Marketplace::Store
13
+ end
14
+ end