@nicotordev/flowcl-pagos
Version:
SDK en TypeScript para integrar pagos con la API de Flow.cl de manera sencilla y segura.
319 lines • 19.6 kB
JavaScript
"use strict";
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 flow_utils_1 = require("../utils/flow.utils");
const qs_1 = __importDefault(require("qs"));
const errors_1 = require("../errors");
/**
* Cliente para interactuar con la API de pagos de Flow.
* Permite suscribir clientes a un plan de suscripción.
*/
class FlowSubscriptions {
/**
* 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) {
/**
* Este servicio permite crear una nueva suscripción de un cliente a un Plan. Para crear una nueva suscripción, basta con enviar los parámetros planId y customerId
* @param {FlowCreateSubscriptionToPlanRequest} data Datos para crear la suscripción.
* @returns {Promise<FlowCreateSubscriptionToPlanResponse>} Respuesta de la API.
* @throws {FlowCreateSubscriptionToPlanError} Si hay problemas al crear la suscripción.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
this.createToPlan = this.createSubscriptionToPlan.bind(this);
this.get = {
bySubscriptionId: this.getSubscriptionBySubscriptionId.bind(this),
};
/**
* Permite obtener la lista de suscripciones paginada de acuerdo a los parámetros de paginación. Además, se puede definir los siguientes filtros:
* filter: filtro por nombre del plan
* status: filtro por estado de la suscripción.
* @param {FlowGetPlanSubscriptionsRequest} data Datos para obtener las suscripciones.
* @returns {Promise<FlowGetPlanSubscriptionsResponse>} Respuesta de la API.
* @throws {FlowGetPlanSubscriptionsError} Si hay problemas al obtener las suscripciones.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
this.getPlanSubscriptions = this._getPlanSubscriptions.bind(this);
this.update = {
trialDays: this.updateSubscriptionTrialDays.bind(this),
};
/**
* Este servicio permite cancelar una suscripción. Existen formas de cancelar una suscripción:
* inmediatamente. Es decir, en este instante al terminar el perído vigente.
* Si desea cancelar la suscripción inmediatamente, envíe el parámetro at_period_end con valor 0, si desea cancelarla al final del período vigente envíe el valor 1.
* @param {string} subscriptionId ID de la suscripción.
* @param {number} at_period_end 0 para cancelar inmediatamente, 1 para cancelar al final del período vigente.
* @returns {Promise<FlowCancelSubscriptionResponse>} Respuesta de la API.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
* @throws {FlowCancelSubscriptionError} Si hay problemas al cancelar la suscripción.
*/
this.cancelSubscription = this._cancelSubscription.bind(this);
/**
* Este servicio permite agregar un descuento a la suscripción. Si la suscripción ya tenía un descuento, será reemplazado por este.
* @param {string} subscriptionId ID de la suscripción.
* @param {string} couponId ID del cupón.
* @returns {Promise<FlowAddDiscountToSubscriptionResponse>} Respuesta de la API.
* @throws {FlowAddDiscountToSubscription} Si hay problemas al agregar el descuento.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
this.addDiscountToSubscription = this._addDiscountToSubscription;
/**
* Este servicio permite eliminar el descuento que tenga la suscripción. El eliminar el descuento de la suscripción, no elimina el descuento que podría tenar asociado el cliente.
* @param {string} subscriptionId ID de la suscripción.
* @returns {Promise<FlowRemoveDiscountFromSubscriptionResponse>} Respuesta de la API.
* @throws {FlowRemoveDiscountFromSubscriptionError} Si hay problemas al eliminar el descuento.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
this.removeDiscountFromSubscription = this._removeDiscountFromSubscription.bind(this);
/**
* Este servicio permite agregar un item adicional a la suscripción.
* @param {string} subscriptionId ID de la suscripción.
* @param {string} itemId ID del item.
* @returns {Promise<FlowAddItemToSubscriptionResponse>} Respuesta de la API.
* @throws {FlowAddItemToSubscriptionError} Si hay problemas al agregar el item.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
this.addItemToSubscription = this._addItemToSubscription.bind(this);
/**
* Este servicio permite eliminar un item adicional que este agregado en una suscripción.
* @param {string} subscriptionId ID de la suscripción.
* @param {string} itemId ID del item.
* @returns {Promise<FlowRemoveItemFromSubscriptionResponse>} Respuesta de la API.
* @throws {FlowRemoveItemFromSubscriptionError} Si hay problemas al eliminar el item.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
this.removeItemFromSubscription = this._removeItemFromSubscription.bind(this);
/**
* Este servicio permite modificar el plan que esta asociado a una suscripción. Se puede modificar el plan de una suscripción ingresando de manera opcional una fecha asocial al cambio de plan. Esta fecha deberá estar en el rango del ciclo de facturación actual de la suscripción, y puede ser a futuro.
* @param {FlowChangeAssociatedPlanToSubscriptionRequest} data Datos para cambiar el plan de la suscripción.
* @returns {Promise<FlowChangeAssociatedPlanToSubscriptionResponse>} Respuesta de la API.
* @throws {FlowChangeAssociatedPlanToSubscriptionError} Si hay problemas al cambiar el plan de la suscripción.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
this.changeAssociatedPlanToSubscription = this._changeAssociatedPlanToSubscription.bind(this);
/**
* Este servicio permite previsualizar el modificar un plan que esta asociado a una suscripción. Se puede modificar el plan de una suscripción ingresando de manera opcional una fecha asocial al cambio de plan. Esta fecha deberá estar en el rango del ciclo de facturación actual de la suscripción, y puede ser a futuro.
* @param {FlowChangeAssociatedPlanToSubscriptionRequest} data Datos para cambiar el plan de la suscripción.
* @returns {Promise<FlowChangeAssociatedPlanToSubscriptionResponse>} Respuesta de la API.
* @throws {FlowPreviewSubscriptionPlanChangeError} Si hay problemas al cambiar el plan de la suscripción.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
this.previewSubscriptionPlanChange = this._previewSubscriptionPlanChange.bind(this);
/**
* Este servicio permite cancelar un cambio de plan que haya sido programado para una suscripción.
* @param {string} subscriptionId ID de la suscripción.
* @returns {Promise<FlowCancelScheduledPlanChangeResponse>} Respuesta de la API.
* @throws {FlowCancelScheduledPlanChangeError} Si hay problemas al cancelar el cambio de plan.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
this.cancelScheduledPlanChange = this._cancelScheduledPlanChange.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}/subscription`,
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 {string} data Datos a enviar en la petición.
* @param {'post' | 'get'} method Método de la petición (POST o GET).
* @param {(e: 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) {
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}`);
return response.data;
}
catch (err) {
if (axios_1.default.isAxiosError(err)) {
console.error(JSON.stringify(err.response?.data, null, 2));
throw new errors_1.FlowAPIError(err.response?.status || 500, err.message);
}
error(err);
}
}
/**
* Este servicio permite crear una nueva suscripción de un cliente a un Plan. Para crear una nueva suscripción, basta con enviar los parámetros planId y customerId
* @param {FlowCreateSubscriptionToPlanRequest} data Datos para crear la suscripción.
* @returns {Promise<FlowCreateSubscriptionToPlanResponse>} Respuesta de la API.
* @throws {FlowCreateSubscriptionToPlanError} Si hay problemas al crear la suscripción.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
async createSubscriptionToPlan(data) {
return await this.request('/create', data, 'post', (err) => {
throw new errors_1.FlowCreateSubscriptionToPlanError(err.message);
});
}
/**
* Este servicio permite obtener los datos de una suscripción.
* @param {string} subscriptionId ID de la suscripción.
* @returns {Promise<FlowGetSubscriptionBySubscriptionIdResponse>} Respuesta de la API.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
* @throws {FlowGetSubscriptionBySubscriptionIdError} Si hay problemas al obtener la suscripción.
*
*/
async getSubscriptionBySubscriptionId(subscriptionId) {
return await this.request('/get', { subscriptionId }, 'get', (err) => {
throw new errors_1.FlowGetSubscriptionBySubscriptionIdError(err.message);
});
}
/**
* Permite obtener la lista de suscripciones paginada de acuerdo a los parámetros de paginación. Además, se puede definir los siguientes filtros:
* filter: filtro por nombre del plan
* status: filtro por estado de la suscripción.
* @param {FlowGetPlanSubscriptionsRequest} data Datos para obtener las suscripciones.
* @returns {Promise<FlowGetPlanSubscriptionsResponse>} Respuesta de la API.
* @throws {FlowGetPlanSubscriptionsError} Si hay problemas al obtener las suscripciones.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
async _getPlanSubscriptions(data) {
return await this.request('/list', data, 'get', (err) => {
throw new errors_1.FlowGetPlanSubscriptionsError(err.message);
});
}
/**
* Este servicio permite modificar los días de Trial de una suscripción. Sólo se puede modificar los días de Trial a una suscripción que aún no se ha iniciado o que todavía está vigente el Trial.
* @param {string} subscriptionId ID de la suscripción.
* @param {number} trial_period_days Días de prueba.
* @returns {Promise<FlowUpdateSubscriptionTrialDays>} Respuesta de la API.
* @throws {FlowUpdateSubscriptionTrialDaysError} Si hay problemas al actualizar los días de prueba.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
async updateSubscriptionTrialDays(subscriptionId, trial_period_days) {
return await this.request('/changeTrial', { subscriptionId, trial_period_days }, 'post', (err) => {
throw new errors_1.FlowUpdateSubscriptionTrialDaysError(err.message);
});
}
/**
* Este servicio permite cancelar una suscripción. Existen formas de cancelar una suscripción:
* inmediatamente. Es decir, en este instante al terminar el perído vigente.
* Si desea cancelar la suscripción inmediatamente, envíe el parámetro at_period_end con valor 0, si desea cancelarla al final del período vigente envíe el valor 1.
* @param {string} subscriptionId ID de la suscripción.
* @param {number} at_period_end 0 para cancelar inmediatamente, 1 para cancelar al final del período vigente.
* @returns {Promise<FlowCancelSubscriptionResponse>} Respuesta de la API.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
* @throws {FlowCancelSubscriptionError} Si hay problemas al cancelar la suscripción.
*/
async _cancelSubscription(subscriptionId, at_period_end) {
return await this.request('/cancel', { subscriptionId, at_period_end }, 'post', (err) => {
throw new errors_1.FlowCancelSubscriptionError(err.message);
});
}
/**
* Este servicio permite agregar un descuento a la suscripción. Si la suscripción ya tenía un descuento, será reemplazado por este.
* @param {string} subscriptionId ID de la suscripción.
* @param {string} couponId ID del cupón.
* @returns {Promise<FlowAddDiscountToSubscriptionResponse>} Respuesta de la API.
* @throws {FlowAddDiscountToSubscription} Si hay problemas al agregar el descuento.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
async _addDiscountToSubscription(subscriptionId, couponId) {
return await this.request('/addCoupon', { subscriptionId, couponId }, 'post', (err) => {
throw new errors_1.FlowAddDiscountToSubscriptionError(err.message);
});
}
/**
* Este servicio permite eliminar el descuento que tenga la suscripción. El eliminar el descuento de la suscripción, no elimina el descuento que podría tenar asociado el cliente.
* @param {string} subscriptionId ID de la suscripción.
* @returns {Promise<FlowRemoveDiscountFromSubscriptionResponse>} Respuesta de la API.
* @throws {FlowRemoveDiscountFromSubscriptionError} Si hay problemas al eliminar el descuento.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
async _removeDiscountFromSubscription(subscriptionId) {
return await this.request('/deleteCoupon', { subscriptionId }, 'post', (err) => {
throw new errors_1.FlowRemoveDiscountFromSubscriptionError(err.message);
});
}
/**
* Este servicio permite agregar un item adicional a la suscripción.
* @param {string} subscriptionId ID de la suscripción.
* @param {string} itemId ID del item.
* @returns {Promise<FlowAddItemToSubscriptionResponse>} Respuesta de la API.
* @throws {FlowAddItemToSubscriptionError} Si hay problemas al agregar el item.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
async _addItemToSubscription(subscriptionId, itemId) {
return await this.request('/addItem', { subscriptionId, itemId }, 'post', (err) => {
throw new errors_1.FlowAddItemToSubscriptionError(err.message);
});
}
/**
* Este servicio permite eliminar un item adicional que este agregado en una suscripción.
* @param {string} subscriptionId ID de la suscripción.
* @param {string} itemId ID del item.
* @returns {Promise<FlowRemoveItemFromSubscriptionResponse>} Respuesta de la API.
* @throws {FlowRemoveItemFromSubscriptionError} Si hay problemas al eliminar el item.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
async _removeItemFromSubscription(subscriptionId, itemId) {
return await this.request('/deleteItem', { subscriptionId, itemId }, 'post', (err) => {
throw new errors_1.FlowRemoveItemFromSubscriptionError(err.message);
});
}
/**
* Este servicio permite modificar el plan que esta asociado a una suscripción. Se puede modificar el plan de una suscripción ingresando de manera opcional una fecha asocial al cambio de plan. Esta fecha deberá estar en el rango del ciclo de facturación actual de la suscripción, y puede ser a futuro.
* @param {FlowChangeAssociatedPlanToSubscriptionRequest} data Datos para cambiar el plan de la suscripción.
* @returns {Promise<FlowChangeAssociatedPlanToSubscriptionResponse>} Respuesta de la API.
* @throws {FlowChangeAssociatedPlanToSubscriptionError} Si hay problemas al cambiar el plan de la suscripción.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
async _changeAssociatedPlanToSubscription(data) {
return await this.request('/changePlan', data, 'post', (err) => {
throw new errors_1.FlowChangeAssociatedPlanToSubscriptionError(err.message);
});
}
/**
* Este servicio permite previsualizar el modificar un plan que esta asociado a una suscripción. Se puede modificar el plan de una suscripción ingresando de manera opcional una fecha asocial al cambio de plan. Esta fecha deberá estar en el rango del ciclo de facturación actual de la suscripción, y puede ser a futuro.
* @param {FlowChangeAssociatedPlanToSubscriptionRequest} data Datos para cambiar el plan de la suscripción.
* @returns {Promise<FlowChangeAssociatedPlanToSubscriptionResponse>} Respuesta de la API.
* @throws {FlowPreviewSubscriptionPlanChangeError} Si hay problemas al cambiar el plan de la suscripción.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*
*/
async _previewSubscriptionPlanChange(data) {
return await this.request('/changePlanPreview', data, 'post', (err) => {
throw new errors_1.FlowPreviewSubscriptionPlanChangeError(err.message);
});
}
/**
* Este servicio permite cancelar un cambio de plan que haya sido programado para una suscripción.
* @param {string} subscriptionId ID de la suscripción.
* @returns {Promise<FlowCancelScheduledPlanChangeResponse>} Respuesta de la API.
* @throws {FlowCancelScheduledPlanChangeError} Si hay problemas al cancelar el cambio de plan.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*
*/
async _cancelScheduledPlanChange(subscriptionId) {
return await this.request('/changePlanCancel', { subscriptionId }, 'post', (err) => {
throw new errors_1.FlowCancelScheduledPlanChangeError(err.message);
});
}
}
exports.default = FlowSubscriptions;
//# sourceMappingURL=flow.subscriptions.js.map