1 | "use strict";
|
2 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3 | if (k2 === undefined) k2 = k;
|
4 | Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
5 | }) : (function(o, m, k, k2) {
|
6 | if (k2 === undefined) k2 = k;
|
7 | o[k2] = m[k];
|
8 | }));
|
9 | var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
10 | Object.defineProperty(o, "default", { enumerable: true, value: v });
|
11 | }) : function(o, v) {
|
12 | o["default"] = v;
|
13 | });
|
14 | var __importStar = (this && this.__importStar) || function (mod) {
|
15 | if (mod && mod.__esModule) return mod;
|
16 | var result = {};
|
17 | if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
18 | __setModuleDefault(result, mod);
|
19 | return result;
|
20 | };
|
21 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
22 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
23 | return new (P || (P = Promise))(function (resolve, reject) {
|
24 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
25 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
26 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
27 | step((generator = generator.apply(thisArg, _arguments || [])).next());
|
28 | });
|
29 | };
|
30 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
31 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
32 | };
|
33 | Object.defineProperty(exports, "__esModule", { value: true });
|
34 | const axios_1 = __importDefault(require("axios"));
|
35 | const common_1 = require("../common");
|
36 | const system_1 = __importStar(require("../system"));
|
37 | const Utils_1 = require("../system/Utils");
|
38 | const Consts_1 = require("./Consts");
|
39 | let lastAuthHeaders = -1;
|
40 | let cachedAuthHeaders = {};
|
41 | function getAuthHeaders(useCachedHeaders = true) {
|
42 | return __awaiter(this, void 0, void 0, function* () {
|
43 | if (process.env.NODE_ENV === 'test') {
|
44 | return {};
|
45 | }
|
46 | const timestamp = Date.now();
|
47 | if (useCachedHeaders) {
|
48 | if (timestamp - lastAuthHeaders < 300000) {
|
49 | return cachedAuthHeaders;
|
50 | }
|
51 | }
|
52 | lastAuthHeaders = timestamp;
|
53 | const auth = system_1.default.getLibModule(system_1.LibModule.AUTH);
|
54 | const organization = yield auth.getOrganization();
|
55 | cachedAuthHeaders = {
|
56 | [Consts_1.X_ORGANIZATION]: organization.module_id,
|
57 | [Consts_1.X_CLIENT_TZ]: Intl.DateTimeFormat().resolvedOptions().timeZone,
|
58 | 'Content-Type': 'application/json;charset=UTF-8',
|
59 | };
|
60 | return cachedAuthHeaders;
|
61 | });
|
62 | }
|
63 | function rejectedBecauseAuth(e) {
|
64 | return Boolean(e.response && e.response.status && (e.response.status === Consts_1.FORBIDDEN || e.response.status === Consts_1.UNAUTHORIZED));
|
65 | }
|
66 |
|
67 |
|
68 |
|
69 |
|
70 |
|
71 | function sanitizeUri(uri) {
|
72 | const length = uri.length;
|
73 | let i = 0;
|
74 | for (; i < length; i++) {
|
75 | if (uri.charAt(i) !== '/') {
|
76 | break;
|
77 | }
|
78 | }
|
79 | if (i === 0) {
|
80 | return uri;
|
81 | }
|
82 | return uri.substr(i);
|
83 | }
|
84 | function request(method, uri, data, headers, canRetryAuth = true, customBaseUrl) {
|
85 | return __awaiter(this, void 0, void 0, function* () {
|
86 | let authFailed = false;
|
87 | const requestSettings = {
|
88 | method,
|
89 | withCredentials: true,
|
90 | };
|
91 | if (data) {
|
92 | if (method === Consts_1.GET || method === Consts_1.DELETE) {
|
93 | requestSettings.params = data;
|
94 | }
|
95 | else {
|
96 | requestSettings.data = data;
|
97 | }
|
98 | }
|
99 | const authHeaders = yield getAuthHeaders(canRetryAuth);
|
100 | const impersonateHeaders = system_1.default.isProtected() ? system_1.default.getImpersonationHeaders() : {};
|
101 | requestSettings.headers = Object.assign(Object.assign(Object.assign(Object.assign({}, authHeaders), system_1.default.getHttpHeaders()), headers), impersonateHeaders);
|
102 | try {
|
103 | const baseUrl = customBaseUrl || system_1.default.nexus.getUrl();
|
104 | const url = `${baseUrl}/${sanitizeUri(uri)}`;
|
105 | const response = (yield axios_1.default(url, requestSettings));
|
106 | if (!response || !response.data) {
|
107 | return null;
|
108 | }
|
109 | return response.data;
|
110 | }
|
111 | catch (e) {
|
112 | if (rejectedBecauseAuth(e)) {
|
113 | try {
|
114 | yield request('get', `${system_1.default.nexus.getUrl()}/user`, undefined, undefined, false);
|
115 | }
|
116 | catch (e2) {
|
117 | authFailed = rejectedBecauseAuth(e2);
|
118 | }
|
119 | }
|
120 | }
|
121 | if (authFailed && canRetryAuth) {
|
122 |
|
123 | try {
|
124 |
|
125 | const user = yield system_1.default.nexus.reconnect();
|
126 | if (user) {
|
127 | return request(method, uri, data, headers, false);
|
128 | }
|
129 | }
|
130 | catch (_a) { }
|
131 | }
|
132 | return null;
|
133 | });
|
134 | }
|
135 | function get(uri, params, headers, customBaseUrl) {
|
136 | return request(Consts_1.GET, uri, params, headers, true, customBaseUrl);
|
137 | }
|
138 | function del(uri, params, headers, customBaseUrl) {
|
139 | return request(Consts_1.DELETE, uri, params, headers, true, customBaseUrl);
|
140 | }
|
141 | function post(uri, payload, headers, customBaseUrl) {
|
142 | return request(Consts_1.POST, uri, payload, headers, true, customBaseUrl);
|
143 | }
|
144 | function put(uri, payload, headers, customBaseUrl) {
|
145 | return request(Consts_1.PUT, uri, payload, headers, true, customBaseUrl);
|
146 | }
|
147 | function search(domain, module, filters, options) {
|
148 | return __awaiter(this, void 0, void 0, function* () {
|
149 | common_1.validateDomainAndModule(domain, module);
|
150 | const domainUri = common_1.domainToUri(domain);
|
151 | const moduleUri = common_1.moduleToUri(module);
|
152 | if (options === null || options === void 0 ? void 0 : options.withFormData) {
|
153 | const response = yield request(Consts_1.PUT, `${domainUri}/${moduleUri}/search/context`, Object.assign(Object.assign({}, options), { filters }), options === null || options === void 0 ? void 0 : options.headers);
|
154 | return response ? response.map(({ entity }) => entity) : [];
|
155 | }
|
156 | const response = yield request(Consts_1.PUT, `${domainUri}/${moduleUri}/search`, Object.assign(Object.assign({}, options), { filters }), options === null || options === void 0 ? void 0 : options.headers);
|
157 | return response ? response : [];
|
158 | });
|
159 | }
|
160 | const api = Object.freeze(Utils_1.makeCallable(request, { get, delete: del, post, put, search }));
|
161 | exports.default = system_1.default.sealModule(api);
|