@communecter/cocolight-api-client 1.0.32 → 1.0.33
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.
- package/dist/cocolight-api-client.browser.js +1 -1
- package/dist/cocolight-api-client.cjs +1 -1
- package/dist/cocolight-api-client.mjs.js +1 -1
- package/dist/cocolight-api-client.vite.mjs.js +1 -1
- package/dist/cocolight-api-client.vite.mjs.js.map +1 -1
- package/package.json +1 -1
- package/src/Api.js +11 -0
- package/src/api/BaseEntity.js +103 -231
- package/src/api/EntityRegistry.js +66 -0
- package/src/api/Organization.js +0 -22
- package/src/api/Project.js +0 -23
- package/src/api/User.js +16 -47
- package/src/index.js +4 -0
package/package.json
CHANGED
package/src/Api.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Api.js
|
|
2
2
|
import { Badge } from "./api/Badge.js";
|
|
3
3
|
import EndpointApi from "./api/EndpointApi.js";
|
|
4
|
+
import { registerEntity } from "./api/EntityRegistry.js";
|
|
4
5
|
import { Event } from "./api/Event.js";
|
|
5
6
|
import { News } from "./api/News.js";
|
|
6
7
|
import { Organization } from "./api/Organization.js";
|
|
@@ -10,6 +11,16 @@ import { User } from "./api/User.js";
|
|
|
10
11
|
import { UserApi } from "./api/UserApi.js";
|
|
11
12
|
import { ApiAuthenticationError, ApiClientError, ApiError } from "./error.js";
|
|
12
13
|
|
|
14
|
+
registerEntity("User", User);
|
|
15
|
+
registerEntity("Organization", Organization);
|
|
16
|
+
registerEntity("Project", Project);
|
|
17
|
+
registerEntity("Event", Event);
|
|
18
|
+
registerEntity("Poi", Poi);
|
|
19
|
+
registerEntity("Badge", Badge);
|
|
20
|
+
registerEntity("EndpointApi", EndpointApi);
|
|
21
|
+
registerEntity("UserApi", UserApi);
|
|
22
|
+
registerEntity("News", News);
|
|
23
|
+
|
|
13
24
|
export default class Api {
|
|
14
25
|
/**
|
|
15
26
|
* Authentifie l'utilisateur et retourne une instance d'Api.
|
package/src/api/BaseEntity.js
CHANGED
|
@@ -266,6 +266,109 @@ export class BaseEntity {
|
|
|
266
266
|
*/
|
|
267
267
|
transforms = {};
|
|
268
268
|
|
|
269
|
+
/**
|
|
270
|
+
* ───────────────────────────────
|
|
271
|
+
* JSON
|
|
272
|
+
* ───────────────────────────────
|
|
273
|
+
*/
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Convertit l'instance en JSON pour l'envoi au serveur.
|
|
277
|
+
*
|
|
278
|
+
* @returns {Object} Représentation JSON de l'instance.
|
|
279
|
+
*/
|
|
280
|
+
toJSON() {
|
|
281
|
+
const parentMeta = {};
|
|
282
|
+
if (this.parent?.id) parentMeta.id = this.parent.id;
|
|
283
|
+
if (typeof this.parent?.getEntityType === "function") parentMeta.type = this.parent.getEntityType();
|
|
284
|
+
if (this.parent?.__entityTag) parentMeta.__entityTag = this.parent.__entityTag;
|
|
285
|
+
|
|
286
|
+
return {
|
|
287
|
+
__entityTag: this.__entityTag,
|
|
288
|
+
_serverData: this._serialize(this._serverData),
|
|
289
|
+
parent: Object.keys(parentMeta).length > 0 ? parentMeta : null
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
_serialize(obj, seen = new WeakSet()) {
|
|
294
|
+
if (obj === null || typeof obj !== "object") return obj;
|
|
295
|
+
|
|
296
|
+
// Évite les boucles circulaires
|
|
297
|
+
if (seen.has(obj)) return null;
|
|
298
|
+
seen.add(obj);
|
|
299
|
+
|
|
300
|
+
// Si c'est une Date (normale ou Proxy)
|
|
301
|
+
if (obj instanceof Date || Object.prototype.toString.call(obj) === "[object Date]") {
|
|
302
|
+
return obj.toISOString();
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Si c'est un Proxy réactif de ton système maison
|
|
306
|
+
if (obj.__isReactive && typeof obj.__raw === "object") {
|
|
307
|
+
return this._serialize(obj.__raw, seen);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Tableaux
|
|
311
|
+
if (Array.isArray(obj)) {
|
|
312
|
+
return obj.map((item) => this._serialize(item, seen));
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// Objets simples
|
|
316
|
+
const result = {};
|
|
317
|
+
for (const key of Object.keys(obj)) {
|
|
318
|
+
const value = obj[key];
|
|
319
|
+
|
|
320
|
+
// Ignore les fonctions, symboles, ou undefined
|
|
321
|
+
if (typeof value === "function" || typeof value === "symbol" || typeof value === "undefined") {
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
try {
|
|
326
|
+
result[key] = this._serialize(value, seen);
|
|
327
|
+
// eslint-disable-next-line no-unused-vars
|
|
328
|
+
} catch (e) {
|
|
329
|
+
result[key] = null;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return result;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
static _revive(obj) {
|
|
337
|
+
if (obj === null || typeof obj !== "object") return obj;
|
|
338
|
+
|
|
339
|
+
// Détecter et restaurer les ISO string en Date
|
|
340
|
+
if (typeof obj === "string" && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/.test(obj)) {
|
|
341
|
+
return new Date(obj);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
if (Array.isArray(obj)) {
|
|
345
|
+
return obj.map((item) => this._revive(item));
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
const result = {};
|
|
349
|
+
for (const key of Object.keys(obj)) {
|
|
350
|
+
result[key] = this._revive(obj[key]);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
return result;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* Crée une instance d'entité à partir de données JSON.
|
|
358
|
+
*
|
|
359
|
+
* @param {Object} json - Données JSON à utiliser.
|
|
360
|
+
* @param {Object} parent - Instance parente.
|
|
361
|
+
* @param {Object} deps - Dépendances injectées.
|
|
362
|
+
* @returns {object} Nouvelle instance d'entité.
|
|
363
|
+
*/
|
|
364
|
+
static fromJSON(json, parent, deps) {
|
|
365
|
+
|
|
366
|
+
const { _serverData } = json;
|
|
367
|
+
|
|
368
|
+
const instance = this.fromServerData(this._revive(_serverData), parent, deps);
|
|
369
|
+
|
|
370
|
+
return instance;
|
|
371
|
+
}
|
|
269
372
|
|
|
270
373
|
/**
|
|
271
374
|
* ───────────────────────────────
|
|
@@ -1685,30 +1788,6 @@ export class BaseEntity {
|
|
|
1685
1788
|
async getOrganizations(data = {}) {
|
|
1686
1789
|
data.searchType = this._getDefaultFromEndpoint("GET_ORGANIZATIONS_NO_ADMIN", "searchType");
|
|
1687
1790
|
// data.searchBy = "ALL";
|
|
1688
|
-
// return this._paginateWith(data, isNext, async (finalData) => {
|
|
1689
|
-
// if(this.isMe){
|
|
1690
|
-
// finalData.pathParams = { type: this.getEntityType(), id: this.id };
|
|
1691
|
-
// // NOTE : dans le schema je crois que si pas de finalData.filters alors le default ce fait avec finalData.pathParams
|
|
1692
|
-
// // finalData.filters = {
|
|
1693
|
-
// // [`links.members.${this.id}`]: { "$exists": true },
|
|
1694
|
-
// // [`links.members.${this.id}.toBeValidated`]: { "$exists": false },
|
|
1695
|
-
// // [`links.members.${this.id}.isInviting`]: { "$exists": false }
|
|
1696
|
-
// // };
|
|
1697
|
-
// } else {
|
|
1698
|
-
// delete finalData?.pathParams;
|
|
1699
|
-
// finalData.filters = {
|
|
1700
|
-
// [`links.members.${this.id}`]: { "$exists": true },
|
|
1701
|
-
// [`links.members.${this.id}.toBeValidated`]: { "$exists": false },
|
|
1702
|
-
// [`links.members.${this.id}.isInviting`]: { "$exists": false }
|
|
1703
|
-
// };
|
|
1704
|
-
// }
|
|
1705
|
-
|
|
1706
|
-
// const fetchFn = this.isMe
|
|
1707
|
-
// ? () => this.callIsMe(() => this.endpointApi.getOrganizationsAdmin(finalData))
|
|
1708
|
-
// : () => this.endpointApi.getOrganizationsNoAdmin(finalData);
|
|
1709
|
-
|
|
1710
|
-
// return fetchFn();
|
|
1711
|
-
// });
|
|
1712
1791
|
|
|
1713
1792
|
const paginator = this._createPaginatorEngine({
|
|
1714
1793
|
initialData: data,
|
|
@@ -1751,34 +1830,7 @@ export class BaseEntity {
|
|
|
1751
1830
|
async getProjects(data = {}) {
|
|
1752
1831
|
data.searchType = this._getDefaultFromEndpoint("GET_PROJECTS_ADMIN", "searchType");
|
|
1753
1832
|
// data.searchBy = "ALL";
|
|
1754
|
-
// return this._paginateWith(data, isNext, async (finalData) => {
|
|
1755
|
-
// if(this.isMe){
|
|
1756
|
-
// finalData.pathParams = { type: this.getEntityType(), id: this.id };
|
|
1757
|
-
// // NOTE : dans le schema je crois que si pas de finalData.filters alors le default ce fait avec finalData.pathParams
|
|
1758
|
-
// // finalData.filters = {
|
|
1759
|
-
// // "$or": {
|
|
1760
|
-
// // [`links.contributors.${this.id}`]: { "$exists": true },
|
|
1761
|
-
// // [`parent.${this.id}`]: { "$exists": true }
|
|
1762
|
-
// // },
|
|
1763
|
-
// // [`links.contributors.${this.id}`]: { "$exists": true }
|
|
1764
|
-
// // };
|
|
1765
|
-
// } else {
|
|
1766
|
-
// delete finalData?.pathParams;
|
|
1767
|
-
// finalData.filters = {
|
|
1768
|
-
// "$or": {
|
|
1769
|
-
// [`links.contributors.${this.id}`]: { "$exists": true },
|
|
1770
|
-
// [`parent.${this.id}`]: { "$exists": true }
|
|
1771
|
-
// },
|
|
1772
|
-
// [`links.contributors.${this.id}`]: { "$exists": true }
|
|
1773
|
-
// };
|
|
1774
|
-
// }
|
|
1775
|
-
|
|
1776
|
-
// const fetchFn = this.isMe
|
|
1777
|
-
// ? () => this.callIsMe(() => this.endpointApi.getProjectsAdmin(finalData))
|
|
1778
|
-
// : () => this.endpointApi.getProjectsNoAdmin(finalData);
|
|
1779
1833
|
|
|
1780
|
-
// return fetchFn();
|
|
1781
|
-
// });
|
|
1782
1834
|
const paginator = this._createPaginatorEngine({
|
|
1783
1835
|
initialData: data,
|
|
1784
1836
|
finalizer: async (finalData) => {
|
|
@@ -1824,26 +1876,6 @@ export class BaseEntity {
|
|
|
1824
1876
|
async getPois(data = {}) {
|
|
1825
1877
|
data.searchType = this._getDefaultFromEndpoint("GET_POIS_ADMIN", "searchType");
|
|
1826
1878
|
// data.searchBy = "ALL";
|
|
1827
|
-
// return this._paginateWith(data, isNext, async (finalData) => {
|
|
1828
|
-
// if(this.isMe){
|
|
1829
|
-
// finalData.pathParams = { type: this.getEntityType(), id: this.id };
|
|
1830
|
-
// // NOTE : dans le schema je crois que si pas de finalData.filters alors le default ce fait avec finalData.pathParams
|
|
1831
|
-
// // finalData.filters = {
|
|
1832
|
-
// // [`parent.${this.id}`]: { "$exists": true },
|
|
1833
|
-
// // };
|
|
1834
|
-
// } else {
|
|
1835
|
-
// delete finalData?.pathParams;
|
|
1836
|
-
// finalData.filters = {
|
|
1837
|
-
// [`parent.${this.id}`]: { "$exists": true },
|
|
1838
|
-
// };
|
|
1839
|
-
// }
|
|
1840
|
-
|
|
1841
|
-
// const fetchFn = this.isMe
|
|
1842
|
-
// ? () => this.callIsMe(() => this.endpointApi.getPoisAdmin(finalData))
|
|
1843
|
-
// : () => this.endpointApi.getPoisNoAdmin(finalData);
|
|
1844
|
-
|
|
1845
|
-
// return fetchFn();
|
|
1846
|
-
// });
|
|
1847
1879
|
|
|
1848
1880
|
const paginator = this._createPaginatorEngine({
|
|
1849
1881
|
initialData: data,
|
|
@@ -1882,17 +1914,7 @@ export class BaseEntity {
|
|
|
1882
1914
|
async getSubscribers(data = {}) {
|
|
1883
1915
|
data.searchType = this._getDefaultFromEndpoint("GET_SUBSCRIBERS", "searchType");
|
|
1884
1916
|
// data.searchBy = "ALL";
|
|
1885
|
-
// return this._paginateWith(data, isNext, async (finalData) => {
|
|
1886
|
-
// delete finalData?.pathParams;
|
|
1887
|
-
|
|
1888
|
-
// finalData.filters = {
|
|
1889
|
-
// [`links.follows.${this.id}`]: { "$exists": true },
|
|
1890
|
-
// [`links.follows.${this.id}.toBeValidated`]: { "$exists": false },
|
|
1891
|
-
// [`links.follows.${this.id}.isInviting`]: { "$exists": false }
|
|
1892
|
-
// };
|
|
1893
1917
|
|
|
1894
|
-
// return this.endpointApi.getSubscribers(finalData);
|
|
1895
|
-
// });
|
|
1896
1918
|
const paginator = this._createPaginatorEngine({
|
|
1897
1919
|
initialData: data,
|
|
1898
1920
|
finalizer: async (finalData) => {
|
|
@@ -1921,15 +1943,7 @@ export class BaseEntity {
|
|
|
1921
1943
|
async getBadgesIssuer(data = {}) {
|
|
1922
1944
|
data.searchType = this._getDefaultFromEndpoint("GET_BADGES", "searchType");
|
|
1923
1945
|
// data.searchBy = "ALL";
|
|
1924
|
-
// return this._paginateWith(data, isNext, async (finalData) => {
|
|
1925
|
-
// delete finalData?.pathParams;
|
|
1926
|
-
|
|
1927
|
-
// finalData.filters = finalData.filters || {};
|
|
1928
|
-
// finalData.filters["$or"] = {};
|
|
1929
|
-
// finalData.filters["$or"][`issuer.${this.id}`] = { "$exists": true };
|
|
1930
1946
|
|
|
1931
|
-
// return this.endpointApi.getBadges(finalData);
|
|
1932
|
-
// });
|
|
1933
1947
|
const paginator = this._createPaginatorEngine({
|
|
1934
1948
|
initialData: data,
|
|
1935
1949
|
finalizer: async (finalData) => {
|
|
@@ -2306,122 +2320,6 @@ export class BaseEntity {
|
|
|
2306
2320
|
|
|
2307
2321
|
return count;
|
|
2308
2322
|
}
|
|
2309
|
-
|
|
2310
|
-
/**
|
|
2311
|
-
* Méthode générique de pagination contextuelle avec support next / prev.
|
|
2312
|
-
*
|
|
2313
|
-
* @param {Object} data - Données d'entrée
|
|
2314
|
-
* @param {boolean} isNext - true si appel de page suivante
|
|
2315
|
-
* @param {Function} finalizer - fonction qui transforme et envoie les données (exécute la requête)
|
|
2316
|
-
* @returns {Promise<Object>} { count, results, next, prev }
|
|
2317
|
-
* @throws {ApiError} - Si le slug ou l'id de l'entité n'est pas défini.
|
|
2318
|
-
* @throws {ApiResponseError} - Si les résultats ne sont pas un tableau.
|
|
2319
|
-
* @private
|
|
2320
|
-
*/
|
|
2321
|
-
// async _paginateWith(data = {}, isNext = false, finalizer) {
|
|
2322
|
-
// if (!this.serverData.slug) throw new ApiError("slug de l'entité non défini");
|
|
2323
|
-
// if (!this.serverData.id) throw new ApiError("id de l'entité non défini");
|
|
2324
|
-
|
|
2325
|
-
// const hasStep = (d) => d?.indexStep && d.indexStep > 0;
|
|
2326
|
-
|
|
2327
|
-
// if (!this._paginationCursor || (!isNext && this._paginationHistory.length === 0)) {
|
|
2328
|
-
// this._paginationCount = 0;
|
|
2329
|
-
// this._paginationPageIndex = 0;
|
|
2330
|
-
// this._paginationHistory = [];
|
|
2331
|
-
// this._paginationPageSizes = [];
|
|
2332
|
-
// data.countType = data.searchType;
|
|
2333
|
-
|
|
2334
|
-
// if (!data?.searchBy && hasStep(data)) {
|
|
2335
|
-
// data.ranges = this._generateRanges(data.searchType, data.indexStep);
|
|
2336
|
-
// data.indexMin = data.indexMin ?? 0;
|
|
2337
|
-
// data.indexMax = data.indexMax ?? data.indexStep;
|
|
2338
|
-
// } else if (data?.searchBy === "ALL" && hasStep(data)) {
|
|
2339
|
-
// data.indexMin = data.indexMin ?? 0;
|
|
2340
|
-
// data.indexMax = data.indexMax ?? data.indexStep;
|
|
2341
|
-
// }
|
|
2342
|
-
|
|
2343
|
-
// this._paginationCursor = { ...data };
|
|
2344
|
-
// }
|
|
2345
|
-
|
|
2346
|
-
// const cursor = this._paginationCursor;
|
|
2347
|
-
|
|
2348
|
-
// if (isNext) {
|
|
2349
|
-
// this._paginationHistory.push({ ...cursor });
|
|
2350
|
-
|
|
2351
|
-
// if (!cursor.searchBy && hasStep(cursor)) {
|
|
2352
|
-
// cursor.ranges = this._generateRanges(cursor.searchType, cursor.indexStep, cursor.ranges);
|
|
2353
|
-
// cursor.indexMin = cursor.indexMax ?? 0;
|
|
2354
|
-
// cursor.indexMax = (cursor.indexMax ?? 0) + cursor.indexStep;
|
|
2355
|
-
// } else if (cursor.searchBy === "ALL" && hasStep(cursor)) {
|
|
2356
|
-
// cursor.indexMin = cursor.indexMax ?? 0;
|
|
2357
|
-
// cursor.indexMax = (cursor.indexMax ?? 0) + cursor.indexStep;
|
|
2358
|
-
// }
|
|
2359
|
-
|
|
2360
|
-
// this._paginationCursor = { ...cursor };
|
|
2361
|
-
// }
|
|
2362
|
-
|
|
2363
|
-
// data = { ...this._paginationCursor };
|
|
2364
|
-
|
|
2365
|
-
// if (!isNext && (!data?.searchType || !Array.isArray(data.searchType) || data.searchType.length === 0)) {
|
|
2366
|
-
// throw new ApiError("searchType non défini");
|
|
2367
|
-
// }
|
|
2368
|
-
|
|
2369
|
-
// const result = await finalizer(data);
|
|
2370
|
-
// if (!Array.isArray(result.results)) {
|
|
2371
|
-
// throw new ApiResponseError("Erreur lors de la récupération des résultats", 500, result.results);
|
|
2372
|
-
// }
|
|
2373
|
-
|
|
2374
|
-
// this._paginationCount += result.results.length;
|
|
2375
|
-
// this._paginationPageSizes.push(result.results.length);
|
|
2376
|
-
|
|
2377
|
-
// if (isNext) {
|
|
2378
|
-
// this._paginationPageIndex++;
|
|
2379
|
-
// }
|
|
2380
|
-
|
|
2381
|
-
// const count = this._normalizeCount(result.count);
|
|
2382
|
-
// const rawList = this._linkEntities(result.results);
|
|
2383
|
-
// const hasNext = hasStep(data) && this._paginationCount < count.total;
|
|
2384
|
-
// const hasPrev = this._paginationHistory?.length > 0;
|
|
2385
|
-
|
|
2386
|
-
// const response = {
|
|
2387
|
-
// count,
|
|
2388
|
-
// results: rawList,
|
|
2389
|
-
// pageIndex: this._paginationPageIndex,
|
|
2390
|
-
// pageNumber: this._paginationPageIndex + 1,
|
|
2391
|
-
// hasNext,
|
|
2392
|
-
// hasPrev
|
|
2393
|
-
// };
|
|
2394
|
-
|
|
2395
|
-
// if (hasNext) {
|
|
2396
|
-
// response.next = async () => this._paginateWith({}, true, finalizer);
|
|
2397
|
-
// }
|
|
2398
|
-
|
|
2399
|
-
// if (this._paginationHistory?.length > 0) {
|
|
2400
|
-
// response.prev = async () => {
|
|
2401
|
-
// const previous = this._paginationHistory.pop();
|
|
2402
|
-
// const lastPageSize = this._paginationPageSizes.pop() ?? 0;
|
|
2403
|
-
// this._paginationCount -= lastPageSize;
|
|
2404
|
-
// this._paginationPageIndex = Math.max(0, this._paginationPageIndex - 1);
|
|
2405
|
-
// this._paginationCursor = { ...previous };
|
|
2406
|
-
// return this._paginateWith({}, false, finalizer);
|
|
2407
|
-
// };
|
|
2408
|
-
// }
|
|
2409
|
-
|
|
2410
|
-
// return response;
|
|
2411
|
-
// }
|
|
2412
|
-
|
|
2413
|
-
|
|
2414
|
-
/**
|
|
2415
|
-
* Réinitialise l'état de pagination.
|
|
2416
|
-
*/
|
|
2417
|
-
// resetPagination() {
|
|
2418
|
-
// this._paginationCursor = undefined;
|
|
2419
|
-
// this._paginationCount = 0;
|
|
2420
|
-
// this._paginationPageIndex = 0;
|
|
2421
|
-
// this._paginationHistory = [];
|
|
2422
|
-
// this._paginationPageSizes = [];
|
|
2423
|
-
// }
|
|
2424
|
-
|
|
2425
2323
|
|
|
2426
2324
|
/**
|
|
2427
2325
|
* Récupère une valeur par défaut depuis un endpoint donné.
|
|
@@ -2436,32 +2334,6 @@ export class BaseEntity {
|
|
|
2436
2334
|
return endpoint.request.properties[path].default;
|
|
2437
2335
|
}
|
|
2438
2336
|
|
|
2439
|
-
/**
|
|
2440
|
-
* recherche lié à l'entité.
|
|
2441
|
-
*
|
|
2442
|
-
* @param {Object} data - Les données de recherche.
|
|
2443
|
-
* @param {boolean} isNext - Indique si c'est une recherche suivante (pagination).
|
|
2444
|
-
* @returns {Promise<Object>} - Résultat de la recherche.
|
|
2445
|
-
* @throws {ApiError} - Si le slug ou l'id de entité n'est pas défini.
|
|
2446
|
-
*/
|
|
2447
|
-
// async searchCostum(data = {}, isNext = false) {
|
|
2448
|
-
// return this._paginateWith(data, isNext, async (finalData) => {
|
|
2449
|
-
// finalData = {
|
|
2450
|
-
// ...finalData,
|
|
2451
|
-
// costumSlug: this.serverData.slug,
|
|
2452
|
-
// contextId: this.serverData.id,
|
|
2453
|
-
// contextType: this.getEntityType()
|
|
2454
|
-
// };
|
|
2455
|
-
|
|
2456
|
-
// if (finalData.sourceKey?.length) {
|
|
2457
|
-
// finalData.sourceKey = [...finalData.sourceKey, this.serverData.slug];
|
|
2458
|
-
// } else {
|
|
2459
|
-
// finalData.sourceKey = [this.serverData.slug];
|
|
2460
|
-
// }
|
|
2461
|
-
|
|
2462
|
-
// return this.endpointApi.globalAutocompleteCostum(finalData);
|
|
2463
|
-
// });
|
|
2464
|
-
// }
|
|
2465
2337
|
|
|
2466
2338
|
/**
|
|
2467
2339
|
* Recherche liée à l'entité, version stateless.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export const EntityRegistry = new Map();
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Enregistre une entité dans la registry.
|
|
5
|
+
* @param {string} tag - ex: "User", "Organization"
|
|
6
|
+
* @param {Function} EntityClass - la classe constructeur
|
|
7
|
+
*/
|
|
8
|
+
export function registerEntity(tag, EntityClass) {
|
|
9
|
+
EntityRegistry.set(tag, EntityClass);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Récupère une instance depuis un JSON générique.
|
|
14
|
+
* @param {Object} json - doit contenir __entityTag
|
|
15
|
+
* @param {Object} parent - ApiClient ou entité parent
|
|
16
|
+
* @param {Object} deps - dépendances (comme dans le constructeur)
|
|
17
|
+
* @returns {BaseEntity|null}
|
|
18
|
+
*/
|
|
19
|
+
export function fromEntityJSON(json, parent = null) {
|
|
20
|
+
if (!json?.__entityTag) return null;
|
|
21
|
+
if (!json._serverData?.collection) return json;
|
|
22
|
+
const meta = _getEntityMeta(json._serverData.collection, json.__entityTag);
|
|
23
|
+
if (!meta) return json;
|
|
24
|
+
if (!meta?.entityClass?.fromJSON) throw new Error(`Classe inconnue ou fromJSON manquant pour ${json.__entityTag}`);
|
|
25
|
+
return meta.entityClass.fromJSON(json, parent, meta.deps);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Récupère la classe d'entité et ses dépendances à partir du type d'entité.
|
|
30
|
+
*
|
|
31
|
+
* @param {string} entityType - Le type d'entité.
|
|
32
|
+
* @param {string} __entityTag - Le tag de l'entité.
|
|
33
|
+
* @returns {Object|null} - Un objet contenant la classe d'entité et ses dépendances, ou null si le type d'entité n'est pas trouvé.
|
|
34
|
+
*/
|
|
35
|
+
function _getEntityMeta(entityType, __entityTag) {
|
|
36
|
+
const selfClass = EntityRegistry.get(__entityTag);
|
|
37
|
+
const selfTag = __entityTag;
|
|
38
|
+
|
|
39
|
+
const commonDeps = {
|
|
40
|
+
EndpointApi: EntityRegistry.get("EndpointApi"),
|
|
41
|
+
User: selfTag === "User" ? selfClass : EntityRegistry.get("User"),
|
|
42
|
+
Organization: selfTag === "Organization" ? selfClass : EntityRegistry.get("Organization"),
|
|
43
|
+
Project: selfTag === "Project" ? selfClass : EntityRegistry.get("Project"),
|
|
44
|
+
Event: selfTag === "Event" ? selfClass : EntityRegistry.get("Event"),
|
|
45
|
+
Poi: selfTag === "Poi" ? selfClass : EntityRegistry.get("Poi"),
|
|
46
|
+
Badge: selfTag === "Badge" ? selfClass : EntityRegistry.get("Badge"),
|
|
47
|
+
News: selfTag === "News" ? selfClass : EntityRegistry.get("News")
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const map = {
|
|
51
|
+
citoyens: { entityClass: commonDeps.User, deps: commonDeps },
|
|
52
|
+
organizations:{ entityClass: commonDeps.Organization, deps: commonDeps },
|
|
53
|
+
projects: { entityClass: commonDeps.Project, deps: commonDeps },
|
|
54
|
+
events: { entityClass: commonDeps.Event, deps: { ...commonDeps, Badge: undefined } },
|
|
55
|
+
poi: { entityClass: commonDeps.Poi, deps: { ...commonDeps, Badge: undefined, News: undefined } },
|
|
56
|
+
news: { entityClass: commonDeps.News, deps: { ...commonDeps } },
|
|
57
|
+
badges: { entityClass: commonDeps.Badge, deps: {
|
|
58
|
+
EndpointApi: commonDeps.EndpointApi,
|
|
59
|
+
User: commonDeps.User,
|
|
60
|
+
Organization: commonDeps.Organization,
|
|
61
|
+
Project: commonDeps.Project
|
|
62
|
+
} }
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
return map[entityType] || null;
|
|
66
|
+
}
|
package/src/api/Organization.js
CHANGED
|
@@ -183,29 +183,7 @@ export class Organization extends BaseEntity {
|
|
|
183
183
|
async getMembers(data = {}, options = {}) {
|
|
184
184
|
data.searchType = this._getDefaultFromEndpoint("GET_MEMBERS_ADMIN", "searchType");
|
|
185
185
|
// data.searchBy = "ALL";
|
|
186
|
-
// return this._paginateWith(data, isNext, async (finalData) => {
|
|
187
|
-
|
|
188
|
-
// const { toBeValidated, isAdmin, isAdminPending, isInviting, roles = [] } = options;
|
|
189
|
-
|
|
190
|
-
// if(this.isMe){
|
|
191
|
-
// finalData.pathParams = { type: this.getEntityType(), id: this.id };
|
|
192
|
-
// // finalData.filters = {
|
|
193
|
-
// // [`links.memberOf.${this.id}`]: { "$exists": true },
|
|
194
|
-
// // [`links.memberOf.${this.id}.toBeValidated`]: { "$exists": false },
|
|
195
|
-
// // [`links.memberOf.${this.id}.isInviting`]: { "$exists": false }
|
|
196
|
-
// // };
|
|
197
|
-
// finalData.filters = this._buildLinkFilters(this.id, { linkType: "memberOf", toBeValidated, isAdmin, isAdminPending, isInviting, roles });
|
|
198
|
-
// } else {
|
|
199
|
-
// delete finalData?.pathParams;
|
|
200
|
-
// finalData.filters = this._buildLinkFilters(this.id, { linkType: "memberOf", toBeValidated: false, isAdmin, isInviting, roles });
|
|
201
|
-
// }
|
|
202
|
-
|
|
203
|
-
// const fetchFn = this.isMe
|
|
204
|
-
// ? () => this.callIsMe(() => this.endpointApi.getMembersAdmin(finalData))
|
|
205
|
-
// : () => this.endpointApi.getMembersNoAdmin(finalData);
|
|
206
186
|
|
|
207
|
-
// return fetchFn();
|
|
208
|
-
// });
|
|
209
187
|
const paginator = this._createPaginatorEngine({
|
|
210
188
|
initialData: data,
|
|
211
189
|
finalizer: async (finalData) => {
|
package/src/api/Project.js
CHANGED
|
@@ -193,30 +193,7 @@ export class Project extends BaseEntity {
|
|
|
193
193
|
async getContributors(data = {}, options = {}) {
|
|
194
194
|
data.searchType = this._getDefaultFromEndpoint("GET_CONTRIBUTORS_ADMIN", "searchType");
|
|
195
195
|
// data.searchBy = "ALL";
|
|
196
|
-
// return this._paginateWith(data, isNext, async (finalData) => {
|
|
197
|
-
|
|
198
|
-
// const { toBeValidated, isAdmin, isInviting, isAdminPending, roles = [] } = options;
|
|
199
|
-
|
|
200
|
-
// if(this.isMe){
|
|
201
|
-
// finalData.pathParams = { type: this.getEntityType(), id: this.id };
|
|
202
|
-
// // NOTE : dans le schema je crois que si pas de finalData.filters alors le default ce fait avec finalData.pathParams
|
|
203
|
-
// // finalData.filters = {
|
|
204
|
-
// // [`links.projects.${this.id}`]: { "$exists": true },
|
|
205
|
-
// // [`links.projects.${this.id}.toBeValidated`]: { "$exists": false },
|
|
206
|
-
// // [`links.projects.${this.id}.isInviting`]: { "$exists": false }
|
|
207
|
-
// // };
|
|
208
|
-
// finalData.filters = this._buildLinkFilters(this.id, { linkType: "projects", toBeValidated, isAdmin, isAdminPending, isInviting, roles });
|
|
209
|
-
// } else {
|
|
210
|
-
// delete finalData?.pathParams;
|
|
211
|
-
// finalData.filters = this._buildLinkFilters(this.id, { linkType: "projects", toBeValidated: false, isAdmin, isInviting, roles });
|
|
212
|
-
// }
|
|
213
|
-
|
|
214
|
-
// const fetchFn = this.isMe
|
|
215
|
-
// ? () => this.callIsMe(() => this.endpointApi.getContributorsAdmin(finalData))
|
|
216
|
-
// : () => this.endpointApi.getContributorsNoAdmin(finalData);
|
|
217
196
|
|
|
218
|
-
// return fetchFn();
|
|
219
|
-
// });
|
|
220
197
|
const paginator = this._createPaginatorEngine({
|
|
221
198
|
initialData: data,
|
|
222
199
|
finalizer: async (finalData) => {
|
package/src/api/User.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ApiError
|
|
1
|
+
import { ApiError } from "../error.js";
|
|
2
2
|
import BaseEntity from "./BaseEntity.js";
|
|
3
3
|
import { UserMixin } from "../mixin/UserMixin.js";
|
|
4
4
|
|
|
@@ -287,23 +287,7 @@ export class User extends BaseEntity {
|
|
|
287
287
|
async getOrganizations(data = {}) {
|
|
288
288
|
data.searchType = this._getDefaultFromEndpoint("GET_ORGANIZATIONS_NO_ADMIN", "searchType");
|
|
289
289
|
// data.searchBy = "ALL";
|
|
290
|
-
// return this._paginateWith(data, isNext, async (finalData) => {
|
|
291
|
-
// delete finalData?.pathParams;
|
|
292
290
|
|
|
293
|
-
// const fetchFn = this.isMe
|
|
294
|
-
// ? () => this.callIsMe(() => this.endpointApi.getOrganizationsAdmin(finalData))
|
|
295
|
-
// : () => this.endpointApi.getOrganizationsNoAdmin(finalData);
|
|
296
|
-
|
|
297
|
-
// if (!this.isMe && !finalData.filters) {
|
|
298
|
-
// finalData.filters = {
|
|
299
|
-
// [`links.members.${this.id}`]: { "$exists": true },
|
|
300
|
-
// [`links.members.${this.id}.toBeValidated`]: { "$exists": false },
|
|
301
|
-
// [`links.members.${this.id}.isInviting`]: { "$exists": false }
|
|
302
|
-
// };
|
|
303
|
-
// }
|
|
304
|
-
|
|
305
|
-
// return fetchFn();
|
|
306
|
-
// });
|
|
307
291
|
const paginator = this._createPaginatorEngine({
|
|
308
292
|
initialData: data,
|
|
309
293
|
finalizer: async (finalData) => {
|
|
@@ -359,25 +343,25 @@ export class User extends BaseEntity {
|
|
|
359
343
|
* actuellement, c'est tous les utilisateurs connectés
|
|
360
344
|
*/
|
|
361
345
|
async getFriends(data = {}) {
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
if (!this.isMe){
|
|
365
|
-
// is not me add id
|
|
366
|
-
data.pathParams = { id: this.id };
|
|
367
|
-
}
|
|
346
|
+
data.searchType = this._getDefaultFromEndpoint("GET_FRIENDS_ADMIN", "searchType");
|
|
347
|
+
// data.searchBy = "ALL";
|
|
368
348
|
|
|
369
|
-
const
|
|
370
|
-
|
|
371
|
-
|
|
349
|
+
const paginator = this._createPaginatorEngine({
|
|
350
|
+
initialData: data,
|
|
351
|
+
finalizer: async (finalData) => {
|
|
372
352
|
|
|
373
|
-
|
|
353
|
+
delete finalData?.pathParams;
|
|
354
|
+
|
|
355
|
+
if (!this.isMe){
|
|
356
|
+
// is not me add id
|
|
357
|
+
finalData.pathParams = { id: this.id };
|
|
358
|
+
}
|
|
374
359
|
|
|
375
|
-
|
|
360
|
+
return this.endpointApi.getFriendsAdmin(finalData);;
|
|
361
|
+
}
|
|
362
|
+
});
|
|
376
363
|
|
|
377
|
-
return
|
|
378
|
-
count: arrayObjet?.count?.citoyens ?? 0,
|
|
379
|
-
results: rawList
|
|
380
|
-
};
|
|
364
|
+
return paginator.next();
|
|
381
365
|
}
|
|
382
366
|
|
|
383
367
|
/**
|
|
@@ -387,22 +371,7 @@ export class User extends BaseEntity {
|
|
|
387
371
|
async getSubscriptions(data = {}) {
|
|
388
372
|
data.searchType = this._getDefaultFromEndpoint("GET_SUBSCRIPTIONS", "searchType");
|
|
389
373
|
// data.searchBy = "ALL";
|
|
390
|
-
// return this._paginateWith(data, isNext, async (finalData) => {
|
|
391
374
|
|
|
392
|
-
// delete finalData?.pathParams;
|
|
393
|
-
|
|
394
|
-
// const fetchFn = this.isMe
|
|
395
|
-
// ? () => this.callIsMe(() => this.endpointApi.getSubscriptionsAdmin(finalData))
|
|
396
|
-
// : () => this.endpointApi.getSubscriptions(finalData);
|
|
397
|
-
|
|
398
|
-
// if (!this.isMe && !finalData.filters) {
|
|
399
|
-
// finalData.filters = {
|
|
400
|
-
// [`links.followers.${this.id}`]: { "$exists": true },
|
|
401
|
-
// };
|
|
402
|
-
// }
|
|
403
|
-
|
|
404
|
-
// return fetchFn();
|
|
405
|
-
// });
|
|
406
375
|
const paginator = this._createPaginatorEngine({
|
|
407
376
|
initialData: data,
|
|
408
377
|
finalizer: async (finalData) => {
|
package/src/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { fromEntityJSON } from "./api/EntityRegistry.js";
|
|
1
2
|
import Api from "./Api.js";
|
|
2
3
|
import ApiClient from "./ApiClient.js";
|
|
3
4
|
import * as error from "./error.js";
|
|
@@ -25,6 +26,9 @@ export default {
|
|
|
25
26
|
createDefaultMultiServerTokenStorageStrategy,
|
|
26
27
|
MultiServerTokenStorageStrategy
|
|
27
28
|
},
|
|
29
|
+
helper: {
|
|
30
|
+
fromEntityJSON
|
|
31
|
+
},
|
|
28
32
|
|
|
29
33
|
OfflineClientManager
|
|
30
34
|
};
|