moov_ruby 26.7.1 → 26.10.0.pre.dev.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 +4 -4
- data/lib/moov/avatars.rb +1 -276
- data/lib/moov/card_issuing.rb +0 -116
- data/lib/moov/client.rb +2 -2
- data/lib/moov/enriched_address.rb +1 -1
- data/lib/moov/enriched_profile.rb +1 -1
- data/lib/moov/institutions.rb +1 -1
- data/lib/moov/models/components/capabilityid.rb +0 -1
- data/lib/moov/models/components/{avataruploadrequest.rb → contributingrule.rb} +8 -8
- data/lib/moov/models/components/contributingrule.rbi +13 -0
- data/lib/moov/models/components/createdtransfer.rb +2 -6
- data/lib/moov/models/components/createdtransfer.rbi +0 -2
- data/lib/moov/models/components/createrefund.rb +2 -2
- data/lib/moov/models/components/createreversal.rb +1 -1
- data/lib/moov/models/components/createtransfer.rb +2 -6
- data/lib/moov/models/components/createtransfer.rbi +0 -2
- data/lib/moov/models/components/fullissuedcard.rb +3 -3
- data/lib/moov/models/components/incurredfee.rb +2 -6
- data/lib/moov/models/components/incurredfee.rbi +0 -2
- data/lib/moov/models/components/issuedcard.rb +3 -3
- data/lib/moov/models/components/issuingcontrols.rb +2 -18
- data/lib/moov/models/components/issuingcontrols.rbi +0 -8
- data/lib/moov/models/components/issuingcontrolserror.rb +2 -18
- data/lib/moov/models/components/issuingcontrolserror.rbi +0 -8
- data/lib/moov/models/components/issuingintervallimit.rb +1 -4
- data/lib/moov/models/components/issuingvelocitylimit.rb +7 -11
- data/lib/moov/models/components/issuingvelocitylimit.rbi +2 -4
- data/lib/moov/models/components/issuingvelocitylimiterror.rb +2 -6
- data/lib/moov/models/components/issuingvelocitylimiterror.rbi +0 -2
- data/lib/moov/models/components/partnerriskoutcomesresponse.rb +38 -0
- data/lib/moov/models/components/partnerriskoutcomesresponse.rbi +15 -0
- data/lib/moov/models/components/paymentlinkpayoutdetails.rb +2 -8
- data/lib/moov/models/components/paymentlinkpayoutdetails.rbi +0 -2
- data/lib/moov/models/components/paymentlinkpayoutdetailsupdate.rb +2 -8
- data/lib/moov/models/components/paymentlinkpayoutdetailsupdate.rbi +0 -2
- data/lib/moov/models/components/paymentmethodswallet.rb +0 -1
- data/lib/moov/models/components/payoutdetailserror.rb +2 -6
- data/lib/moov/models/components/payoutdetailserror.rbi +0 -2
- data/lib/moov/models/components/product.rb +2 -6
- data/lib/moov/models/components/product.rbi +0 -2
- data/lib/moov/models/components/productrequest.rb +2 -6
- data/lib/moov/models/components/productrequest.rbi +0 -2
- data/lib/moov/models/components/sendfunds.rb +2 -6
- data/lib/moov/models/components/sendfunds.rbi +0 -2
- data/lib/moov/models/components/sendfundserror.rb +2 -6
- data/lib/moov/models/components/sendfundserror.rbi +0 -2
- data/lib/moov/models/components/transfer.rb +2 -6
- data/lib/moov/models/components/transfer.rbi +0 -2
- data/lib/moov/models/components/transferpaymentmethodswallet.rb +0 -1
- data/lib/moov/models/components/updateissuedcard.rb +2 -6
- data/lib/moov/models/components/updateissuedcard.rbi +0 -2
- data/lib/moov/models/components/wallet.rb +0 -1
- data/lib/moov/models/components/wallettype.rb +0 -2
- data/lib/moov/models/components/webhookdatatransferstatus.rb +0 -3
- data/lib/moov/models/components.rb +2 -34
- data/lib/moov/models/errors/productrequestvalidationerror.rb +2 -6
- data/lib/moov/models/errors/productrequestvalidationerror.rbi +0 -2
- data/lib/moov/models/errors/transfer_error.rb +2 -6
- data/lib/moov/models/errors/transfer_error.rbi +0 -2
- data/lib/moov/models/errors/updateissuedcarderror.rb +2 -6
- data/lib/moov/models/errors/updateissuedcarderror.rbi +0 -2
- data/lib/moov/models/operations/gettransferriskoutcomes_request.rb +37 -0
- data/lib/moov/models/operations/gettransferriskoutcomes_request.rbi +15 -0
- data/lib/moov/models/operations/{listissuingmerchantcategories_response.rb → gettransferriskoutcomes_response.rb} +6 -6
- data/lib/moov/models/operations/{deleteavatar_response.rbi → gettransferriskoutcomes_response.rbi} +4 -2
- data/lib/moov/models/operations/listproducts_request.rb +2 -8
- data/lib/moov/models/operations/listproducts_request.rbi +0 -2
- data/lib/moov/models/operations/listtransfers_request.rb +2 -10
- data/lib/moov/models/operations/listtransfers_request.rbi +0 -4
- data/lib/moov/models/operations.rb +2 -8
- data/lib/moov/products.rb +8 -113
- data/lib/moov/sdk_hooks/hooks.rb +0 -6
- data/lib/moov/sdkconfiguration.rb +4 -4
- data/lib/moov/transfers.rb +125 -0
- data/lib/moov_ruby.rb +1 -1
- metadata +12 -90
- data/lib/moov/models/components/allowedscheduleerror.rb +0 -36
- data/lib/moov/models/components/allowedscheduleerror.rbi +0 -15
- data/lib/moov/models/components/avataruploadrequest.rbi +0 -13
- data/lib/moov/models/components/avataruploadrequest_file.rb +0 -36
- data/lib/moov/models/components/avataruploadrequest_file.rbi +0 -15
- data/lib/moov/models/components/feepaidby.rb +0 -19
- data/lib/moov/models/components/feepaidby.rbi +0 -11
- data/lib/moov/models/components/issuedcontrols.rb +0 -52
- data/lib/moov/models/components/issuedcontrols.rbi +0 -23
- data/lib/moov/models/components/issuedcontrols_allowedschedule.rb +0 -36
- data/lib/moov/models/components/issuedcontrols_allowedschedule.rbi +0 -15
- data/lib/moov/models/components/issuedvelocitylimit.rb +0 -60
- data/lib/moov/models/components/issuedvelocitylimit.rbi +0 -27
- data/lib/moov/models/components/issuingcontrols_allowedschedule.rb +0 -36
- data/lib/moov/models/components/issuingcontrols_allowedschedule.rbi +0 -15
- data/lib/moov/models/components/issuingcontrolsrestrictionmode.rb +0 -19
- data/lib/moov/models/components/issuingcontrolsrestrictionmode.rbi +0 -11
- data/lib/moov/models/components/issuingmerchantcategory.rb +0 -43
- data/lib/moov/models/components/issuingmerchantcategory.rbi +0 -11
- data/lib/moov/models/components/issuingscheduleday.rb +0 -24
- data/lib/moov/models/components/issuingscheduleday.rbi +0 -11
- data/lib/moov/models/components/merchantcategories.rb +0 -32
- data/lib/moov/models/components/merchantcategories.rbi +0 -13
- data/lib/moov/models/components/merchantcategory.rb +0 -37
- data/lib/moov/models/components/merchantcategory.rbi +0 -15
- data/lib/moov/models/components/merchantcategoryrestrictions.rb +0 -44
- data/lib/moov/models/components/merchantcategoryrestrictions.rbi +0 -19
- data/lib/moov/models/components/merchantcategoryrestrictionserror.rb +0 -44
- data/lib/moov/models/components/merchantcategoryrestrictionserror.rbi +0 -19
- data/lib/moov/models/components/merchantentry.rb +0 -40
- data/lib/moov/models/components/merchantentry.rbi +0 -17
- data/lib/moov/models/components/merchantentryerror.rb +0 -36
- data/lib/moov/models/components/merchantentryerror.rbi +0 -15
- data/lib/moov/models/components/merchantrestrictions.rb +0 -36
- data/lib/moov/models/components/merchantrestrictions.rbi +0 -15
- data/lib/moov/models/components/merchantrestrictionserror.rb +0 -36
- data/lib/moov/models/components/merchantrestrictionserror.rbi +0 -15
- data/lib/moov/models/components/productcategories.rb +0 -32
- data/lib/moov/models/components/productcategories.rbi +0 -13
- data/lib/moov/models/components/productcategory.rb +0 -48
- data/lib/moov/models/components/productcategory.rbi +0 -21
- data/lib/moov/models/components/schedulewindow.rb +0 -40
- data/lib/moov/models/components/schedulewindow.rbi +0 -17
- data/lib/moov/models/components/schedulewindowerror.rb +0 -40
- data/lib/moov/models/components/schedulewindowerror.rbi +0 -17
- data/lib/moov/models/components/schemebasicauth.rb +0 -36
- data/lib/moov/models/components/schemebasicauth.rbi +0 -15
- data/lib/moov/models/components/schemeoauth2auth.rb +0 -40
- data/lib/moov/models/components/schemeoauth2auth.rbi +0 -17
- data/lib/moov/models/components/sendfundswire.rb +0 -32
- data/lib/moov/models/components/sendfundswire.rbi +0 -13
- data/lib/moov/models/components/sendfundswireerror.rb +0 -32
- data/lib/moov/models/components/sendfundswireerror.rbi +0 -13
- data/lib/moov/models/components/transfercapture.rb +0 -36
- data/lib/moov/models/components/transfercapture.rbi +0 -15
- data/lib/moov/models/components/transferfeepaidby.rb +0 -32
- data/lib/moov/models/components/transferfeepaidby.rbi +0 -13
- data/lib/moov/models/components/updateissuingcontrols.rb +0 -48
- data/lib/moov/models/components/updateissuingcontrols.rbi +0 -21
- data/lib/moov/models/components/updateissuingcontrols_allowedschedule.rb +0 -36
- data/lib/moov/models/components/updateissuingcontrols_allowedschedule.rbi +0 -15
- data/lib/moov/models/components/updateissuingcontrols_merchantcategoryrestrictions.rb +0 -44
- data/lib/moov/models/components/updateissuingcontrols_merchantcategoryrestrictions.rbi +0 -19
- data/lib/moov/models/components/updateissuingcontrols_merchantrestrictions.rb +0 -36
- data/lib/moov/models/components/updateissuingcontrols_merchantrestrictions.rbi +0 -15
- data/lib/moov/models/components/updateissuingcontrolserror.rb +0 -48
- data/lib/moov/models/components/updateissuingcontrolserror.rbi +0 -21
- data/lib/moov/models/operations/deleteavatar_request.rb +0 -32
- data/lib/moov/models/operations/deleteavatar_request.rbi +0 -13
- data/lib/moov/models/operations/deleteavatar_response.rb +0 -44
- data/lib/moov/models/operations/deleteavatar_security.rb +0 -36
- data/lib/moov/models/operations/deleteavatar_security.rbi +0 -15
- data/lib/moov/models/operations/listissuingmerchantcategories_response.rbi +0 -21
- data/lib/moov/models/operations/listproductcategories_response.rb +0 -48
- data/lib/moov/models/operations/listproductcategories_response.rbi +0 -21
- data/lib/moov/models/operations/uploadavatar_request.rb +0 -36
- data/lib/moov/models/operations/uploadavatar_request.rbi +0 -15
- data/lib/moov/models/operations/uploadavatar_response.rb +0 -44
- data/lib/moov/models/operations/uploadavatar_response.rbi +0 -19
- data/lib/moov/models/operations/uploadavatar_security.rb +0 -36
- data/lib/moov/models/operations/uploadavatar_security.rbi +0 -15
- data/lib/moov/sdk_hooks/clientcredentials.rb +0 -386
- data/lib/moov/sdk_hooks/oauth2scopes.rb +0 -18
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
# typed: true
|
|
2
|
-
# frozen_string_literal: true
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class Moov::Models::Operations::ListIssuingMerchantCategoriesResponse
|
|
6
|
-
extend ::Crystalline::MetadataFields::ClassMethods
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class Moov::Models::Operations::ListIssuingMerchantCategoriesResponse
|
|
11
|
-
def content_type(); end
|
|
12
|
-
def content_type=(str_); end
|
|
13
|
-
def status_code(); end
|
|
14
|
-
def status_code=(str_); end
|
|
15
|
-
def raw_response(); end
|
|
16
|
-
def raw_response=(str_); end
|
|
17
|
-
def headers(); end
|
|
18
|
-
def headers=(str_); end
|
|
19
|
-
def merchant_categories(); end
|
|
20
|
-
def merchant_categories=(str_); end
|
|
21
|
-
end
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
# Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
2
|
-
|
|
3
|
-
# typed: true
|
|
4
|
-
# frozen_string_literal: true
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
module Moov
|
|
8
|
-
module Models
|
|
9
|
-
module Operations
|
|
10
|
-
|
|
11
|
-
class ListProductCategoriesResponse
|
|
12
|
-
extend T::Sig
|
|
13
|
-
include Crystalline::MetadataFields
|
|
14
|
-
|
|
15
|
-
# HTTP response content type for this operation
|
|
16
|
-
field :content_type, ::String
|
|
17
|
-
# HTTP response status code for this operation
|
|
18
|
-
field :status_code, ::Integer
|
|
19
|
-
# Raw HTTP response; suitable for custom response parsing
|
|
20
|
-
field :raw_response, ::Faraday::Response
|
|
21
|
-
|
|
22
|
-
field :headers, Crystalline::Hash.new(Symbol, Crystalline::Array.new(::String))
|
|
23
|
-
# The request completed successfully.
|
|
24
|
-
field :product_categories, Crystalline::Nilable.new(Models::Components::ProductCategories)
|
|
25
|
-
|
|
26
|
-
sig { params(content_type: ::String, status_code: ::Integer, raw_response: ::Faraday::Response, headers: T::Hash[Symbol, T::Array[::String]], product_categories: T.nilable(Models::Components::ProductCategories)).void }
|
|
27
|
-
def initialize(content_type:, status_code:, raw_response:, headers:, product_categories: nil)
|
|
28
|
-
@content_type = content_type
|
|
29
|
-
@status_code = status_code
|
|
30
|
-
@raw_response = raw_response
|
|
31
|
-
@headers = headers
|
|
32
|
-
@product_categories = product_categories
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
sig { params(other: T.untyped).returns(T::Boolean) }
|
|
36
|
-
def ==(other)
|
|
37
|
-
return false unless other.is_a? self.class
|
|
38
|
-
return false unless @content_type == other.content_type
|
|
39
|
-
return false unless @status_code == other.status_code
|
|
40
|
-
return false unless @raw_response == other.raw_response
|
|
41
|
-
return false unless @headers == other.headers
|
|
42
|
-
return false unless @product_categories == other.product_categories
|
|
43
|
-
true
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
# typed: true
|
|
2
|
-
# frozen_string_literal: true
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class Moov::Models::Operations::ListProductCategoriesResponse
|
|
6
|
-
extend ::Crystalline::MetadataFields::ClassMethods
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class Moov::Models::Operations::ListProductCategoriesResponse
|
|
11
|
-
def content_type(); end
|
|
12
|
-
def content_type=(str_); end
|
|
13
|
-
def status_code(); end
|
|
14
|
-
def status_code=(str_); end
|
|
15
|
-
def raw_response(); end
|
|
16
|
-
def raw_response=(str_); end
|
|
17
|
-
def headers(); end
|
|
18
|
-
def headers=(str_); end
|
|
19
|
-
def product_categories(); end
|
|
20
|
-
def product_categories=(str_); end
|
|
21
|
-
end
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
2
|
-
|
|
3
|
-
# typed: true
|
|
4
|
-
# frozen_string_literal: true
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
module Moov
|
|
8
|
-
module Models
|
|
9
|
-
module Operations
|
|
10
|
-
|
|
11
|
-
class UploadAvatarRequest
|
|
12
|
-
extend T::Sig
|
|
13
|
-
include Crystalline::MetadataFields
|
|
14
|
-
|
|
15
|
-
# The accountID to upload the avatar for. Only accountID values are accepted for writes.
|
|
16
|
-
field :unique_id, ::String, { 'path_param': { 'field_name': 'uniqueID', 'style': 'simple', 'explode': false } }
|
|
17
|
-
|
|
18
|
-
field :avatar_upload_request, Models::Components::AvatarUploadRequest, { 'request': { 'media_type': 'multipart/form-data' } }
|
|
19
|
-
|
|
20
|
-
sig { params(unique_id: ::String, avatar_upload_request: Models::Components::AvatarUploadRequest).void }
|
|
21
|
-
def initialize(unique_id:, avatar_upload_request:)
|
|
22
|
-
@unique_id = unique_id
|
|
23
|
-
@avatar_upload_request = avatar_upload_request
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
sig { params(other: T.untyped).returns(T::Boolean) }
|
|
27
|
-
def ==(other)
|
|
28
|
-
return false unless other.is_a? self.class
|
|
29
|
-
return false unless @unique_id == other.unique_id
|
|
30
|
-
return false unless @avatar_upload_request == other.avatar_upload_request
|
|
31
|
-
true
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# typed: true
|
|
2
|
-
# frozen_string_literal: true
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class Moov::Models::Operations::UploadAvatarRequest
|
|
6
|
-
extend ::Crystalline::MetadataFields::ClassMethods
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class Moov::Models::Operations::UploadAvatarRequest
|
|
11
|
-
def unique_id(); end
|
|
12
|
-
def unique_id=(str_); end
|
|
13
|
-
def avatar_upload_request(); end
|
|
14
|
-
def avatar_upload_request=(str_); end
|
|
15
|
-
end
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
2
|
-
|
|
3
|
-
# typed: true
|
|
4
|
-
# frozen_string_literal: true
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
module Moov
|
|
8
|
-
module Models
|
|
9
|
-
module Operations
|
|
10
|
-
|
|
11
|
-
class UploadAvatarResponse
|
|
12
|
-
extend T::Sig
|
|
13
|
-
include Crystalline::MetadataFields
|
|
14
|
-
|
|
15
|
-
# HTTP response content type for this operation
|
|
16
|
-
field :content_type, ::String
|
|
17
|
-
# HTTP response status code for this operation
|
|
18
|
-
field :status_code, ::Integer
|
|
19
|
-
# Raw HTTP response; suitable for custom response parsing
|
|
20
|
-
field :raw_response, ::Faraday::Response
|
|
21
|
-
|
|
22
|
-
field :headers, Crystalline::Hash.new(Symbol, Crystalline::Array.new(::String))
|
|
23
|
-
|
|
24
|
-
sig { params(content_type: ::String, status_code: ::Integer, raw_response: ::Faraday::Response, headers: T::Hash[Symbol, T::Array[::String]]).void }
|
|
25
|
-
def initialize(content_type:, status_code:, raw_response:, headers:)
|
|
26
|
-
@content_type = content_type
|
|
27
|
-
@status_code = status_code
|
|
28
|
-
@raw_response = raw_response
|
|
29
|
-
@headers = headers
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
sig { params(other: T.untyped).returns(T::Boolean) }
|
|
33
|
-
def ==(other)
|
|
34
|
-
return false unless other.is_a? self.class
|
|
35
|
-
return false unless @content_type == other.content_type
|
|
36
|
-
return false unless @status_code == other.status_code
|
|
37
|
-
return false unless @raw_response == other.raw_response
|
|
38
|
-
return false unless @headers == other.headers
|
|
39
|
-
true
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# typed: true
|
|
2
|
-
# frozen_string_literal: true
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class Moov::Models::Operations::UploadAvatarResponse
|
|
6
|
-
extend ::Crystalline::MetadataFields::ClassMethods
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class Moov::Models::Operations::UploadAvatarResponse
|
|
11
|
-
def content_type(); end
|
|
12
|
-
def content_type=(str_); end
|
|
13
|
-
def status_code(); end
|
|
14
|
-
def status_code=(str_); end
|
|
15
|
-
def raw_response(); end
|
|
16
|
-
def raw_response=(str_); end
|
|
17
|
-
def headers(); end
|
|
18
|
-
def headers=(str_); end
|
|
19
|
-
end
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
2
|
-
|
|
3
|
-
# typed: true
|
|
4
|
-
# frozen_string_literal: true
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
module Moov
|
|
8
|
-
module Models
|
|
9
|
-
module Operations
|
|
10
|
-
|
|
11
|
-
class UploadAvatarSecurity
|
|
12
|
-
extend T::Sig
|
|
13
|
-
include Crystalline::MetadataFields
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
field :basic_auth, Crystalline::Nilable.new(Models::Components::SchemeBasicAuth), { 'security': { 'scheme': true, 'type': 'http', 'sub_type': 'basic' } }
|
|
17
|
-
|
|
18
|
-
field :o_auth2_auth, Crystalline::Nilable.new(Models::Components::SchemeOAuth2Auth), { 'security': { 'scheme': true, 'type': 'oauth2', 'sub_type': 'client_credentials' } }
|
|
19
|
-
|
|
20
|
-
sig { params(basic_auth: T.nilable(Models::Components::SchemeBasicAuth), o_auth2_auth: T.nilable(Models::Components::SchemeOAuth2Auth)).void }
|
|
21
|
-
def initialize(basic_auth: nil, o_auth2_auth: nil)
|
|
22
|
-
@basic_auth = basic_auth
|
|
23
|
-
@o_auth2_auth = o_auth2_auth
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
sig { params(other: T.untyped).returns(T::Boolean) }
|
|
27
|
-
def ==(other)
|
|
28
|
-
return false unless other.is_a? self.class
|
|
29
|
-
return false unless @basic_auth == other.basic_auth
|
|
30
|
-
return false unless @o_auth2_auth == other.o_auth2_auth
|
|
31
|
-
true
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# typed: true
|
|
2
|
-
# frozen_string_literal: true
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class Moov::Models::Operations::UploadAvatarSecurity
|
|
6
|
-
extend ::Crystalline::MetadataFields::ClassMethods
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class Moov::Models::Operations::UploadAvatarSecurity
|
|
11
|
-
def basic_auth(); end
|
|
12
|
-
def basic_auth=(str_); end
|
|
13
|
-
def o_auth2_auth(); end
|
|
14
|
-
def o_auth2_auth=(str_); end
|
|
15
|
-
end
|
|
@@ -1,386 +0,0 @@
|
|
|
1
|
-
# Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
2
|
-
|
|
3
|
-
# typed: true
|
|
4
|
-
# frozen_string_literal: true
|
|
5
|
-
|
|
6
|
-
require 'digest'
|
|
7
|
-
require 'json'
|
|
8
|
-
require 'net/http'
|
|
9
|
-
require 'uri'
|
|
10
|
-
|
|
11
|
-
require_relative './types'
|
|
12
|
-
|
|
13
|
-
module Moov
|
|
14
|
-
module SDKHooks
|
|
15
|
-
class Credentials
|
|
16
|
-
extend T::Sig
|
|
17
|
-
|
|
18
|
-
sig { returns(String) }
|
|
19
|
-
attr_reader :client_id
|
|
20
|
-
|
|
21
|
-
sig { returns(String) }
|
|
22
|
-
attr_reader :client_secret
|
|
23
|
-
|
|
24
|
-
sig { returns(String) }
|
|
25
|
-
attr_reader :token_url
|
|
26
|
-
|
|
27
|
-
sig { returns(T.nilable(T::Array[String])) }
|
|
28
|
-
attr_reader :scopes
|
|
29
|
-
|
|
30
|
-
sig { returns(T::Hash[String, String]) }
|
|
31
|
-
attr_reader :additional_properties
|
|
32
|
-
|
|
33
|
-
sig do
|
|
34
|
-
params(
|
|
35
|
-
client_id: String,
|
|
36
|
-
client_secret: String,
|
|
37
|
-
token_url: String,
|
|
38
|
-
scopes: T.nilable(T::Array[String]),
|
|
39
|
-
additional_properties: T::Hash[String, String]
|
|
40
|
-
).void
|
|
41
|
-
end
|
|
42
|
-
def initialize(client_id:, client_secret:, token_url:, scopes: nil, additional_properties: {})
|
|
43
|
-
@client_id = client_id
|
|
44
|
-
@client_secret = client_secret
|
|
45
|
-
@token_url = token_url
|
|
46
|
-
@scopes = scopes
|
|
47
|
-
@additional_properties = additional_properties
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
class Session
|
|
52
|
-
extend T::Sig
|
|
53
|
-
|
|
54
|
-
sig { returns(Credentials) }
|
|
55
|
-
attr_reader :credentials
|
|
56
|
-
|
|
57
|
-
sig { returns(String) }
|
|
58
|
-
attr_reader :token
|
|
59
|
-
|
|
60
|
-
sig { returns(T::Array[String]) }
|
|
61
|
-
attr_reader :scopes
|
|
62
|
-
|
|
63
|
-
sig { returns(T.nilable(Integer)) }
|
|
64
|
-
attr_reader :expires_at
|
|
65
|
-
|
|
66
|
-
sig do
|
|
67
|
-
params(
|
|
68
|
-
credentials: Credentials,
|
|
69
|
-
token: String,
|
|
70
|
-
scopes: T::Array[String],
|
|
71
|
-
expires_at: T.nilable(Integer)
|
|
72
|
-
).void
|
|
73
|
-
end
|
|
74
|
-
def initialize(credentials:, token:, scopes:, expires_at: nil)
|
|
75
|
-
@credentials = credentials
|
|
76
|
-
@token = token
|
|
77
|
-
@scopes = scopes
|
|
78
|
-
@expires_at = expires_at
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
class ClientCredentialsHook < AbstractSDKHook
|
|
83
|
-
|
|
84
|
-
extend T::Sig
|
|
85
|
-
|
|
86
|
-
@global_lock = Mutex.new
|
|
87
|
-
@client_locks = {}
|
|
88
|
-
@sessions = {}
|
|
89
|
-
|
|
90
|
-
class << self
|
|
91
|
-
attr_reader :global_lock
|
|
92
|
-
attr_accessor :client_locks, :sessions
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
sig { override.params(config: SDKConfiguration).returns(SDKConfiguration) }
|
|
96
|
-
def sdk_init(config:)
|
|
97
|
-
raise 'Client is required' if config.client.nil?
|
|
98
|
-
|
|
99
|
-
@client = config.client
|
|
100
|
-
config
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
sig do
|
|
104
|
-
override.params(
|
|
105
|
-
hook_ctx: BeforeRequestHookContext,
|
|
106
|
-
request: Faraday::Request
|
|
107
|
-
).returns(Faraday::Request)
|
|
108
|
-
end
|
|
109
|
-
def before_request(hook_ctx:, request:)
|
|
110
|
-
return request if hook_disabled?(hook_ctx)
|
|
111
|
-
|
|
112
|
-
credentials = get_credentials(hook_ctx)
|
|
113
|
-
return request if credentials.nil?
|
|
114
|
-
|
|
115
|
-
session_key = get_session_key(credentials.client_id, credentials.client_secret)
|
|
116
|
-
scopes = get_required_scopes(credentials, hook_ctx)
|
|
117
|
-
session = get_existing_session(session_key, scopes)
|
|
118
|
-
|
|
119
|
-
if session.nil?
|
|
120
|
-
token_url = resolve_token_endpoint(hook_ctx.base_url, credentials.token_url)
|
|
121
|
-
session = do_token_request(token_url, credentials, scopes)
|
|
122
|
-
store_session(session_key, scopes, session)
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
request.headers['Authorization'] = "Bearer #{session.token}"
|
|
126
|
-
request
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
sig do
|
|
130
|
-
override.params(
|
|
131
|
-
error: T.nilable(StandardError),
|
|
132
|
-
hook_ctx: AfterErrorHookContext,
|
|
133
|
-
response: T.nilable(Faraday::Response)
|
|
134
|
-
).returns(T.nilable(Faraday::Response))
|
|
135
|
-
end
|
|
136
|
-
def after_error(error:, hook_ctx:, response:)
|
|
137
|
-
return response if hook_disabled?(hook_ctx)
|
|
138
|
-
|
|
139
|
-
# We don't want to refresh the token if the error is not related to the token
|
|
140
|
-
return response unless error.nil?
|
|
141
|
-
|
|
142
|
-
credentials = get_credentials(hook_ctx)
|
|
143
|
-
return response if credentials.nil?
|
|
144
|
-
|
|
145
|
-
if !response.nil? && response.status == 401
|
|
146
|
-
session_key = get_session_key(credentials.client_id, credentials.client_secret)
|
|
147
|
-
scopes = get_required_scopes(credentials, hook_ctx)
|
|
148
|
-
scope_key = get_scope_key(scopes)
|
|
149
|
-
remove_session(session_key, scope_key)
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
response
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
private
|
|
156
|
-
|
|
157
|
-
sig { params(hook_ctx: HookContext).returns(T::Boolean) }
|
|
158
|
-
def hook_disabled?(hook_ctx)
|
|
159
|
-
hook_ctx.oauth2_scopes.nil?
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
sig { params(hook_ctx: HookContext).returns(T.nilable(Credentials)) }
|
|
164
|
-
def get_credentials(hook_ctx)
|
|
165
|
-
source = hook_ctx.security_source
|
|
166
|
-
return nil if source.nil?
|
|
167
|
-
|
|
168
|
-
security = source.call
|
|
169
|
-
|
|
170
|
-
case hook_ctx.operation_id
|
|
171
|
-
when 'uploadAvatar'
|
|
172
|
-
return get_credentials_upload_avatar(security)
|
|
173
|
-
when 'deleteAvatar'
|
|
174
|
-
return get_credentials_delete_avatar(security)
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
nil
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
sig { params(security: T.untyped).returns(T.nilable(Credentials)) }
|
|
182
|
-
def get_credentials_upload_avatar(security)
|
|
183
|
-
return nil if security.nil? || security.o_auth2_auth.nil?
|
|
184
|
-
|
|
185
|
-
# Extract additional properties from security object
|
|
186
|
-
additional_properties = {}
|
|
187
|
-
security.o_auth2_auth.class.fields.each do |f|
|
|
188
|
-
name = f.name.to_s
|
|
189
|
-
next if %w[client_id client_secret token_url scopes].include?(name)
|
|
190
|
-
|
|
191
|
-
metadata = f.metadata&.dig(:security)
|
|
192
|
-
next if metadata.nil?
|
|
193
|
-
|
|
194
|
-
field_name = metadata[:field_name] || name
|
|
195
|
-
value = security.o_auth2_auth.send(f.name)
|
|
196
|
-
additional_properties[field_name] = value.to_s unless value.nil?
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
Credentials.new(
|
|
200
|
-
client_id: security.o_auth2_auth.client_id,
|
|
201
|
-
client_secret: security.o_auth2_auth.client_secret,
|
|
202
|
-
token_url: security.o_auth2_auth.token_url,
|
|
203
|
-
scopes: nil,
|
|
204
|
-
additional_properties: additional_properties
|
|
205
|
-
)
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
sig { params(security: T.untyped).returns(T.nilable(Credentials)) }
|
|
209
|
-
def get_credentials_delete_avatar(security)
|
|
210
|
-
return nil if security.nil? || security.o_auth2_auth.nil?
|
|
211
|
-
|
|
212
|
-
# Extract additional properties from security object
|
|
213
|
-
additional_properties = {}
|
|
214
|
-
security.o_auth2_auth.class.fields.each do |f|
|
|
215
|
-
name = f.name.to_s
|
|
216
|
-
next if %w[client_id client_secret token_url scopes].include?(name)
|
|
217
|
-
|
|
218
|
-
metadata = f.metadata&.dig(:security)
|
|
219
|
-
next if metadata.nil?
|
|
220
|
-
|
|
221
|
-
field_name = metadata[:field_name] || name
|
|
222
|
-
value = security.o_auth2_auth.send(f.name)
|
|
223
|
-
additional_properties[field_name] = value.to_s unless value.nil?
|
|
224
|
-
end
|
|
225
|
-
|
|
226
|
-
Credentials.new(
|
|
227
|
-
client_id: security.o_auth2_auth.client_id,
|
|
228
|
-
client_secret: security.o_auth2_auth.client_secret,
|
|
229
|
-
token_url: security.o_auth2_auth.token_url,
|
|
230
|
-
scopes: nil,
|
|
231
|
-
additional_properties: additional_properties
|
|
232
|
-
)
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
sig { params(base_url: String, token_url: String).returns(String) }
|
|
237
|
-
def resolve_token_endpoint(base_url, token_url)
|
|
238
|
-
parsed = URI.parse(token_url)
|
|
239
|
-
return token_url if parsed.host
|
|
240
|
-
|
|
241
|
-
base = base_url.chomp('/')
|
|
242
|
-
URI.join("#{base}/", token_url).to_s
|
|
243
|
-
end
|
|
244
|
-
|
|
245
|
-
sig { params(token_url: String, credentials: Credentials, scopes: T::Array[String]).returns(Session) }
|
|
246
|
-
def do_token_request(token_url, credentials, scopes)
|
|
247
|
-
payload = {
|
|
248
|
-
'grant_type' => 'client_credentials',
|
|
249
|
-
'client_id' => credentials.client_id,
|
|
250
|
-
'client_secret' => credentials.client_secret
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
payload['scope'] = scopes.join(' ') unless scopes.empty?
|
|
254
|
-
|
|
255
|
-
# Add additional properties to payload
|
|
256
|
-
credentials.additional_properties.each do |key, value|
|
|
257
|
-
payload[key] = value
|
|
258
|
-
end
|
|
259
|
-
response = @client.post(token_url) do |req|
|
|
260
|
-
req.headers['Content-Type'] = 'application/x-www-form-urlencoded'
|
|
261
|
-
req.body = URI.encode_www_form(payload)
|
|
262
|
-
end
|
|
263
|
-
|
|
264
|
-
raise "Unexpected status code #{response.status} from token endpoint" unless response.status >= 200 && response.status < 300
|
|
265
|
-
|
|
266
|
-
response_data = JSON.parse(response.body)
|
|
267
|
-
|
|
268
|
-
raise 'Unexpected token type from token endpoint' unless response_data.fetch('token_type', '').downcase == 'bearer'
|
|
269
|
-
|
|
270
|
-
expires_at = nil
|
|
271
|
-
if response_data.key?('expires_in')
|
|
272
|
-
expires_at = Time.now.to_i + response_data['expires_in'].to_i
|
|
273
|
-
end
|
|
274
|
-
|
|
275
|
-
Session.new(
|
|
276
|
-
credentials: credentials,
|
|
277
|
-
token: response_data['access_token'],
|
|
278
|
-
scopes: scopes,
|
|
279
|
-
expires_at: expires_at
|
|
280
|
-
)
|
|
281
|
-
end
|
|
282
|
-
|
|
283
|
-
sig { params(client_id: String, client_secret: String).returns(String) }
|
|
284
|
-
def get_session_key(client_id, client_secret)
|
|
285
|
-
Digest::MD5.hexdigest("#{client_id}:#{client_secret}")
|
|
286
|
-
end
|
|
287
|
-
|
|
288
|
-
sig { params(credentials: Credentials, hook_ctx: HookContext).returns(T::Array[String]) }
|
|
289
|
-
def get_required_scopes(credentials, hook_ctx)
|
|
290
|
-
return T.must(credentials.scopes) unless credentials.scopes.nil?
|
|
291
|
-
|
|
292
|
-
hook_ctx.oauth2_scopes || []
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
sig { params(scopes: T::Array[String]).returns(String) }
|
|
296
|
-
def get_scope_key(scopes)
|
|
297
|
-
return '' if scopes.empty?
|
|
298
|
-
|
|
299
|
-
scopes.sort.join('&')
|
|
300
|
-
end
|
|
301
|
-
|
|
302
|
-
sig { params(client_key: String, scopes: T::Array[String], session: Session).void }
|
|
303
|
-
def store_session(client_key, scopes, session)
|
|
304
|
-
scope_key = get_scope_key(scopes)
|
|
305
|
-
lock = get_client_lock(client_key)
|
|
306
|
-
lock.synchronize do
|
|
307
|
-
self.class.sessions[client_key] ||= {}
|
|
308
|
-
self.class.sessions[client_key][scope_key] = session
|
|
309
|
-
end
|
|
310
|
-
end
|
|
311
|
-
|
|
312
|
-
sig { params(client_key: String, scope_key: String).void }
|
|
313
|
-
def remove_session(client_key, scope_key)
|
|
314
|
-
lock = get_client_lock(client_key)
|
|
315
|
-
lock.synchronize do
|
|
316
|
-
if self.class.sessions.key?(client_key) && self.class.sessions[client_key].key?(scope_key)
|
|
317
|
-
self.class.sessions[client_key].delete(scope_key)
|
|
318
|
-
self.class.sessions.delete(client_key) if self.class.sessions[client_key].empty?
|
|
319
|
-
end
|
|
320
|
-
end
|
|
321
|
-
end
|
|
322
|
-
|
|
323
|
-
sig { params(client_key: String, required_scopes: T::Array[String]).returns(T.nilable(Session)) }
|
|
324
|
-
def get_existing_session(client_key, required_scopes)
|
|
325
|
-
scope_key = get_scope_key(required_scopes)
|
|
326
|
-
expired_keys = []
|
|
327
|
-
result = T.let(nil, T.untyped)
|
|
328
|
-
|
|
329
|
-
lock = get_client_lock(client_key)
|
|
330
|
-
lock.synchronize do
|
|
331
|
-
return nil unless self.class.sessions.key?(client_key)
|
|
332
|
-
|
|
333
|
-
client_sessions = self.class.sessions[client_key]
|
|
334
|
-
|
|
335
|
-
# Check for exact scope match first
|
|
336
|
-
if client_sessions.key?(scope_key)
|
|
337
|
-
exact_match = client_sessions[scope_key]
|
|
338
|
-
if token_expired?(exact_match.expires_at)
|
|
339
|
-
expired_keys << scope_key
|
|
340
|
-
else
|
|
341
|
-
result = exact_match
|
|
342
|
-
end
|
|
343
|
-
end
|
|
344
|
-
|
|
345
|
-
# If no exact match, look for a superset match
|
|
346
|
-
if result.nil?
|
|
347
|
-
found = T.let(false, T::Boolean)
|
|
348
|
-
client_sessions.each do |key, session|
|
|
349
|
-
if token_expired?(session.expires_at)
|
|
350
|
-
expired_keys << key
|
|
351
|
-
elsif !found && required_scopes?(session.scopes, required_scopes)
|
|
352
|
-
result = session
|
|
353
|
-
found = true
|
|
354
|
-
end
|
|
355
|
-
end
|
|
356
|
-
end
|
|
357
|
-
|
|
358
|
-
# Clean up expired sessions
|
|
359
|
-
expired_keys.each { |key| client_sessions.delete(key) }
|
|
360
|
-
|
|
361
|
-
# Clean up empty client sessions
|
|
362
|
-
self.class.sessions.delete(client_key) if self.class.sessions.key?(client_key) && self.class.sessions[client_key].empty?
|
|
363
|
-
end
|
|
364
|
-
|
|
365
|
-
result
|
|
366
|
-
end
|
|
367
|
-
|
|
368
|
-
sig { params(scopes: T::Array[String], required_scopes: T::Array[String]).returns(T::Boolean) }
|
|
369
|
-
def required_scopes?(scopes, required_scopes)
|
|
370
|
-
required_scopes.all? { |scope| scopes.include?(scope) }
|
|
371
|
-
end
|
|
372
|
-
|
|
373
|
-
sig { params(expires_at: T.nilable(Integer)).returns(T::Boolean) }
|
|
374
|
-
def token_expired?(expires_at)
|
|
375
|
-
!expires_at.nil? && Time.now.to_i + 60 >= expires_at
|
|
376
|
-
end
|
|
377
|
-
|
|
378
|
-
sig { params(client_key: String).returns(Mutex) }
|
|
379
|
-
def get_client_lock(client_key)
|
|
380
|
-
self.class.global_lock.synchronize do
|
|
381
|
-
self.class.client_locks[client_key] ||= Mutex.new
|
|
382
|
-
end
|
|
383
|
-
end
|
|
384
|
-
end
|
|
385
|
-
end
|
|
386
|
-
end
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
2
|
-
|
|
3
|
-
# typed: true
|
|
4
|
-
# frozen_string_literal: true
|
|
5
|
-
|
|
6
|
-
module Moov
|
|
7
|
-
module SDKHooks
|
|
8
|
-
|
|
9
|
-
# OAuth2AuthOAuth2Scope - Available scopes for the OAuth2Auth OAuth 2.0 scheme (clientCredentials flow).
|
|
10
|
-
class OAuth2AuthOAuth2Scope < T::Enum
|
|
11
|
-
|
|
12
|
-
enums do
|
|
13
|
-
# ROOT_ACCOUNTS_WRITE
|
|
14
|
-
ROOT_ACCOUNTS_WRITE = new('/accounts.write')
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|