@nicotordev/flowcl-pagos
Version:
SDK en TypeScript para integrar pagos con la API de Flow.cl de manera sencilla y segura.
139 lines • 7.13 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const axios_1 = __importDefault(require("axios"));
const errors_1 = require("../errors");
const flow_utils_1 = require("../utils/flow.utils");
const qs_1 = __importDefault(require("qs"));
/**
* Cliente para interactuar con la API de reembolsos de Flow.
* Permite realizar reembolsos en Flow.
*/
class FlowRefunds {
/**
* Constructor de la clase FlowClient.
* @param {string} apiKey Clave de API proporcionada por Flow.
* @param {string} secretKey Clave secreta proporcionada por Flow.
* @param {string} baseURL URL base de la API de Flow.
* @throws {FlowAuthenticationError} Si no se proporciona apiKey o secretKey.
*/
constructor(apiKey, secretKey, baseURL) {
/**
* Objeto que proporciona métodos para interactuar con los reembolsos en Flow.
*/
/**
* Este servicio permite crear una orden de reembolso. Una vez que el receptor del reembolso acepte o rechaze el reembolso, Flow notificará vía POST a la página del comercio identificada en urlCallback pasando como parámetro token En esta página, el comercio debe invocar el servicio refund/getStatus para obtener el estado del reembolso.
* @param {string} data FlowCreateRefundRequest con los datos del reembolso.
* @returns {Promise<FlowCreateRefundResponse>} con la respuesta de Flow.
* @throws {FlowAPIError} Si hay un error en la respuesta de la API.
* @throws {FlowCreateRefundError} Si hay un error al crear el reembolso.
*/
this.create = this.createRefund.bind(this);
/**
* Este servicio permite cancelar una orden de reembolso pendiente
* @param {string} token Token de la orden de reembolso
* @returns {Promise<FlowCancelRefundResponse>} con la respuesta de Flow.
* @throws {FlowAPIError} Si hay un error en la respuesta de la API.
* @throws {FlowCancelRefundError} Si hay un error al cancelar el reembolso.
*/
this.cancel = this.cancelRefund.bind(this);
/**
* Este servicio permite obtener el estado de un reembolso.
*/
this.status = {
/**
* Permite obtener el estado de un reembolso solicitado. Este servicio se debe invocar desde la página del comercio que se señaló en el parámetro urlCallback del servicio refund/create.
* @param {string} token Token de la orden de reembolso
* @returns {Promise<FlowRefundStatusResponse>} con la respuesta de Flow.
* @throws {FlowAPIError} Si hay un error en la respuesta de la API.
* @throws {FlowRefundStatusError} Si hay un error al obtener el estado del reembolso.
*/
byToken: this.getRefundStatus.bind(this),
};
if (!apiKey || !secretKey) {
throw new errors_1.FlowAuthenticationError();
}
this.apiKey = apiKey;
this.secretKey = secretKey;
// Crear una instancia de Axios con la configuración base
this.axiosInstance = axios_1.default.create({
baseURL: `${baseURL}/refund`,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
});
}
/**
* Realiza una petición a la API de Flow.
* @param {string} endpoint URL del endpoint de la API.
* @param {Record<string, unknown>} data Datos a enviar en la petición.
* @param {'post' | 'get'} method Método de la petición (POST o GET).
* @param {(err: unknown) => never} error Error a lanzar en caso de error.
* @returns {Promise<T>} Respuesta de la API.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
* @throws {Error} Si hay problemas al realizar la petición.
*/
async request(endpoint, data, method = 'post', error, modifyResponse) {
try {
const allData = {
...data,
apiKey: this.apiKey,
};
const formData = (0, flow_utils_1.generateFormData)(allData, this.secretKey);
const formDataSearchParams = new URLSearchParams(formData);
const response = method === 'post'
? await this.axiosInstance.post(`${endpoint}`, qs_1.default.stringify(formData))
: await this.axiosInstance.get(`${endpoint}?${formDataSearchParams}`);
if (modifyResponse) {
return modifyResponse(data);
}
return response.data;
}
catch (err) {
if (axios_1.default.isAxiosError(err)) {
throw new errors_1.FlowAPIError(err.response?.status || 500, err.message);
}
error(err);
}
}
/**
* Este servicio permite crear una orden de reembolso. Una vez que el receptor del reembolso acepte o rechaze el reembolso, Flow notificará vía POST a la página del comercio identificada en urlCallback pasando como parámetro token En esta página, el comercio debe invocar el servicio refund/getStatus para obtener el estado del reembolso.
* @param {FlowCreateRefundRequest} data con los datos del reembolso.
* @returns {Promise<FlowCreateRefundResponse>} con la respuesta de Flow.
* @throws {FlowAPIError} Si hay un error en la respuesta de la API.
* @throws {FlowCreateRefundError} Si hay un error al crear el reembolso.
*/
async createRefund(data) {
return await this.request('/create', data, 'post', (e) => {
throw new errors_1.FlowCreateRefundError(e.message);
});
}
/**
* Este servicio permite cancelar una orden de reembolso pendiente
* @param {string} token Token de la orden de reembolso
* @returns {Promise<FlowCancelRefundResponse>} con la respuesta de Flow.
* @throws {FlowAPIError} Si hay un error en la respuesta de la API.
* @throws {FlowCancelRefundError} Si hay un error al cancelar el reembolso.
*/
async cancelRefund(token) {
return await this.request('/cancel', { token }, 'post', (e) => {
throw new errors_1.FlowCancelRefundError(e.message);
});
}
/**
* Permite obtener el estado de un reembolso solicitado. Este servicio se debe invocar desde la página del comercio que se señaló en el parámetro urlCallback del servicio refund/create.
* @param {string} token Token de la orden de reembolso
* @returns {Promise<FlowRefundStatusResponse>} con la respuesta de Flow.
* @throws {FlowAPIError} Si hay un error en la respuesta de la API.
* @throws {FlowRefundStatusError} Si hay un error al obtener el estado del reembolso.
*/
async getRefundStatus(token) {
return await this.request('/getStatus', { token }, 'get', (e) => {
throw new errors_1.FlowRefundStatusError(e.message);
});
}
}
exports.default = FlowRefunds;
//# sourceMappingURL=flow.refunds.js.map