UNPKG

@nicotordev/flowcl-pagos

Version:

SDK en TypeScript para integrar pagos con la API de Flow.cl de manera sencilla y segura.

177 lines 8.83 kB
"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 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 pagos de Flow. * Permite crear planes de suscripción. */ class FlowPlans { /** * 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 un nuevo Plan de Suscripción * @param {FlowCreatePlanRequest} data Datos para crear el plan. * @returns {Promise<FlowCreatePlanResponse>} Respuesta de la API. * @throws {FlowCreatePlanError} Si hay problemas al crear el plan. * @throws {FlowAPIError} Si hay problemas con la API de Flow. */ this.create = this.createPlan.bind(this); /** * Este servicio permite obtener los datos de un Plan de Suscripción * @param {string} planId Identificador del plan. * @returns {Promise<FlowGetPlanResponse>} Respuesta de la API. * @throws {FlowCreatePlanError} Si hay problemas al obtener el plan. * @throws {FlowAPIError} Si hay problemas con la API de Flow. */ this.get = this.getPlan.bind(this); /** * Este servicio permite editar los datos de un Plan de Suscripción. Si el plan tiene clientes suscritos sólo se puede modificar el campo trial_period_days. * @param {FlowEditPlanRequest} data Datos para editar el plan. * @returns {Promise<FlowEditPlanResponse>} Respuesta de la API. * @throws {FlowEditPlanError} Si hay problemas al editar el plan. * @throws {FlowAPIError} Si hay problemas con la API de Flow. */ this.edit = this.editPlan.bind(this); /** * Este servicio permite eliminar un Plan de Suscripción. El eliminar un Plan significa que ya no podrá suscribir nuevos clientes al plan. Pero las suscripciones activas continuarán su ciclo de vida mientras estas no sean cancelas. * @param {string} planId Identificador del plan. * @returns {Promise<FlowDeletePlanResponse>} Respuesta de la API. * @throws {FlowEditPlanError} Si hay problemas al eliminar el plan. * @throws {FlowAPIError} Si hay problemas con la API de Flow. */ this.delete = this.deletePlan.bind(this); /** * Permite obtener la lista de planes de suscripción 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 del plan * @param {FlowListPlansRequest} data Datos para listar los planes. * @returns {Promise<FlowListPlansResponse>} Respuesta de la API. * @throws {FlowEditPlanError} Si hay problemas al listar los planes. * @throws {FlowAPIError} Si hay problemas con la API de Flow. */ this.list = this.listPlans.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}/plans`, 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. * @param {(data: P) => P} [modifyResponse] Función para modificar la respuesta de la API. * @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)) { 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 un nuevo Plan de Suscripción * @param {FlowCreatePlanRequest} data Datos para crear el plan. * @returns {Promise<FlowCreatePlanResponse>} Respuesta de la API. * @throws {FlowCreatePlanError} Si hay problemas al crear el plan. * @throws {FlowAPIError} Si hay problemas con la API de Flow. */ async createPlan(data) { return await this.request('/create', data, 'post', (e) => { throw new errors_1.FlowCreatePlanError(e.message); }); } /** * Este servicio permite obtener los datos de un Plan de Suscripción * @param {string} planId Identificador del plan. * @returns {Promise<FlowGetPlanResponse>} Respuesta de la API. * @throws {FlowCreatePlanError} Si hay problemas al obtener el plan. * @throws {FlowAPIError} Si hay problemas con la API de Flow. */ async getPlan(planId) { return await this.request('/get', { planId }, 'get', (e) => { throw new errors_1.FlowCreatePlanError(e.message); }); } /** * Este servicio permite editar los datos de un Plan de Suscripción. Si el plan tiene clientes suscritos sólo se puede modificar el campo trial_period_days. * @param {FlowEditPlanRequest} data Datos para editar el plan. * @returns {Promise<FlowEditPlanResponse>} Respuesta de la API. * @throws {FlowEditPlanError} Si hay problemas al editar el plan. * @throws {FlowAPIError} Si hay problemas con la API de Flow. */ async editPlan(data) { return await this.request('/edit', { ...data }, 'post', (e) => { throw new errors_1.FlowEditPlanError(e.message); }); } /** * Este servicio permite eliminar un Plan de Suscripción. El eliminar un Plan significa que ya no podrá suscribir nuevos clientes al plan. Pero las suscripciones activas continuarán su ciclo de vida mientras estas no sean cancelas. * @param {string} planId Identificador del plan. * @returns {Promise<FlowDeletePlanResponse>} Respuesta de la API. * @throws {FlowEditPlanError} Si hay problemas al eliminar el plan. * @throws {FlowAPIError} Si hay problemas con la API de Flow. */ async deletePlan(planId) { return await this.request('/delete', { planId }, 'post', (e) => { throw new errors_1.FlowEditPlanError(e.message); }); } /** * Permite obtener la lista de planes de suscripción 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 del plan * @param {FlowListPlansRequest} data Datos para listar los planes. * @returns {Promise<FlowListPlansResponse>} Respuesta de la API. * @throws {FlowEditPlanError} Si hay problemas al listar los planes. * @throws {FlowAPIError} Si hay problemas con la API de Flow. */ async listPlans(data) { return await this.request('/list', { ...data }, 'get', (e) => { throw new errors_1.FlowListPlansError(e.message); }); } } exports.default = FlowPlans; //# sourceMappingURL=flow.plans.js.map