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
JavaScript
"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;