1
1
use api_models:: { payment_methods:: PaymentMethodId , proxy as proxy_api_models} ;
2
- use common_utils:: { ext_traits:: OptionExt , id_type} ;
3
- use error_stack:: { report, ResultExt } ;
4
- use hyperswitch_domain_models:: {
5
- errors:: api_error_response:: NotImplementedMessage , payment_methods,
2
+ use common_utils:: {
3
+ ext_traits:: { Encode , OptionExt } ,
4
+ id_type,
6
5
} ;
6
+ use error_stack:: ResultExt ;
7
+ use hyperswitch_domain_models:: payment_methods;
7
8
use masking:: Mask ;
9
+ use serde_json:: Value ;
8
10
use x509_parser:: nom:: {
9
11
bytes:: complete:: { tag, take_while1} ,
10
12
character:: complete:: { char, multispace0} ,
@@ -13,9 +15,12 @@ use x509_parser::nom::{
13
15
} ;
14
16
15
17
use crate :: {
16
- core:: errors:: { self , RouterResult } ,
18
+ core:: {
19
+ errors:: { self , RouterResult } ,
20
+ payment_methods:: vault,
21
+ } ,
17
22
routes:: SessionState ,
18
- types:: domain,
23
+ types:: { domain, payment_methods as pm_types } ,
19
24
} ;
20
25
21
26
pub struct ProxyRequestWrapper ( pub proxy_api_models:: ProxyRequest ) ;
@@ -53,46 +58,23 @@ impl ProxyRequestWrapper {
53
58
) ) )
54
59
}
55
60
proxy_api_models:: TokenType :: TokenizationId => {
56
- Err ( report ! ( errors:: ApiErrorResponse :: NotImplemented {
57
- message: NotImplementedMessage :: Reason (
58
- "Proxy flow using tokenization id" . to_string( ) ,
59
- ) ,
60
- } ) )
61
- }
62
- }
63
- }
64
-
65
- pub async fn get_customer_id (
66
- & self ,
67
- state : & SessionState ,
68
- key_store : & domain:: MerchantKeyStore ,
69
- storage_scheme : common_enums:: enums:: MerchantStorageScheme ,
70
- ) -> RouterResult < id_type:: GlobalCustomerId > {
71
- let token = & self . 0 . token ;
72
-
73
- match self . 0 . token_type {
74
- proxy_api_models:: TokenType :: PaymentMethodId => {
75
- let pm_id = PaymentMethodId {
76
- payment_method_id : token. clone ( ) ,
77
- } ;
78
- let pm_id =
79
- id_type:: GlobalPaymentMethodId :: generate_from_string ( pm_id. payment_method_id )
80
- . change_context ( errors:: ApiErrorResponse :: InternalServerError )
81
- . attach_printable ( "Unable to generate GlobalPaymentMethodId" ) ?;
82
-
83
- Ok ( state
84
- . store
85
- . find_payment_method ( & ( ( state) . into ( ) ) , key_store, & pm_id, storage_scheme)
61
+ let token_id = id_type:: GlobalTokenId :: from_string ( token. clone ( ) . as_str ( ) )
62
+ . change_context ( errors:: ApiErrorResponse :: InternalServerError )
63
+ . attach_printable (
64
+ "Error while coneverting from string to GlobalTokenId type" ,
65
+ ) ?;
66
+ let db = state. store . as_ref ( ) ;
67
+ let key_manager_state = & ( state) . into ( ) ;
68
+
69
+ let tokenization_record = db
70
+ . get_entity_id_vault_id_by_token_id ( & token_id, key_store, key_manager_state)
86
71
. await
87
- . change_context ( errors:: ApiErrorResponse :: PaymentMethodNotFound ) ?
88
- . customer_id )
89
- }
90
- proxy_api_models:: TokenType :: TokenizationId => {
91
- Err ( report ! ( errors:: ApiErrorResponse :: NotImplemented {
92
- message: NotImplementedMessage :: Reason (
93
- "Proxy flow using tokenization id" . to_string( ) ,
94
- ) ,
95
- } ) )
72
+ . change_context ( errors:: ApiErrorResponse :: InternalServerError )
73
+ . attach_printable ( "Error while fetching tokenization record from vault" ) ?;
74
+
75
+ Ok ( ProxyRecord :: TokenizationRecord ( Box :: new (
76
+ tokenization_record,
77
+ ) ) )
96
78
}
97
79
}
98
80
}
@@ -116,30 +98,65 @@ impl ProxyRequestWrapper {
116
98
}
117
99
118
100
impl ProxyRecord {
119
- pub fn get_vault_id ( & self ) -> RouterResult < payment_methods:: VaultId > {
101
+ fn get_vault_id ( & self ) -> RouterResult < payment_methods:: VaultId > {
120
102
match self {
121
103
Self :: PaymentMethodRecord ( payment_method) => payment_method
122
104
. locker_id
123
105
. clone ( )
124
106
. get_required_value ( "vault_id" )
125
107
. change_context ( errors:: ApiErrorResponse :: InternalServerError )
126
108
. attach_printable ( "Locker id not present in Payment Method Entry" ) ,
127
- Self :: TokenizationRecord ( _) => Err ( report ! ( errors:: ApiErrorResponse :: NotImplemented {
128
- message: NotImplementedMessage :: Reason (
129
- "Proxy flow using tokenization id" . to_string( ) ,
130
- ) ,
131
- } ) ) ,
109
+ Self :: TokenizationRecord ( tokenization_record) => Ok (
110
+ payment_methods:: VaultId :: generate ( tokenization_record. locker_id . clone ( ) ) ,
111
+ ) ,
132
112
}
133
113
}
134
114
135
- pub fn get_customer_id ( & self ) -> RouterResult < id_type:: GlobalCustomerId > {
115
+ fn get_customer_id ( & self ) -> id_type:: GlobalCustomerId {
136
116
match self {
137
- Self :: PaymentMethodRecord ( payment_method) => Ok ( payment_method. customer_id . clone ( ) ) ,
138
- Self :: TokenizationRecord ( _) => Err ( report ! ( errors:: ApiErrorResponse :: NotImplemented {
139
- message: NotImplementedMessage :: Reason (
140
- "Proxy flow using tokenization id" . to_string( ) ,
141
- ) ,
142
- } ) ) ,
117
+ Self :: PaymentMethodRecord ( payment_method) => payment_method. customer_id . clone ( ) ,
118
+ Self :: TokenizationRecord ( tokenization_record) => {
119
+ tokenization_record. customer_id . clone ( )
120
+ }
121
+ }
122
+ }
123
+
124
+ pub async fn get_vault_data (
125
+ & self ,
126
+ state : & SessionState ,
127
+ merchant_context : domain:: MerchantContext ,
128
+ ) -> RouterResult < Value > {
129
+ match self {
130
+ Self :: PaymentMethodRecord ( _) => {
131
+ let vault_resp = vault:: retrieve_payment_method_from_vault_internal (
132
+ state,
133
+ & merchant_context,
134
+ & self . get_vault_id ( ) ?,
135
+ & self . get_customer_id ( ) ,
136
+ )
137
+ . await
138
+ . change_context ( errors:: ApiErrorResponse :: InternalServerError )
139
+ . attach_printable ( "Error while fetching data from vault" ) ?;
140
+
141
+ Ok ( vault_resp
142
+ . data
143
+ . encode_to_value ( )
144
+ . change_context ( errors:: ApiErrorResponse :: InternalServerError )
145
+ . attach_printable ( "Failed to serialize vault data" ) ?)
146
+ }
147
+ Self :: TokenizationRecord ( _) => {
148
+ let vault_request = pm_types:: VaultRetrieveRequest {
149
+ entity_id : self . get_customer_id ( ) ,
150
+ vault_id : self . get_vault_id ( ) ?,
151
+ } ;
152
+
153
+ let vault_data = vault:: retrieve_value_from_vault ( state, vault_request)
154
+ . await
155
+ . change_context ( errors:: ApiErrorResponse :: InternalServerError )
156
+ . attach_printable ( "Failed to retrieve vault data" ) ?;
157
+
158
+ Ok ( vault_data. get ( "data" ) . cloned ( ) . unwrap_or ( Value :: Null ) )
159
+ }
143
160
}
144
161
}
145
162
}
0 commit comments