Class: Mpp::Server::MppHandler

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/mpp/server/mpp_handler.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(method:, realm:, secret_key:, defaults: nil) ⇒ MppHandler

Returns a new instance of MppHandler.



26
27
28
29
30
31
# File 'lib/mpp/server/mpp_handler.rb', line 26

def initialize(method:, realm:, secret_key:, defaults: nil)
  @method = T.let(method, T.untyped)
  @realm = T.let(realm, String)
  @secret_key = T.let(secret_key, String)
  @defaults = T.let(defaults || {}, T::Hash[String, T.untyped])
end

Instance Attribute Details

#defaultsObject (readonly)

Returns the value of attribute defaults.



23
24
25
# File 'lib/mpp/server/mpp_handler.rb', line 23

def defaults
  @defaults
end

#methodObject (readonly)

Returns the value of attribute method.



14
15
16
# File 'lib/mpp/server/mpp_handler.rb', line 14

def method
  @method
end

#realmObject (readonly)

Returns the value of attribute realm.



17
18
19
# File 'lib/mpp/server/mpp_handler.rb', line 17

def realm
  @realm
end

#secret_keyObject (readonly)

Returns the value of attribute secret_key.



20
21
22
# File 'lib/mpp/server/mpp_handler.rb', line 20

def secret_key
  @secret_key
end

Class Method Details

.create(method:, realm: nil, secret_key: nil) ⇒ Object



35
36
37
38
39
40
41
# File 'lib/mpp/server/mpp_handler.rb', line 35

def self.create(method:, realm: nil, secret_key: nil)
  new(
    method: method,
    realm: realm || Defaults.detect_realm,
    secret_key: secret_key || Defaults.detect_secret_key
  )
end

Instance Method Details

#charge(authorization, amount, currency: nil, recipient: nil, expires: nil, description: nil, memo: nil, fee_payer: false, chain_id: nil, extra: nil) ⇒ Object

Raises:

  • (ArgumentError)


45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/mpp/server/mpp_handler.rb', line 45

def charge(authorization, amount, currency: nil, recipient: nil, expires: nil,
  description: nil, memo: nil, fee_payer: false, chain_id: nil, extra: nil)
  intent = @method.intents["charge"]
  raise ArgumentError, "Method #{@method.name} does not support charge intent" unless intent

  resolved_currency = currency || (@method.respond_to?(:currency) ? @method.currency : nil)
  resolved_recipient = recipient || (@method.respond_to?(:recipient) ? @method.recipient : nil)
  raise ArgumentError, "currency must be set on the method or passed to charge()" unless resolved_currency
  raise ArgumentError, "recipient must be set on the method or passed to charge()" unless resolved_recipient

  decimals = @method.respond_to?(:decimals) ? @method.decimals : DEFAULT_DECIMALS
  base_amount = Mpp::Units.parse_units(amount, decimals).to_s

  request = {
    "amount" => base_amount,
    "currency" => resolved_currency,
    "recipient" => resolved_recipient
  }

  if extra
    extra.each do |k, v|
      raise ArgumentError, "extra must be a dict[str, str]" unless k.is_a?(String) && v.is_a?(String)
    end
    request["extra"] = extra
  end

  resolved_chain_id = chain_id
  resolved_chain_id ||= @method.chain_id if @method.respond_to?(:chain_id)

  if memo || fee_payer || !resolved_chain_id.nil?
    method_details = {}
    method_details["chainId"] = resolved_chain_id unless resolved_chain_id.nil?
    method_details["memo"] = memo if memo
    method_details["feePayer"] = true if fee_payer
    request["methodDetails"] = method_details
  end

  request = Mpp::Server::MethodHelper.transform_request(@method, request, nil)

  Verify.verify_or_challenge(
    authorization: authorization,
    intent: intent,
    request: request,
    realm: @realm,
    secret_key: @secret_key,
    method: @method.name,
    description: description,
    expires: expires
  )
end