convert form id to payment method string with validation

This commit is contained in:
woodser 2023-08-29 10:32:50 -04:00
parent 9fd95e81f6
commit 0266147d74
3 changed files with 84 additions and 54 deletions

View File

@ -1040,8 +1040,8 @@ test("Can get payment accounts (CI)", async () => {
// TODO: FieldId represented as number
test("Can validate payment account forms (CI, sanity check)", async () => {
// supported payment methods
const expectedPaymentMethods = ["BLOCK_CHAINS", "REVOLUT", "SEPA", "SEPA_INSTANT", "TRANSFERWISE", "ZELLE", "SWIFT", "F2F", "STRIKE", "MONEY_GRAM", "FASTER_PAYMENTS", "UPHOLD", "PAXUM", "PAY_BY_MAIL"];
// expected payment methods
const expectedPaymentMethods = Object.keys(PaymentAccountForm.FormId);
// get payment methods
const paymentMethods = await user1.getPaymentMethods();
@ -1097,7 +1097,7 @@ test("Can validate payment account forms (CI, sanity check)", async () => {
test("Can create fiat payment accounts (CI)", async () => {
// get payment account form
const paymentMethodId = 'REVOLUT';
const paymentMethodId = HavenoUtils.getPaymentMethodId(PaymentAccountForm.FormId.REVOLUT);
const accountForm = await user1.getPaymentAccountForm(paymentMethodId);
// edit form
@ -3296,8 +3296,8 @@ function getCryptoAddress(currencyCode: string): string|undefined {
}
}
async function createPaymentAccount(trader: HavenoClient, assetCodes: string, paymentMethodId?: string) {
if (!paymentMethodId) paymentMethodId = isCrypto(assetCodes!) ? "block_chains" : "revolut";
async function createPaymentAccount(trader: HavenoClient, assetCodes: string, paymentMethodId?: string | PaymentAccountForm.FormId) {
if (!paymentMethodId) paymentMethodId = isCrypto(assetCodes!) ? PaymentAccountForm.FormId.BLOCK_CHAINS : PaymentAccountForm.FormId.REVOLUT;
const accountForm = await trader.getPaymentAccountForm(paymentMethodId);
for (const field of accountForm.getFieldsList()) field.setValue(getValidFormInput(accountForm, field.getId()));
HavenoUtils.setFormValue(PaymentAccountFormField.FieldId.TRADE_CURRENCIES, assetCodes, accountForm);

View File

@ -860,11 +860,12 @@ export default class HavenoClient {
/**
* Get a form for the given payment method to complete and create a new payment account.
*
* @param {string} paymentMethodId - the id of the payment method
* @param {string | PaymentAccountForm.FormId} paymentMethodId - the id of the payment method
* @return {PaymentAccountForm} the payment account form
*/
async getPaymentAccountForm(paymentMethodId: string): Promise<PaymentAccountForm> {
async getPaymentAccountForm(paymentMethodId: string | PaymentAccountForm.FormId): Promise<PaymentAccountForm> {
try {
paymentMethodId = HavenoUtils.getPaymentMethodId(paymentMethodId); // validate and normalize
return (await this._paymentAccountsClient.getPaymentAccountForm(new GetPaymentAccountFormRequest().setPaymentMethodId(paymentMethodId), {password: this._password})).getPaymentAccountForm()!;
} catch (e: any) {
throw new HavenoError(e.message, e.code);

View File

@ -73,53 +73,6 @@ export default class HavenoUtils {
process.kill(signal ? signal : "SIGINT");
});
}
/**
* Stringify a payment account form.
*
* @param form - form to stringify
* @return {string} the stringified form
*/
static formToString(form: PaymentAccountForm): string {
let str = "";
for (const field of form.getFieldsList()) {
str += field.getId() + ": " + this.getFormValue(form, field.getId()) + "\n";
}
return str.trim();
}
/**
* Get a form field value.
*
* @param {PaymentAccountForm} form - form to get the field value from
* @param {PaymentAccountFormField.FieldId} fieldId - id of the field to get the value from
* @return {string} the form field value
*/
// TODO: attach getter and setter to PaymentAccountForm prototype in typescript?
static getFormValue(form: PaymentAccountForm, fieldId: PaymentAccountFormField.FieldId): string {
for (const field of form.getFieldsList()) {
if (field.getId() === fieldId) return field.getValue();
}
throw new Error("PaymentAccountForm does not have field " + fieldId);
}
/**
* Set a form field value.
*
* @param {PaymentAccountFormField.FieldId} fieldId - id of the field to set the value of
* @param {string} value - field value to set
* @param {PaymentAccountForm} form - form to get the field from
* @return {string} the form field value
*/
static setFormValue(fieldId: PaymentAccountFormField.FieldId, value: string, form: PaymentAccountForm): void {
for (const field of form.getFieldsList()) {
if (field.getId() === fieldId) {
field.setValue(value);
return;
}
}
throw new Error("PaymentAccountForm does not have field " + fieldId);
}
/**
* Wait for the duration.
@ -172,4 +125,80 @@ export default class HavenoUtils {
const remainder: bigint = amountAtomicUnits as bigint % HavenoUtils.AU_PER_XMR;
return Number(quotient) + Number(remainder) / Number(HavenoUtils.AU_PER_XMR);
}
// ------------------------- PAYMENT ACCOUNT FORMS --------------------------
/**
* Get a validated payment method id from a string or form id.
*
* @param {string | PaymentAccountForm.FormId} id - identifies the payment method
* @returns {string} the payment method id
*/
static getPaymentMethodId(id: string | PaymentAccountForm.FormId) {
if (typeof id === "string") {
id = id.toUpperCase();
if (!(id in PaymentAccountForm.FormId)) throw Error("Invalid payment method: " + id);
return id;
} else {
let keyByValue = getKeyByValue(PaymentAccountForm.FormId, id);
if (!keyByValue) throw Error("No payment method id with form id " + id);
return keyByValue;
}
}
/**
* Stringify a payment account form.
*
* @param form - form to stringify
* @return {string} the stringified form
*/
static formToString(form: PaymentAccountForm): string {
let str = "";
for (const field of form.getFieldsList()) {
str += field.getId() + ": " + this.getFormValue(form, field.getId()) + "\n";
}
return str.trim();
}
/**
* Get a form field value.
*
* @param {PaymentAccountForm} form - form to get the field value from
* @param {PaymentAccountFormField.FieldId} fieldId - id of the field to get the value from
* @return {string} the form field value
*/
// TODO: attach getter and setter to PaymentAccountForm prototype in typescript?
static getFormValue(form: PaymentAccountForm, fieldId: PaymentAccountFormField.FieldId): string {
for (const field of form.getFieldsList()) {
if (field.getId() === fieldId) return field.getValue();
}
throw new Error("PaymentAccountForm does not have field " + fieldId);
}
/**
* Set a form field value.
*
* @param {PaymentAccountFormField.FieldId} fieldId - id of the field to set the value of
* @param {string} value - field value to set
* @param {PaymentAccountForm} form - form to get the field from
* @return {string} the form field value
*/
static setFormValue(fieldId: PaymentAccountFormField.FieldId, value: string, form: PaymentAccountForm): void {
for (const field of form.getFieldsList()) {
if (field.getId() === fieldId) {
field.setValue(value);
return;
}
}
throw new Error("PaymentAccountForm does not have field " + fieldId);
}
}
function getKeyByValue(object: any, value: number): string | undefined {
for (const key in object) {
if (object.hasOwnProperty(key) && object[key] === value) {
return key;
}
}
return undefined;
}