desertcart 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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