mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-29 17:19:15 +08:00
feat(pm_list): add required fields for giropay (#3194)
Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com> Co-authored-by: Prasunna Soppa <70575890+prasunna09@users.noreply.github.com>
This commit is contained in:
@ -390,6 +390,8 @@ bank_debit.sepa = { connector_list = "gocardless" } # Mandate supported payment
|
|||||||
bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"} # Mandate supported payment method type and connector for bank_redirect
|
bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"} # Mandate supported payment method type and connector for bank_redirect
|
||||||
bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
|
bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
|
||||||
wallet.apple_pay = { connector_list = "stripe,adyen,cybersource,noon" }
|
wallet.apple_pay = { connector_list = "stripe,adyen,cybersource,noon" }
|
||||||
|
bank_redirect.giropay = {connector_list = "adyen,globalpay"}
|
||||||
|
|
||||||
|
|
||||||
[mandates.update_mandate_supported]
|
[mandates.update_mandate_supported]
|
||||||
card.credit ={connector_list ="cybersource"} # Update Mandate supported payment method type and connector for card
|
card.credit ={connector_list ="cybersource"} # Update Mandate supported payment method type and connector for card
|
||||||
|
|||||||
@ -117,8 +117,10 @@ pay_later.klarna.connector_list = "adyen"
|
|||||||
wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon"
|
wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon"
|
||||||
wallet.google_pay.connector_list = "stripe,adyen,cybersource"
|
wallet.google_pay.connector_list = "stripe,adyen,cybersource"
|
||||||
wallet.paypal.connector_list = "adyen"
|
wallet.paypal.connector_list = "adyen"
|
||||||
bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"}
|
bank_redirect.ideal.connector_list = "stripe,adyen,globalpay"
|
||||||
bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
|
bank_redirect.sofort.connector_list = "stripe,adyen,globalpay"
|
||||||
|
bank_redirect.giropay.connector_list = "adyen,globalpay"
|
||||||
|
|
||||||
|
|
||||||
[mandates.update_mandate_supported]
|
[mandates.update_mandate_supported]
|
||||||
card.credit ={connector_list ="cybersource"}
|
card.credit ={connector_list ="cybersource"}
|
||||||
|
|||||||
@ -117,8 +117,9 @@ pay_later.klarna.connector_list = "adyen"
|
|||||||
wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon"
|
wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon"
|
||||||
wallet.google_pay.connector_list = "stripe,adyen,cybersource"
|
wallet.google_pay.connector_list = "stripe,adyen,cybersource"
|
||||||
wallet.paypal.connector_list = "adyen"
|
wallet.paypal.connector_list = "adyen"
|
||||||
bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"}
|
bank_redirect.ideal.connector_list = "stripe,adyen,globalpay"
|
||||||
bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
|
bank_redirect.sofort.connector_list = "stripe,adyen,globalpay"
|
||||||
|
bank_redirect.giropay.connector_list = "adyen,globalpay"
|
||||||
|
|
||||||
[mandates.update_mandate_supported]
|
[mandates.update_mandate_supported]
|
||||||
card.credit ={connector_list ="cybersource"}
|
card.credit ={connector_list ="cybersource"}
|
||||||
|
|||||||
@ -117,8 +117,10 @@ pay_later.klarna.connector_list = "adyen"
|
|||||||
wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon"
|
wallet.apple_pay.connector_list = "stripe,adyen,cybersource,noon"
|
||||||
wallet.google_pay.connector_list = "stripe,adyen,cybersource"
|
wallet.google_pay.connector_list = "stripe,adyen,cybersource"
|
||||||
wallet.paypal.connector_list = "adyen"
|
wallet.paypal.connector_list = "adyen"
|
||||||
bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"}
|
bank_redirect.ideal.connector_list = "stripe,adyen,globalpay"
|
||||||
bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
|
bank_redirect.sofort.connector_list = "stripe,adyen,globalpay"
|
||||||
|
bank_redirect.giropay.connector_list = "adyen,globalpay"
|
||||||
|
|
||||||
|
|
||||||
[mandates.update_mandate_supported]
|
[mandates.update_mandate_supported]
|
||||||
card.credit ={connector_list ="cybersource"}
|
card.credit ={connector_list ="cybersource"}
|
||||||
|
|||||||
@ -486,6 +486,7 @@ bank_debit.becs = { connector_list = "gocardless"}
|
|||||||
bank_debit.sepa = { connector_list = "gocardless"}
|
bank_debit.sepa = { connector_list = "gocardless"}
|
||||||
bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"}
|
bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"}
|
||||||
bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
|
bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
|
||||||
|
bank_redirect.giropay = {connector_list = "adyen,globalpay"}
|
||||||
|
|
||||||
[mandates.update_mandate_supported]
|
[mandates.update_mandate_supported]
|
||||||
card.credit ={connector_list ="cybersource"}
|
card.credit ={connector_list ="cybersource"}
|
||||||
|
|||||||
@ -351,6 +351,8 @@ bank_debit.becs = { connector_list = "gocardless"}
|
|||||||
bank_debit.sepa = { connector_list = "gocardless"}
|
bank_debit.sepa = { connector_list = "gocardless"}
|
||||||
bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"}
|
bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"}
|
||||||
bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
|
bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
|
||||||
|
bank_redirect.giropay = {connector_list = "adyen,globalpay"}
|
||||||
|
|
||||||
|
|
||||||
[connector_customer]
|
[connector_customer]
|
||||||
connector_list = "gocardless,stax,stripe"
|
connector_list = "gocardless,stax,stripe"
|
||||||
|
|||||||
@ -1289,7 +1289,7 @@ pub enum BankRedirectData {
|
|||||||
},
|
},
|
||||||
Giropay {
|
Giropay {
|
||||||
/// The billing details for bank redirection
|
/// The billing details for bank redirection
|
||||||
billing_details: BankRedirectBilling,
|
billing_details: Option<BankRedirectBilling>,
|
||||||
/// Bank account details for Giropay
|
/// Bank account details for Giropay
|
||||||
|
|
||||||
#[schema(value_type = Option<String>)]
|
#[schema(value_type = Option<String>)]
|
||||||
|
|||||||
@ -4482,13 +4482,225 @@ impl Default for super::settings::RequiredFields {
|
|||||||
ConnectorFields {
|
ConnectorFields {
|
||||||
fields: HashMap::from([
|
fields: HashMap::from([
|
||||||
(
|
(
|
||||||
enums::Connector::Stripe,
|
enums::Connector::Aci,
|
||||||
|
RequiredFieldFinal {
|
||||||
|
mandate: HashMap::new(),
|
||||||
|
non_mandate: HashMap::from([
|
||||||
|
(
|
||||||
|
"payment_method_data.bank_redirect.giropay.country".to_string(),
|
||||||
|
RequiredFieldInfo {
|
||||||
|
required_field: "payment_method_data.bank_redirect.giropay.country".to_string(),
|
||||||
|
display_name: "country".to_string(),
|
||||||
|
field_type: enums::FieldType::UserCountry {
|
||||||
|
options: vec![
|
||||||
|
"DE".to_string(),
|
||||||
|
]},
|
||||||
|
value: None,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
]),
|
||||||
|
common: HashMap::new(),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
(
|
||||||
|
enums::Connector::Adyen,
|
||||||
RequiredFieldFinal {
|
RequiredFieldFinal {
|
||||||
mandate: HashMap::new(),
|
mandate: HashMap::new(),
|
||||||
non_mandate: HashMap::new(),
|
non_mandate: HashMap::new(),
|
||||||
common: HashMap::new(),
|
common: HashMap::new(),
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
enums::Connector::Globalpay,
|
||||||
|
RequiredFieldFinal {
|
||||||
|
mandate: HashMap::new(),
|
||||||
|
non_mandate: HashMap::new(),
|
||||||
|
common: HashMap::from([
|
||||||
|
("billing.address.country".to_string(),
|
||||||
|
RequiredFieldInfo {
|
||||||
|
required_field: "billing.address.country".to_string(),
|
||||||
|
display_name: "country".to_string(),
|
||||||
|
field_type: enums::FieldType::UserAddressCountry {
|
||||||
|
options: vec![
|
||||||
|
"DE".to_string(),
|
||||||
|
]
|
||||||
|
},
|
||||||
|
value: None,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
]),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
(
|
||||||
|
enums::Connector::Mollie,
|
||||||
|
RequiredFieldFinal {
|
||||||
|
mandate: HashMap::new(),
|
||||||
|
non_mandate: HashMap::new(),
|
||||||
|
common: HashMap::new(),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
(
|
||||||
|
enums::Connector::Nuvei,
|
||||||
|
RequiredFieldFinal {
|
||||||
|
mandate: HashMap::new(),
|
||||||
|
non_mandate:HashMap::from([
|
||||||
|
(
|
||||||
|
"email".to_string(),
|
||||||
|
RequiredFieldInfo {
|
||||||
|
required_field: "email".to_string(),
|
||||||
|
display_name: "email".to_string(),
|
||||||
|
field_type: enums::FieldType::UserEmailAddress,
|
||||||
|
value: None,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"billing.address.first_name".to_string(),
|
||||||
|
RequiredFieldInfo {
|
||||||
|
required_field: "billing.address.first_name".to_string(),
|
||||||
|
display_name: "billing_first_name".to_string(),
|
||||||
|
field_type: enums::FieldType::UserBillingName,
|
||||||
|
value: None,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"billing.address.last_name".to_string(),
|
||||||
|
RequiredFieldInfo {
|
||||||
|
required_field: "billing.address.last_name".to_string(),
|
||||||
|
display_name: "billing_last_name".to_string(),
|
||||||
|
field_type: enums::FieldType::UserBillingName,
|
||||||
|
value: None,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"billing.address.country".to_string(),
|
||||||
|
RequiredFieldInfo {
|
||||||
|
required_field: "billing.address.country".to_string(),
|
||||||
|
display_name: "country".to_string(),
|
||||||
|
field_type: enums::FieldType::UserAddressCountry{
|
||||||
|
options: vec![
|
||||||
|
"DE".to_string(),
|
||||||
|
]
|
||||||
|
},
|
||||||
|
value: None,
|
||||||
|
}
|
||||||
|
)]
|
||||||
|
),
|
||||||
|
common: HashMap::new(),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
(
|
||||||
|
enums::Connector::Paypal,
|
||||||
|
RequiredFieldFinal {
|
||||||
|
mandate: HashMap::new(),
|
||||||
|
non_mandate: HashMap::from([
|
||||||
|
("payment_method_data.bank_redirect.giropay.country".to_string(),
|
||||||
|
RequiredFieldInfo {
|
||||||
|
required_field: "payment_method_data.bank_redirect.giropay.country".to_string(),
|
||||||
|
display_name: "country".to_string(),
|
||||||
|
field_type: enums::FieldType::UserCountry {
|
||||||
|
options: vec![
|
||||||
|
"DE".to_string(),
|
||||||
|
]
|
||||||
|
},
|
||||||
|
value: None,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"payment_method_data.bank_redirect.giropay.billing_details.billing_name".to_string(),
|
||||||
|
RequiredFieldInfo {
|
||||||
|
required_field: "payment_method_data.bank_redirect.giropay.billing_details.billing_name".to_string(),
|
||||||
|
display_name: "billing_name".to_string(),
|
||||||
|
field_type: enums::FieldType::UserBillingName,
|
||||||
|
value: None,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
]),
|
||||||
|
common: HashMap::new(),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
(
|
||||||
|
enums::Connector::Stripe,
|
||||||
|
RequiredFieldFinal {
|
||||||
|
mandate: HashMap::new(),
|
||||||
|
non_mandate: HashMap::from([
|
||||||
|
("payment_method_data.bank_redirect.giropay.billing_details.billing_name".to_string(),
|
||||||
|
RequiredFieldInfo {
|
||||||
|
required_field: "payment_method_data.bank_redirect.giropay.billing_details.billing_name".to_string(),
|
||||||
|
display_name: "billing_name".to_string(),
|
||||||
|
field_type: enums::FieldType::UserBillingName,
|
||||||
|
value: None,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
]),
|
||||||
|
common: HashMap::new(),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
(
|
||||||
|
enums::Connector::Shift4,
|
||||||
|
RequiredFieldFinal {
|
||||||
|
mandate: HashMap::new(),
|
||||||
|
non_mandate: HashMap::new(),
|
||||||
|
common: HashMap::new(),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
(
|
||||||
|
enums::Connector::Trustpay,
|
||||||
|
RequiredFieldFinal {
|
||||||
|
mandate: HashMap::new(),
|
||||||
|
non_mandate: HashMap::from([
|
||||||
|
(
|
||||||
|
"billing.address.first_name".to_string(),
|
||||||
|
RequiredFieldInfo {
|
||||||
|
required_field: "billing.address.first_name".to_string(),
|
||||||
|
display_name: "billing_first_name".to_string(),
|
||||||
|
field_type: enums::FieldType::UserBillingName,
|
||||||
|
value: None,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"billing.address.line1".to_string(),
|
||||||
|
RequiredFieldInfo {
|
||||||
|
required_field: "billing.address.line1".to_string(),
|
||||||
|
display_name: "line1".to_string(),
|
||||||
|
field_type: enums::FieldType::UserAddressLine1,
|
||||||
|
value: None,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"billing.address.city".to_string(),
|
||||||
|
RequiredFieldInfo {
|
||||||
|
required_field: "billing.address.city".to_string(),
|
||||||
|
display_name: "city".to_string(),
|
||||||
|
field_type: enums::FieldType::UserAddressCity,
|
||||||
|
value: None,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"billing.address.zip".to_string(),
|
||||||
|
RequiredFieldInfo {
|
||||||
|
required_field: "billing.address.zip".to_string(),
|
||||||
|
display_name: "zip".to_string(),
|
||||||
|
field_type: enums::FieldType::UserAddressPincode,
|
||||||
|
value: None,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"billing.address.country".to_string(),
|
||||||
|
RequiredFieldInfo {
|
||||||
|
required_field: "billing.address.country".to_string(),
|
||||||
|
display_name: "country".to_string(),
|
||||||
|
field_type: enums::FieldType::UserAddressCountry {
|
||||||
|
options: vec![
|
||||||
|
"DE".to_string(),
|
||||||
|
]
|
||||||
|
},
|
||||||
|
value: None,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
common: HashMap::new(),
|
||||||
|
}
|
||||||
|
),
|
||||||
]),
|
]),
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|||||||
@ -166,10 +166,15 @@ impl
|
|||||||
api_models::payments::BankRedirectData::Giropay {
|
api_models::payments::BankRedirectData::Giropay {
|
||||||
bank_account_bic,
|
bank_account_bic,
|
||||||
bank_account_iban,
|
bank_account_iban,
|
||||||
|
country,
|
||||||
..
|
..
|
||||||
} => Self::BankRedirect(Box::new(BankRedirectionPMData {
|
} => Self::BankRedirect(Box::new(BankRedirectionPMData {
|
||||||
payment_brand: PaymentBrand::Giropay,
|
payment_brand: PaymentBrand::Giropay,
|
||||||
bank_account_country: Some(api_models::enums::CountryAlpha2::DE),
|
bank_account_country: Some(country.ok_or(
|
||||||
|
errors::ConnectorError::MissingRequiredField {
|
||||||
|
field_name: "giropay.country",
|
||||||
|
},
|
||||||
|
)?),
|
||||||
bank_account_bank_name: None,
|
bank_account_bank_name: None,
|
||||||
bank_account_bic: bank_account_bic.clone(),
|
bank_account_bic: bank_account_bic.clone(),
|
||||||
bank_account_iban: bank_account_iban.clone(),
|
bank_account_iban: bank_account_iban.clone(),
|
||||||
|
|||||||
@ -315,7 +315,12 @@ fn get_payment_source(
|
|||||||
country,
|
country,
|
||||||
..
|
..
|
||||||
} => Ok(PaymentSourceItem::Giropay(RedirectRequest {
|
} => Ok(PaymentSourceItem::Giropay(RedirectRequest {
|
||||||
name: billing_details.get_billing_name()?,
|
name: billing_details
|
||||||
|
.clone()
|
||||||
|
.ok_or(errors::ConnectorError::MissingRequiredField {
|
||||||
|
field_name: "giropay.billing_details",
|
||||||
|
})?
|
||||||
|
.get_billing_name()?,
|
||||||
country_code: country.ok_or(errors::ConnectorError::MissingRequiredField {
|
country_code: country.ok_or(errors::ConnectorError::MissingRequiredField {
|
||||||
field_name: "giropay.country",
|
field_name: "giropay.country",
|
||||||
})?,
|
})?,
|
||||||
|
|||||||
@ -18,7 +18,8 @@ use url::Url;
|
|||||||
use crate::{
|
use crate::{
|
||||||
collect_missing_value_keys,
|
collect_missing_value_keys,
|
||||||
connector::utils::{
|
connector::utils::{
|
||||||
self as connector_util, ApplePay, ApplePayDecrypt, PaymentsPreProcessingData, RouterData,
|
self as connector_util, ApplePay, ApplePayDecrypt, BankRedirectBillingData,
|
||||||
|
PaymentsPreProcessingData, RouterData,
|
||||||
},
|
},
|
||||||
consts,
|
consts,
|
||||||
core::errors,
|
core::errors,
|
||||||
@ -1111,7 +1112,14 @@ impl TryFrom<(&payments::BankRedirectData, Option<bool>)> for StripeBillingAddre
|
|||||||
payments::BankRedirectData::Giropay {
|
payments::BankRedirectData::Giropay {
|
||||||
billing_details, ..
|
billing_details, ..
|
||||||
} => Ok(Self {
|
} => Ok(Self {
|
||||||
name: billing_details.billing_name.clone(),
|
name: Some(
|
||||||
|
billing_details
|
||||||
|
.clone()
|
||||||
|
.ok_or(errors::ConnectorError::MissingRequiredField {
|
||||||
|
field_name: "giropay.billing_details",
|
||||||
|
})?
|
||||||
|
.get_billing_name()?,
|
||||||
|
),
|
||||||
..Self::default()
|
..Self::default()
|
||||||
}),
|
}),
|
||||||
payments::BankRedirectData::Ideal {
|
payments::BankRedirectData::Ideal {
|
||||||
|
|||||||
@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize};
|
|||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
connector::utils::{self, CardData},
|
connector::utils::{self, BankRedirectBillingData, CardData},
|
||||||
core::errors,
|
core::errors,
|
||||||
services,
|
services,
|
||||||
types::{
|
types::{
|
||||||
@ -385,11 +385,12 @@ fn make_bank_redirect_request(
|
|||||||
{
|
{
|
||||||
PaymentMethodSpecificData::PaymentProduct816SpecificInput(Box::new(Giropay {
|
PaymentMethodSpecificData::PaymentProduct816SpecificInput(Box::new(Giropay {
|
||||||
bank_account_iban: BankAccountIban {
|
bank_account_iban: BankAccountIban {
|
||||||
account_holder_name: billing_details.billing_name.clone().ok_or(
|
account_holder_name: billing_details
|
||||||
errors::ConnectorError::MissingRequiredField {
|
.clone()
|
||||||
field_name: "billing_details.billing_name",
|
.ok_or(errors::ConnectorError::MissingRequiredField {
|
||||||
},
|
field_name: "giropay.billing_details",
|
||||||
)?,
|
})?
|
||||||
|
.get_billing_name()?,
|
||||||
iban: bank_account_iban.clone(),
|
iban: bank_account_iban.clone(),
|
||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
|
|||||||
@ -251,6 +251,8 @@ bank_debit.becs = { connector_list = "gocardless"}
|
|||||||
bank_debit.sepa = { connector_list = "gocardless"}
|
bank_debit.sepa = { connector_list = "gocardless"}
|
||||||
bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"}
|
bank_redirect.ideal = {connector_list = "stripe,adyen,globalpay"}
|
||||||
bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
|
bank_redirect.sofort = {connector_list = "stripe,adyen,globalpay"}
|
||||||
|
bank_redirect.giropay = {connector_list = "adyen,globalpay"}
|
||||||
|
|
||||||
|
|
||||||
[mandates.update_mandate_supported]
|
[mandates.update_mandate_supported]
|
||||||
card.credit ={connector_list ="cybersource"}
|
card.credit ={connector_list ="cybersource"}
|
||||||
|
|||||||
@ -5227,12 +5227,16 @@
|
|||||||
"giropay": {
|
"giropay": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"required": [
|
"required": [
|
||||||
"billing_details",
|
|
||||||
"country"
|
"country"
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"billing_details": {
|
"billing_details": {
|
||||||
"$ref": "#/components/schemas/BankRedirectBilling"
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/components/schemas/BankRedirectBilling"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"nullable": true
|
||||||
},
|
},
|
||||||
"bank_account_bic": {
|
"bank_account_bic": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
|
|||||||
Reference in New Issue
Block a user