UNPKG

finerio-pfm-unnax

Version:

This SDK lets you connect to [Finerio PFM API Unnax](http://ec2-3-16-174-50.us-east-2.compute.amazonaws.com:8082/swagger-ui/index.html#/) in an easier way.

261 lines (260 loc) 10.8 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; 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 accounts_1 = __importDefault(require("../accounts")); const Budgets_1 = __importDefault(require("../budgets/Budgets")); const Categories_1 = __importDefault(require("../categories/Categories")); const constants_1 = require("../constants"); const error_1 = __importDefault(require("../error")); const index_1 = __importDefault(require("../financialEntities/index")); const Insights_1 = __importDefault(require("../insights/Insights")); const Login_1 = __importDefault(require("../models/Login")); const Transactions_1 = __importDefault(require("../transactions/Transactions")); class FinerioConnectSDK { constructor(arg) { this._authToken = ""; this._baseURL = ""; this._refreshToken = ""; this._tokenExpiresDate = null; this.getIncludedClasses = (arg) => { if (arg) { if (Array.isArray(arg)) { return arg; } if (typeof arg === "string") { return [arg]; } } return []; }; this._includedClasses = []; this._baseURL = constants_1.SERVER_URL; if (arg) { if (Array.isArray(arg) || typeof arg === "string") { this._includedClasses = this.getIncludedClasses(arg); } else if (typeof arg === "object") { if (arg.includes) { this._includedClasses = this.getIncludedClasses(arg.includes); } if (arg.serverUrl) { this._baseURL = arg.serverUrl; } } } this._axiosApiInstance = axios_1.default.create({ baseURL: this._baseURL, }); } login(username, password, clientId, headers) { return new Promise((resolve, reject) => { const uri = `/login`; this.doPost(uri, { username, password, clientId }, this.processLogin, headers) .then((response) => { this.setNewAccessData(response); resolve(this.connect()); }) .catch((error) => { reject(error); }); }); } connect(authToken) { if (authToken) { this._authToken = authToken; } this.setRequestInterceptors(); this.setResponseInterceptors(); if (this._includedClasses.length) { return this._includedClasses.reduce((acc, current) => { switch (current) { case constants_1.ACCOUNT_TYPE: return Object.assign(Object.assign({}, acc), { Accounts: new accounts_1.default(this) }); case constants_1.CATEGORY_TYPE: return Object.assign(Object.assign({}, acc), { Categories: new Categories_1.default(this) }); case constants_1.BUDGET_TYPE: return Object.assign(Object.assign({}, acc), { Budgets: new Budgets_1.default(this) }); case constants_1.TRANSACTION_TYPE: return Object.assign(Object.assign({}, acc), { Transactions: new Transactions_1.default(this) }); case constants_1.INSIGHTS_TYPE: return Object.assign(Object.assign({}, acc), { Insights: new Insights_1.default(this) }); case constants_1.FINANCIAL_ENTITY_TYPE: return Object.assign(Object.assign({}, acc), { FinancialEntities: new index_1.default(this) }); default: return acc; } }, {}); } return { Accounts: new accounts_1.default(this), Categories: new Categories_1.default(this), Transactions: new Transactions_1.default(this), Budgets: new Budgets_1.default(this), Insights: new Insights_1.default(this), FinancialEntities: new index_1.default(this), }; } refreshApiToken() { return new Promise((resolve, reject) => { const uri = `${this._baseURL}/oauth/access_token?refresh_token=${this._refreshToken}`; axios_1.default .post(uri, "", { headers: { Accept: "application/json", Authorization: `Bearer ${this._authToken}`, }, }) .then(({ data }) => { this.setNewAccessData(data); resolve(true); }) .catch((error) => { reject(new error_1.default(`${error.response.status}`, error.response.data.path, error.response.data.error)); }); }); } get authToken() { return this._authToken; } get refreshToken() { return this._refreshToken; } doGet(uri, success) { return new Promise((resolve, reject) => { this._axiosApiInstance .get(uri) .then((response) => resolve(success(response))) .catch((error) => this.processErrors(error, reject)); }); } doPost(uri, body, success, headers) { return new Promise((resolve, reject) => { this._axiosApiInstance .post(uri, body, headers && { headers }) .then((response) => { resolve(success(response)); }) .catch((error) => this.processErrors(error, reject)); }); } doPut(uri, body, success) { return new Promise((resolve, reject) => { this._axiosApiInstance .put(uri, body) .then((response) => resolve(success(response))) .catch((error) => this.processErrors(error, reject)); }); } doDelete(uri, success) { return new Promise((resolve, reject) => { this._axiosApiInstance .delete(uri) .then((response) => resolve(success(response))) .catch((error) => this.processErrors(error, reject)); }); } setNewAccessData(data) { const { access_token, refresh_token, expires_in } = data; const currentTimeAsMs = Date.now(); this._authToken = access_token; this._refreshToken = refresh_token; this._tokenExpiresDate = new Date(currentTimeAsMs + expires_in); } processLogin(response) { return new Login_1.default(response.data); } setRequestInterceptors() { this._axiosApiInstance.interceptors.request.use((config) => __awaiter(this, void 0, void 0, function* () { if (this._authToken) { if (this._tokenExpiresDate && Date.now() >= this._tokenExpiresDate.getTime()) { yield this.refreshApiToken(); } config.headers = Object.assign(Object.assign({}, config.headers), { Authorization: `Bearer ${this._authToken}` }); } return config; }), (error) => { Promise.reject(error); }); } setRequestHeaders(headers) { this._axiosApiInstance.interceptors.request.use((config) => __awaiter(this, void 0, void 0, function* () { config.headers = Object.assign(Object.assign({}, config.headers), headers); }), (error) => { Promise.reject(error); }); } setResponseInterceptors() { this._axiosApiInstance.interceptors.response.use((response) => { return response.data; }, (error) => __awaiter(this, void 0, void 0, function* () { const originalRequest = error.config; if (this.refreshToken && error.response.status === 401 && this._refreshToken && !originalRequest._retry) { originalRequest._retry = true; yield this.refreshApiToken(); return this._axiosApiInstance(originalRequest); } return Promise.reject(error); })); } processErrors(error, reject) { var _a; if (error.response && error.response.data && error.response.status !== 500) { reject(this.createErrorBadRequest((_a = error.response) === null || _a === void 0 ? void 0 : _a.data)); } else if (error.response && error.response.status) { reject(this.createErrorResObject(error)); } else { reject(this.createErrorObject(error)); } } createErrorBadRequest(errors) { const errorsList = []; if (errors.errors) errors.errors.forEach((error) => { errorsList.push(new error_1.default(error.code, error.title, error.detail)); }); else if (errors.error) errorsList.push(new error_1.default(`${errors.status}`, errors.error, `${errors.path}`)); return errorsList; } createErrorResObject(axiosError) { const { response: error } = axiosError; return new error_1.default(`${error.status}`, error.statusText, error.status === 404 ? "The item you requested was not found" : ""); } createErrorObject(error) { return new error_1.default(`${error.code}`, "", ""); } getUriParams(objectReq) { let params = ""; let index = 0; for (let [key, value] of Object.entries(objectReq)) { params += index === 0 ? "?" : "&"; if (Array.isArray(value)) params += `${key}=${value.join("&" + key + "=")}`; else params += `${key}=${value}`; index++; } return params; } } exports.default = FinerioConnectSDK;