Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(connector): [Novalnet] Add zero auth mandate #6631

Open
wants to merge 4 commits into
base: main
Choose a base branch
from

Conversation

cookieg13
Copy link
Contributor

@cookieg13 cookieg13 commented Nov 21, 2024

Type of Change

  • Bugfix
  • New feature
  • Enhancement
  • Refactoring
  • Dependency updates
  • Documentation
  • CI/CD

Description

  1. Added zero auth mandates for Novalnet
  2. Made changes so that create_webhook_url fn can accept merchant_connector_account_id instead of connector_name

Additional Changes

  • This PR modifies the API contract
  • This PR modifies the database schema
  • This PR modifies application configuration/environment variables

Motivation and Context

How did you test it?

  1. Zero auth mandate for novalnet
    Note:
    Skipping no3ds test cases as it is not supported by novalnet cc: @Likhin Bopanna
Screenshot 2024-12-05 at 13 57 38

Tested manually
https://docs.google.com/document/d/1i4SSX837Dh9ipfOz24bDwJF8osR_UPmfPLWUbLP3bh0/edit?usp=sharing

  1. Webhooks
    Webhooks working as expected for /payments. Tested locally.
Screenshot 2024-11-28 at 13 46 36

Checklist

  • I formatted the code cargo +nightly fmt --all
  • I addressed lints thrown by cargo clippy
  • I reviewed the submitted code
  • I added unit tests for my changes where possible

@cookieg13 cookieg13 requested review from a team as code owners November 21, 2024 11:30
@cookieg13 cookieg13 self-assigned this Nov 21, 2024
@cookieg13 cookieg13 changed the title Add novalnet zero auth mandate feat(connector): [Novalnet] Add zero auth mandate Nov 21, 2024
@cookieg13 cookieg13 force-pushed the addNovalnetSetupMandate branch from df85bb8 to 4fdf8c1 Compare November 22, 2024 06:10
srujanchikke
srujanchikke previously approved these changes Nov 25, 2024
Comment on lines 1403 to 1410
let enforce_3d = match item.auth_type {
enums::AuthenticationType::ThreeDs => Some(1),
enums::AuthenticationType::NoThreeDs => None,
};
let test_mode = match item.test_mode {
Some(true) => 1,
Some(false) | None => 0,
};
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we consider using constants or enums here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, sure

mobile: item.get_optional_billing_phone_number(),
billing: Some(billing),
// no_nc is used to indicate if minimal customer data is passed or not
no_nc: 1,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can use constants here.

let custom = NovalnetCustom { lang };
let hook_url = item.request.get_webhook_url()?;
let return_url = item.request.get_return_url()?;
let create_token = Some(1);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here.

Comment on lines 3040 to 3589
let webhook_url = Some(helpers::create_webhook_url(
router_base_url,
&attempt.merchant_id,
connector_name,
));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Narayanbhat166 @sai-harsha-vardhan Should we consider passing MerchantConnectorAccountId here, instead of the connector name? Basically update the create_webhook_url() function as well?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it's always recommended to use MerchantConnectorAccountId in webhook url

Copy link
Contributor Author

@cookieg13 cookieg13 Nov 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sai-harsha-vardhan @SanchithHegde I made a new fn create_webhook_url_using_mca_id ,but only used it in line 226 (crates/router/src/core/payments/transformers.rs:226) . In the other places where create_webhook_url() is currently used the MerchantConnectorAccountId value is Optional, so we cant replace connector name with simply MerchantConnectorAccountId.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we will always have the merchant_connector_id when constructing the router data. So if it is not found you can raise an internal server error.

I do not see any harm in updating the existing webhook function.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

updated the existing create_webhook_url fn

SanchithHegde
SanchithHegde previously approved these changes Nov 27, 2024
crates/router/src/core/payments/helpers.rs Outdated Show resolved Hide resolved
SanchithHegde
SanchithHegde previously approved these changes Nov 27, 2024
srujanchikke
srujanchikke previously approved these changes Nov 27, 2024
@cookieg13 cookieg13 dismissed stale reviews from srujanchikke and SanchithHegde via 4c94106 November 28, 2024 08:18
@cookieg13 cookieg13 force-pushed the addNovalnetSetupMandate branch 2 times, most recently from 4c94106 to 004a8b6 Compare November 28, 2024 08:22
) -> String {
format!(
"{}/webhooks/{}/{}",
"/webhooks/{}/{}",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the base url should be in the beginning, and there are only two params in the format string, whereas there are three parameters

@@ -2322,7 +2322,7 @@ impl<F: Clone> TryFrom<PaymentAdditionalData<'_, F>> for types::PaymentsAuthoriz
let payment_data = additional_data.payment_data.clone();
let router_base_url = &additional_data.router_base_url;
let connector_name = &additional_data.connector_name;
let attempt = &payment_data.payment_attempt;
let attempt = &payment_data.payment_attempt.clone();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why are we cloning the attempt here? clone the fields instead

crates/router/src/core/payments/transformers.rs Outdated Show resolved Hide resolved
crates/router/src/core/payments/transformers.rs Outdated Show resolved Hide resolved
crates/router/src/core/payments/transformers.rs Outdated Show resolved Hide resolved
crates/router/src/core/payments/transformers.rs Outdated Show resolved Hide resolved
@cookieg13 cookieg13 force-pushed the addNovalnetSetupMandate branch from 004a8b6 to 9f96ab9 Compare December 2, 2024 09:01
@cookieg13 cookieg13 force-pushed the addNovalnetSetupMandate branch 3 times, most recently from 31be626 to 3053db8 Compare January 2, 2025 11:14
likhinbopanna
likhinbopanna previously approved these changes Jan 2, 2025
srujanchikke
srujanchikke previously approved these changes Jan 2, 2025
Narayanbhat166
Narayanbhat166 previously approved these changes Jan 2, 2025
#[serde(untagged)]
pub enum NovalNetAmount {
StringMinor(StringMinorUnit),
Int(i64),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you can use MinorUnit here right?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sure, I will take this up in a separate PR #6981

SanchithHegde
SanchithHegde previously approved these changes Jan 3, 2025
srujanchikke
srujanchikke previously approved these changes Jan 3, 2025
likhinbopanna
likhinbopanna previously approved these changes Jan 3, 2025
@@ -2745,11 +2745,17 @@ impl<F: Clone> TryFrom<PaymentAdditionalData<'_, F>> for types::PaymentsAuthoriz
attempt,
connector_name,
));

let merchant_connector_account_id = payment_data
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sahkal @sai-harsha-vardhan we will not have merchant_connector_id in case of tunnel payments right? I think we need to provide a fallback to connector_name if merchant connector id is not present.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, correct! but again putting a fallback to fetch with connector_name would also not work since tunnel merchant will never have a MCA in Hs

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes that is a valid point, we cannot make merchant_connector_id as mandatory is what my concern is, because it will not be present in case of creds_identifier

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added connector_name as fallback

@@ -3569,6 +3578,19 @@ impl<F: Clone> TryFrom<PaymentAdditionalData<'_, F>> for types::SetupMandateRequ
.map(|customer| customer.clone().into_inner())
});
let amount = payment_data.payment_attempt.get_total_amount();
let merchant_connector_account_id = payment_data
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please add the fallback here as well

.payment_attempt
.merchant_connector_id
.clone()
.get_required_value("merchant_connector_id")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

provide the fallback here as well

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants