@ofidj/node 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/QUICKSTART.md +224 -0
  3. package/README.md +72 -0
  4. package/api/FidjApiAppsCreateRequest.d.ts +20 -0
  5. package/api/FidjApiAppsCreateRequest.js +3 -0
  6. package/api/FidjApiAppsCreateResponse.d.ts +8 -0
  7. package/api/FidjApiAppsCreateResponse.js +3 -0
  8. package/api/FidjApiAppsDetailsResponse.d.ts +18 -0
  9. package/api/FidjApiAppsDetailsResponse.js +3 -0
  10. package/api/FidjApiAppsMeDetailsResponse.d.ts +6 -0
  11. package/api/FidjApiAppsMeDetailsResponse.js +3 -0
  12. package/api/FidjApiAppsOAuthStatusResponse.d.ts +5 -0
  13. package/api/FidjApiAppsOAuthStatusResponse.js +3 -0
  14. package/api/FidjApiAppsPublicResponse.d.ts +7 -0
  15. package/api/FidjApiAppsPublicResponse.js +3 -0
  16. package/api/FidjApiAppsUpdateRequest.d.ts +2 -0
  17. package/api/FidjApiAppsUpdateRequest.js +3 -0
  18. package/api/FidjApiAppsUsersResponse.d.ts +7 -0
  19. package/api/FidjApiAppsUsersResponse.js +3 -0
  20. package/api/FidjApiConsentsHistoryResponse.d.ts +10 -0
  21. package/api/FidjApiConsentsHistoryResponse.js +3 -0
  22. package/api/FidjApiConsentsResponse.d.ts +9 -0
  23. package/api/FidjApiConsentsResponse.js +3 -0
  24. package/api/FidjApiConsentsUpdateRequest.d.ts +8 -0
  25. package/api/FidjApiConsentsUpdateRequest.js +3 -0
  26. package/api/FidjApiContractsCreateRequest.d.ts +5 -0
  27. package/api/FidjApiContractsCreateRequest.js +3 -0
  28. package/api/FidjApiContractsListResponse.d.ts +10 -0
  29. package/api/FidjApiContractsListResponse.js +3 -0
  30. package/api/FidjApiContractsUpdateRequest.d.ts +3 -0
  31. package/api/FidjApiContractsUpdateRequest.js +3 -0
  32. package/api/FidjApiErrorResponse.d.ts +3 -0
  33. package/api/FidjApiErrorResponse.js +3 -0
  34. package/api/FidjApiOAuthTokenRequest.d.ts +8 -0
  35. package/api/FidjApiOAuthTokenRequest.js +3 -0
  36. package/api/FidjApiOAuthTokenResponse.d.ts +6 -0
  37. package/api/FidjApiOAuthTokenResponse.js +3 -0
  38. package/api/FidjApiStatusResponse.d.ts +8 -0
  39. package/api/FidjApiStatusResponse.js +3 -0
  40. package/api/FidjApiTokensCreateRequest.d.ts +8 -0
  41. package/api/FidjApiTokensCreateRequest.js +3 -0
  42. package/api/FidjApiTokensCreateResponse.d.ts +7 -0
  43. package/api/FidjApiTokensCreateResponse.js +3 -0
  44. package/api/FidjApiUsersCreateRequest.d.ts +7 -0
  45. package/api/FidjApiUsersCreateRequest.js +3 -0
  46. package/api/FidjApiUsersCreateResponse.d.ts +13 -0
  47. package/api/FidjApiUsersCreateResponse.js +3 -0
  48. package/api/FidjApiUsersForgotRequest.d.ts +3 -0
  49. package/api/FidjApiUsersForgotRequest.js +3 -0
  50. package/api/FidjApiUsersMeDetailsResponse.d.ts +13 -0
  51. package/api/FidjApiUsersMeDetailsResponse.js +3 -0
  52. package/api/FidjApiUsersMeResponse.d.ts +6 -0
  53. package/api/FidjApiUsersMeResponse.js +3 -0
  54. package/api/FidjApiUsersMeUpdateRequest.d.ts +4 -0
  55. package/api/FidjApiUsersMeUpdateRequest.js +3 -0
  56. package/api/index.d.ts +26 -0
  57. package/api/index.js +50 -0
  58. package/bpInfo.d.ts +3 -0
  59. package/bpInfo.js +5 -0
  60. package/connection/Ajax.d.ts +65 -0
  61. package/connection/Ajax.js +230 -0
  62. package/connection/Client.d.ts +38 -0
  63. package/connection/Client.js +278 -0
  64. package/connection/ClientToken.d.ts +6 -0
  65. package/connection/ClientToken.js +12 -0
  66. package/connection/ClientTokens.d.ts +8 -0
  67. package/connection/ClientTokens.js +13 -0
  68. package/connection/ClientUser.d.ts +6 -0
  69. package/connection/ClientUser.js +12 -0
  70. package/connection/Connection.d.ts +65 -0
  71. package/connection/Connection.js +613 -0
  72. package/connection/Interfaces.d.ts +3 -0
  73. package/connection/Interfaces.js +3 -0
  74. package/connection/OwnerUser.d.ts +9 -0
  75. package/connection/OwnerUser.js +60 -0
  76. package/connection/index.d.ts +8 -0
  77. package/connection/index.js +25 -0
  78. package/index.d.ts +5 -0
  79. package/index.js +23 -0
  80. package/package.json +71 -0
  81. package/sdk/FidjError.d.ts +8 -0
  82. package/sdk/FidjError.js +18 -0
  83. package/sdk/FidjNodeService.d.ts +77 -0
  84. package/sdk/FidjNodeService.js +682 -0
  85. package/sdk/IService.d.ts +38 -0
  86. package/sdk/IService.js +3 -0
  87. package/sdk/Interfaces.d.ts +67 -0
  88. package/sdk/Interfaces.js +11 -0
  89. package/sdk/LoggerService.d.ts +9 -0
  90. package/sdk/LoggerService.js +37 -0
  91. package/sdk/index.d.ts +6 -0
  92. package/sdk/index.js +25 -0
  93. package/session/Session.d.ts +28 -0
  94. package/session/Session.js +398 -0
  95. package/session/index.d.ts +1 -0
  96. package/session/index.js +18 -0
  97. package/tools/Base64.d.ts +7 -0
  98. package/tools/Base64.js +50 -0
  99. package/tools/Storage.d.ts +32 -0
  100. package/tools/Storage.js +132 -0
  101. package/tools/Xor.d.ts +7 -0
  102. package/tools/Xor.js +36 -0
  103. package/tools/index.d.ts +3 -0
  104. package/tools/index.js +20 -0
@@ -0,0 +1,682 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.FidjNodeService = void 0;
49
+ const tools = __importStar(require("../tools"));
50
+ const connection = __importStar(require("../connection"));
51
+ const connection_1 = require("../connection");
52
+ const session = __importStar(require("../session"));
53
+ const Interfaces_1 = require("./Interfaces");
54
+ const LoggerService_1 = require("./LoggerService");
55
+ const proper_url_join_1 = __importDefault(require("proper-url-join"));
56
+ const FidjError_1 = require("./FidjError");
57
+ const bpInfo_1 = require("../bpInfo");
58
+ // TODO const PouchDB = window['PouchDB'] || require('pouchdb').default;
59
+ class FidjNodeService {
60
+ constructor(logger, promise, options) {
61
+ this.sdk = {
62
+ org: 'fidj',
63
+ version: bpInfo_1.bpInfo.version.substring(1),
64
+ prod: false,
65
+ useDB: true,
66
+ };
67
+ if (promise) {
68
+ this.promise = promise;
69
+ }
70
+ else {
71
+ this.promise = Promise;
72
+ }
73
+ if (logger) {
74
+ this.logger = logger;
75
+ }
76
+ else {
77
+ this.logger = new LoggerService_1.LoggerService();
78
+ }
79
+ if (options && options.logLevel) {
80
+ this.logger.setLevel(options.logLevel);
81
+ }
82
+ this.logger.log('fidj.sdk.service : constructor');
83
+ this.storage = new tools.LocalStorage('fidj.');
84
+ this.session = new session.Session();
85
+ this.connection = new connection.Connection(this.sdk, this.storage, this.logger);
86
+ }
87
+ static IsJWTExpired(payload) {
88
+ if (!payload.exp) {
89
+ return true;
90
+ }
91
+ const now = new Date();
92
+ const expDate = new Date(payload.exp * 1000);
93
+ return expDate.getTime() < now.getTime();
94
+ }
95
+ static NameFromPayload(payload) {
96
+ return payload === null || payload === void 0 ? void 0 : payload.name;
97
+ }
98
+ static RolesFromPayload(payload) {
99
+ let roles = [];
100
+ try {
101
+ roles = [].concat(payload.roles);
102
+ }
103
+ catch (ignored) {
104
+ // If payload.roles is not an array or doesn't exist, keep roles as an empty array
105
+ }
106
+ return roles;
107
+ }
108
+ static AppIdFromPayload(payload) {
109
+ return payload === null || payload === void 0 ? void 0 : payload.aud;
110
+ }
111
+ init(fidjId, options) {
112
+ return __awaiter(this, void 0, void 0, function* () {
113
+ var _a, _b;
114
+ if (options === null || options === void 0 ? void 0 : options.logLevel) {
115
+ this.logger.setLevel(options.logLevel);
116
+ }
117
+ else {
118
+ this.logger.setLevel(Interfaces_1.LoggerLevelEnum.NONE);
119
+ }
120
+ this.logger.log('fidj.sdk.service.init : ', options);
121
+ // Zero-config: no fidjId and no options → sandbox auto-detect
122
+ const isZeroConfig = !fidjId && !options;
123
+ if (isZeroConfig) {
124
+ fidjId = FidjNodeService.SANDBOX_FIDJ_ID;
125
+ options = { prod: false };
126
+ this.logger.log('fidj.sdk.service.init : zero-config mode, using sandbox');
127
+ }
128
+ if (!fidjId) {
129
+ this.logger.error('fidj.sdk.service.init : bad init');
130
+ throw new FidjError_1.FidjError(400, 'Need a fidjId');
131
+ }
132
+ this.sdk.prod = !options ? true : ((_a = options.prod) !== null && _a !== void 0 ? _a : true);
133
+ this.sdk.useDB = !options ? false : ((_b = options.useDB) !== null && _b !== void 0 ? _b : false);
134
+ yield this.connection.init(this.sdk.version, fidjId, !options || !Object.prototype.hasOwnProperty.call(options, 'crypto')
135
+ ? false
136
+ : options.crypto, options === null || options === void 0 ? void 0 : options.apiEndpoint);
137
+ let bestUrls = [], bestOldUrls = [];
138
+ try {
139
+ yield this.connection.verifyConnectionStates();
140
+ bestUrls = yield this.connection.getApiEndpoints({ filter: 'theBestOne' });
141
+ bestOldUrls = yield this.connection.getApiEndpoints({ filter: 'theBestOldOne' });
142
+ }
143
+ catch (err) {
144
+ this.logger.error('fidj.sdk.service.init: ', err);
145
+ const cause = err instanceof Error ? err.message : err.toString();
146
+ throw new FidjError_1.FidjError(500, 'Could not verify API endpoints: ' + cause);
147
+ }
148
+ if (bestUrls.length === 0 && bestOldUrls.length === 0) {
149
+ const envHint = this.sdk.prod
150
+ ? 'https://api.fidj.ovh/v3'
151
+ : 'https://api.sandbox.fidj.ovh/v3';
152
+ throw new FidjError_1.FidjError(404, 'No reachable API endpoint. Tried: ' +
153
+ envHint +
154
+ '. Check your network, fidjId, and prod/sandbox setting.');
155
+ }
156
+ const theBestFirstUrl = bestUrls.length ? bestUrls[0] : bestOldUrls[0];
157
+ const isLogin = this.isLoggedIn();
158
+ this.logger.log('fidj.sdk.service.init > verifyConnectionStates : ', theBestFirstUrl, isLogin);
159
+ this.connection.setClient(new connection.Client(this.connection.fidjId, theBestFirstUrl.url, this.storage, this.sdk, this.logger));
160
+ });
161
+ }
162
+ login(login, password, options) {
163
+ return __awaiter(this, void 0, void 0, function* () {
164
+ this.logger.log('fidj.sdk.service.login');
165
+ if (!this.connection.isReady()) {
166
+ throw new FidjError_1.FidjError(404, 'Need an initialized FidjService');
167
+ }
168
+ try {
169
+ yield this._removeAll();
170
+ yield this._createSession(this.connection.fidjId);
171
+ const clientTokens = yield this._loginInternal(login, password, undefined, options);
172
+ yield this.connection.setConnection(clientTokens);
173
+ }
174
+ catch (err) {
175
+ if (err instanceof FidjError_1.FidjError)
176
+ throw err;
177
+ const code = typeof (err === null || err === void 0 ? void 0 : err.code) === 'number' ? err.code : 500;
178
+ throw new FidjError_1.FidjError(code, (err === null || err === void 0 ? void 0 : err.toString) ? err.toString() : String(err));
179
+ }
180
+ if (!this.sdk.useDB) {
181
+ return this.connection.getUser();
182
+ }
183
+ try {
184
+ yield this.session.sync(this.connection.getClientId());
185
+ }
186
+ catch (e) {
187
+ this.logger.warn('fidj.sdk.service.login: sync -not blocking- issue ', e.toString());
188
+ }
189
+ return this.connection.getUser();
190
+ });
191
+ }
192
+ loginInDemoMode(options) {
193
+ return __awaiter(this, void 0, void 0, function* () {
194
+ // generate one day tokens if not set
195
+ if (!options || !options.accessToken) {
196
+ const now = new Date();
197
+ now.setDate(now.getDate() + 1);
198
+ const tomorrow = now.getTime();
199
+ const payload = tools.Base64.encode(JSON.stringify({
200
+ roles: [],
201
+ message: 'demo',
202
+ apis: [],
203
+ endpoints: [],
204
+ dbs: [],
205
+ exp: tomorrow,
206
+ }));
207
+ const jwtSign = tools.Base64.encode(JSON.stringify({}));
208
+ const token = jwtSign + '.' + payload + '.' + jwtSign;
209
+ options = {
210
+ accessToken: token,
211
+ idToken: token,
212
+ refreshToken: token,
213
+ };
214
+ }
215
+ return new this.promise((resolve, reject) => {
216
+ this._removeAll()
217
+ .then(() => {
218
+ return this._createSession(this.connection.fidjId);
219
+ })
220
+ .then(() => __awaiter(this, void 0, void 0, function* () {
221
+ yield this.connection.setConnectionOffline(options);
222
+ resolve(this.connection.getUser());
223
+ }))
224
+ .catch((err) => {
225
+ this.logger.error('fidj.sdk.service.loginInDemoMode error: ', err);
226
+ reject(err);
227
+ });
228
+ });
229
+ });
230
+ }
231
+ // Convenience: init + login in one call
232
+ // Usage: await srv.initAndLogin('user@test.com', 'pwd') → zero-config sandbox
233
+ // Usage: await srv.initAndLogin('user@test.com', 'pwd', 'my-app') → prod
234
+ initAndLogin(login, password, fidjId, options, loginOptions) {
235
+ return __awaiter(this, void 0, void 0, function* () {
236
+ yield this.init(fidjId, options);
237
+ return this.login(login, password, loginOptions);
238
+ });
239
+ }
240
+ // Convenience: init + loginInDemoMode in one call
241
+ // Usage: await srv.initDemo() → sandbox with mock tokens, zero setup
242
+ initDemo(fidjId, options) {
243
+ return __awaiter(this, void 0, void 0, function* () {
244
+ yield this.init(fidjId, options);
245
+ return this.loginInDemoMode();
246
+ });
247
+ }
248
+ isLoggedIn() {
249
+ return this.connection.isLogin();
250
+ }
251
+ needsRefresh() {
252
+ return !this.connection.isReady();
253
+ }
254
+ isConnected() {
255
+ var _a;
256
+ return (_a = this.connection) === null || _a === void 0 ? void 0 : _a.isConnected();
257
+ }
258
+ getOwnerUser() {
259
+ const clientUser = this.connection.getUser();
260
+ if ((clientUser === null || clientUser === void 0 ? void 0 : clientUser.roles.indexOf('Owner')) > -1) {
261
+ return new connection_1.OwnerUser(this, this.connection, clientUser.id, clientUser.username, clientUser.roles);
262
+ }
263
+ return null;
264
+ }
265
+ fidjGetEndpoints(filter) {
266
+ return __awaiter(this, void 0, void 0, function* () {
267
+ if (!filter) {
268
+ filter = { showBlocked: false };
269
+ }
270
+ const ap = yield this.connection.getAccessPayload({ endpoints: [] });
271
+ let endpoints = JSON.parse(ap).endpoints;
272
+ if (!endpoints || !Array.isArray(endpoints)) {
273
+ return [];
274
+ }
275
+ endpoints = endpoints.filter((endpoint) => {
276
+ let ok = true;
277
+ if (ok && filter.key) {
278
+ ok = endpoint.key === filter.key;
279
+ }
280
+ if (ok && !filter.showBlocked) {
281
+ ok = !endpoint.blocked;
282
+ }
283
+ return ok;
284
+ });
285
+ return endpoints;
286
+ });
287
+ }
288
+ fidjRoles() {
289
+ return __awaiter(this, void 0, void 0, function* () {
290
+ return JSON.parse(yield this.connection.getIdPayload({ roles: [] })).roles;
291
+ });
292
+ }
293
+ fidjMessage() {
294
+ return __awaiter(this, void 0, void 0, function* () {
295
+ return JSON.parse(yield this.connection.getIdPayload({ message: '' })).message;
296
+ });
297
+ }
298
+ logout(force) {
299
+ return __awaiter(this, void 0, void 0, function* () {
300
+ if (!this.connection.getClient() && !force) {
301
+ return this._removeAll().then(() => {
302
+ return this.session.create(this.connection.fidjId, true);
303
+ });
304
+ }
305
+ return this.connection
306
+ .logout()
307
+ .then(() => {
308
+ return this._removeAll();
309
+ })
310
+ .catch(() => {
311
+ return this._removeAll();
312
+ })
313
+ .then(() => {
314
+ return this.session.create(this.connection.fidjId, true);
315
+ });
316
+ });
317
+ }
318
+ sync() {
319
+ return __awaiter(this, arguments, void 0, function* (options = { forceRefresh: false }) {
320
+ this.logger.log('fidj.sdk.service.sync');
321
+ this.logger.log('fidj.sdk.service.sync: you ar not using DB - no sync available.');
322
+ try {
323
+ const clientTokens = yield this.connection.refreshConnection(options.forceRefresh);
324
+ if (clientTokens) {
325
+ yield this.connection.setConnection(clientTokens);
326
+ }
327
+ this.logger.log('fidj.sdk.service.sync refreshConnection done. ');
328
+ }
329
+ catch (err) {
330
+ this.logger.warn('fidj.sdk.service.sync refreshConnection failed : ', err);
331
+ if ((err === null || err === void 0 ? void 0 : err.code) === 403 || (err === null || err === void 0 ? void 0 : err.code) === 410) {
332
+ yield this.logout(true);
333
+ }
334
+ throw new FidjError_1.FidjError(403, 'not connected');
335
+ }
336
+ // if (!self.session.isReady()) {
337
+ // return self.promise.reject('fidj.sdk.service.sync : DB sync impossible. Did you login ?');
338
+ // }
339
+ if (!this.sdk.useDB) {
340
+ return;
341
+ }
342
+ const firstSync = this.session.dbLastSync === null;
343
+ try {
344
+ yield this._createSession(this.connection.fidjId);
345
+ yield this.session.sync(this.connection.getClientId());
346
+ this.logger.log('fidj.sdk.service.sync resolved');
347
+ }
348
+ catch (err) {
349
+ this.logger.warn('fidj.sdk.service.sync warn: ', err);
350
+ }
351
+ const isEmpty = yield this.session.isEmpty();
352
+ this.logger.log('fidj.sdk.service.sync isEmpty : ', isEmpty, firstSync);
353
+ if (isEmpty && firstSync && options.fnInitFirstData) {
354
+ try {
355
+ const ret = yield options.fnInitFirstData(options.fnInitFirstData_Arg);
356
+ this.logger.log('fidj.sdk.service.sync fnInitFirstData resolved: ', ret);
357
+ }
358
+ catch (e) {
359
+ this.logger.warn('fidj.sdk.service.sync fnInitFirstData error: ', e);
360
+ }
361
+ }
362
+ this.session.dbLastSync = new Date().getTime();
363
+ const result = yield this.session.info();
364
+ this.session.dbRecordCount = 0;
365
+ if (result && result.doc_count) {
366
+ this.session.dbRecordCount = result.doc_count;
367
+ }
368
+ this.logger.log('fidj.sdk.service.sync _dbRecordCount : ' + this.session.dbRecordCount);
369
+ });
370
+ }
371
+ fidjPutInDb(data) {
372
+ return __awaiter(this, void 0, void 0, function* () {
373
+ this.logger.log('fidj.sdk.service.fidjPutInDb: ', data);
374
+ if (!this.sdk.useDB) {
375
+ this.logger.log('fidj.sdk.service.fidjPutInDb: you are not using DB - no put available.');
376
+ return Promise.resolve('NA');
377
+ }
378
+ if (!this.connection.getClientId()) {
379
+ return this.promise.reject(new FidjError_1.FidjError(401, 'DB put impossible. Need a user logged in.'));
380
+ }
381
+ if (!this.session.isReady()) {
382
+ return this.promise.reject(new FidjError_1.FidjError(400, 'Need to be synchronised.'));
383
+ }
384
+ let _id;
385
+ if (data && typeof data === 'object' && Object.keys(data).indexOf('_id')) {
386
+ _id = data._id;
387
+ }
388
+ if (!_id) {
389
+ _id = this._generateObjectUniqueId(this.connection.fidjId);
390
+ }
391
+ let crypto;
392
+ if (this.connection.fidjCrypto) {
393
+ crypto = {
394
+ obj: this.connection,
395
+ method: 'encrypt',
396
+ };
397
+ }
398
+ return this.session.put(data, _id, this.connection.getClientId(), this.sdk.org, this.connection.fidjVersion, crypto);
399
+ });
400
+ }
401
+ fidjRemoveInDb(data_id) {
402
+ return __awaiter(this, void 0, void 0, function* () {
403
+ this.logger.log('fidj.sdk.service.fidjRemoveInDb ', data_id);
404
+ if (!this.sdk.useDB) {
405
+ this.logger.log('fidj.sdk.service.fidjRemoveInDb: you are not using DB - no remove available.');
406
+ return Promise.resolve();
407
+ }
408
+ if (!this.session.isReady()) {
409
+ return this.promise.reject(new FidjError_1.FidjError(400, 'Need to be synchronised.'));
410
+ }
411
+ if (!data_id || typeof data_id !== 'string') {
412
+ return this.promise.reject(new FidjError_1.FidjError(400, 'DB remove impossible. ' + 'Need the data._id.'));
413
+ }
414
+ return this.session.remove(data_id);
415
+ });
416
+ }
417
+ fidjFindInDb(data_id) {
418
+ return __awaiter(this, void 0, void 0, function* () {
419
+ if (!this.sdk.useDB) {
420
+ this.logger.log('fidj.sdk.service.fidjFindInDb: you are not using DB - no find available.');
421
+ return Promise.resolve();
422
+ }
423
+ if (!this.connection.getClientId()) {
424
+ return this.promise.reject(new FidjError_1.FidjError(401, 'Find pb : need a user logged in.'));
425
+ }
426
+ if (!this.session.isReady()) {
427
+ return this.promise.reject(new FidjError_1.FidjError(400, ' Need to be synchronised.'));
428
+ }
429
+ let crypto;
430
+ if (this.connection.fidjCrypto) {
431
+ crypto = {
432
+ obj: this.connection,
433
+ method: 'decrypt',
434
+ };
435
+ }
436
+ return this.session.get(data_id, crypto);
437
+ });
438
+ }
439
+ fidjFindAllInDb() {
440
+ return __awaiter(this, void 0, void 0, function* () {
441
+ if (!this.sdk.useDB) {
442
+ this.logger.log('fidj.sdk.service.fidjFindAllInDb: you are not using DB - no find available.');
443
+ return Promise.resolve([]);
444
+ }
445
+ if (!this.connection.getClientId()) {
446
+ return this.promise.reject(new FidjError_1.FidjError(401, 'Need a user logged in.'));
447
+ }
448
+ if (!this.session.isReady()) {
449
+ return this.promise.reject(new FidjError_1.FidjError(400, 'Need to be synchronised.'));
450
+ }
451
+ let crypto;
452
+ if (this.connection.fidjCrypto) {
453
+ crypto = {
454
+ obj: this.connection,
455
+ method: 'decrypt',
456
+ };
457
+ }
458
+ return this.session.getAll(crypto).then((results) => {
459
+ this.connection.setCryptoSaltAsVerified();
460
+ return this.promise.resolve(results);
461
+ });
462
+ });
463
+ }
464
+ sendOnEndpoint(input) {
465
+ return __awaiter(this, void 0, void 0, function* () {
466
+ yield this.sync();
467
+ const filter = input.key ? { key: input.key } : null;
468
+ const endpoints = yield this.fidjGetEndpoints(filter);
469
+ if (!input.defaultKeyUrl && (!endpoints || endpoints.length !== 1)) {
470
+ throw new FidjError_1.FidjError(400, 'fidj.sdk.service.sendOnEndpoint : endpoint does not exist.');
471
+ }
472
+ let firstEndpointUrl = !endpoints || endpoints.length !== 1 ? input.defaultKeyUrl : endpoints[0].url;
473
+ if (input.relativePath) {
474
+ firstEndpointUrl = (0, proper_url_join_1.default)(firstEndpointUrl, input.relativePath);
475
+ }
476
+ const jwt = yield this.connection.getIdToken();
477
+ let answer;
478
+ const query = new connection_1.Ajax();
479
+ switch (input.verb) {
480
+ case 'POST':
481
+ answer = yield query.post({
482
+ url: firstEndpointUrl,
483
+ // not used : withCredentials: true,
484
+ headers: {
485
+ 'Content-Type': 'application/json',
486
+ Accept: 'application/json',
487
+ Authorization: 'Bearer ' + jwt,
488
+ },
489
+ data: input.data ? input.data : {},
490
+ timeout: input.timeout,
491
+ });
492
+ break;
493
+ case 'PUT':
494
+ answer = yield query.put({
495
+ url: firstEndpointUrl,
496
+ // not used : withCredentials: true,
497
+ headers: {
498
+ 'Content-Type': 'application/json',
499
+ Accept: 'application/json',
500
+ Authorization: 'Bearer ' + jwt,
501
+ },
502
+ data: input.data ? input.data : {},
503
+ timeout: input.timeout,
504
+ });
505
+ break;
506
+ case 'DELETE':
507
+ answer = yield query.delete({
508
+ url: firstEndpointUrl,
509
+ // not used : withCredentials: true,
510
+ headers: {
511
+ 'Content-Type': 'application/json',
512
+ Accept: 'application/json',
513
+ Authorization: 'Bearer ' + jwt,
514
+ },
515
+ timeout: input.timeout,
516
+ // not used: data: data
517
+ });
518
+ break;
519
+ default:
520
+ answer = yield query.get({
521
+ url: firstEndpointUrl,
522
+ // not used : withCredentials: true,
523
+ headers: {
524
+ 'Content-Type': 'application/json',
525
+ Accept: 'application/json',
526
+ Authorization: 'Bearer ' + jwt,
527
+ },
528
+ timeout: input.timeout,
529
+ // not used: data: data
530
+ });
531
+ }
532
+ return answer;
533
+ });
534
+ }
535
+ // Typed API convenience methods (using @ofidj/contracts)
536
+ getMe() {
537
+ return __awaiter(this, void 0, void 0, function* () {
538
+ return this.sendOnEndpoint({
539
+ verb: 'GET',
540
+ key: 'me',
541
+ });
542
+ });
543
+ }
544
+ getMeDetails() {
545
+ return __awaiter(this, void 0, void 0, function* () {
546
+ return this.sendOnEndpoint({
547
+ verb: 'GET',
548
+ key: 'me',
549
+ relativePath: 'details',
550
+ });
551
+ });
552
+ }
553
+ updateMe(data) {
554
+ return __awaiter(this, void 0, void 0, function* () {
555
+ return this.sendOnEndpoint({
556
+ verb: 'PUT',
557
+ key: 'me',
558
+ data,
559
+ });
560
+ });
561
+ }
562
+ getConsents() {
563
+ return __awaiter(this, void 0, void 0, function* () {
564
+ return this.sendOnEndpoint({
565
+ verb: 'GET',
566
+ key: 'me',
567
+ relativePath: 'consents',
568
+ });
569
+ });
570
+ }
571
+ putConsents(data) {
572
+ return __awaiter(this, void 0, void 0, function* () {
573
+ return this.sendOnEndpoint({
574
+ verb: 'PUT',
575
+ key: 'me',
576
+ relativePath: 'consents',
577
+ data,
578
+ });
579
+ });
580
+ }
581
+ getConsentsHistory() {
582
+ return __awaiter(this, void 0, void 0, function* () {
583
+ return this.sendOnEndpoint({
584
+ verb: 'GET',
585
+ key: 'me',
586
+ relativePath: 'consents/history',
587
+ });
588
+ });
589
+ }
590
+ fidjForgotPasswordRequest(email) {
591
+ return __awaiter(this, void 0, void 0, function* () {
592
+ const bestUrls = yield this.connection.getApiEndpoints({ filter: 'theBestOne' });
593
+ if (!bestUrls || bestUrls.length !== 1) {
594
+ throw new FidjError_1.FidjError(400, 'fidj.sdk.service.fidjForgotPasswordRequest : api endpoint does not exist.');
595
+ }
596
+ const query = new connection_1.Ajax();
597
+ yield query.post({
598
+ url: bestUrls[0].url + '/me/forgot',
599
+ // not used : withCredentials: true,
600
+ headers: {
601
+ 'Content-Type': 'application/json',
602
+ Accept: 'application/json',
603
+ },
604
+ data: { email },
605
+ timeout: FidjNodeService.DEFAULT_TIMEOUT_MS,
606
+ });
607
+ });
608
+ }
609
+ fidjGetIdToken() {
610
+ return __awaiter(this, void 0, void 0, function* () {
611
+ return this.connection.getIdToken();
612
+ });
613
+ }
614
+ _removeAll() {
615
+ return __awaiter(this, void 0, void 0, function* () {
616
+ yield this.connection.destroy();
617
+ yield this.session.destroy();
618
+ });
619
+ }
620
+ _loginInternal(login, password, updateProperties, options) {
621
+ return __awaiter(this, void 0, void 0, function* () {
622
+ this.logger.log('fidj.sdk.service._loginInternal');
623
+ if (!this.connection.isReady()) {
624
+ throw new FidjError_1.FidjError(403, 'Need an initialized FidjService');
625
+ }
626
+ yield this.connection.logout();
627
+ return yield this.connection.getClient().login(login, password, updateProperties, options);
628
+ });
629
+ }
630
+ _createSession(uid) {
631
+ return __awaiter(this, void 0, void 0, function* () {
632
+ const dbs = yield this.connection.getDBs({ filter: 'theBestOnes' });
633
+ if (!dbs || dbs.length === 0) {
634
+ this.logger.warn('Seems that you are in Demo mode or using Node (no remote DB).');
635
+ }
636
+ this.session.setRemote(dbs);
637
+ return this.session.create(uid);
638
+ });
639
+ }
640
+ _testPromise(a) {
641
+ return __awaiter(this, void 0, void 0, function* () {
642
+ if (a) {
643
+ return this.promise.resolve('test promise ok ' + a);
644
+ }
645
+ return new this.promise((resolve, reject) => {
646
+ resolve('test promise ok');
647
+ });
648
+ });
649
+ }
650
+ _generateObjectUniqueId(appName, type, name) {
651
+ // return null;
652
+ const now = new Date();
653
+ const simpleDate = '' +
654
+ now.getFullYear() +
655
+ '' +
656
+ now.getMonth() +
657
+ '' +
658
+ now.getDate() +
659
+ '' +
660
+ now.getHours() +
661
+ '' +
662
+ now.getMinutes(); // new Date().toISOString();
663
+ const sequId = ++FidjNodeService._srvDataUniqId;
664
+ let UId = '';
665
+ if (appName && appName.charAt(0)) {
666
+ UId += appName.charAt(0) + '';
667
+ }
668
+ if (type && type.length > 3) {
669
+ UId += type.substring(0, 4);
670
+ }
671
+ if (name && name.length > 3) {
672
+ UId += name.substring(0, 4);
673
+ }
674
+ UId += simpleDate + '' + sequId;
675
+ return UId;
676
+ }
677
+ }
678
+ exports.FidjNodeService = FidjNodeService;
679
+ FidjNodeService.DEFAULT_TIMEOUT_MS = 60000;
680
+ FidjNodeService.SANDBOX_FIDJ_ID = 'fidj-sandbox-0123fe7ed0000001';
681
+ FidjNodeService._srvDataUniqId = 0;
682
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlkak5vZGVTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nkay9GaWRqTm9kZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQWtDO0FBQ2xDLDBEQUE0QztBQUM1Qyw4Q0FBNEQ7QUFDNUQsb0RBQXNDO0FBRXRDLDZDQVdzQjtBQUN0QixtREFBOEM7QUFDOUMsc0VBQXNDO0FBQ3RDLDJDQUFzQztBQUV0QyxzQ0FBaUM7QUFVakMsd0VBQXdFO0FBRXhFLE1BQWEsZUFBZTtJQVl4QixZQUNJLE1BQXdCLEVBQ3hCLE9BQTRCLEVBQzVCLE9BQTJDO1FBRTNDLElBQUksQ0FBQyxHQUFHLEdBQUc7WUFDUCxHQUFHLEVBQUUsTUFBTTtZQUNYLE9BQU8sRUFBRSxlQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxFQUFFLEtBQUs7WUFDWCxLQUFLLEVBQUUsSUFBSTtTQUNkLENBQUM7UUFDRixJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1YsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDM0IsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUMzQixDQUFDO1FBQ0QsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLDZCQUFhLEVBQUUsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQs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