@afriex/checkout
Version:
Checkout service for Afriex SDK
79 lines • 3.59 kB
JavaScript
import { ValidationBuilder } from "@afriex/core";
export class CheckoutService {
constructor(httpClient) {
this.httpClient = httpClient;
}
/**
* Create a checkout session
* POST /checkout-session
*
* Creates a hosted checkout session where customers can complete payments.
* Returns a checkout URL that can be embedded or redirected to.
*/
async createSession(request) {
this.validateCreateSessionRequest(request);
const response = await this.httpClient.post("/checkout-session", request);
return response.data;
}
validateCreateSessionRequest(request) {
new ValidationBuilder()
.required("amount", request.amount)
.condition("amount", request.amount !== undefined && !Number.isInteger(request.amount), "amount must be an integer value in minor units")
.condition("amount", typeof request.amount === "number" && request.amount < 100, "amount must be at least 100")
.required("currency", request.currency)
.condition("currency", request.currency !== undefined &&
request.currency !== "" &&
request.currency.trim().length !== 3, "currency must be a 3-letter ISO 4217 code")
.required("merchantReference", request.merchantReference)
.required("redirectUrl", request.redirectUrl)
.condition("redirectUrl", request.redirectUrl !== undefined &&
request.redirectUrl !== "" &&
!this.isHttpsUrl(request.redirectUrl), "redirectUrl must be a valid HTTPS URL")
.required("customer.email", request.customer?.email)
.required("customer.phone", request.customer?.phone)
.required("customer.countryCode", request.customer?.countryCode)
.required("customer.name", request.customer?.name)
.condition("customer.countryCode", request.customer?.countryCode !== undefined &&
request.customer.countryCode !== "" &&
request.customer.countryCode.trim().length !== 2, "customer.countryCode must be a 2-letter ISO country code")
.required("channels", request.channels)
.condition("channels", Array.isArray(request.channels) && request.channels.length === 0, "channels must contain at least one payment channel")
.condition("channels", this.hasInvalidChannels(request.channels), "channels contains an unsupported payment channel")
.condition("metadata", this.hasInvalidMetadata(request.metadata), "metadata values must be strings")
.throwIfInvalid();
}
hasInvalidChannels(channels) {
if (channels === undefined) {
return false;
}
if (!Array.isArray(channels)) {
return true;
}
return channels.some((channel) => typeof channel !== "string" ||
!CheckoutService.supportedChannels.has(channel));
}
hasInvalidMetadata(metadata) {
if (metadata === undefined) {
return false;
}
if (metadata === null ||
typeof metadata !== "object" ||
Array.isArray(metadata)) {
return true;
}
return Object.values(metadata).some((value) => typeof value !== "string");
}
isHttpsUrl(url) {
try {
return new URL(url).protocol === "https:";
}
catch {
return false;
}
}
}
CheckoutService.supportedChannels = new Set([
"VIRTUAL_BANK_ACCOUNT",
"MOBILE_MONEY",
]);
//# sourceMappingURL=CheckoutService.js.map