customers: Added ephemeral key authentication for customer retrieve (#89)

This commit is contained in:
Kartikeya Hegde
2022-12-09 17:58:04 +05:30
committed by GitHub
parent 2aef3bccfb
commit 3d7d89172c
21 changed files with 214 additions and 41 deletions

View File

@ -12,6 +12,7 @@ use super::{
};
use crate::{
configs::settings::Server,
consts,
core::{
errors::{self, CustomResult, RouterResult, StorageErrorExt},
payment_methods::cards,
@ -21,7 +22,7 @@ use crate::{
services,
types::{
api::{self, enums as api_enums},
storage::{self, enums as storage_enums},
storage::{self, enums as storage_enums, ephemeral_key},
},
utils::{
self,
@ -571,7 +572,7 @@ pub async fn create_customer_if_not_exist<'a, F: Clone, R>(
pub async fn make_pm_data<'a, F: Clone, R>(
operation: BoxedOperation<'a, F, R>,
state: &'a AppState,
payment_method: Option<storage_enums::PaymentMethodType>,
payment_method_type: Option<storage_enums::PaymentMethodType>,
txn_id: &str,
_payment_attempt: &storage::PaymentAttempt,
request: &Option<api::PaymentMethod>,
@ -579,7 +580,7 @@ pub async fn make_pm_data<'a, F: Clone, R>(
) -> RouterResult<(BoxedOperation<'a, F, R>, Option<api::PaymentMethod>)> {
let payment_method = match (request, token) {
(_, Some(token)) => Ok::<_, error_stack::Report<errors::ApiErrorResponse>>(
if payment_method == Some(storage_enums::PaymentMethodType::Card) {
if payment_method_type == Some(storage_enums::PaymentMethodType::Card) {
// TODO: Handle token expiry
Vault::get_payment_method_data_from_locker(state, token).await?
} else {
@ -598,7 +599,13 @@ pub async fn make_pm_data<'a, F: Clone, R>(
let payment_method = match payment_method {
Some(pm) => Some(pm),
None => Vault::get_payment_method_data_from_locker(state, txn_id).await?,
None => {
if payment_method_type == Some(storage_enums::PaymentMethodType::Card) {
Vault::get_payment_method_data_from_locker(state, txn_id).await?
} else {
None
}
}
};
Ok((operation, payment_method))
@ -897,6 +904,40 @@ pub fn make_merchant_url_with_response(
Ok(merchant_url_with_response.to_string())
}
pub async fn make_ephemeral_key(
state: &AppState,
customer_id: String,
merchant_id: String,
) -> errors::RouterResponse<ephemeral_key::EphemeralKey> {
let store = &state.store;
let id = utils::generate_id(consts::ID_LENGTH, "eki");
let secret = format!("epk_{}", &Uuid::new_v4().simple().to_string());
let ek = ephemeral_key::EphemeralKeyNew {
id,
customer_id,
merchant_id,
secret,
};
let ek = store
.create_ephemeral_key(ek, state.conf.eph_key.validity)
.await
.change_context(errors::ApiErrorResponse::InternalServerError)
.attach_printable("Unable to create ephemeral key")?;
Ok(services::BachResponse::Json(ek))
}
pub async fn delete_ephemeral_key(
store: &dyn StorageInterface,
ek_id: String,
) -> errors::RouterResponse<ephemeral_key::EphemeralKey> {
let ek = store
.delete_ephemeral_key(&ek_id)
.await
.change_context(errors::ApiErrorResponse::InternalServerError)
.attach_printable("Unable to delete ephemeral key")?;
Ok(services::BachResponse::Json(ek))
}
pub fn make_pg_redirect_response(
payment_id: String,
response: &api::PaymentsResponse,