@communecter/cocolight-api-client 1.0.50 → 1.0.51
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/EndpointApi.types.d.ts +3 -3
- package/src/endpoints.module.js +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cocolight-api-client.vite.mjs.js","sources":["../src/api/EntityRegistry.js","../src/error.js","../src/utils/reactive.js","../src/api/BaseEntity.js","../src/api/Badge.js","../src/api/EndpointApi.js","../src/api/Event.js","../src/api/News.js","../src/api/Organization.js","../src/api/Poi.js","../src/api/Project.js","../src/api/User.js","../src/mixin/UserMixin.js","../src/EJSONType.js","../src/endpoints.module.js","../src/utils/TokenStorage.js","../src/utils/MultiServerTokenStorageStrategy.js","../src/ApiClient.js","../src/api/UserApi.js","../src/Api.js","../src/utils/OfflineQueueStorageStrategy.js","../src/utils/OfflineClientManager.js","../src/utils/createDefaultOfflineStrategy.js","../src/index.js","../src/utils/createDefaultTokenStorageStrategy.js","../src/utils/createDefaultMultiServerTokenStorageStrategy.js","../src/utils/stream-utils.node.js","../src/utils/MultiServerFileStorageStrategy.node.js","../src/utils/FileStorageStrategy.node.js","../src/utils/FileOfflineStorageStrategy.node.js"],"sourcesContent":["export const EntityRegistry = new Map();\n\n/**\n * Enregistre une entité dans la registry.\n * @param {string} tag - ex: \"User\", \"Organization\"\n * @param {Function} EntityClass - la classe constructeur\n */\nexport function registerEntity(tag, EntityClass) {\n EntityRegistry.set(tag, EntityClass);\n}\n\n/**\n * Récupère une instance depuis un JSON générique.\n * @param {Object} json - doit contenir __entityTag\n * @param {Object} parent - ApiClient ou entité parent\n * @param {Object} deps - dépendances (comme dans le constructeur)\n * @returns {BaseEntity|null}\n */\nexport function fromEntityJSON(json, parent = null) {\n if (!json?.__entityTag) return null;\n if (!json.serverData?.collection) return json;\n const meta = _getEntityMeta(json.serverData.collection, json.__entityTag);\n if (!meta) return json;\n if (!meta?.entityClass?.fromJSON) throw new Error(`Classe inconnue ou fromJSON manquant pour ${json.__entityTag}`);\n return meta.entityClass.fromJSON(json, parent, meta.deps);\n}\n\n/**\n * Récupère la classe d'entité et ses dépendances à partir du type d'entité.\n * \n * @param {string} entityType - Le type d'entité.\n * @param {string} __entityTag - Le tag de l'entité.\n * @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é.\n */\nfunction _getEntityMeta(entityType, __entityTag) {\n const selfClass = EntityRegistry.get(__entityTag);\n const selfTag = __entityTag;\n \n const commonDeps = {\n EndpointApi: EntityRegistry.get(\"EndpointApi\"),\n User: selfTag === \"User\" ? selfClass : EntityRegistry.get(\"User\"),\n Organization: selfTag === \"Organization\" ? selfClass : EntityRegistry.get(\"Organization\"),\n Project: selfTag === \"Project\" ? selfClass : EntityRegistry.get(\"Project\"),\n Event: selfTag === \"Event\" ? selfClass : EntityRegistry.get(\"Event\"),\n Poi: selfTag === \"Poi\" ? selfClass : EntityRegistry.get(\"Poi\"),\n Badge: selfTag === \"Badge\" ? selfClass : EntityRegistry.get(\"Badge\"),\n News: selfTag === \"News\" ? selfClass : EntityRegistry.get(\"News\")\n };\n \n const map = {\n citoyens: { entityClass: commonDeps.User, deps: commonDeps },\n organizations:{ entityClass: commonDeps.Organization, deps: commonDeps },\n projects: { entityClass: commonDeps.Project, deps: commonDeps },\n events: { entityClass: commonDeps.Event, deps: { ...commonDeps, Badge: undefined } },\n poi: { entityClass: commonDeps.Poi, deps: { ...commonDeps, Badge: undefined, News: undefined } },\n news: { entityClass: commonDeps.News, deps: { ...commonDeps } },\n badges: { entityClass: commonDeps.Badge, deps: { \n EndpointApi: commonDeps.EndpointApi, \n User: commonDeps.User, \n Organization: commonDeps.Organization, \n Project: commonDeps.Project \n } }\n };\n \n return map[entityType] || null;\n}\n\n/**\n * Crée une instance d'entité basée sur le seul nom de la collection.\n * @param {string} collection - ex: \"citoyens\", \"projects\", ...\n * @param {Object} parent - ApiClient ou entité parente\n * @returns {BaseEntity|null}\n */\nexport function createFromCollection(collection, parent = null, data = {}) {\n const _collectionMap = {\n citoyens: {\n entityTag: \"User\",\n meta: tag => _buildMeta(tag, { remove: [] })\n },\n organizations: {\n entityTag: \"Organization\",\n meta: tag => _buildMeta(tag, { remove: [] })\n },\n projects: {\n entityTag: \"Project\",\n meta: tag => _buildMeta(tag, { remove: [] })\n },\n events: {\n entityTag: \"Event\",\n meta: tag => _buildMeta(tag, { remove: [\"Badge\"] })\n },\n poi: {\n entityTag: \"Poi\",\n meta: tag => _buildMeta(tag, { remove: [\"Badge\",\"News\"] })\n },\n news: {\n entityTag: \"News\",\n meta: tag => _buildMeta(tag, { remove: [] })\n },\n badges: {\n entityTag: \"Badge\",\n meta: tag => _buildCustomMeta(tag)\n }\n };\n const entry = _collectionMap[collection];\n if (!entry) {\n console.warn(`Collection inconnue : '${collection}'`);\n return null;\n }\n const { entityTag, meta } = entry;\n const { entityClass, deps } = meta(entityTag);\n return new entityClass(parent, data, deps);\n}\n\n/**\n * Construit entityClass et deps pour une collection standard.\n * @param {string} tag\n * @param {{remove: string[]}} options\n */\nfunction _buildMeta(tag, options) {\n const EntityClass = EntityRegistry.get(tag);\n const allDeps = {\n EndpointApi: EntityRegistry.get(\"EndpointApi\"),\n User: EntityRegistry.get(\"User\"),\n Organization: EntityRegistry.get(\"Organization\"),\n Project: EntityRegistry.get(\"Project\"),\n Event: EntityRegistry.get(\"Event\"),\n Poi: EntityRegistry.get(\"Poi\"),\n Badge: EntityRegistry.get(\"Badge\"),\n News: EntityRegistry.get(\"News\")\n };\n // inject self\n allDeps[tag] = EntityClass;\n // remove undesired\n options.remove.forEach(dep => delete allDeps[dep]);\n return { entityClass: EntityClass, deps: allDeps };\n}\n\n/**\n * Cas spécifique des badges : seules certaines dépendances.\n */\nfunction _buildCustomMeta(tag) {\n const EntityClass = EntityRegistry.get(tag);\n const deps = {\n EndpointApi: EntityRegistry.get(\"EndpointApi\"),\n User: EntityRegistry.get(\"User\"),\n Organization: EntityRegistry.get(\"Organization\"),\n Project: EntityRegistry.get(\"Project\")\n };\n deps[tag] = EntityClass;\n return { entityClass: EntityClass, deps };\n}\n","\n/**\n * Classe de base pour toutes les erreurs de l'API.\n */\nexport class ApiError extends Error {\n constructor(message, status, details) {\n super(message);\n this.name = \"ApiError\";\n this.status = status;\n this.details = details;\n }\n}\n\n/**\n * Erreur levée par le client API lorsqu'un appel échoue.\n */\nexport class ApiClientError extends ApiError {\n constructor(message, status, details) {\n super(message, status, details);\n this.name = \"ApiClientError\";\n }\n}\n\nexport class ApiValidationError extends Error {\n constructor(message, status, messages, details = null) {\n super(message);\n this.name = \"ApiValidationError\";\n this.status = status;\n this.messages = messages;\n this.details = details;\n }\n}\n\n\n/**\n * CircuitBreakerError : levée lorsqu'on bloque l'accès à l'API (trop d'erreurs).\n */\nexport class CircuitBreakerError extends ApiError {\n constructor(message) {\n super(message, 503);\n this.name = \"CircuitBreakerError\";\n }\n}\n \nexport class ApiResponseError extends Error {\n /**\n * Crée une instance d'ApiResponseError.\n *\n * @param {string} message - Message d'erreur.\n * @param {number} status - Le code HTTP (souvent 200 quand c'est une erreur logique).\n * @param {Object} responseData - Les données renvoyées par l'API.\n * @param {any} details - Informations supplémentaires (facultatif).\n */\n constructor(message, status, responseData, details = null) {\n super(message);\n this.name = \"ApiResponseError\";\n this.status = status;\n this.responseData = responseData;\n this.details = details;\n }\n}\n\nexport class ApiAuthenticationError extends ApiError {\n constructor(message, status, details) {\n super(message, status, details);\n this.name = \"ApiAuthenticationError\";\n }\n}","// reactive.js - Système maison combinant Signal + Proxy pour réactivité profonde et fine\n\nconst effectStack = [];\nconst computedCache = new WeakMap();\nconst signalRegistry = new WeakMap();\nlet batchDepth = 0;\nconst pendingEffects = new Set();\n\n/**\n * Crée une fonction réactive qui se relance automatiquement\n * lorsqu'une valeur réactive qu'elle utilise change.\n * @param {Function} fn\n * @returns {Function} le wrapper exécuté\n */\nexport function effect(fn) {\n const wrapper = () => {\n try {\n effectStack.push(wrapper);\n fn();\n } finally {\n effectStack.pop();\n }\n };\n wrapper();\n return wrapper;\n}\n\n/**\n * Exécute une fonction dans un lot, en retardant l'exécution\n * des effets jusqu'à ce que le lot soit terminé.\n * @param {Function} fn\n * @returns {void}\n */\nexport function batch(fn) {\n batchDepth++;\n try {\n fn();\n } finally {\n batchDepth--;\n if (batchDepth === 0) {\n const effects = Array.from(pendingEffects);\n pendingEffects.clear();\n for (const effect of effects) effect();\n }\n }\n}\n\n/**\n * Crée un signal observable pour une valeur primitive ou complexe.\n * @param {*} initialValue\n * @returns {{value: *, subscribe: Function, __isSignal: boolean}}\n */\nfunction createSignal(initialValue) {\n let value = initialValue;\n const subscribers = new Set();\n\n const signal = {\n get value() {\n const currentEffect = effectStack[effectStack.length - 1];\n if (currentEffect) subscribers.add(currentEffect);\n return value;\n },\n set value(newValue) {\n if (value !== newValue) {\n value = newValue;\n if (batchDepth > 0) {\n subscribers.forEach((fn) => pendingEffects.add(fn));\n } else {\n subscribers.forEach((fn) => fn());\n }\n }\n },\n subscribe(fn) {\n subscribers.add(fn);\n return () => subscribers.delete(fn);\n },\n __isSignal: true\n };\n\n return signal;\n}\n\n/**\n * vérifie si un objet est un signal.\n * @param {*} obj\n * @returns {boolean}\n */\nexport function isSignal(obj) {\n return obj && obj.__isSignal === true;\n}\n\nfunction toRaw(obj) {\n return isSignal(obj) ? obj.value : obj;\n}\n\nfunction _wrapArray(arr, path) {\n const proxy = new Proxy(arr, {\n get(target, prop) {\n if (typeof prop === \"string\" && !isNaN(prop)) {\n const val = target[prop];\n return isReactive(val) ? val : reactive(val, path.concat(prop));\n }\n return Reflect.get(target, prop);\n },\n set(target, prop, value) {\n const val = reactive(value, path.concat(prop));\n target[prop] = val;\n return true;\n }\n });\n return proxy;\n}\n\nfunction _wrapReactive(obj, path = []) {\n if (typeof obj !== \"object\" || obj === null) return obj;\n if (Array.isArray(obj)) return _wrapArray(obj, path);\n if (obj.__isReactive) return obj;\n\n const signalMap = new Map();\n const proxy = new Proxy(obj, {\n // eslint-disable-next-line no-unused-vars\n get(target, prop, receiver) {\n if (prop === \"__raw\") return target;\n if (prop === \"__isReactive\") return true;\n\n if (!signalMap.has(prop)) {\n const val = target[prop];\n const reactiveVal = _wrapReactive(val, path.concat(prop));\n const signal = createSignal(reactiveVal);\n signalMap.set(prop, signal);\n }\n\n const signal = signalMap.get(prop);\n return signal.value;\n },\n\n set(target, prop, value) {\n const val = _wrapReactive(value, path.concat(prop));\n if (!signalMap.has(prop)) {\n const signal = createSignal(val);\n signalMap.set(prop, signal);\n }\n signalMap.get(prop).value = val;\n target[prop] = toRaw(val);\n return true;\n },\n\n deleteProperty(target, prop) {\n signalMap.delete(prop);\n return Reflect.deleteProperty(target, prop);\n }\n });\n\n signalRegistry.set(proxy, signalMap);\n return proxy;\n}\n\n/**\n * Rend un objet profondément réactif.\n * @param {object} obj\n * @returns {object}\n */\nexport function reactive(obj) {\n if (typeof obj !== \"object\" || obj === null) return obj;\n if (obj.__isReactive) return obj;\n return _wrapReactive(obj);\n}\n\n/**\n * Teste si un objet est réactif.\n * @param {*} obj\n * @returns {boolean}\n */\nexport function isReactive(obj) {\n return obj !== null && typeof obj === \"object\" && obj.__isReactive === true;\n}\n\n/**\n * Crée une valeur dérivée automatiquement recalculée.\n * @param {Function} fn\n * @returns {{value: *}}\n */\nexport function computed(fn) {\n if (computedCache.has(fn)) return computedCache.get(fn);\n\n const result = createSignal();\n effect(() => result.value = fn());\n computedCache.set(fn, result);\n return result;\n}\n\n/**\n * Observe les changements de valeur retournée par un getter.\n * @param {Function} getter\n * @param {Function} callback\n */\nexport function watch(getter, callback) {\n let oldValue;\n effect(() => {\n const newValue = getter();\n if (newValue !== oldValue) {\n callback(newValue, oldValue);\n oldValue = newValue;\n }\n });\n}\n\n/**\n * Récupère les signaux internes d’un objet réactif.\n * @param {object} obj\n * @returns {Map|null}\n */\nexport function getSignals(obj) {\n if (!isReactive(obj)) return null;\n return signalRegistry.get(obj);\n}\n\n/**\n * Permet à React de s'abonner à une propriété réactive (champ simple).\n * @param {object} obj - Objet réactif\n * @param {string} key - Nom de la propriété à écouter\n * @param {(newValue: any, oldValue: any) => void} callback\n * @returns {() => void} fonction de nettoyage\n */\nexport function subscribeTo(obj, key, callback) {\n const signals = getSignals(obj);\n if (!signals || !signals.has(key)) return () => {};\n const signal = signals.get(key);\n return signal?.subscribe?.(() => callback(signal.value)) ?? (() => {});\n}\n","// BaseEntity.js\nimport ObjectID from \"bson-objectid\";\n// import { fileTypeFromBuffer } from \"file-type\";\nimport EJSON from \"ejson\";\nimport pkg from \"file-type\";\n\nimport { ApiAuthenticationError, ApiError, ApiResponseError, ApiValidationError } from \"../error.js\";\nimport { isReactive, isSignal, reactive } from \"../utils/reactive.js\";\nconst { fromBuffer } = pkg;\n\n/**\n * @typedef {import(\"../ApiClient.js\").default} ApiClient\n * @typedef {import(\"./EndpointApi.js\").default} EndpointApi\n */\n\n/**\n * Classe de base pour toutes les entités métiers : utilisateurs, projets, organisations, etc.\n * Fournit un système de brouillon (draft), transformation, appel API sécurisé,\n * et gestion de données côté client avec support du mode offline.\n * @abstract\n */\nexport class BaseEntity {\n /** @type {Object} Données de brouillon modifiables */\n _draftData = {};\n\n /** @type {Object} Snapshot initial des données de brouillon */\n _initialDraftData = {};\n\n /** @type {Object|null} Données reçues du serveur */\n _serverData = null;\n\n /** @type {boolean} Indique si `save()` est en cours */\n _calledFromSave = false;\n\n /** @type {boolean} Indique si le draft est synchronisé avec le serveur */\n _syncReactiveDraft = false;\n\n static entityTag = \"BaseEntity\";\n\n /**\n * Constructeur de l'entité.\n * @param {Object} parent - L'ApiClient ou une entité parente.\n * @param {Object} parent.apiClient - Instance de l'ApiClient.\n * @param {Object} [parent.parent] - Instance parente.\n * @param {Object} [data={}] - Données initiales.\n * @param {Object} [deps={}] - Dépendances injectées (EndpointApi, autres entités).\n * @param {Object|function} deps.EndpointApi - Instance de l'API.\n * @param {function} deps.User - Classe d'entité utilisateur.\n * @param {function} deps.Organization - Classe d'entité organisation.\n * @param {function} deps.Project - Classe d'entité projet.\n * @param {function} deps.Poi - Classe d'entité point d'intérêt.\n * @param {function} deps.Event - Classe d'entité événement.\n * @param {function} deps.Badge - Classe d'entité badge.\n * @param {function} deps.News - Classe d'entité actualité.\n * @param {string} [config.entityTag] - Tag d'entité (ex: \"User\", \"Organization\").\n * @param {Object} [config={}] - Configuration optionnelle.\n * @throws {ApiError} Si les dépendances ou parent sont invalides.\n */\n constructor(parent, data = {}, deps = {}, config = {}) {\n this.__entityTag = config.entityTag || this.getEntityTag(this.constructor.entityTag) || \"BaseEntity\";\n this.deps = deps;\n\n if (this.getEntityTag(parent?.__entityTag) === \"ApiClient\") {\n /** @type {ApiClient} */\n this.apiClient = parent;\n this.parent = null;\n this.userContext = null;\n } else if (parent?.apiClient) {\n /** @type {ApiClient} */\n this.apiClient = parent.apiClient;\n this.parent = parent;\n if (this.getEntityTag(parent?.__entityTag) === \"User\") {\n this.userContext = parent;\n } else if (parent?.userContext) {\n this.userContext = parent.userContext;\n }\n } else {\n throw new ApiError(\"Parent invalide ou ApiClient manquant.\");\n }\n\n // Gérer les deux cas : fonction constructeur ou instance\n if (typeof deps.EndpointApi === \"function\") {\n /** @type {EndpointApi} */\n this.endpointApi = new deps.EndpointApi(this.apiClient);\n } else if (typeof deps.EndpointApi === \"object\") {\n /** @type {EndpointApi} */\n this.endpointApi = deps.EndpointApi;\n } else {\n throw new ApiError(\"deps.EndpointApi doit être une classe ou une instance valide.\");\n }\n\n this._serverData = reactive({});\n\n const { draft, proxy, initial } = this._buildDraftAndProxy({\n data: { ...data, ...this.defaultFields },\n serverData: this._serverData,\n constant: this.constructor.SCHEMA_CONSTANTS,\n apiClient: this.apiClient,\n transforms: this.transforms,\n removeFields: this.removeFields\n });\n\n this._initialDraftData = initial;\n this._draftData = draft;\n this.data = proxy;\n }\n\n getEntityTag = (__entityTag) => __entityTag?.replace(/^_/, \"\");\n\n /** @returns {string|null} Identifiant de l'entité */\n get id() {\n return this._draftData.id || null;\n }\n\n /** @returns {string|null} Slug de l'entité */\n get slug() {\n return this._draftData.slug || null;\n }\n\n /** Définit un ID (utilisé en interne) */\n _id(newId) {\n this._draftData.id = newId;\n }\n\n /** @returns {boolean} Indique si l'utilisateur est connecté */\n get isConnected() {\n return this.apiClient.isConnected;\n }\n\n /** @returns {string|null} Identifiant utilisateur associé */\n get userId() {\n return this.apiClient.userId;\n }\n\n /** @returns {Object} Données de brouillon courantes */\n get draftData() {\n return this._draftData;\n }\n\n /** @returns {Object} Données de brouillon initiales */\n get initialDraftData() {\n return this._initialDraftData;\n }\n\n /** @returns {Object|null} Données brutes du serveur */\n get serverData() {\n return this._serverData;\n }\n\n /** @returns {boolean} Indique si cette entité représente l'utilisateur connecté */\n get isMe() {\n return this.isConnected && this.userId === this.userContext?.id;\n }\n\n /** @returns {string} Type de l'entité (ex: 'citoyens') */\n getEntityType() {\n return this.constructor.entityType;\n }\n\n /**\n * Indique si le draft contient des modifications par rapport aux données initiales.\n * @returns {boolean}\n */\n hasChanges() {\n return this._serialize(this._toRawDeep(this._draftData)) !== this._serialize(this._initialDraftData);\n }\n\n /**\n * Rafraîchit l'entité en rechargeant ses données depuis le serveur.\n * @returns {Promise<Object>} Données mises à jour\n */\n async refresh() {\n if (!this.id) throw new ApiError(\"Impossible de rafraîchir sans ID.\");\n return this.get();\n }\n\n /**\n * Sauvegarde les modifications locales vers le serveur (add ou update).\n * @returns {Promise<Object>} Données serveur mises à jour\n */\n async save() {\n if (!this.isConnected) throw new ApiError(\"Non connecté.\");\n this._calledFromSave = true;\n try {\n const payload = { ...this._draftData };\n\n if (!this.id && typeof this._add === \"function\") {\n await this._add(payload);\n this._resetInitialDraftData();\n // on refresh le contexte utilisateur si besoin\n if(this.userContext) {\n await this.userContext.refresh();\n }\n return await this.refresh();\n } else if (typeof this._update === \"function\") {\n const hasChanged = await this._update(payload);\n this._resetInitialDraftData();\n if (hasChanged) return await this.refresh();\n }\n\n return this._serverData;\n } finally {\n this._calledFromSave = false;\n }\n }\n\n /**\n * Crée une nouvelle instance d'entité à partir des données du serveur.\n * \n * @param {Object} data - Données du serveur.\n * @param {BaseEntity} parent - Instance parente.\n * @param {Object} deps - Dépendances injectées.\n * @returns {BaseEntity} Nouvelle instance d'entité.\n */\n static fromServerData(data, parent, deps) {\n const instance = new this(parent, {}, deps);\n instance._setData(data);\n return instance;\n }\n\n /**\n * Met à jour les données de l'entité avec de nouvelles données.\n * \n * @param {Object} newData - Les nouvelles données à appliquer.\n * @returns {void}\n * @private\n */\n _setData(newData, { forceInitialDraftReset = false } = {}) {\n if (this.userContext && this.userContext !== this) {\n this.apiClient._logger?.info?.(`[${this.__entityTag}] Mise à jour liée à userContext : ${this.userContext.id}`);\n }\n\n if (isReactive(this._serverData)) {\n Object.assign(this._serverData, newData);\n } else {\n this._serverData = reactive({ ...newData });\n }\n\n const clientDraft = this._draftData ? this._toRawDeep(this._draftData) : {};\n\n const mergedData = {\n ...newData,\n ...this.defaultFields,\n ...clientDraft\n };\n\n const { draft, proxy, initial } = this._buildDraftAndProxy({\n data: mergedData,\n serverData: this._serverData,\n previousDraft: this._draftData,\n constant: this.constructor.SCHEMA_CONSTANTS,\n apiClient: this.apiClient,\n transforms: this.transforms,\n removeFields: this.removeFields\n });\n\n if (forceInitialDraftReset) {\n this._initialDraftData = structuredClone(this._toRawDeep(draft));\n } else if (!this._initialDraftData) {\n this._initialDraftData = initial;\n }\n\n if (isReactive(this._draftData)) {\n this._updateDraftPreservingUserChanges(draft);\n } else {\n this._draftData = reactive(draft);\n }\n\n if (!this.data) {\n this.data = proxy;\n }\n\n }\n\n _updateDraftPreservingUserChanges(draft) {\n for (const key of Object.keys(draft)) {\n const current = this._draftData?.[key];\n const initialValue = this._initialDraftData?.[key];\n\n const isModified =\n current !== undefined &&\n initialValue !== undefined &&\n this._serialize(this._toRawDeep(current)) !== this._serialize(initialValue);\n\n if (!isModified) {\n this._draftData[key] = draft[key];\n }\n }\n }\n\n _resetInitialDraftData() {\n const raw = this._toRawDeep(this._draftData);\n this._initialDraftData = structuredClone(raw);\n }\n\n\n _toRawDeep(obj) {\n\n if (!this || typeof this._toRawDeep !== \"function\") {\n throw new Error(\"`this._toRawDeep` is not bound correctly. Use a lambda to preserve context.\");\n }\n \n if (isSignal(obj)) {\n return this._toRawDeep(obj.value);\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => this._toRawDeep(item));\n }\n\n if (typeof obj === \"object\" && obj !== null) {\n const result = {};\n for (const key of Object.keys(obj)) {\n result[key] = this._toRawDeep(obj[key]);\n }\n return result;\n }\n\n return obj; // valeur primitive\n }\n\n /**\n * Champs à ajouter automatiquement à chaque draft (ex: `typeElement`).\n * Souvent utilisés dans les conditions `if/then` du JSON Schema.\n * @type {Object<string, any>}\n */\n defaultFields = {};\n\n /**\n * Champs à exclure explicitement du draft et des payloads.\n * @type {string[]}\n */\n removeFields = [];\n\n /**\n * Transformations à appliquer à certains champs lors de la lecture depuis le draft.\n * Clé = champ, valeur = fonction (val, full) => valeur transformée.\n * @type {Object<string, function(any, object): any>}\n */\n transforms = {};\n\n /**\n * ───────────────────────────────\n * JSON\n * ───────────────────────────────\n */\n\n /**\n * Convertit l'instance en JSON pour l'envoi au serveur.\n * \n * @returns {Object} Représentation JSON de l'instance.\n */\n toJSON() {\n const parentMeta = {};\n if (this.parent?.id) parentMeta.id = this.parent.id;\n if (typeof this.parent?.getEntityType === \"function\") parentMeta.type = this.parent.getEntityType();\n if (this.parent?.__entityTag) parentMeta.__entityTag = this.parent.__entityTag;\n if (this.parent?.slug) parentMeta.slug = this.parent.slug;\n\n return {\n __entityTag: this.__entityTag,\n __isSerializedEntity: true,\n serverData: this._serialize(this._serverData),\n parent: Object.keys(parentMeta).length > 0 ? parentMeta : null\n };\n }\n\n\n _serialize(obj) {\n try {\n return JSON.parse(EJSON.stringify(this._removeUnserializables(obj)));\n } catch (e) {\n this.apiClient?._logger?.error?.(\"Erreur de sérialisation EJSON\", e);\n return null;\n }\n }\n\n /**\n * Supprime les propriétés non sérialisables d'un objet.\n * \n * @param {Object} obj - L'objet à nettoyer.\n * @param {WeakSet} [seen] - Ensemble pour éviter les références circulaires.\n * @returns {Object} L'objet nettoyé.\n * @private\n */\n _removeUnserializables(obj, seen = new WeakSet()) {\n if (obj === null || typeof obj !== \"object\") return obj;\n\n if (seen.has(obj)) return null;\n seen.add(obj);\n\n // Ignore les proxys réactifs\n if (obj.__isReactive && typeof obj.__raw === \"object\") {\n return this._removeUnserializables(obj.__raw, seen);\n }\n\n if (Array.isArray(obj)) {\n return obj.map((el) => this._removeUnserializables(el, seen));\n }\n\n const clean = {};\n for (const key of Object.keys(obj)) {\n const val = obj[key];\n\n if (\n typeof val === \"function\" ||\n typeof val === \"symbol\" ||\n typeof val === \"undefined\"\n ) {\n continue;\n }\n\n try {\n clean[key] = this._removeUnserializables(val, seen);\n // eslint-disable-next-line no-unused-vars\n } catch (e) {\n clean[key] = null;\n }\n }\n\n return clean;\n }\n\n /**\n * Restaure les données sérialisées en un objet d'origine.\n *\n * @param {Object} obj - L'objet à restaurer.\n * @returns {Object} L'objet restauré.\n */\n static _revive(obj) {\n return EJSON.fromJSONValue(obj);\n }\n\n /**\n * Crée une instance d'entité à partir de données JSON.\n * \n * @param {Object} json - Données JSON à utiliser.\n * @param {Object} parent - Instance parente.\n * @param {Object} deps - Dépendances injectées.\n * @returns {object} Nouvelle instance d'entité.\n */\n static fromJSON(json, parent, deps) {\n\n const { serverData } = json;\n\n const instance = this.fromServerData(this._revive(serverData), parent, deps);\n\n return instance;\n }\n\n /**\n * ───────────────────────────────\n * UtilMixin\n * ───────────────────────────────\n */\n\n /**\n * Appelle une méthode de l'API.\n * \n * @param {string} constant - Le nom de la méthode à appeler.\n * @param {object} data - Les données à passer à la méthode.\n * @returns {Promise<any>} - La promesse de la méthode appelée.\n * @throws {ApiValidationError} - Si une erreur se produit lors de l'appel de l'API.\n * @throws {ApiResponseError} - Si une erreur se produit lors de l'appel de l'API.\n * @throws {ApiClientError} - Si l'utilisateur n'est pas authentifié.\n */\n async call(constant, data = {}) {\n return this.apiClient.safeCall(async () => {\n const response = await this.apiClient.callEndpoint(constant, data);\n this.apiClient.checkAndThrowApiResponseError(response);\n return response.data;\n });\n }\n\n /**\n * Appelle une méthode de l'API si l'utilisateur n'est pas connecté.\n * \n * @param {string} constant - Le nom de la méthode à appeler.\n * @param {object} data - Les données à passer à la méthode.\n * @returns {Promise<any>} - La promesse de la méthode appelée.\n * @throws {ApiAuthenticationError} - Si l'utilisateur est connecté.\n * @throws {ApiValidationError} - Si une erreur se produit lors de l'appel de l'API.\n * @throws {ApiResponseError} - Si une erreur se produit lors de l'appel de l'API.\n * @throws {ApiClientError} - Si une erreur se produit lors de l'appel de l'API.\n */\n async callNoConnected(constant, data = {}) {\n if(this.isConnected) {\n throw new ApiAuthenticationError(\"Vous devez ne devez pas être connecté pour faire cette action.\");\n }\n return this.call(constant, data);\n }\n\n /**\n * Appelle une méthode de l'API si l'utilisateur est connecté.\n * \n * @param {string|function} param - Le nom de la méthode à appeler ou une fonction de rappel.\n * @param {object} data - Les données à passer à la méthode.\n * @returns {Promise<any>} - La promesse de la méthode appelée.\n * @throws {ApiAuthenticationError} - Si l'utilisateur n'est pas connecté.\n * @throws {ApiValidationError} - Si une erreur se produit lors de l'appel de l'API.\n * @throws {ApiResponseError} - Si une erreur se produit lors de l'appel de l'API.\n * @throws {ApiClientError} - Si une erreur se produit lors de l'appel de l'API.\n */\n async callIsConnected(param, data = {}) {\n if(!this.isConnected) {\n throw new ApiAuthenticationError(\"Vous devez être connecté pour faire cette action.\");\n }\n // Si le premier paramètre est une fonction, on l'exécute en tant que callback\n if (typeof param === \"function\") {\n return await param();\n }\n return this.call(param, data);\n }\n\n /**\n * Appelle une méthode de l'API si l'utilisateur est lui-même.\n * \n * @param {string|function} param - Le nom de la méthode à appeler ou une fonction de rappel.\n * @param {object} data - Les données à passer à la méthode.\n * @returns {Promise<any>} - La promesse de la méthode appelée.\n * @throws {ApiAuthenticationError} - Si l'utilisateur n'est pas lui-même.\n * @throws {ApiValidationError} - Si une erreur se produit lors de l'appel de l'API.\n * @throws {ApiResponseError} - Si une erreur se produit lors de l'appel de l'API.\n * @throws {ApiClientError} - Si une erreur se produit lors de l'appel de l'API.\n */\n async callIsMe(param, data = {}) {\n if (!this.isMe) {\n throw new ApiAuthenticationError(\"Vous devez être vous-même pour faire cette action.\");\n }\n // Si le premier paramètre est une fonction, on l'exécute en tant que callback\n if (typeof param === \"function\") {\n return await param();\n }\n // Sinon, on considère qu'il s'agit d'un constant et on appelle la méthode par défaut\n return await this.callIsConnected(param, data);\n }\n\n /**\n * Valide une image d'entrée.\n * \n * @param {File|Blob|Buffer|ReadableStream} imageInput - L'image à valider.\n * @returns {Promise<File|Buffer|ReadableStream>} - L'image validée.\n * @private\n */\n async _validateImage(imageInput){\n const image = await this._validateUploadInput(imageInput, {\n allowedMimeTypes: [\"image/jpeg\", \"image/png\", \"image/jpg\"],\n expectedType: \"image\"\n });\n return image;\n }\n\n /**\n * Valide un fichier d'entrée.\n * \n * @param {File|Blob|Buffer|ReadableStream} fileInput - Le fichier à valider.\n * @returns {Promise<File|Buffer|ReadableStream>} - Le fichier validé.\n * @private\n */\n async _validateFile(fileInput){\n const file = await this._validateUploadInput(fileInput, {\n allowedMimeTypes: [\"application/pdf\", \"text/plain\", \"text/csv\"],\n expectedType: \"file\"\n });\n return file;\n }\n\n /**\n * Valide les entrées d'upload de fichiers.\n * \n * @param {File|Blob|Buffer|ReadableStream} input - Le fichier à valider.\n * @param {Object} options - Options de validation.\n * @param {Array} options.allowedMimeTypes - Types MIME autorisés.\n * @param {string} options.expectedType - Type de fichier attendu (ex: \"image\", \"file\").\n * @returns {Promise<File|Buffer|ReadableStream>} - Le fichier validé.\n * @throws {ApiValidationError} - Si le type de fichier est invalide.\n * @throws {Error} - Si le type de fichier est inconnu.\n * @private\n */\n async _validateUploadInput(input, { allowedMimeTypes = [], expectedType = \"any\" }) {\n if (!input) {\n throw new ApiValidationError(\"Le fichier est requis.\");\n }\n \n const isNode = typeof window === \"undefined\" && typeof process !== \"undefined\";\n let mimeType = \"\";\n let output = input;\n \n // Navigateur : File\n if (typeof File !== \"undefined\" && input instanceof File) {\n mimeType = input.type;\n if (!allowedMimeTypes.includes(mimeType)) {\n throw new ApiValidationError(\"Le type du fichier est invalide.\");\n }\n }\n \n // Navigateur : Blob\n else if (typeof Blob !== \"undefined\" && input instanceof Blob) {\n mimeType = input.type;\n if (!allowedMimeTypes.includes(mimeType)) {\n throw new ApiValidationError(\"Le type du fichier est invalide.\");\n }\n \n const ext = mimeType.split(\"/\")[1] || \"bin\";\n const fileName = `${Date.now()}.${ext}`;\n output = new File([input], fileName, { type: mimeType });\n }\n \n // Node.js : Buffer\n else if (isNode && Buffer.isBuffer(input)) {\n const fileTypeResult = await fromBuffer(input);\n mimeType = fileTypeResult?.mime;\n \n if (!fileTypeResult || !allowedMimeTypes.includes(mimeType)) {\n throw new ApiValidationError(\"Le type du fichier est invalide.\");\n }\n \n // Pour un fichier image, on transforme en stream\n if (expectedType === \"image\") {\n const ext = fileTypeResult.ext;\n const filename = `${Date.now()}.${ext}`;\n output = await this._createReadStreamFromBuffer(input, filename, mimeType);\n }\n }\n \n // Node.js : ReadableStream\n else if (isNode && input?.readable && typeof input._read === \"function\") {\n const previewChunks = [];\n const tee = await this._passThrough();\n const resultStream = await this._passThrough();\n \n const MAX_BYTES = 4100;\n let bytesRead = 0;\n \n input.on(\"data\", (chunk) => {\n if (bytesRead < MAX_BYTES) {\n previewChunks.push(chunk);\n bytesRead += chunk.length;\n }\n });\n \n input.pipe(tee).pipe(resultStream);\n await new Promise((resolve) => setTimeout(resolve, 10));\n \n const previewBuffer = Buffer.concat(previewChunks);\n const fileTypeResult = await fromBuffer(previewBuffer);\n mimeType = fileTypeResult?.mime;\n \n if (!fileTypeResult || !allowedMimeTypes.includes(mimeType)) {\n throw new ApiValidationError(\"Le type du fichier est invalide.\");\n }\n \n resultStream.path = `${Date.now()}.${fileTypeResult.ext}`;\n resultStream.mimeType = mimeType;\n output = resultStream;\n }\n \n else {\n throw new ApiValidationError(\"Type de fichier non reconnu.\");\n }\n \n return output;\n }\n\n /**\n * Transforme un Buffer en ReadableStream équivalent à fs.createReadStream\n * @param {Buffer} buffer - Le buffer contenant les données binaires\n * @param {string} filename - Nom de fichier (utilisé dans FormData)\n * @param {string} mimeType - Type MIME (utilisé dans FormData)\n * @returns {Object} - { stream, filename, mimeType }\n * @private\n */\n async _createReadStreamFromBuffer(buffer, filename = \"file.bin\", mimeType = \"application/octet-stream\") {\n const stream = await this._bufferToReadable(buffer);\n stream.path = filename; // 👈 hack pour simuler un vrai fichier ReadStream\n stream.mimeType = mimeType;\n return stream;\n }\n\n /**\n * Transforme un Buffer en ReadableStream.\n * \n * @param {Buffer} buffer - Le buffer à transformer.\n * @returns {Promise<stream.Readable>} - Un ReadableStream.\n * @throws {Error} - Si appelé dans le navigateur.\n * @private\n */\n async _bufferToReadable(buffer) {\n if (typeof window === \"undefined\") {\n const { bufferToReadable } = await import(\"../utils/stream-utils.node.js\");\n return bufferToReadable(buffer);\n } else {\n throw new Error(\"bufferToReadable ne doit pas être appelé dans le navigateur\");\n }\n }\n \n /**\n * Crée un PassThrough stream pour le traitement des fichiers.\n * \n * @returns {Promise<stream.PassThrough>} - Un PassThrough stream.\n * @throws {Error} - Si appelé dans le navigateur.\n * @private\n */\n async _passThrough() {\n if (typeof window === \"undefined\") {\n const { createPassThrough } = await import(\"../utils/stream-utils.node.js\");\n return createPassThrough();\n } else {\n throw new Error(\"passThrough ne doit pas être appelé dans le navigateur\");\n }\n }\n\n // async _bufferToReadable(buffer) {\n // if (typeof window === \"undefined\") {\n // const { Readable } = await import(\"stream\");\n // return Readable.from(buffer);\n // } else {\n // throw new Error(\"bufferToReadable ne doit pas être appelé dans le navigateur\");\n // }\n // },\n\n // async _passThrough() {\n // if (typeof window === \"undefined\") {\n // const { PassThrough } = await import(\"stream\");\n // return new PassThrough();\n // } else {\n // throw new Error(\"passThrough ne doit pas être appelé dans le navigateur\");\n // }\n // },\n\n /**\n * Supprime les propriétés d'un objet en fonction d'une liste de clés.\n * \n * @param {Object} obj - L'objet source.\n * @param {Array} propsToRemove - Liste des clés à supprimer\n * @param {boolean} [deep=false] - Si vrai, supprime les propriétés de manière récursive.\n * @returns {Object} - Un nouvel objet sans les propriétés supprimées.\n * @private\n */\n _omitProps(obj, propsToRemove) {\n if (!obj || typeof obj !== \"object\") return {};\n \n const result = { ...obj };\n for (const prop of propsToRemove) {\n delete result[prop];\n }\n return result;\n }\n\n /**\n * Extrait les propriétés d'un objet en fonction d'une liste de clés.\n * \n * @param {Object} obj - L'objet source.\n * @param {Array} keys - Liste des clés à extraire.\n * @param {Object} [transforms={}] - Transformations à appliquer aux valeurs.\n * @returns {Object} - Un nouvel objet contenant les propriétés extraites.\n * @private\n */\n _pickProps(obj, keys, transforms = {}) {\n if (!obj || typeof obj !== \"object\") return {};\n\n const result = {};\n\n for (const key of keys) {\n if (key in obj) {\n const value = obj[key];\n if (typeof transforms[key] === \"function\") {\n result[key] = transforms[key](value, obj); // (valeur, objet source)\n } else {\n result[key] = value;\n }\n }\n }\n\n return result;\n }\n\n /**\n * Vérifie si au moins une clé est présente dans l'objet et n'est pas nulle.\n * \n * @param {Object} obj - L'objet à vérifier.\n * @param {Array} keys - Liste des clés à vérifier.\n * @returns {boolean} - true si au moins une clé est présente et non nulle, sinon false.\n * @private\n */\n _hasAtLeastOne(obj, keys = []) {\n return keys.some((key) => key in obj && obj[key] != null);\n }\n\n /**\n * Crée un proxy filtré pour une liste d'entités.\n * @param {Array} list - Liste d'entités.\n * @returns {Proxy} Proxy filtré.\n * @private\n */\n _createFilteredProxy(list) {\n return new Proxy(list, {\n get(target, prop, receiver) {\n if (typeof prop === \"string\" && !isNaN(prop)) {\n const active = target.filter(n => !n._isDeleted);\n return active[prop];\n }\n if (prop === \"length\") {\n return target.filter(n => !n._isDeleted).length;\n }\n if (typeof target[prop] === \"function\") {\n return (...args) => target.filter(n => !n._isDeleted)[prop](...args);\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n }\n \n /**\n * Génère un nouvel identifiant unique.\n * @returns {string} Un identifiant unique.\n * @private\n */\n _newId() {\n const newId = new ObjectID();\n return newId.toString();\n }\n\n /**\n * ───────────────────────────────\n * DraftStateMixin\n * ───────────────────────────────\n */\n\n /**\n * Crée un proxy combinant draft + serveur, avec transformations facultatives.\n * @param {Object} server\n * @param {Object} draft\n * @param {Array} allowedFields - champs autorisés dans le draft\n * @param {Object} [transforms={}] - transformateurs de lecture\n * @param {Object} [options={}] - options\n * @returns {Proxy}\n * @private\n */\n _createDraftProxy(apiClient, server = {}, draft = {}, allowedFields = [], transforms = {}, options = {}) {\n return new Proxy({}, {\n get: (_, prop) => {\n // Ne pas tenter d’accéder à des propriétés système\n if (typeof prop !== \"string\" && typeof prop !== \"symbol\") return undefined;\n\n // Lecture explicite — déclenche signal si draft est réactif\n if (prop in draft) {\n const value = draft[prop];\n const transformer = transforms[prop];\n return typeof transformer === \"function\" ? transformer(value) : value;\n }\n\n // Fallback vers serverData — aussi potentiellement réactif\n if (server && typeof server === \"object\" && prop in server) {\n const value = server[prop];\n const transformer = transforms[prop];\n return typeof transformer === \"function\" ? transformer(value) : value;\n }\n\n return undefined;\n },\n\n set: (_, prop, value) => {\n if (!allowedFields.includes(prop)) {\n const message = `[DraftProxy] Le champ \"${prop}\" n'est pas autorisé.`;\n if (options.throwOnError) {\n throw new ApiValidationError(message, 400, null, {\n field: prop,\n value,\n allowedFields\n });\n }\n apiClient._logger.warn(message);\n return false;\n }\n const current = draft[prop];\n\n if (current && typeof current === \"object\" && current.__isSignal === true) {\n current.value = value; // ✅ met à jour le signal\n } else {\n draft[prop] = value; // fallback classique\n }\n return true;\n },\n\n deleteProperty: (_, prop) => {\n if (!allowedFields.includes(prop)) return false;\n delete draft[prop];\n return true;\n },\n\n has: (_, prop) => prop in draft || prop in server,\n\n ownKeys: () => [...new Set([\n ...Object.keys(server || {}),\n ...Object.keys(draft || {})\n ])],\n\n getOwnPropertyDescriptor: () => ({\n enumerable: true,\n configurable: true\n })\n });\n }\n\n /**\n * Extrait les champs modifiables d'un schéma JSON.\n * \n * @param {Object} schema - Le schéma JSON à analyser.\n * @param {Object} data - Les données à comparer.\n * @param {Object} ctx - Contexte d'extraction (pour la récursion).\n * @param {Object} ctx.defs - Définitions de schéma.\n * @param {Set} ctx.visited - Ensemble des schémas déjà visités.\n * @returns {Array} - Liste des champs modifiables.\n * @private\n */\n _extractWritableFields(schema = {}, data = {}, ctx = { defs: {}, visited: new Set() }) {\n if (!schema || typeof schema !== \"object\") return [];\n if (schema.$id && ctx.visited.has(schema.$id)) return [];\n if (schema.$id) ctx.visited.add(schema.$id);\n ctx.defs = schema.$defs || schema.definitions || ctx.defs;\n\n const fields = [];\n\n if (schema.$ref) {\n const refKey = schema.$ref.replace(/^#\\/?(\\$defs|definitions)\\//, \"\");\n const resolved = ctx.defs?.[refKey];\n if (resolved) fields.push(...this._extractWritableFields(resolved, data, ctx));\n }\n\n if (schema.allOf) {\n schema.allOf.forEach(s => fields.push(...this._extractWritableFields(s, data, ctx)));\n }\n\n if (schema.if && schema.then) {\n const condition = schema.if?.properties;\n let matches = true;\n if (condition) {\n for (const key in condition) {\n const expected = condition[key]?.const;\n if (data[key] !== expected) {\n matches = false;\n break;\n }\n }\n }\n if (matches && schema.then) {\n fields.push(...this._extractWritableFields(schema.then, data, ctx));\n } else if (!matches && schema.else) {\n fields.push(...this._extractWritableFields(schema.else, data, ctx));\n }\n }\n\n if (schema.properties) {\n fields.push(...Object.entries(schema.properties)\n // eslint-disable-next-line no-unused-vars\n .filter(([_, def]) => def.readOnly !== true && def.const === undefined)\n .map(([key]) => key));\n }\n\n return [...new Set(fields)];\n }\n\n /**\n * Construit un brouillon et un proxy à partir des données et du schéma.\n * \n * @param {Object} options - Options de construction.\n * @param {Object} options.data - Données à utiliser pour le brouillon.\n * @param {Object} [options.serverData=null] - Données du serveur.\n * @param {string|Array} options.constant - Nom de la constante ou tableau de constantes.\n * @param {ApiClient} options.apiClient - Instance de l'API.\n * @param {Object} [options.transforms={}] - Transformations à appliquer.\n * @param {boolean} [options.throwOnError=true] - Si vrai, lève une erreur en cas de problème.\n * @param {Array} [options.removeFields=[]] - Liste des champs à ignorer.\n * @returns {Object} - Objet contenant le brouillon et le proxy.\n * @private\n */\n _buildDraftAndProxy({ data = {}, serverData = null, previousDraft = null, constant, apiClient, transforms = {}, throwOnError = true, removeFields = [] }) {\n const constants = Array.isArray(constant) ? constant : [constant];\n const combinedSchema = {\n allOf: [],\n $defs: {}\n };\n \n for (const key of constants) {\n const sch = apiClient.getRequestSchema(key);\n if (!sch) throw new ApiError(`Unable to find schema for ${key}.`);\n \n // Extraire et fusionner les $defs\n if (sch.$defs) {\n for (const [defKey, defVal] of Object.entries(sch.$defs)) {\n if (combinedSchema.$defs[defKey]) {\n apiClient._logger.warn(`Duplicate $defs key '${defKey}' from schema '${key}'`);\n } else {\n combinedSchema.$defs[defKey] = defVal;\n }\n }\n }\n \n combinedSchema.allOf.push(sch);\n }\n\n let allowed = this._extractWritableFields(combinedSchema, data);\n\n if (data.id && allowed.indexOf(\"id\") === -1) {\n allowed.push(\"id\");\n }\n if (data.slug && allowed.indexOf(\"slug\") === -1) { \n allowed.push(\"slug\");\n }\n\n allowed = allowed.filter(k => !removeFields.includes(k));\n\n // Transformation des champs autorisés\n const rawDraft = Object.fromEntries(\n allowed.map((key) => {\n const raw = data[key];\n const transformed = typeof transforms[key] === \"function\"\n ? transforms[key](raw, data)\n : raw;\n return [key, transformed];\n // eslint-disable-next-line no-unused-vars\n }).filter(([_, v]) => v !== undefined)\n );\n\n const initial = structuredClone ? structuredClone(rawDraft) : JSON.parse(JSON.stringify(rawDraft));\n\n const draft = isReactive(previousDraft)\n ? Object.assign(previousDraft, rawDraft)\n : reactive(rawDraft);\n\n // Assure que serverData est réactif si c'est un objet\n const reactiveServer = isReactive(serverData)\n ? serverData\n : (serverData && typeof serverData === \"object\" ? reactive(serverData) : serverData);\n\n const proxy = this._createDraftProxy(apiClient, reactiveServer, draft, allowed, transforms, { throwOnError });\n\n return { draft, proxy, initial};\n }\n\n /**\n * Extrait les champs modifiés du schéma.\n * \n * @param {ApiClient} apiClient - Instance de l'API.\n * @param {string} constant - Nom de la constante.\n * @param {Object} data - Données à comparer.\n * @param {Function} getInitialDraft - Fonction pour obtenir le brouillon initial.\n * @param {Array} removeFields - Liste des champs à ignorer.\n * @returns {Object|null} - Champs modifiés ou null.\n * @private\n */\n _extractChangedFieldsFromSchema(apiClient, constant, data = {}, getInitialDraft, removeFields = []) {\n const schema = apiClient.getRequestSchema(constant);\n let allowed = this._extractWritableFields(schema, data);\n const changed = {};\n const initialDraft = getInitialDraft?.() || {};\n \n // on enlève les champs qui ne sont pas dans le draft\n // ou qui sont dans removeFields\n allowed = allowed.filter(k => !removeFields.includes(k));\n\n for (const key of allowed) {\n // on verifie que le champ existe dans le draft\n // sinon on ne le prend pas en compte\n\n if (data[key] === undefined) continue;\n \n const current = data[key];\n const initial = initialDraft[key];\n \n const changedValue =\n JSON.stringify(current) !== JSON.stringify(initial);\n \n if (changedValue) {\n changed[key] = current;\n }\n }\n \n return Object.keys(changed).length > 0 ? changed : null;\n }\n\n /**\n * Extrait tous les champs valides selon le schéma, et retourne uniquement ceux qui ont changé par rapport au draft initial.\n * Contrairement à `_extractChangedFieldsFromSchema`, cette méthode retourne l'ensemble des champs valides (`updated`)\n * uniquement s'il y a au moins un champ modifié (`changed`).\n *\n * ⚠️ Les champs sont filtrés en fonction :\n * - des champs définis comme modifiables dans le schéma (`writeable`)\n * - des champs non exclus dans `removeFields`\n * - des champs définis dans `data` (les `undefined` sont ignorés)\n *\n * @param {ApiClient} apiClient - L’instance de client API contenant les schémas.\n * @param {string} constant - Le nom de la constante de schéma (ex: \"ADD_EVENT\").\n * @param {Object} data - Les nouvelles données à comparer avec le draft initial.\n * @param {() => Object} getInitialDraft - Fonction qui retourne le draft initial (souvent `this.initialDraftData`).\n * @param {string[]} [removeFields=[]] - Champs à ignorer même s’ils sont valides.\n * @returns {Object|null} - Un objet `updated` avec les champs valides si au moins un champ a changé, sinon `null`.\n * @private\n */\n _extractAllValidFieldsFromSchema(apiClient, constant, data = {}, getInitialDraft, removeFields = []) {\n const schema = apiClient.getRequestSchema(constant);\n let allowed = this._extractWritableFields(schema, data);\n const changed = {};\n const updated = {};\n const initialDraft = getInitialDraft?.() || {};\n \n // on enlève les champs qui ne sont pas dans le draft\n // ou qui sont dans removeFields\n allowed = allowed.filter(k => !removeFields.includes(k));\n\n for (const key of allowed) {\n // on verifie que le champ existe dans le draft\n // sinon on ne le prend pas en compte\n\n if (data[key] === undefined) continue;\n \n const current = data[key];\n const initial = initialDraft[key];\n \n const changedValue =\n JSON.stringify(current) !== JSON.stringify(initial);\n \n if (changedValue) {\n changed[key] = current;\n }\n\n updated[key] = current;\n }\n \n return Object.keys(changed).length > 0 ? updated : null;\n }\n\n /**\n * ───────────────────────────────\n * MutualEntityMixin\n * ───────────────────────────────\n */\n\n /**\n * Résout l'identifiant de l'entité si seul le slug est fourni.\n * @param {string} type - Le type d'entité (ex : \"citoyens\", \"organizations\", \"projects\").\n * @returns {Promise<string>} L'identifiant résolu.\n * @private\n */\n async _resolveId(type) {\n if (!this.id && this.slug) {\n try {\n const data = await this.endpointApi.getElementsKey({\n pathParams:{\n slug: this.slug\n }\n });\n if(data?.contextId && data?.contextType === type) {\n this._id(data.contextId);\n } else {\n throw new ApiResponseError(`Le slug ${this.slug} ne correspond pas à un ${type}`, 200, data);\n }\n } catch (error) {\n if(error instanceof ApiResponseError) {\n if(error?.responseData?.contextType !== type) {\n throw error;\n } else {\n throw new ApiResponseError(`Impossible de récupérer l'identifiant pour le slug ${this.slug}`, error.status, error.responseData);\n }\n } else {\n throw error;\n }\n }\n }\n return this.id;\n }\n \n /**\n * Récupère le profil public de l'entité.\n * \n * @returns {Promise<Object>} - Les données du profil public.\n * @private\n */\n async _getPublicProfile() {\n await this._resolveId(this.getEntityType());\n return this.endpointApi.getElementsAbout({ pathParams: { id: this.id, type: this.getEntityType() } });\n }\n\n /**\n * Récupère la classe d'entité et ses dépendances à partir du type d'entité.\n * \n * @param {string} entityType - Le type d'entité.\n * @return {{ entityClass: Function, deps: Object } | null}\n * @private\n */\n _getEntityMeta(entityType) {\n const selfClass = this.constructor;\n const selfTag = this.__entityTag;\n \n const commonDeps = {\n EndpointApi: this.deps.EndpointApi,\n User: selfTag === \"User\" ? selfClass : this.deps.User,\n Organization: selfTag === \"Organization\" ? selfClass : this.deps.Organization,\n Project: selfTag === \"Project\" ? selfClass : this.deps.Project,\n Event: selfTag === \"Event\" ? selfClass : this.deps.Event,\n Poi: selfTag === \"Poi\" ? selfClass : this.deps.Poi,\n Badge: selfTag === \"Badge\" ? selfClass : this.deps.Badge,\n News: selfTag === \"News\" ? selfClass : this.deps.News\n };\n \n const map = {\n citoyens: { entityClass: commonDeps.User, deps: commonDeps },\n organizations:{ entityClass: commonDeps.Organization, deps: commonDeps },\n projects: { entityClass: commonDeps.Project, deps: commonDeps },\n events: { entityClass: commonDeps.Event, deps: { ...commonDeps, Badge: undefined } },\n poi: { entityClass: commonDeps.Poi, deps: { ...commonDeps, Badge: undefined, News: undefined } },\n news: { entityClass: commonDeps.News, deps: { ...commonDeps } },\n badges: { entityClass: commonDeps.Badge, deps: { \n EndpointApi: commonDeps.EndpointApi, \n User: commonDeps.User, \n Organization: commonDeps.Organization, \n Project: commonDeps.Project \n } }\n };\n \n return map[entityType] || null;\n }\n\n /**\n * Lier des données d'entité à une instance d'entité.\n * \n * @param {string} entityType - Le type d'entité (ex : \"citoyens\", \"organisations\", \"projets\").\n * @param {Object} entityData - Les données de l'entité à lier.\n * @return {Object} L'entité liée.\n * @private\n */\n _linkEntity(entityType, entityData) {\n const meta = this._getEntityMeta(entityType);\n if (!meta) return entityData;\n return meta.entityClass.fromServerData(entityData, this, meta.deps);\n }\n\n /**\n * Récupère et lie une entité à partir de son ID.\n * \n * @param {string} entityType - Le type d'entité.\n * @param {string} entityId - L'identifiant de l'entité.\n * @param {Object} [options] - Options supplémentaires :\n * @param {boolean} [options.skipGet] - Si true, ne pas appeler `get()` sur l'entité.\n * @return {Promise<Object|null>} L'entité liée ou null.\n * @private\n */\n async _linkEntityById(entityType, entityId, options = {}) {\n const meta = this._getEntityMeta(entityType);\n if (!meta) return null;\n const entity = new meta.entityClass(this, { id: entityId }, meta.deps);\n if(options?.skipGet) return entity;\n await entity.get();\n return entity;\n }\n\n /**\n * Lie une liste d'entités à partir de leurs données.\n * \n * @param {Array<Object>} results - Liste de données d'entités.\n * @return {Array<Object>} Liste d'entités liées.\n * @private\n */\n _linkEntities(results) {\n return results.flatMap(d => {\n if (!d?.collection) {\n this.apiClient._logger?.warn?.(`Objet ignoré car sans 'collection' : ${d?.id}`);\n return []; // exclu de la liste\n }\n\n return [this._linkEntity?.(d.collection, d) ?? d];\n });\n }\n\n /**\n * Lie des entités présentes dans `this.serverData` à partir de leurs IDs,\n * en les filtrant dynamiquement et en optionnellement les transformant.\n *\n * @param {string} entityType - Le type d'entité (ex : \"badges\", \"citoyens\", etc.).\n * @param {Object} filters - Clés/valeurs de filtres dynamiques. Les valeurs peuvent être :\n * - un littéral (comparaison stricte ou intelligente selon le type),\n * - une chaîne (utilise `includes` insensible à la casse),\n * - une RegExp (appliquée si la valeur est une chaîne),\n * - une fonction `(value) => boolean`.\n * @param {Object} [options] - Options supplémentaires :\n * @param {string} [options.key] - Le champ de `this.serverData` à utiliser (par défaut = entityType).\n * @param {Function} [options.mapFn] - Fonction de transformation `(entity) => any` appliquée au résultat.\n *\n * @return {Promise<Array<Object>>} Liste des entités liées, filtrées et éventuellement transformées.\n *\n * @example\n * // Tous les badges avec `name` contenant \"codev\"\n * const badges = await this.linkEntitiesFromServerData(\"badges\", { name: \"codev\" });\n *\n * @example\n * // Badges non expirés et visibles\n * const badges = await this.linkEntitiesFromServerData(\"badges\", {\n * expiredOn: false,\n * show: \"true\"\n * });\n *\n * @example\n * // Badges émis après 2023\n * const badges = await this.linkEntitiesFromServerData(\"badges\", {\n * issuedOn: (v) => new Date(v) >= new Date(\"2023-01-01\")\n * });\n *\n * @example\n * // Extraire uniquement les noms des badges\n * const namesOnly = await this.linkEntitiesFromServerData(\"badges\", {}, {\n * mapFn: (badge) => badge.meta.name\n * });\n */\n async linkEntitiesFromServerData(entityType, filters = {}, options = {}) {\n const key = options.key || entityType;\n const mapFn = typeof options.mapFn === \"function\" ? options.mapFn : null;\n\n const isTruthy = (v) => v === true || v === \"true\";\n const isFalsy = (v) => v === false || v === \"false\";\n\n const data = this.serverData?.[key];\n const result = [];\n\n if (data && typeof data === \"object\" && Object.keys(data).length > 0) {\n for (const id of Object.keys(data)) {\n const meta = data[id];\n\n const matches = Object.entries(filters).every(([key, expected]) => {\n const actual = meta[key];\n\n if (typeof expected === \"function\") {\n try {\n return expected(actual);\n } catch (err) {\n console.warn(`Erreur dans le filtre personnalisé pour ${key}`, err);\n return false;\n }\n }\n\n if (expected instanceof RegExp) {\n return typeof actual === \"string\" && expected.test(actual);\n }\n\n if (typeof expected === \"string\" && typeof actual === \"string\") {\n return actual.toLowerCase().includes(expected.toLowerCase());\n }\n\n if (isTruthy(expected)) return isTruthy(actual);\n if (isFalsy(expected)) return isFalsy(actual);\n\n if (\n typeof actual === \"string\" &&\n typeof expected === \"string\" &&\n !isNaN(Date.parse(actual)) &&\n !isNaN(Date.parse(expected))\n ) {\n return new Date(actual).getTime() === new Date(expected).getTime();\n }\n\n return actual === expected;\n });\n\n if (!matches) continue;\n\n try {\n const entity = await this._linkEntityById(entityType, id);\n if (entity) {\n entity.meta = meta;\n result.push(mapFn ? mapFn(entity) : entity);\n }\n } catch (error) {\n this._logger?.error?.(`Erreur lors de la récupération de l'entité ${entityType} (${id}) :`, error);\n }\n }\n }\n return result;\n }\n\n /**\n * Crée une instance d'entité à partir des données fournies.\n * @param {string} entityType - Le type d'entité (ex : \"citoyens\", \"organisations\", \"projets\").\n * @param {Object} entityData - Les données de l'entité.\n * @return {Object} L'entité créée.\n * @private\n */\n _entityInstanceData(entityType, entityData) {\n const meta = this._getEntityMeta(entityType);\n const selfKey = this.__entityTag; // ex: \"User\", \"Organization\", etc.\n const selfClass = this.constructor;\n\n // pour citoyens la signature est différentes\n return new meta.entityClass(this, entityData, {\n [selfKey]: selfClass,\n ...meta.deps\n });\n }\n\n /**\n * Crée une instance d'entité, et déclenche get() si certaines propriétés sont présentes.\n * @param {string} entityType\n * @param {Object} entityData\n * @return {Promise<Object>}\n */\n async entity(entityType, entityData = {}) {\n try {\n const entity = this._entityInstanceData(entityType, entityData);\n\n const fetchKeysByEntity = {\n citoyens: [\"id\", \"slug\"],\n organizations: [\"id\", \"slug\"],\n projects: [\"id\", \"slug\"],\n events: [\"id\", \"slug\"],\n poi: [\"id\", \"slug\"],\n news: [\"id\"],\n badges: [\"id\"],\n };\n\n const fetchKeys = fetchKeysByEntity[entityType];\n\n if (fetchKeys && this._hasAtLeastOne(entityData, fetchKeys)) {\n await entity.get();\n }\n\n return entity;\n } catch (error) {\n this.apiClient._logger.error(`[Api.${this.__entityTag}.${entityType}] Erreur lors de la création d'une instance ${entityType} :`, error.message);\n throw error;\n }\n }\n\n /**\n * Récupère et lie une entité à partir de son slug.\n * @param {string} slug - Le slug de l'entité.\n * @return {Promise<Object|null>} L'entité liée ou null.\n */\n async entityBySlug(slug) {\n if (!slug) {\n throw new ApiError(\"Le slug est requis.\");\n }\n try {\n const data = await this.endpointApi.getElementsKey({\n pathParams:{\n slug: slug\n }\n });\n if(data?.contextId && data?.contextType) {\n const entity = await this.entity(data.contextType, { id: data.contextId });\n return entity;\n } else {\n throw new ApiResponseError(`Le slug ${slug} n'est pas valide`, 200, data);\n }\n } catch (error) {\n if(error instanceof ApiResponseError) {\n throw new ApiResponseError(`Impossible de récupérer l'identifiant pour le slug ${slug}`, error.status, error.responseData);\n } else {\n throw error;\n }\n }\n }\n\n\n /**\n * Construit dynamiquement des filtres sur un lien entre entités\n *\n * @param {string} id - L'ID de l'entité cible.\n * @param {Object} options - Options de filtrage.\n * @param {\"memberOf\" | \"projects\"} [options.linkType] - Le type de lien (ex: \"memberOf\", \"projects\", etc.).\n * @param {boolean} [options.isAdmin] - Si défini, filtre selon l'existence de isAdmin.\n * @param {boolean} [options.isAdminPending] - Si défini, filtre selon l'existence de isAdminPending.\n * @param {boolean} [options.isInviting] - Si défini, filtre selon l'existence de isInviting.\n * @param {boolean} [options.toBeValidated] - Si défini, filtre selon l'existence de toBeValidated.\n * @param {Array<string>} [options.roles] - Rôles à filtrer.\n * @returns {Object} - Un objet de filtres à passer à une requête.\n * @throws {TypeError} - Si les types des paramètres ne sont pas valides.\n * @private\n */\n _buildLinkFilters(id, {\n linkType,\n isAdmin,\n isAdminPending,\n isInviting,\n toBeValidated = false,\n roles = []\n } = {}) {\n if (typeof id !== \"string\") throw new TypeError(\"id doit être une chaîne.\");\n if (typeof linkType !== \"string\") throw new TypeError(\"linkType doit être une chaîne.\");\n if (typeof isAdmin !== \"undefined\" && typeof isAdmin !== \"boolean\") {\n throw new TypeError(\"isAdmin doit être un booléen.\");\n }\n if (typeof isAdminPending !== \"undefined\" && typeof isAdminPending !== \"boolean\") {\n throw new TypeError(\"isAdminPending doit être un booléen.\");\n }\n if (typeof isInviting !== \"undefined\" && typeof isInviting !== \"boolean\") {\n throw new TypeError(\"isInviting doit être un booléen.\");\n }\n if (typeof toBeValidated !== \"undefined\" && typeof toBeValidated !== \"boolean\") {\n throw new TypeError(\"toBeValidated doit être un booléen.\");\n }\n if (!Array.isArray(roles)) {\n throw new TypeError(\"roles doit être un tableau de chaînes.\");\n }\n\n const path = `links.${linkType}.${id}`;\n const filters = {\n [`${path}`]: { $exists: true }\n };\n\n if (typeof toBeValidated === \"boolean\") {\n filters[`${path}.toBeValidated`] = { $exists: toBeValidated };\n }\n\n if (typeof isInviting === \"boolean\") {\n filters[`${path}.isInviting`] = { $exists: isInviting };\n }\n\n if (isAdmin === true) {\n filters[`${path}.isAdmin`] = { $exists: true };\n }\n\n if(isAdminPending === true) {\n filters[`${path}.isAdminPending`] = { $exists: true };\n }\n\n if (roles.length > 0) {\n filters[`${path}.roles`] = { $in: roles };\n }\n\n return filters;\n }\n\n /**\n * Retourne les métadonnées de lien pour une entité :\n * - `linkType` : clé dans `serverData.links`\n * - `connectTypeConnect` : valeur envoyée pour `connect()`\n * - `connectTypeDisconnect` : valeur envoyée pour `disconnect()`\n * @typedef {Object} LinkMeta\n * @property {string} linkType\n * @property {string} connectTypeConnect\n * @property {string} connectTypeDisconnect\n * @returns {LinkMeta}\n * @throws {ApiError} - Si le type d'entité est inconnu.\n * @private\n */\n _getLinkMeta() {\n const map = {\n organizations: {\n linkType: \"memberOf\",\n connectTypeConnect: \"member\",\n connectTypeDisconnect: \"members\"\n },\n projects: {\n linkType: \"projects\",\n connectTypeConnect: \"contributor\",\n connectTypeDisconnect: \"contributors\"\n },\n events: {\n linkType: \"events\",\n connectTypeConnect: \"attendee\",\n connectTypeDisconnect: \"attendees\"\n },\n citoyens: {\n linkType: \"friends\",\n connectTypeConnect: \"friend\",\n connectTypeDisconnect: \"friends\"\n }\n };\n\n const entityType = this.getEntityType();\n const meta = map[entityType];\n\n if (!meta) {\n throw new ApiError(`Aucune correspondance de lien définie pour le type d'entité \"${entityType}\"`);\n }\n\n return meta;\n }\n\n /**\n * Vérifie si l'entité prend en charge les opérations de lien (`connect`, `disconnect`, etc.).\n * Utilise `_getLinkMeta()` comme source unique de vérité.\n *\n * @throws {ApiError} - Si l'entité ne supporte pas les liens.\n * @private\n */\n _checkLinkableEntity() {\n try {\n this._getLinkMeta(); // si l'entité n'est pas supportée, ça throw déjà\n } catch (error) {\n if (error instanceof ApiError) {\n throw new ApiError(`L'entité \"${this.getEntityType()}\" ne prend pas en charge les actions de lien.`);\n }\n throw error;\n }\n }\n\n /**\n * Retourne le lien de l'utilisateur connecté avec l'entité cible (dans `parent.serverData.links`)\n * @private\n */\n _getLinkFromConnectedUser() {\n const { linkType } = this._getLinkMeta();\n return this?.userContext?.serverData?.links?.[linkType]?.[this.id] || null;\n }\n\n /**\n * Soumet une demande de connexion à une entité (ex : membre, contributeur),\n * ou valide l'invitation si elle existe déjà.\n *\n * @returns {Promise<Object>} - Résultat de l'API\n * @throws {ApiError} - En cas d'erreur de connexion ou d'invitation.\n * @private\n */\n async _submitLinkRequest() {\n\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const { connectTypeConnect } = this._getLinkMeta();\n\n const userLink = this._getLinkFromConnectedUser();\n\n // Cas : aucun lien → on demande à se connecter\n if (!userLink) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n connectType: connectTypeConnect\n };\n\n // TODO : reflechir au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n const retour = await this.callIsMe(() => this.endpointApi.connect(data));\n await this.userContext.refresh();\n return retour;\n }\n\n // Cas : invitation reçue → on valide l'invitation\n if (userLink.isInviting) {\n return this._acceptLinkRequest();\n }\n\n // Cas : déjà en attente\n if (userLink.toBeValidated) {\n throw new ApiError(\"Vous êtes déjà en attente de validation.\");\n }\n\n // Cas par défaut : rien à faire\n throw new ApiError(\"Vous êtes déjà connecté à cette entité.\");\n }\n\n /**\n * Soumet une demande pour devenir administrateur d'une entité.\n *\n * @returns {Promise<Object>}\n * @throws {ApiError}\n * @private\n */\n async _submitLinkRequestAdmin() {\n\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const userLink = this._getLinkFromConnectedUser();\n\n // Aucun lien existant → envoie une demande avec rôle \"admin\"\n if (!userLink) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n connectType: \"admin\"\n };\n\n // TODO : reflechir au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n const retour = await this.callIsMe(() => this.endpointApi.connect(data));\n await this.userContext.refresh();\n return retour;\n }\n\n // Invitation reçue → accepte automatiquement\n if (userLink.isInviting) {\n return this._acceptLinkRequest();\n }\n\n // Déjà en attente pour admin\n if (userLink.toBeValidated && userLink.isAdminPending) {\n throw new ApiError(\"Vous êtes déjà en attente de validation pour devenir admin.\");\n }\n\n // Déjà en attente pour un autre rôle\n if (userLink.toBeValidated) {\n throw new ApiError(\"Vous êtes déjà en attente de validation pour rejoindre cette entité.\");\n }\n\n // Déjà connecté\n throw new ApiError(\"Vous êtes déjà connecté à cette entité.\");\n }\n\n /**\n * Accepte une demande de lien (ex : invitation à rejoindre un groupe).\n * \n * @returns {Promise<Object>} - Résultat de l'API\n * @throws {ApiError} - En cas d'erreur de connexion ou d'invitation.\n * @private\n */\n async _acceptLinkRequest() {\n\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const userLink = this._getLinkFromConnectedUser();\n\n if (userLink.isInviting) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n linkOption: \"isInviting\"\n };\n // TODO : reflechir au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n const retour = await this.callIsMe(() => this.endpointApi.linkValidate(data));\n await this.userContext.refresh();\n return retour;\n }\n\n throw new ApiError(\"Vous n'avez pas d'invitation à valider.\");\n }\n\n /**\n * Annule une demande de lien ou se déconnecte d'une entité.\n * \n * @returns {Promise<Object>} - Résultat de l'API\n * @throws {ApiError} - En cas d'erreur de connexion ou d'invitation.\n * @private\n */\n async _leaveLinkRequest() {\n\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const { connectTypeDisconnect } = this._getLinkMeta();\n\n const userLink = this._getLinkFromConnectedUser();\n\n if (!userLink) {\n throw new ApiError(\"Vous n'êtes pas connecté à cette entité.\");\n }\n\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n // Normalement en auto dans le schema mais je le met quand même\n connectType: connectTypeDisconnect\n };\n \n // TODO : reflechir au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n const retour = await this.callIsMe(() => this.endpointApi.disconnect(data));\n await this.userContext.refresh();\n return retour;\n }\n\n /**\n * ───────────────────────────────\n * EntityMixin\n * ───────────────────────────────\n */\n\n /**\n * Récupérer le profil public de l'entité\n * \n * @returns {Promise<Object>} - Les données de réponse.\n */\n async get() {\n return this.apiClient.safeCall(async () => {\n const data = await this._getPublicProfile();\n this._setData(data, { forceInitialDraftReset: true });\n return data;\n });\n }\n \n /**\n * Mettre à jour les paramètres d'un élément : Mise à jour des paramètres spécifiques d'un élément.\n * Constant : UPDATE_SETTINGS\n * @param {Object} data - Les données à envoyer.\n * @param {string} data.type - data.type\n * @param {undefined} data.value - data.value\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateSettings(data = {}) {\n data.idEntity = this.id;\n data.typeEntity = this.getEntityType();\n return this.callIsConnected(() => this.endpointApi.updateSettings(data));\n }\n \n /**\n * Mettre à jour la description d'un élément : Permet de mettre à jour la description courte et complète d'un élément.\n * Constant : UPDATE_BLOCK_DESCRIPTION\n * @param {Object} data - Les données à envoyer.\n * @param {string} data.descMentions - Mentions dans la description (default: \"\")\n * @param {string} data.shortDescription - Courte description\n * @param {string} data.description - Description complète\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateDescription(data = {}) {\n data.typeElement = this.getEntityType();\n data.id = this.id;\n return this.callIsConnected(() => this.endpointApi.updateBlockDescription(data));\n }\n \n /**\n * Mettre à jour les informations d'un élément : Permet de mettre à jour les informations générales d'un élément (nom, contacts, etc.).\n * Constant : UPDATE_BLOCK_INFO\n */\n async updateInfo(data = {}) {\n data.typeElement = this.getEntityType();\n data.id = this.id;\n return this.callIsConnected(() => this.endpointApi.updateBlockInfo(data));\n }\n \n /**\n * Mettre à jour les réseaux sociaux d'un élément : Permet de mettre à jour les liens vers les réseaux sociaux d'un élément.\n * Constant : UPDATE_BLOCK_SOCIAL\n */\n async updateSocial(data = {}) {\n data.typeElement = this.getEntityType();\n data.id = this.id;\n return this.callIsConnected(() => this.endpointApi.updateBlockSocial(data));\n }\n \n /**\n * Mettre à jour les localités d'un élément : Permet de mettre à jour l'adresse et les informations géographiques d'un élément.\n * Constant : UPDATE_BLOCK_LOCALITY\n */\n async updateLocality(data = {}) {\n data.typeElement = this.getEntityType();\n data.id = this.id;\n return this.callIsConnected(() => this.endpointApi.updateBlockLocality(data));\n }\n \n /**\n * Mettre à jour le slug d'un élément : Permet de mettre à jour le slug pour une URL simplifiée.\n * Constant : UPDATE_BLOCK_SLUG\n * @param {Object} data - Les données à envoyer.\n * @param {string} data.slug - Le nouveau slug à appliquer.\n * @returns {Promise<Object>} - Les données de réponse.\n */\n async updateSlug({ slug }) {\n try {\n await this.endpointApi.check({ type: this.getEntityType(), id: this.id, slug });\n } catch (error) {\n if(error instanceof ApiResponseError) {\n throw new ApiResponseError(\"Erreur lors de la vérification du slug.\", error.status, error.data);\n }\n throw error;\n }\n return this.callIsConnected(() => this.endpointApi.updateBlockSlug({ typeElement: this.getEntityType(), id: this.id, slug }));\n }\n \n /**\n * Mettre à jour l'image de profil : Permet de mettre à jour l'image de profil d'un utilisateur ou d'une entité.\n * Constant : PROFIL_IMAGE\n * @param {Object} data - Les données à envoyer.\n * @param {string} data.profil_avatar - L'image de profil à mettre à jour.\n * @returns {Promise<Object>} - Les données de réponse.\n */\n async updateImageProfil({ profil_avatar: image }) {\n image = await this._validateImage(image);\n const data = { pathParams: { folder: this.getEntityType(), ownerId: this.id }, profil_avatar: image };\n return this.callIsConnected(() => this.endpointApi.profilImage(data));\n }\n\n /**\n * Crée une instance d'organisation et récupère son profil si nécessaire.\n *\n * @param {Object} organizationData - Les données nécessaires pour initialiser l'organisation.\n * @returns {Promise<Organization>} Une promesse qui résout l'objet Organisation créé.\n * @throws {Error} Si une erreur se produit lors de la création de l'organisation.\n */\n async organization(organizationData = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour créer une organisation.\");\n }\n return this.entity(\"organizations\", organizationData);\n }\n\n /**\n * Crée une instance de projet et récupère son profil si nécessaire.\n *\n * @param {Object} projectData - Les données nécessaires pour initialiser le projet.\n * @returns {Promise<Project>} Une promesse qui résout l'objet Projet créé.\n * @throws {Error} Si une erreur se produit lors de la création du projet.\n */\n async project(projectData = {}) {\n // TODO: Vérifier si l'utilisateur est admin de l'organisation\n if(!this.isConnected){\n throw new ApiError(\"Vous devez être connecté pour créer un projet.\");\n }\n return this.entity(\"projects\", projectData);\n }\n\n /**\n * Crée une instance de POI et la récupère si nécessaire.\n * \n * @param {Object} poiData - Les données nécessaires pour initialiser le POI.\n * @returns {Promise<Poi>} Une promesse qui résout l'objet POI créé.\n * @throws {Error} Si une erreur se produit lors de la création du POI.\n */\n async poi(poiData = {}) {\n // TODO: Vérifier si l'utilisateur est admin de l'organisation\n if(!this.isConnected){\n throw new ApiError(\"Vous devez être connecté pour créer un POI.\");\n }\n return this.entity(\"poi\", poiData);\n }\n\n /**\n * Crée une instance d'événement et la récupère si nécessaire.\n * \n * @param {Object} eventData - Les données nécessaires pour initialiser l'événement.\n * @returns {Promise<Event>} Une promesse qui résout l'objet Événement créé.\n * @throws {Error} Si une erreur se produit lors de la création de l'événement.\n */\n async event(eventData = {}) {\n // TODO: Vérifier si l'utilisateur est admin de l'organisation\n if(!this.isConnected){\n throw new ApiError(\"Vous devez être connecté pour créer un événement.\");\n }\n return this.entity(\"events\", eventData);\n }\n\n /**\n * Crée une instance de badge et la récupère si nécessaire.\n * \n * @param {Object} badgeData - Les données nécessaires pour initialiser le badge.\n * @returns {Promise<Badge>} Une promesse qui résout l'objet Badge créé.\n * @throws {Error} Si une erreur se produit lors de la création du badge.\n */\n async badge(badgeData = {}) {\n // TODO: Vérifier si l'utilisateur est admin de l'organisation\n if(!this.isConnected){\n throw new ApiError(\"Vous devez être connecté pour créer un badge.\");\n }\n return this.entity(\"badges\", badgeData);\n }\n\n /**\n * Crée une instance de news et la récupère si nécessaire.\n * \n * @param {Object} newsData - Les données nécessaires pour initialiser la news.\n * @returns {Promise<News>} Une promesse qui résout l'objet News créé.\n * @throws {Error} Si une erreur se produit lors de la création de la news.\n */\n async news(newsData = {}) {\n if(!this.isConnected){\n throw new ApiError(\"Vous devez être connecté.\");\n }\n return this.entity(\"news\", newsData);\n }\n\n /**\n * Récupérer les organisations d'une entitée : la liste des organisations dont l'entité est membre ou admin valide.\n * Constant : GET_ORGANIZATIONS_ADMIN | GET_ORGANIZATIONS_NO_ADMIN\n * @param {Object} data - Les données à envoyer.\n * @param {boolean} isNext - Indique si c'est une recherche suivante (pagination).\n * @returns {Promise<Object>} - Les données de réponse.\n */\n async getOrganizations(data = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_ORGANIZATIONS_NO_ADMIN\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n if(this.isMe){\n finalData.pathParams = { type: this.getEntityType(), id: this.id };\n // NOTE : dans le schema je crois que si pas de finalData.filters alors le default ce fait avec finalData.pathParams\n // finalData.filters = {\n // [`links.members.${this.id}`]: { \"$exists\": true },\n // [`links.members.${this.id}.toBeValidated`]: { \"$exists\": false },\n // [`links.members.${this.id}.isInviting`]: { \"$exists\": false }\n // };\n } else {\n delete finalData?.pathParams;\n finalData.filters = {\n [`links.members.${this.id}`]: { \"$exists\": true },\n [`links.members.${this.id}.toBeValidated`]: { \"$exists\": false },\n [`links.members.${this.id}.isInviting`]: { \"$exists\": false }\n };\n }\n \n const fetchFn = this.isMe\n ? () => this.callIsMe(() => this.endpointApi.getOrganizationsAdmin(finalData))\n : () => this.endpointApi.getOrganizationsNoAdmin(finalData);\n\n return fetchFn();\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupérer les projets d'une entitée : liste des projets de l'entité ou elle est \"parent\" ou \"contributeur\".\n * Constant : GET_PROJECTS_ADMIN | GET_PROJECTS_NO_ADMIN\n * @param {Object} data - Les données à envoyer.\n * @param {boolean} isNext - Indique si c'est une recherche suivante (pagination).\n * @returns {Promise<Object>} - Les données de réponse.\n */\n async getProjects(data = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_PROJECTS_ADMIN\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n if(this.isMe){\n finalData.pathParams = { type: this.getEntityType(), id: this.id };\n // NOTE : dans le schema je crois que si pas de finalData.filters alors le default ce fait avec finalData.pathParams\n // finalData.filters = {\n // \"$or\": {\n // [`links.contributors.${this.id}`]: { \"$exists\": true },\n // [`parent.${this.id}`]: { \"$exists\": true }\n // },\n // [`links.contributors.${this.id}`]: { \"$exists\": true }\n // };\n } else {\n delete finalData?.pathParams;\n finalData.filters = {\n \"$or\": {\n [`links.contributors.${this.id}`]: { \"$exists\": true },\n [`parent.${this.id}`]: { \"$exists\": true }\n },\n [`links.contributors.${this.id}`]: { \"$exists\": true }\n };\n }\n \n const fetchFn = this.isMe\n ? () => this.callIsMe(() => this.endpointApi.getProjectsAdmin(finalData))\n : () => this.endpointApi.getProjectsNoAdmin(finalData);\n\n return fetchFn();\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupérer les POIs d'une entité : liste des POIs de l'entité ou elle est \"parent\".\n * Constant : GET_POIS_NO_ADMIN / GET_POIS_ADMIN\n * @param {Object} data - Les données à envoyer.\n * @param {boolean} isNext - Indique si c'est une recherche suivante (pagination).\n * @returns {Promise<Object>} - Les données de réponse.\n */\n async getPois(data = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_POIS_ADMIN\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n if(this.isMe){\n finalData.pathParams = { type: this.getEntityType(), id: this.id };\n // NOTE : dans le schema je crois que si pas de finalData.filters alors le default ce fait avec finalData.pathParams\n // finalData.filters = {\n // [`parent.${this.id}`]: { \"$exists\": true },\n // };\n } else {\n delete finalData?.pathParams;\n finalData.filters = {\n [`parent.${this.id}`]: { \"$exists\": true },\n };\n }\n \n const fetchFn = this.isMe\n ? () => this.callIsMe(() => this.endpointApi.getPoisAdmin(finalData))\n : () => this.endpointApi.getPoisNoAdmin(finalData);\n\n return fetchFn();\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupérer les abonnés d'une entité\n * Constant : GET_SUBSCRIBERS\n * @param {Object} data - Les données à envoyer.\n * @param {boolean} isNext - Indique si c'est une recherche suivante (pagination).\n * @returns {Promise<Object>} - Les données de réponse.\n */\n async getSubscribers(data = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_SUBSCRIBERS\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n delete finalData?.pathParams;\n\n finalData.filters = {\n [`links.follows.${this.id}`]: { \"$exists\": true },\n [`links.follows.${this.id}.toBeValidated`]: { \"$exists\": false },\n [`links.follows.${this.id}.isInviting`]: { \"$exists\": false }\n };\n\n return this.endpointApi.getSubscribers(finalData);\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Liste des badges créés par l'entité\n * Constant : GET_BADGES\n * @param {Object} data - Les données à envoyer.\n * @param {boolean} isNext - Indique si c'est une recherche suivante (pagination).\n * @returns {Promise<Object>} - Les données de réponse. \n */\n async getBadgesIssuer(data = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_BADGES\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n delete finalData?.pathParams;\n \n finalData.filters = finalData.filters || {};\n finalData.filters[\"$or\"] = {};\n finalData.filters[\"$or\"][`issuer.${this.id}`] = { \"$exists\": true };\n\n return this.endpointApi.getBadges(finalData);\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupérer les actualités : Récupère la liste d’actualités selon plusieurs critères.\n * Constant : GET_NEWS\n * @param {Object} data - Les données à envoyer.\n * @param {number} data.dateLimit - Limite de date timestamp ou 0 (default: 0)\n * @param {object} data.search - data.search\n * @param {string} data.search.name - Nom ou terme recherché (default: \"\")\n * @param {number} data.indexStep - Nombre de résultats par page (default: 12)\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getNews(data = {}) {\n data.pathParams = { type: this.getEntityType(), id: this.id };\n const arrayObjet = await this.endpointApi.getNews(data);\n if(!Array.isArray(arrayObjet)){\n throw new ApiResponseError(\"Erreur lors de la récupération des actualités.\", 500, arrayObjet);\n }\n\n const rawList = this._linkEntities(arrayObjet);\n\n return this._createFilteredProxy(rawList);\n }\n\n /**\n * Récupérer la galerie d'une entité.\n * Constant : GET_GALLERY\n * @param {Object} data - Les données à envoyer.\n * @param {string} data.pathParams.docType - Type de document (default: \"image\")\n * @param {string} data.contentKey - Clé de contenu pour la galerie (default: \"null\")\n * @param {string} data.folderId - ID du dossier pour la galerie (default: \"null\")\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getGallery(data = {}) {\n data.pathParams = { type: this.getEntityType(), id: this.id, docType: data.pathParams?.docType || \"image\" };\n const arrayObjet = await this.endpointApi.getGallery(data);\n\n return arrayObjet;\n }\n\n /**\n * Soumet une demande pour rejoindre l'entité courante (ex. organisation, projet, événement...).\n * Si une invitation est en attente, elle est automatiquement acceptée.\n *\n * @returns {Promise<Object>} - Résultat de la demande ou de la validation.\n * @throws {ApiError} - Si l'entité ne supporte pas l'action ou si une demande est déjà en cours.\n */\n async requestToJoin(){\n if (!this.isMe) {\n throw new ApiError(\"Vous devez être connecté pour envoyer une demande de participation.\");\n }\n this._checkLinkableEntity();\n return this._submitLinkRequest();\n }\n\n /**\n * Soumet une demande pour devenir administrateur de l'entité courante.\n * Si une invitation est en attente, elle est automatiquement validée.\n *\n * @returns {Promise<Object>} - Résultat de la demande ou de la validation.\n * @throws {ApiError} - Si l'entité ne supporte pas l'action ou si une demande est déjà en cours.\n */\n async requestToJoinAdmin(){\n if (!this.isMe) {\n throw new ApiError(\"Vous devez être connecté pour envoyer une demande de participation.\");\n }\n this._checkLinkableEntity();\n return this._submitLinkRequestAdmin();\n }\n\n /**\n * Accepte une invitation à rejoindre l'entité courante.\n * Ne fonctionne que si un lien avec `isInviting` est détecté.\n *\n * @returns {Promise<Object>} - Résultat de l'acceptation de l'invitation.\n * @throws {ApiError} - Si aucune invitation n'est en attente ou si l'entité ne supporte pas cette action.\n */\n async acceptInvitation(){\n if (!this.isMe) {\n throw new ApiError(\"Vous devez être connecté pour envoyer une demande de participation.\");\n }\n this._checkLinkableEntity();\n return this._acceptLinkRequest();\n }\n\n /**\n * Se désengage de l'entité courante : quitte un rôle (membre, contributeur, etc.).\n *\n * @returns {Promise<Object>} - Résultat de la déconnexion.\n * @throws {ApiError} - Si l'entité ne supporte pas l'action ou si l'utilisateur n'est pas lié à cette entité.\n */\n async leave() {\n if (!this.isMe) {\n throw new ApiError(\"Vous devez être connecté pour envoyer une demande de participation.\");\n }\n this._checkLinkableEntity();\n return this._leaveLinkRequest();\n }\n\n /**\n * S'abonne à l'entité courante.\n * \n * @returns {Promise<Object>} - Résultat de l'abonnement.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité n'est pas enregistrée.\n */\n async follow() {\n if (!this.isMe) {\n throw new ApiError(\"Vous devez être connecté pour suivre cette entité.\");\n }\n\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const userLink = this.userContext?.serverData?.links?.[\"follows\"]?.[this.id] || null;\n\n if (!userLink) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id\n };\n const retour = await this.callIsMe(() => this.endpointApi.follow(data));\n // TODO : reflechir au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n await this.userContext.refresh();\n return retour;\n }\n\n throw new ApiError(\"Vous êtes déjà abonné à cette entité.\");\n }\n\n /**\n * Se désabonne de l'entité courante.\n * \n * @returns {Promise<Object>} - Résultat de la désinscription.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité n'est pas enregistrée.\n */\n async unfollow() {\n if (!this.isMe) {\n throw new ApiError(\"Vous devez être connecté pour vous désabonner.\");\n }\n\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const userLink = this.userContext?.serverData?.links?.[\"follows\"]?.[this.id] || null;\n\n if (userLink) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n connectType: \"followers\"\n };\n const retour = await this.callIsMe(() => this.endpointApi.disconnect(data));\n // TODO : reflechir au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n await this.userContext.refresh();\n return retour;\n }\n\n throw new ApiError(\"Vous n'êtes pas abonné à cette entité.\");\n }\n \n\n /**\n * Vérifie si l'utilisateur est connecté et a accès à l'entité.\n * \n * @param {string} action - Action à effectuer.\n * @returns {void}\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité n'est pas enregistrée.\n * @private\n */\n _checkAccess(action = \"effectuer cette action\") {\n if (!this.isMe) {\n throw new ApiError(`Vous devez être connecté pour ${action}`);\n }\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n }\n\n /**\n * Vérifie si l'utilisateur a un lien valide avec l'entité.\n * \n * @param {Object} userLink - Lien de l'utilisateur avec l'entité.\n * @param {boolean} userLink.toBeValidated - Indique si le lien est en attente de validation.\n * @param {boolean} userLink.isInviting - Indique si l'utilisateur a été invité.\n * @returns {boolean} - `true` si le lien est valide, `false` sinon.\n * @private\n */\n _validateUserLink(userLink) {\n if (!userLink) return false;\n const { toBeValidated, isInviting } = userLink;\n return !toBeValidated && !isInviting;\n }\n\n /**\n * Vérifie si l'entité est d'un type spécifique.\n * \n * @param {...string} types - Types d'entité attendus.\n * @throws {ApiError} - Si l'entité n'est pas du type attendu.\n * @private\n */\n _assertEntityType(...types) {\n const expectedTypes = Array.isArray(types[0]) ? types[0] : types;\n if (!expectedTypes.includes(this.getEntityType())) {\n throw new ApiError(`L'entité doit être de type : ${expectedTypes.join(\", \")}, reçu : ${this.getEntityType()}`);\n }\n }\n\n /**\n * Vérifie si l'entité est liée à un type de lien spécifique.\n * \n * @param {string} linkType - Type de lien à vérifier.\n * @returns {boolean} - `true` si l'entité est liée, `false` sinon.\n * @private\n */\n _isLinked(linkType) {\n return !!this.userContext?.serverData?.links?.[linkType]?.[this.id];\n }\n\n /**\n * Vérifie si l'utilisateur est l'auteur de l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur est l'auteur, `false` sinon.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si les données du serveur ne sont pas disponibles.\n */\n isAuthor() {\n this._checkAccess(\"vérifier l'auteur\");\n if (!this.serverData) {\n throw new ApiError(\"Aucune donnée serveur disponible.\");\n }\n return this.userId && this.serverData?.creator === this.userId;\n }\n\n /**\n * Vérifie si l'utilisateur est administrateur de l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur est administrateur, `false` sinon.\n * @throws {ApiError}\n */\n isAdmin() {\n this._checkAccess(\"vérifier l'administrateur.\");\n this._assertEntityType(\"organizations\", \"projects\", \"events\");\n const userLink = this._getLinkFromConnectedUser();\n return this._validateUserLink(userLink) && userLink?.isAdmin === true && !userLink?.isAdminPending;\n }\n\n /**\n * Vérifie si l'utilisateur est soit l'auteur, soit administrateur de l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur est l'auteur ou administrateur, `false` sinon.\n * @throws {ApiError}\n */\n isAuthorOrAdmin() {\n this._checkAccess(\"vérifier l'auteur ou l'administrateur.\");\n return this.isAuthor() || this.isAdmin();\n }\n\n /**\n * Vérifie si l'utilisateur est membre de l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur est membre, `false` sinon.\n * @throws {ApiError}\n */\n isMember() {\n this._checkAccess(\"vérifier le membre.\");\n this._assertEntityType(\"organizations\");\n const userLink = this._getLinkFromConnectedUser();\n return this._validateUserLink(userLink);\n }\n\n /**\n * Vérifie si l'utilisateur est contributeur de l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur est contributeur, `false` sinon.\n * @throws {ApiError}\n */\n isContributor() {\n this._checkAccess(\"vérifier le contributeur.\");\n this._assertEntityType(\"projects\");\n const userLink = this._getLinkFromConnectedUser();\n return this._validateUserLink(userLink);\n }\n\n /**\n * Vérifie si l'utilisateur est participant de l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur est participant, `false` sinon.\n * @throws {ApiError}\n */\n isAttendee() {\n this._checkAccess(\"vérifier si vous êtes un participant.\");\n this._assertEntityType(\"events\");\n const userLink = this._getLinkFromConnectedUser();\n return this._validateUserLink(userLink);\n }\n\n /**\n * Vérifie si l'utilisateur suit l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur suit l'entité, `false` sinon.\n * @throws {ApiError}\n */\n isFollower() {\n this._checkAccess(\"vérifier si il vous suit.\");\n this._assertEntityType(\"citoyens\",\"organizations\", \"projects\", \"events\", \"poi\");\n return this._isLinked(\"followers\");\n }\n\n /**\n * Vérifie si l'utilisateur est abonné à l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur est abonné, `false` sinon.\n * @throws {ApiError}\n */\n isFollowing() {\n this._checkAccess(\"vérifier si vous le suivez.\");\n this._assertEntityType(\"citoyens\",\"organizations\", \"projects\", \"events\", \"poi\");\n return this._isLinked(\"follows\");\n }\n\n /**\n * Récupère le JSON personnalisé de l'entité\n * \n * @returns {Promise<Object>} - Le JSON personnalisé de l'entité.\n * @throws {ApiError} - Si le slug de l'entité n'est pas défini.\n */\n async getCostumJson() {\n if (!this.serverData.slug) {\n throw new ApiError(\"slug de l'entité non défini\");\n }\n const data = {\n pathParams: {\n slug: this.serverData.slug\n }\n };\n return this.endpointApi.getCostumJson(data);\n }\n\n /**\n * Génère des plages d'index pour la pagination.\n * \n * @param {Array<string>} searchType - Types de recherche.\n * @param {number} indexStep - Pas d'index.\n * @param {Object} previousRanges - Plages précédentes.\n * @returns {Object} - Plages d'index générées.\n * @private\n */\n _generateRanges(searchType, indexStep, previousRanges = {}) {\n const ranges = {};\n for (const type of searchType) {\n const previous = previousRanges[type] || { indexMax: 0 };\n ranges[type] = {\n indexMin: previous.indexMax || 0,\n indexMax: previous.indexMax + indexStep\n };\n }\n return ranges;\n }\n\n /**\n * Normalise le compte des résultats.\n * \n * @param {Object} count - Compte des résultats.\n * @returns {Object} - Compte normalisé.\n * @private\n */\n _normalizeCount(count = {}) {\n // suppression des indésirables\n delete count.spam;\n\n // calcul du total (somme des valeurs numériques)\n count.total = Object.values(count).reduce((acc, val) => acc + (typeof val === \"number\" ? val : 0), 0);\n\n return count;\n }\n\n /**\n * Récupère une valeur par défaut depuis un endpoint donné.\n *\n * @param {string} constant - Le nom unique de l’endpoint (ex: \"GET_ORGANIZATIONS_NO_ADMIN\")\n * @param {string} path - Le chemin vers la propriété (ex: \"searchType\")\n * @returns {*} La valeur par défaut, ou undefined si non trouvée\n */\n _getDefaultFromEndpoint(constant, path) {\n const endpoint = this.apiClient._endpoints.find((ep) => ep.constant === constant);\n if (!endpoint?.request?.properties?.[path]) return undefined;\n return endpoint.request.properties[path].default;\n }\n\n /**\n * Coeur de pagination stateless et réutilisable, sans logique métier.\n *\n * @param {Object} config\n * @param {Object} config.initialData - Paramètres de départ\n * @param {Function} config.finalizer - Fonction async qui retourne { results, count }\n *\n * @returns {Object} paginator avec .next() et .prev()\n */\n _createPaginatorEngine({ initialData, finalizer }) {\n const Entity = this;\n\n const state = {\n cursor: undefined,\n count: 0,\n index: 0,\n history: [],\n sizes: []\n };\n\n const hasStep = (d) => d?.indexStep && d.indexStep > 0;\n\n async function getPage(isNext = false) {\n let data = { ...initialData };\n\n if (!state.cursor || (!isNext && state.history.length === 0)) {\n state.count = 0;\n state.index = 0;\n state.history = [];\n state.sizes = [];\n\n data.countType = data.searchType;\n\n if (!data?.searchBy && hasStep(data)) {\n data.ranges = Entity._generateRanges(data.searchType, data.indexStep);\n data.indexMin = data.indexMin ?? 0;\n data.indexMax = data.indexMax ?? data.indexStep;\n } else if (data?.searchBy === \"ALL\" && hasStep(data)) {\n data.indexMin = data.indexMin ?? 0;\n data.indexMax = data.indexMax ?? data.indexStep;\n }\n\n state.cursor = { ...data };\n }\n\n const cursor = state.cursor;\n\n if (isNext) {\n state.history.push({ ...cursor });\n\n if (!cursor.searchBy && hasStep(cursor)) {\n cursor.ranges = Entity._generateRanges(cursor.searchType, cursor.indexStep, cursor.ranges);\n cursor.indexMin = cursor.indexMax ?? 0;\n cursor.indexMax = (cursor.indexMax ?? 0) + cursor.indexStep;\n } else if (cursor.searchBy === \"ALL\" && hasStep(cursor)) {\n cursor.indexMin = cursor.indexMax ?? 0;\n cursor.indexMax = (cursor.indexMax ?? 0) + cursor.indexStep;\n }\n\n state.cursor = { ...cursor };\n }\n\n data = { ...state.cursor };\n\n if (!isNext && (!data?.searchType || !Array.isArray(data.searchType) || data.searchType.length === 0)) {\n throw new Error(\"searchType non défini\");\n }\n\n const result = await finalizer(data);\n if (!Array.isArray(result.results)) {\n throw new Error(\"Les résultats doivent être un tableau\");\n }\n\n state.count += result.results.length;\n state.sizes.push(result.results.length);\n if (isNext) state.index++;\n\n const count = Entity._normalizeCount(result.count);\n const rawList = Entity._linkEntities(result.results);\n\n const hasNext = hasStep(data) && state.count < count.total;\n const hasPrev = state.history.length > 0;\n\n return {\n count,\n results: rawList,\n pageIndex: state.index,\n pageNumber: state.index + 1,\n hasNext,\n hasPrev,\n next: hasNext ? () => getPage(true) : undefined,\n prev: hasPrev\n ? async () => {\n const previous = state.history.pop();\n const lastPageSize = state.sizes.pop() ?? 0;\n state.count -= lastPageSize;\n state.index = Math.max(0, state.index - 1);\n state.cursor = { ...previous };\n return getPage(false);\n }\n : undefined\n };\n }\n\n return {\n next: () => getPage(false)\n };\n }\n\n /**\n * Injection de contexte Communecter dans une requête finalizer.\n *\n * @param {Function} baseFinalizer - fonction async(data) => { results, count }\n * @returns {Function} fonction enrichie\n */\n _withCostumContext(baseFinalizer) {\n return async (data) => {\n const finalData = {\n ...data,\n costumSlug: this.serverData.slug,\n contextId: this.serverData.id,\n contextType: this.getEntityType(),\n sourceKey: [...(data.sourceKey || []), this.serverData.slug]\n };\n return baseFinalizer(finalData);\n };\n }\n\n /**\n * ───────────────────────────────\n * custom\n * ───────────────────────────────\n */\n\n /**\n * Recherche liée à l'entité, version stateless.\n *\n * @param {Object} data - Données initiales de recherche.\n * @returns {Object} - Un paginateur avec .next(), .prev(), etc.\n */\n async searchCostum(data = {}) {\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: this._withCostumContext((finalData) => this.endpointApi.globalAutocompleteCostum(finalData)),\n });\n\n return paginator.next();\n }\n\n async costumEventRequestActors(data = {}){\n\n data = {\n pathParams: {\n id: this.id,\n type: this.getEntityType()\n },\n ...data\n };\n\n const wrappedFinalizer = this._withCostumContext((finalData) => this.endpointApi.costumEventRequestActors(finalData));\n\n const actors = await wrappedFinalizer(data);\n\n // const transformedActors = actors\n // .filter(actor => {\n // const isValid = !!actor?.type;\n // if (!isValid) {\n // this.apiClient._logger?.warn?.(`Objet ignoré car sans 'type' : ${actor?.id}`);\n // }\n // return isValid;\n // })\n // .map(({ id, name, type, ...meta }) => ({\n // id,\n // name,\n // collection: type,\n // meta\n // }));\n\n // const rawList = this._linkEntities(transformedActors);\n\n return actors;\n }\n\n async costumEventRequestSubevents(data = {}){\n\n data = {\n pathParams: {\n id: this.id,\n type: this.getEntityType()\n },\n ...data\n };\n\n const wrappedFinalizer = this._withCostumContext((finalData) => this.endpointApi.costumEventRequestSubevents(finalData));\n\n return wrappedFinalizer(data);\n }\n\n async costumEventRequestDates(data = {}){\n data = {\n pathParams: {\n id: this.id,\n type: this.getEntityType()\n },\n ...data\n };\n\n const wrappedFinalizer = this._withCostumContext((finalData) => this.endpointApi.costumEventRequestDates(finalData));\n\n return wrappedFinalizer(data);\n }\n\n async costumEventRequestElementEvent(data = {}){\n data = {\n pathParams: {\n id: this.id,\n type: this.getEntityType()\n },\n ...data\n };\n\n const wrappedFinalizer = this._withCostumContext((finalData) => this.endpointApi.costumEventRequestElementEvent(finalData));\n\n return wrappedFinalizer(data);\n }\n\n async costumEventRequestCategories(data = {}){\n data = {\n pathParams: {\n id: this.id,\n type: this.getEntityType()\n },\n ...data\n };\n\n const wrappedFinalizer = this._withCostumContext((finalData) => this.endpointApi.costumEventRequestCategories(finalData));\n\n return wrappedFinalizer(data);\n }\n\n async costumEventRequestEvent(data = {}){\n data = {\n pathParams: {\n id: this.id,\n type: this.getEntityType()\n },\n ...data\n };\n\n const wrappedFinalizer = this._withCostumContext((finalData) => this.endpointApi.costumEventRequestEvent(finalData));\n\n return wrappedFinalizer(data);\n }\n\n async costumEventRequestLinkTlToEvent(data = {}){\n data = {\n pathParams: {\n id: this.id,\n type: this.getEntityType()\n },\n ...data\n };\n\n const wrappedFinalizer = this._withCostumContext((finalData) => this.endpointApi.costumEventRequestLinkTlToEvent(finalData));\n\n return wrappedFinalizer(data);\n }\n\n async costumEventRequestLoadContextTag(data = {}){\n data = {\n pathParams: {\n id: this.id,\n type: this.getEntityType()\n },\n ...data\n };\n\n const wrappedFinalizer = this._withCostumContext((finalData) => this.endpointApi.costumEventRequestLoadContextTag(finalData));\n\n return wrappedFinalizer(data);\n }\n\n\n}\n\nexport default BaseEntity;\n","import { ApiError } from \"../error.js\";\nimport BaseEntity from \"./BaseEntity.js\";\n\nexport class Badge extends BaseEntity {\n static entityType = \"badges\";\n\n static entityTag = \"Badge\";\n\n static SCHEMA_CONSTANTS = [\n \"ADD_BADGES\",\n ];\n\n static ADD_BLOCKS = new Map([\n [\"ADD_BADGES\", \"addBadges\"]\n ]);\n\n static UPDATE_BLOCKS = new Map([\n ]);\n\n defaultFields = {\n\n };\n\n removeFields = [];\n\n transforms = {\n\n };\n\n async _add(payload) {\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _add, utilisez save\");\n }\n payload.id = this._newId?.();\n if (payload.slug) delete payload.slug;\n\n for (const [constant, methodName] of Badge.ADD_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => {}\n );\n if (blockData && Object.keys(blockData).length > 0) {\n const data = await this[methodName](blockData);\n if (!this.id && data?.map?.id) {\n this._draftData.id = data.map.id;\n this._draftData.slug = data.map.slug;\n }\n }\n }\n }\n\n async _update(payload) {\n // TODO: qui peut modifier un badge ?\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _update, utilisez save\");\n }\n if (payload.id) delete payload.id;\n let hasChanged = false;\n\n for (const [constant, methodName] of Badge.UPDATE_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => this.initialDraftData,\n this.removeFields\n );\n if (blockData && Object.keys(blockData).length > 0) {\n await this[methodName](blockData);\n hasChanged = true;\n }\n }\n\n return hasChanged;\n }\n\n async getOrganizations() {\n throw new ApiError(`getOrganizations n'existe pas dans ${this.constructor.name}`);\n }\n\n async getProjects() {\n throw new ApiError(`getProjects n'existe pas dans ${this.constructor.name}`);\n }\n\n async getEvents() {\n throw new ApiError(`getEvents n'existe pas dans ${this.constructor.name}`);\n }\n\n async getPois() {\n throw new ApiError(`getPois n'existe pas dans ${this.constructor.name}`);\n }\n\n async getBadgesIssuer() {\n throw new ApiError(`getBadgesIssuer n'existe pas dans ${this.constructor.name}`);\n }\n\n async getNews() {\n throw new ApiError(`getNews n'existe pas dans ${this.constructor.name}`);\n }\n\n async getSubscribers() {\n throw new ApiError(`getSubscribers n'existe pas dans ${this.constructor.name}`);\n }\n\n async project() {\n throw new ApiError(`project n'existe pas dans ${this.constructor.name}`);\n }\n\n async poi() {\n throw new ApiError(`poi n'existe pas dans ${this.constructor.name}`);\n }\n\n async event() {\n throw new ApiError(`event n'existe pas dans ${this.constructor.name}`);\n }\n\n async badge() {\n throw new ApiError(`badge n'existe pas dans ${this.constructor.name}`);\n }\n\n async news() {\n throw new ApiError(`news n'existe pas dans ${this.constructor.name}`);\n }\n\n}\n","// Fichier généré automatiquement\n// @ts-check\nimport { ApiAuthenticationError } from \"../error.js\";\n\n/**\n * @typedef {import(\"../error.js\").ApiResponseError} ApiResponseError\n */\n\n/**\n * Classe EndpointApi générée automatiquement depuis endpoints-copie.json\n */\nclass EndpointApi {\n constructor(apiClient) {\n this.apiClient = apiClient;\n }\n\n get isConnected() {\n return this.apiClient.isConnected;\n }\n\n get userId() {\n return this.apiClient.userId;\n }\n\n async call(constant, data = {}) {\n return this.apiClient.safeCall(async () => {\n const response = await this.apiClient.callEndpoint(constant, data);\n this.apiClient.checkAndThrowApiResponseError(response);\n return response.data;\n });\n }\n\n async callNoConnected(constant, data = {}) {\n if (this.isConnected) {\n throw new ApiAuthenticationError(\"Vous ne devez pas être connecté pour faire cette action.\");\n }\n return this.call(constant, data);\n }\n\n async callIsConnected(constant, data = {}) {\n if (!this.isConnected) {\n throw new ApiAuthenticationError(\"Vous devez être connecté pour effectuer cette action.\");\n }\n return this.call(constant, data);\n }\n\n \n /**\n * Enregistrement d'un utilisateur : Permet d’enregistrer un nouvel utilisateur avec ses informations personnelles.\n * Constant : PERSON_REGISTER\n * @param {import(\"./EndpointApi.types\").PersonRegisterData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async personRegister(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callNoConnected(\"PERSON_REGISTER\", data);\n }\n \n /**\n * Authentification : Permet de se connecter en utilisant une adresse email et un mot de passe.\n * Constant : AUTHENTICATE_URL\n * @param {import(\"./EndpointApi.types\").AuthenticateUrlData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async authenticateUrl(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callNoConnected(\"AUTHENTICATE_URL\", data);\n }\n \n /**\n * Rafraîchir un token : Permet de rafraîchir un token d'accès expiré en utilisant un token de rafraîchissement.\n * Constant : REFRESH_TOKEN_URL\n * @param {import(\"./EndpointApi.types\").RefreshTokenUrlData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async refreshTokenUrl(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"REFRESH_TOKEN_URL\", data);\n }\n \n /**\n * Récupérer les informations utilisateur : Récupère les informations du profil utilisateur pour un token donné.\n * Constant : ME_INFO_URL\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async meInfoUrl() {\n return this.callIsConnected(\"ME_INFO_URL\");\n }\n \n /**\n * Récupération de mot de passe : Envoie un email pour récupérer le mot de passe.\n * Constant : PASSWORD_RECOVERY\n * @param {import(\"./EndpointApi.types\").PasswordRecoveryData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async passwordRecovery(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callNoConnected(\"PASSWORD_RECOVERY\", data);\n }\n \n /**\n * Échange de token avec un autre serveur : Permet de se connecter à un autre serveur Communecter en échangeant un token.\n * Constant : SERVER_EXCHANGE_TOKEN\n * @param {import(\"./EndpointApi.types\").ServerExchangeTokenData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async serverExchangeToken(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"SERVER_EXCHANGE_TOKEN\", data);\n }\n \n /**\n * Changer le mot de passe : Permet de changer le mot de passe d'un utilisateur.\n * Constant : CHANGE_PASSWORD\n * @param {import(\"./EndpointApi.types\").ChangePasswordData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async changePassword(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"CHANGE_PASSWORD\", data);\n }\n \n /**\n * Supprimer un compte : Permet de supprimer un compte utilisateur.\n * Constant : DELETE_ACCOUNT\n * @param {import(\"./EndpointApi.types\").DeleteAccountData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async deleteAccount(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"DELETE_ACCOUNT\", data);\n }\n \n /**\n * Mettre à jour les paramètres d'un élément : Mise à jour des paramètres spécifiques d'un élément.\n * Constant : UPDATE_SETTINGS\n * @param {import(\"./EndpointApi.types\").UpdateSettingsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateSettings(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"UPDATE_SETTINGS\", data);\n }\n \n /**\n * Mettre à jour la description d'un élément : Permet de mettre à jour la description courte et complète d'un élément.\n * Constant : UPDATE_BLOCK_DESCRIPTION\n * @param {import(\"./EndpointApi.types\").UpdateBlockDescriptionData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateBlockDescription(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"UPDATE_BLOCK_DESCRIPTION\", data);\n }\n \n /**\n * Mettre à jour les informations d'un élément : Permet de mettre à jour les informations générales d'un élément (nom, contacts, etc.).\n * Constant : UPDATE_BLOCK_INFO\n * @param {import(\"./EndpointApi.types\").UpdateBlockInfoData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateBlockInfo(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"UPDATE_BLOCK_INFO\", data);\n }\n \n /**\n * Mettre à jour les réseaux sociaux d'un élément : Permet de mettre à jour les liens vers les réseaux sociaux d'un élément.\n * Constant : UPDATE_BLOCK_SOCIAL\n * @param {import(\"./EndpointApi.types\").UpdateBlockSocialData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateBlockSocial(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"UPDATE_BLOCK_SOCIAL\", data);\n }\n \n /**\n * Mettre à jour les localités d'un élément : Permet de mettre à jour l'adresse et les informations géographiques d'un élément.\n * Constant : UPDATE_BLOCK_LOCALITY\n * @param {import(\"./EndpointApi.types\").UpdateBlockLocalityData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateBlockLocality(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"UPDATE_BLOCK_LOCALITY\", data);\n }\n \n /**\n * Mettre à jour le slug d'un élément : Permet de mettre à jour le slug pour une URL simplifiée.\n * Constant : UPDATE_BLOCK_SLUG\n * @param {import(\"./EndpointApi.types\").UpdateBlockSlugData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateBlockSlug(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"UPDATE_BLOCK_SLUG\", data);\n }\n \n /**\n * Vérifier l'état d'une URL : Vérifie si une URL (slug) est valide ou disponible.\n * Constant : CHECK\n * @param {import(\"./EndpointApi.types\").CheckData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async check(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"CHECK\", data);\n }\n \n /**\n * Mettre à jour l'image de profil : Permet de mettre à jour l'image de profil d'un utilisateur ou d'une entité.\n * Constant : PROFIL_IMAGE\n * @param {import(\"./EndpointApi.types\").ProfilImageData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async profilImage(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"PROFIL_IMAGE\", data);\n }\n \n /**\n * Obtenir les éléments liés : Récupère les informations détaillées d'un élément et de ses éléments liés.\n * Constant : GET_ELEMENTS_ABOUT\n * @param {import(\"./EndpointApi.types\").GetElementsAboutData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getElementsAbout(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_ELEMENTS_ABOUT\", data);\n }\n \n /**\n * Gérer des connexions multiples : Permet d’inviter ou de connecter plusieurs utilisateurs en même temps à une entité.\n * Constant : MULTICONNECT\n * @param {import(\"./EndpointApi.types\").MulticonnectData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async multiconnect(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"MULTICONNECT\", data);\n }\n \n /**\n * Récupérer les actualités : Récupère la liste d’actualités selon plusieurs critères.\n * Constant : GET_NEWS\n * @param {import(\"./EndpointApi.types\").GetNewsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getNews(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_NEWS\", data);\n }\n \n /**\n * Récupérer des actualités par IDs : Récupère des actualités à partir d’une liste d’identifiants.\n * Constant : GET_NEWS_BY_ID\n * @param {import(\"./EndpointApi.types\").GetNewsByIdData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getNewsById(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_NEWS_BY_ID\", data);\n }\n \n /**\n * Ajouter une actualité : Ajoute une nouvelle actualité.\n * Constant : ADD_NEWS\n * @param {import(\"./EndpointApi.types\").AddNewsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addNews(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_NEWS\", data);\n }\n \n /**\n * Ajouter une image à une actualité : Ajoute une images à une actualité.\n * Constant : ADD_IMAGE_NEWS\n * @param {import(\"./EndpointApi.types\").AddImageNewsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addImageNews(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_IMAGE_NEWS\", data);\n }\n \n /**\n * Ajouter un fichier à une actualité : Ajoute un fichier à une actualité.\n * Constant : ADD_FILE_NEWS\n * @param {import(\"./EndpointApi.types\").AddFileNewsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addFileNews(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_FILE_NEWS\", data);\n }\n \n /**\n * Supprimer une actualité : Supprime une actualité existante.\n * Constant : DELETE_NEWS\n * @param {import(\"./EndpointApi.types\").DeleteNewsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async deleteNews(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"DELETE_NEWS\", data);\n }\n \n /**\n * Mettre à jour une actualité : Met à jour le contenu d’une actualité existante.\n * Constant : UPDATE_NEWS\n * @param {import(\"./EndpointApi.types\").UpdateNewsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateNews(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"UPDATE_NEWS\", data);\n }\n \n /**\n * Partager une actualité : Partage une actualité avec une entité ou un utilisateur.\n * Constant : SHARE_NEWS\n * @param {import(\"./EndpointApi.types\").ShareNewsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async shareNews(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"SHARE_NEWS\", data);\n }\n \n /**\n * Récupérer les commentaires : Récupère les commentaires d’un élément.\n * Constant : GET_COMMENTS\n * @param {import(\"./EndpointApi.types\").GetCommentsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getComments(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_COMMENTS\", data);\n }\n \n /**\n * Ajouter un commentaire : Ajoute un commentaire à une actualité ou autre contexte.\n * Constant : ADD_COMMENTS\n * @param {import(\"./EndpointApi.types\").AddCommentsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addComments(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_COMMENTS\", data);\n }\n \n /**\n * Supprimer un commentaire : Supprime un commentaire existant.\n * Constant : DELETE_COMMENTS\n * @param {import(\"./EndpointApi.types\").DeleteCommentsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async deleteComments(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"DELETE_COMMENTS\", data);\n }\n \n /**\n * Mettre à jour un commentaire : Met à jour le contenu d’un commentaire.\n * Constant : UPDATE_COMMENTS\n * @param {import(\"./EndpointApi.types\").UpdateCommentsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateComments(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"UPDATE_COMMENTS\", data);\n }\n \n /**\n * Rechercher des tags : Recherche des tags correspondant à un mot-clé.\n * Constant : SEARCH_TAGS\n * @param {import(\"./EndpointApi.types\").SearchTagsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async searchTags(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"SEARCH_TAGS\", data);\n }\n \n /**\n * Afficher les votes d'une actualité : Récupère la liste des votes (like, love, etc.) sur une actualité.\n * Constant : SHOW_VOTE\n * @param {import(\"./EndpointApi.types\").ShowVoteData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async showVote(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"SHOW_VOTE\", data);\n }\n \n /**\n * Recherche globale avec autocomplétion : Effectue une recherche globale avec possibilité d’autocomplétion.\n * Constant : GLOBAL_AUTOCOMPLETE\n * @param {import(\"./EndpointApi.types\").GlobalAutocompleteData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async globalAutocomplete(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GLOBAL_AUTOCOMPLETE\", data);\n }\n \n /**\n * Recherche de villes avec autocomplétion : Recherche des villes en fonction d’un nom, autocomplétion rapide.\n * Constant : CITY_AUTOCOMPLETE\n * @param {import(\"./EndpointApi.types\").CityAutocompleteData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async cityAutocomplete(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"CITY_AUTOCOMPLETE\", data);\n }\n \n /**\n * Recherche de villes par pays : Recherche de villes par pays avec autocomplétion.\n * Constant : CITY_AUTOCOMPLETE_BY_COUNTRY\n * @param {import(\"./EndpointApi.types\").CityAutocompleteByCountryData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async cityAutocompleteByCountry(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"CITY_AUTOCOMPLETE_BY_COUNTRY\", data);\n }\n \n /**\n * Suggestions d'entrée : Fournit des suggestions basées sur le nom recherché, etc.\n * Constant : SUGGESTION_INPUT\n * @param {import(\"./EndpointApi.types\").SuggestionInputData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async suggestionInput(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"SUGGESTION_INPUT\", data);\n }\n \n /**\n * Récupérer les projets non administrables : Récupère les projets accessibles sans droits d'administration.\n * Constant : GET_PROJECTS_NO_ADMIN\n * @param {import(\"./EndpointApi.types\").GetProjectsNoAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getProjectsNoAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_PROJECTS_NO_ADMIN\", data);\n }\n \n /**\n * Récupérer les projets administrables : Récupère les projets pour lesquels l'utilisateur a des droits d'administration.\n * Constant : GET_PROJECTS_ADMIN\n * @param {import(\"./EndpointApi.types\").GetProjectsAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getProjectsAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_PROJECTS_ADMIN\", data);\n }\n \n /**\n * Récupérer les POIs non administrables : Récupère la liste des POIs accessibles sans droits d'administration.\n * Constant : GET_POIS_NO_ADMIN\n * @param {import(\"./EndpointApi.types\").GetPoisNoAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getPoisNoAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_POIS_NO_ADMIN\", data);\n }\n \n /**\n * Récupérer les POIs administrables : Récupère la liste des POIs administrables par l’utilisateur.\n * Constant : GET_POIS_ADMIN\n * @param {import(\"./EndpointApi.types\").GetPoisAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getPoisAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_POIS_ADMIN\", data);\n }\n \n /**\n * Récupérer les organisations non administrables : Récupère la liste des organisations auxquelles l’utilisateur appartient sans les administrer.\n * Constant : GET_ORGANIZATIONS_NO_ADMIN\n * @param {import(\"./EndpointApi.types\").GetOrganizationsNoAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getOrganizationsNoAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_ORGANIZATIONS_NO_ADMIN\", data);\n }\n \n /**\n * Récupérer les organisations administrables : Récupère les organisations administrées par l’utilisateur.\n * Constant : GET_ORGANIZATIONS_ADMIN\n * @param {import(\"./EndpointApi.types\").GetOrganizationsAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getOrganizationsAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_ORGANIZATIONS_ADMIN\", data);\n }\n \n /**\n * Récupérer les membres non administrables : Récupère les membres d’une organisation sans droits d’admin.\n * Constant : GET_MEMBERS_NO_ADMIN\n * @param {import(\"./EndpointApi.types\").GetMembersNoAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getMembersNoAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_MEMBERS_NO_ADMIN\", data);\n }\n \n /**\n * Récupérer les membres administrables : Récupère les membres d’une organisation administrée par l’utilisateur.\n * Constant : GET_MEMBERS_ADMIN\n * @param {import(\"./EndpointApi.types\").GetMembersAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getMembersAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_MEMBERS_ADMIN\", data);\n }\n \n /**\n * Récupérer les amis administrables : Récupère les amis administrée par l’utilisateur.\n * Constant : GET_FRIENDS_ADMIN\n * @param {import(\"./EndpointApi.types\").GetFriendsAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getFriendsAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_FRIENDS_ADMIN\", data);\n }\n \n /**\n * Récupérer les suivis non administrables : Liste les entités suivies sans droits d’admin.\n * Constant : GET_SUBSCRIPTIONS\n * @param {import(\"./EndpointApi.types\").GetSubscriptionsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getSubscriptions(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_SUBSCRIPTIONS\", data);\n }\n \n /**\n * Récupérer les suivis administrables : Liste les entités suivies par l’utilisateur, sur lesquelles il est admin.\n * Constant : GET_SUBSCRIPTIONS_ADMIN\n * @param {import(\"./EndpointApi.types\").GetSubscriptionsAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getSubscriptionsAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_SUBSCRIPTIONS_ADMIN\", data);\n }\n \n /**\n * Récupérer les abonnés non administrables : Liste les abonnés sans droits d’admin.\n * Constant : GET_SUBSCRIBERS\n * @param {import(\"./EndpointApi.types\").GetSubscribersData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getSubscribers(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_SUBSCRIBERS\", data);\n }\n \n /**\n * Récupérer les abonnés administrables : Liste les abonnés d’une entité administrée par l’utilisateur.\n * Constant : GET_SUBSCRIBERS_ADMIN\n * @param {import(\"./EndpointApi.types\").GetSubscribersAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getSubscribersAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_SUBSCRIBERS_ADMIN\", data);\n }\n \n /**\n * Récupérer les contributeurs non administrables : Récupère les contributeurs sans droits d’admin.\n * Constant : GET_CONTRIBUTORS_NO_ADMIN\n * @param {import(\"./EndpointApi.types\").GetContributorsNoAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getContributorsNoAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_CONTRIBUTORS_NO_ADMIN\", data);\n }\n \n /**\n * Récupérer les contributeurs administrables : Récupère les contributeurs d’un project l’utilisateur est admin.\n * Constant : GET_CONTRIBUTORS_ADMIN\n * @param {import(\"./EndpointApi.types\").GetContributorsAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getContributorsAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_CONTRIBUTORS_ADMIN\", data);\n }\n \n /**\n * Recherche globale des badges : Recherche des badges publics en fonction de divers critères.\n * Constant : GET_BADGES\n * @param {import(\"./EndpointApi.types\").GetBadgesData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getBadges(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_BADGES\", data);\n }\n \n /**\n * Recherche globale des badges : Recherche des badges publics en fonction de divers critères.\n * Constant : GET_BADGES_FILTERS\n * @param {import(\"./EndpointApi.types\").GetBadgesFiltersData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getBadgesFilters(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_BADGES_FILTERS\", data);\n }\n \n /**\n * Suivre un élément : Permet à un utilisateur de suivre un élément (projet, organisation...).\n * Constant : CONNECT\n * @param {import(\"./EndpointApi.types\").ConnectData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async connect(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"CONNECT\", data);\n }\n \n /**\n * Se déconnecter d'un élément : Permet de supprimer le lien entre un utilisateur et un élément.\n * Constant : DISCONNECT\n * @param {import(\"./EndpointApi.types\").DisconnectData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async disconnect(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"DISCONNECT\", data);\n }\n \n /**\n * Récuperer l'id et la collection d'un element en fonction du slug : Récuperer l'id et la collection d'un element en fonction du slug\n * Constant : GET_ELEMENTS_KEY\n * @param {import(\"./EndpointApi.types\").GetElementsKeyData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getElementsKey(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_ELEMENTS_KEY\", data);\n }\n \n /**\n * Récupérer les favoris d'un utilisateur : Récupère la liste des favoris d’un utilisateur.\n * Constant : GET_FAVORIS\n * @param {import(\"./EndpointApi.types\").GetFavorisData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getFavoris(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_FAVORIS\", data);\n }\n \n /**\n * Supprimer un favori : Supprime un élément des favoris de l’utilisateur.\n * Constant : DELETE_FAVORIS\n * @param {import(\"./EndpointApi.types\").DeleteFavorisData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async deleteFavoris(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"DELETE_FAVORIS\", data);\n }\n \n /**\n * Ajouter un favori : Ajoute un élément aux favoris de l’utilisateur.\n * Constant : ADD_FAVORIS\n * @param {import(\"./EndpointApi.types\").AddFavorisData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addFavoris(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_FAVORIS\", data);\n }\n \n /**\n * Créer une organisation : Crée une nouvelle organisation.\n * Constant : ADD_ORGANIZATION\n * @param {import(\"./EndpointApi.types\").AddOrganizationData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addOrganization(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_ORGANIZATION\", data);\n }\n \n /**\n * Créer un projet : Crée un nouveau projet avec des informations de base et des options supplémentaires.\n * Constant : ADD_PROJECT\n * @param {import(\"./EndpointApi.types\").AddProjectData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addProject(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_PROJECT\", data);\n }\n \n /**\n * Créer un POI : Crée un nouveau POI (Point d'Intérêt).\n * Constant : ADD_POI\n * @param {import(\"./EndpointApi.types\").AddPoiData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addPoi(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_POI\", data);\n }\n \n /**\n * Créer un événement : Crée un nouvel événement.\n * Constant : ADD_EVENT\n * @param {import(\"./EndpointApi.types\").AddEventData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addEvent(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_EVENT\", data);\n }\n \n /**\n * Supprimer un POI : Supprime un POI existant.\n * Constant : DELETE_POI\n * @param {import(\"./EndpointApi.types\").DeletePoiData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async deletePoi(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"DELETE_POI\", data);\n }\n \n /**\n * Supprimer un événement : Supprime un événement spécifique.\n * Constant : DELETE_EVENT\n * @param {import(\"./EndpointApi.types\").DeleteEventData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async deleteEvent(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"DELETE_EVENT\", data);\n }\n \n /**\n * Supprimer un élément : Supprime un élément existant.\n * Constant : DELETE_ELEMENT\n * @param {import(\"./EndpointApi.types\").DeleteElementData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async deleteElement(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"DELETE_ELEMENT\", data);\n }\n \n /**\n * Ajouter une image à un élément : Ajoute une image à un élément.\n * Constant : ADD_IMAGE_ELEMENT\n * @param {import(\"./EndpointApi.types\").AddImageElementData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addImageElement(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_IMAGE_ELEMENT\", data);\n }\n \n /**\n * Valider un lien : Permet de valider un lien (ex: rejoindre un projet, accepter un membre...).\n * Constant : LINK_VALIDATE\n * @param {import(\"./EndpointApi.types\").LinkValidateData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async linkValidate(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"LINK_VALIDATE\", data);\n }\n \n /**\n * Recherche avec autocomplétion (membres) : Recherche des membres avec autocomplétion.\n * Constant : SEARCH_MEMBER_AUTOCOMPLETE\n * @param {import(\"./EndpointApi.types\").SearchMemberAutocompleteData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async searchMemberAutocomplete(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"SEARCH_MEMBER_AUTOCOMPLETE\", data);\n }\n \n /**\n * Récupérer les notifications : Récupère la liste des notifications pour un utilisateur.\n * Constant : GET_NOTIFICATIONS\n * @param {import(\"./EndpointApi.types\").GetNotificationsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getNotifications(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_NOTIFICATIONS\", data);\n }\n \n /**\n * Récupérer le nombre de notifications : Récupère le nombre de notifications pour un utilisateur.\n * Constant : GET_NOTIFICATIONS_COUNT\n * @param {import(\"./EndpointApi.types\").GetNotificationsCountData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getNotificationsCount(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_NOTIFICATIONS_COUNT\", data);\n }\n \n /**\n * Mettre à jour toutes les notifications : Marque toutes les notifications comme vues ou lues.\n * Constant : NOTIFICATION_UPDATE\n * @param {import(\"./EndpointApi.types\").NotificationUpdateData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async notificationUpdate(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"NOTIFICATION_UPDATE\", data);\n }\n \n /**\n * Supprimer toutes les notifications : Supprime toutes les notifications de l’utilisateur.\n * Constant : REMOVE_ALL_NOTIFICATIONS\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async removeAllNotifications() {\n return this.callIsConnected(\"REMOVE_ALL_NOTIFICATIONS\");\n }\n \n /**\n * Marquer une notification comme lue : Marque une notification spécifique comme lue.\n * Constant : MARK_NOTIFICATION_AS_READ\n * @param {import(\"./EndpointApi.types\").MarkNotificationAsReadData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async markNotificationAsRead(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"MARK_NOTIFICATION_AS_READ\", data);\n }\n \n /**\n * Recherche ActivityPub : Recherche des éléments ActivityPub selon une adresse ou un terme.\n * Constant : ACTIVITYPUB_SEARCH\n * @param {import(\"./EndpointApi.types\").ActivitypubSearchData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async activitypubSearch(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"ACTIVITYPUB_SEARCH\", data);\n }\n \n /**\n * Mettre à jour une activité (ActivityPub) : Met à jour une activité ActivityPub avec une action et un payload.\n * Constant : ACTIVITYPUB_LINK\n * @param {import(\"./EndpointApi.types\").ActivitypubLinkData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async activitypubLink(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ACTIVITYPUB_LINK\", data);\n }\n \n /**\n * Obtenir la liste ActivityPub : Obtient la liste des communautés ActivityPub pour un utilisateur.\n * Constant : ACTIVITYPUB_GET_COMMUNITY\n * @param {import(\"./EndpointApi.types\").ActivitypubGetCommunityData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async activitypubGetCommunity(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"ACTIVITYPUB_GET_COMMUNITY\", data);\n }\n \n /**\n * Récupérer les informations d'un badge : Récupère les détails d’un badge par son ID.\n * Constant : GET_BADGE\n * @param {import(\"./EndpointApi.types\").GetBadgeData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getBadge(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_BADGE\", data);\n }\n \n /**\n * Obtenir la liste des émetteurs de badges : Récupère la liste des émetteurs pour les badges.\n * Constant : GET_EMETTEUR_BADGES\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getEmetteurBadges() {\n return this.call(\"GET_EMETTEUR_BADGES\");\n }\n \n /**\n * Créer un badge : Crée un nouveau badge avec des informations détaillées.\n * Constant : ADD_BADGES\n * @param {import(\"./EndpointApi.types\").AddBadgesData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addBadges(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_BADGES\", data);\n }\n \n /**\n * Attribuer un badge : Attribue un badge à une ou plusieurs personnes ou entités.\n * Constant : ASSIGN_BADGES\n * @param {import(\"./EndpointApi.types\").AssignBadgesData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async assignBadges(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ASSIGN_BADGES\", data);\n }\n \n /**\n * Obtenir la liste des événements : Permet de rechercher des événements selon plusieurs critères (dates, nom, type...).\n * Constant : GET_EVENTS\n * @param {import(\"./EndpointApi.types\").GetEventsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getEvents(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_EVENTS\", data);\n }\n \n /**\n * Partager un événement : Partage un événement avec d’autres utilisateurs ou entités.\n * Constant : SHARE_EVENTS\n * @param {import(\"./EndpointApi.types\").ShareEventsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async shareEvents(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"SHARE_EVENTS\", data);\n }\n \n /**\n * Inviter des participants à un événement : Invite plusieurs utilisateurs ou entités à participer à un événement.\n * Constant : INVITE_EVENT\n * @param {import(\"./EndpointApi.types\").InviteEventData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async inviteEvent(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"INVITE_EVENT\", data);\n }\n \n /**\n * Suivre un utilisateur ou un élément : Suivre un utilisateur ou un élément.\n * Constant : FOLLOW\n * @param {import(\"./EndpointApi.types\").FollowData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async follow(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"FOLLOW\", data);\n }\n \n /**\n * Récuperer les data d'un JSON d'un costum : Récuperer les data d'un JSON d'un costum\n * Constant : GET_COSTUM_JSON\n * @param {import(\"./EndpointApi.types\").GetCostumJsonData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getCostumJson(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_COSTUM_JSON\", data);\n }\n \n /**\n * Recherche globale lier à un costum : Effectue une recherche globale lier à un costum\n * Constant : GLOBAL_AUTOCOMPLETE_COSTUM\n * @param {import(\"./EndpointApi.types\").GlobalAutocompleteCostumData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async globalAutocompleteCostum(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GLOBAL_AUTOCOMPLETE_COSTUM\", data);\n }\n \n /**\n * Récupérer les acteurs d'événement : Récupérer les acteurs (organizers, attendees, creators, animators) d'une entité événement.\n * Constant : COSTUM_EVENT_REQUEST_ACTORS\n * @param {import(\"./EndpointApi.types\").CostumEventRequestActorsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async costumEventRequestActors(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"COSTUM_EVENT_REQUEST_ACTORS\", data);\n }\n \n /**\n * Récupérer les sous-événements d’un événement parent : Retourne les sous-événements filtrés par date, type, tags, région, timezone.\n * Constant : COSTUM_EVENT_REQUEST_SUBEVENTS\n * @param {import(\"./EndpointApi.types\").CostumEventRequestSubeventsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async costumEventRequestSubevents(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"COSTUM_EVENT_REQUEST_SUBEVENTS\", data);\n }\n \n /**\n * Récupérer les événements liés à un élément : Retourne les événements liés à une entité (via links.events ou parent).\n * Constant : COSTUM_EVENT_REQUEST_ELEMENT_EVENT\n * @param {import(\"./EndpointApi.types\").CostumEventRequestElementEventData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async costumEventRequestElementEvent(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"COSTUM_EVENT_REQUEST_ELEMENT_EVENT\", data);\n }\n \n /**\n * Récupérer les catégories d’événements : Retourne la liste des types (catégories) d’événements enfants liés à l'entité.\n * Constant : COSTUM_EVENT_REQUEST_CATEGORIES\n * @param {import(\"./EndpointApi.types\").CostumEventRequestCategoriesData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async costumEventRequestCategories(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"COSTUM_EVENT_REQUEST_CATEGORIES\", data);\n }\n \n /**\n * Récupérer les dates de sous-événements : Retourne les dates des sous-événements à venir et passés, groupées par jour.\n * Constant : COSTUM_EVENT_REQUEST_DATES\n * @param {import(\"./EndpointApi.types\").CostumEventRequestDatesData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async costumEventRequestDates(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"COSTUM_EVENT_REQUEST_DATES\", data);\n }\n \n /**\n * Récupérer un événement par ID : Retourne les informations détaillées d’un événement par son ID.\n * Constant : COSTUM_EVENT_REQUEST_EVENT\n * @param {import(\"./EndpointApi.types\").CostumEventRequestEventData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async costumEventRequestEvent(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"COSTUM_EVENT_REQUEST_EVENT\", data);\n }\n \n /**\n * Associer une structure à un événement (adresse) : Associe une structure existante à un événement en copiant son adresse.\n * Constant : COSTUM_EVENT_REQUEST_LINK_TL_TO_EVENT\n * @param {import(\"./EndpointApi.types\").CostumEventRequestLinkTlToEventData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async costumEventRequestLinkTlToEvent(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"COSTUM_EVENT_REQUEST_LINK_TL_TO_EVENT\", data);\n }\n \n /**\n * Charger les tags de contexte d’un événement : Retourne les tags des sous-événements et des parents d’un événement, avec filtre optionnel.\n * Constant : COSTUM_EVENT_REQUEST_LOAD_CONTEXT_TAG\n * @param {import(\"./EndpointApi.types\").CostumEventRequestLoadContextTagData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async costumEventRequestLoadContextTag(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"COSTUM_EVENT_REQUEST_LOAD_CONTEXT_TAG\", data);\n }\n \n /**\n * Récupération de la galerie : Renvoie soit la liste d’albums associés à une entité, soit les images d’un album spécifique.\n * Constant : GET_GALLERY\n * @param {import(\"./EndpointApi.types\").GetGalleryData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getGallery(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_GALLERY\", data);\n }\n \n}\n\nexport default EndpointApi;\n","import { ApiError } from \"../error.js\";\nimport BaseEntity from \"./BaseEntity.js\";\n\nexport class Event extends BaseEntity {\n static entityType = \"events\";\n\n static entityTag = \"Event\";\n\n static SCHEMA_CONSTANTS = [\n \"ADD_EVENT\",\n // \"UPDATE_BLOCK_DESCRIPTION\",\n // \"UPDATE_BLOCK_INFO\",\n // \"UPDATE_BLOCK_SOCIAL\",\n // \"UPDATE_BLOCK_LOCALITY\",\n \"UPDATE_BLOCK_SLUG\",\n \"PROFIL_IMAGE\"\n ];\n\n static ADD_BLOCKS = new Map([\n [\"ADD_EVENT\", \"addEvent\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n static UPDATE_BLOCKS = new Map([\n // [\"UPDATE_BLOCK_DESCRIPTION\", \"updateDescription\"],\n // [\"UPDATE_BLOCK_SOCIAL\", \"updateSocial\"],\n // [\"UPDATE_BLOCK_LOCALITY\", \"updateLocality\"],\n // [\"UPDATE_BLOCK_INFO\", \"updateInfo\"],\n [\"UPDATE_BLOCK_SLUG\", \"updateSlug\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n defaultFields = {\n typeElement: this.getEntityType()\n };\n\n removeFields = [\n \"typeElement\"\n ];\n\n transforms = {\n parent: (val) => {\n if (!val || typeof val !== \"object\") return null;\n \n return Object.fromEntries(\n Object.entries(val).map(([key, obj]) => [\n key,\n {\n type: obj?.type ?? null,\n name: obj?.name ?? null\n }\n ])\n );\n },\n organizer: (val) => {\n if (!val || typeof val !== \"object\") return null;\n \n return Object.fromEntries(\n Object.entries(val).map(([key, obj]) => [\n key,\n {\n type: obj?.type ?? null,\n name: obj?.name ?? null\n }\n ])\n );\n }\n };\n\n async _add(payload) {\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _add, utilisez save\");\n }\n\n payload.id = this._newId?.();\n if (payload.slug) delete payload.slug;\n\n for (const [constant, methodName] of Event.ADD_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => {}\n );\n if (blockData && Object.keys(blockData).length > 0) {\n const data = await this[methodName](blockData);\n if (!this.id && data?.map?.id) {\n this._draftData.id = data.map.id;\n this._draftData.slug = data.map.slug;\n }\n }\n }\n }\n\n async _update(payload) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour modifier cet événement\", 403);\n }\n\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _update, utilisez save\");\n }\n\n let hasChanged = false;\n\n const blockData = this._extractAllValidFieldsFromSchema(\n this.apiClient,\n \"ADD_EVENT\",\n { ...payload, ...this.defaultFields },\n () => this.initialDraftData,\n this.removeFields\n );\n if (blockData && Object.keys(blockData).length > 0) {\n await this[\"addEvent\"](blockData);\n hasChanged = true;\n }\n\n if (payload.id) delete payload.id;\n\n for (const [constant, methodName] of Event.UPDATE_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => this.initialDraftData,\n this.removeFields\n );\n if (blockData && Object.keys(blockData).length > 0) {\n await this[methodName](blockData);\n hasChanged = true;\n }\n }\n\n return hasChanged;\n }\n\n async addEvent(data = {}) {\n\n if (!this.isMe && !data.organizer) {\n data.organizer = {};\n data.organizer[`${this.parent.id}`] = {\n type: this.parent.getEntityType(),\n name: this.parent.name\n };\n }\n\n return this.callIsConnected(() => this.endpointApi.addEvent(data));\n }\n\n async getOrganizations() {\n throw new ApiError(`getOrganizations n'existe pas dans ${this.constructor.name}`);\n }\n\n async getProjects() {\n throw new ApiError(`getProjects n'existe pas dans ${this.constructor.name}`);\n }\n\n async getEvents() {\n throw new ApiError(`getEvents - les sous-events ne sont pas encore implémentés dans ${this.constructor.name}`);\n }\n\n async getPois() {\n throw new ApiError(`getPois n'existe pas dans ${this.constructor.name}`);\n }\n\n async getBadgesIssuer() {\n throw new ApiError(`getBadgesIssuer n'existe pas dans ${this.constructor.name}`);\n }\n\n async getNews(data = {}) {\n return super.getNews(data);\n }\n\n async getSubscribers(data = {}) {\n return super.getSubscribers(data);\n }\n\n async project() {\n throw new ApiError(`project n'existe pas dans ${this.constructor.name}`);\n }\n\n async poi() {\n throw new ApiError(`poi n'existe pas dans ${this.constructor.name}`);\n }\n\n async event() {\n throw new ApiError(`les sous-events ne sont pas encore implémentés dans ${this.constructor.name}`);\n }\n\n async badge() {\n throw new ApiError(`badge n'existe pas dans ${this.constructor.name}`);\n }\n\n /**\n * Crée une instance de news et la récupère si nécessaire.\n * \n * @param {Object} newsData - Les données nécessaires pour initialiser la news.\n * @returns {Promise<News>} Une promesse qui résout l'objet News créé.\n * @throws {Error} Si une erreur se produit lors de la création de la news.\n */\n async news(newsData = {}) {\n return super.news(newsData);\n }\n\n /**\n * Suivre un événement.\n * Cette action permet à l'utilisateur de suivre un événement.\n * \n * @returns {Promise<Object>} - Résultat de l'action de suivi.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité ne supporte pas l'action.\n */\n async follow() {\n return super.follow();\n }\n\n /**\n * Se désabonne d'un événement.\n * \n * @returns {Promise<Object>} - Résultat de la désinscription.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité n'est pas enregistrée.\n */\n async unfollow() {\n return super.unfollow();\n }\n \n}\n","import { ApiError } from \"../error.js\";\nimport BaseEntity from \"./BaseEntity.js\";\n\nexport class News extends BaseEntity {\n static entityType = \"news\";\n\n static entityTag = \"News\";\n\n static SCHEMA_CONSTANTS = [\n \"ADD_NEWS\"\n ];\n\n static ADD_BLOCKS = new Map([\n [\"ADD_NEWS\", \"addNews\"]\n ]);\n\n static UPDATE_BLOCKS = new Map([\n [\"ADD_NEWS\", \"updateNews\"]\n ]);\n\n defaultFields = {\n\n };\n\n removeFields = [\n\n ];\n\n transforms = {\n scope: val => val?.type,\n mentions: val =>\n Array.isArray(val)\n ? val.map(m => ({ ...m, count: parseInt(m.count) }))\n : [],\n mediaImg: val => {\n const images = val?.images?.map(img => img.id).filter(Boolean) || [];\n return images.length > 0 ? { countImages: images.length, images } : undefined;\n },\n mediaFile: val => {\n const files = val?.files?.map(f => f.id).filter(Boolean) || [];\n return files.length > 0 ? { countFiles: files.length, files } : undefined;\n }\n };\n\n /**\n * Récupérer des actualités par IDs : Récupère des actualités à partir d’une liste d’identifiants.\n * Constant : GET_NEWS_BY_ID\n */\n async get() {\n if (!this.id) throw new ApiError(\"Impossible de rafraîchir sans ID.\");\n \n const newsArray = await this.callIsConnected(() =>\n this.endpointApi.getNewsById({ ids: [this.id] })\n );\n \n if (newsArray && Array.isArray(newsArray) && newsArray.length === 1) {\n const data = newsArray[0];\n this._setData(data);\n return this.serverData;\n }\n throw new ApiError(`Aucune actualité trouvée pour l'ID ${this.id}`);\n }\n\n \n async _add(payload) {\n if (!this._calledFromSave) {\n throw new Error(\"utilisation invalide de _add, utilisez save\");\n }\n\n // si le texte est vide, on met un espace pour que le champ soit pris en compte car sur le serveur\n // il y a une vérification de la taille du texte je pense\n if(payload.text === \"\"){\n payload.text = \" \";\n }\n payload.parentId = this.parent.id;\n payload.parentType = this.parent.getEntityType();\n \n // const data = await this.callIsConnected(() => this.endpointApi.addNews(payload));\n // this._draftData.id = data.object.id;\n // // TODO : voir si j'ai ce qui faut dans reponseData de ADD_NEWS pour mettre à jour #serverData\n // // c'est dans reponseData.object\n // // if(data?.object){\n // // this._serverData = { ...data.object };\n // // }\n \n for (const [constant, methodName] of News.ADD_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => {}\n );\n if (blockData && Object.keys(blockData).length > 0) {\n const data = await this[methodName](blockData);\n if (!this.id && data?.object?.id) {\n this._draftData.id = data.object.id;\n // this._serverData = { ...data.object };\n }\n }\n }\n }\n\n async _update(payload) {\n if (!this._calledFromSave) {\n throw new Error(\"utilisation invalide de _update, utilisez save\");\n }\n\n if (payload.id) delete payload.id;\n\n // si le texte est vide, on met un espace pour que le champ soit pris en compte car sur le serveur\n // il y a une vérification de la taille du texte je pense\n if(payload?.text === \"\"){\n payload.text = \" \";\n }\n \n payload.parentId = this.parent.id;\n payload.parentType = this.parent.getEntityType();\n payload.idNews = this.id;\n\n let hasChanged = false;\n const data = await this.callIsConnected(() => this.endpointApi.updateNews(payload));\n // TODO : voir si j'ai ce qui faut dans data de UPDATE_NEWS pour mettre à jour #serverData\n // c'est dans data.object\n if(data?.object){\n this._serverData = { ...data.object };\n }\n hasChanged = true;\n return hasChanged;\n\n // if (payload.id) delete payload.id;\n // let hasChanged = false;\n\n // for (const [constant, methodName] of News.UPDATE_BLOCKS) {\n // const blockData = this._extractChangedFieldsFromSchema(\n // this.apiClient,\n // constant,\n // { ...payload, ...this.defaultFields },\n // () => this.initialDraftData,\n // this.removeFields\n // );\n // if (blockData && Object.keys(blockData).length > 0) {\n // await this[methodName](blockData);\n // hasChanged = true;\n // }\n // }\n\n // return hasChanged;\n }\n\n async addNews(data = {}) {\n return this.callIsConnected(() => this.endpointApi.addNews(data));\n }\n\n async updateNews(data = {}) {\n return this.callIsConnected(() => this.endpointApi.updateNews(data));\n }\n\n async addMention({ slug, id }) {\n try {\n if (!slug && !id) {\n throw new ApiError(\"Vous devez fournir un slug ou un id pour ajouter une mention.\");\n }\n\n const userInstance = await this.entity(\"citoyens\", { id, slug });\n // const userInstance = new this.deps.User(this.apiClient, { id, slug }, { EndpointApi: this.endpointApi });\n const user = userInstance.serverData;\n\n if (!this._draftData.mentions) {\n this._draftData.mentions = [];\n }\n // Vérification si la mention existe déjà\n if (this._draftData.mentions.find((mention) => mention.id === user.id)) {\n // Si la mention existe déjà, on incrémente le compteur\n this._draftData.mentions = this._draftData.mentions.map((mention) => {\n if (mention.id === user.id) {\n mention.count += 1;\n }\n return mention;\n });\n return this._draftData.mentions;\n }\n const mention = { id: user.id, slug: user.slug, type: userInstance.getEntityType(), name: user.name, value: user.name, count: 1 };\n this._draftData.mentions.push(mention);\n return this._draftData.mentions;\n } catch (error) {\n this.apiClient._logger.error(\"Erreur lors de l'ajout de la mention :\", error);\n throw error;\n }\n\n }\n\n \n /**\n * Ajouter une image à une actualité : Ajoute une images à une actualité.\n * Constant : ADD_IMAGE_NEWS\n */\n async addImage(image) {\n image = await this._validateImage(image);\n const data = { pathParams: { folder: this.parent.getEntityType(), ownerId: this.parent.id }, newsImage: image };\n const dataImage = await this.callIsConnected(() => this.endpointApi.addImageNews(data));\n if (this._draftData.mediaImg) {\n this._draftData.mediaImg.countImages = this._draftData.mediaImg.countImages + 1;\n this._draftData.mediaImg.images.push(dataImage.id);\n } else {\n this._draftData.mediaImg = { countImages: 1, images: [dataImage.id] };\n }\n return dataImage;\n }\n\n /**\n * Ajouter un fichier à une actualité : Ajoute un fichier à une actualité.\n * Constant : ADD_FILE_NEWS\n */\n async addFile(file) {\n file = await this._validateFile(file);\n const data = { pathParams: { folder: this.parent.getEntityType(), ownerId: this.parent.id }, newsFile: file };\n const dataFile = await this.callIsConnected(() =>this.endpointApi.addFileNews(data));\n if (this._draftData.mediaFile) {\n this._draftData.mediaFile.countFiles = this._draftData.mediaFile.countFiles + 1;\n this._draftData.mediaFile.files.push(dataFile);\n } else {\n this._draftData.mediaFile = { countFiles: 1, files: [dataFile] };\n }\n return dataFile;\n }\n\n /**\n * Supprimer une actualité : Supprime une actualité existante.\n * Constant : DELETE_NEWS\n */\n async delete() {\n if(!this.id) {\n throw new ApiError(\"Vous devez fournir un id pour supprimer une news.\");\n }\n const data = { pathParams: { id: this.id } };\n await this.callIsConnected(() => this.endpointApi.deleteNews(data));\n this._draftData = {};\n this._serverData = null;\n this._draftData.id = null;\n this._isDeleted = true;\n }\n \n\n}\n","import { ApiError } from \"../error.js\";\nimport BaseEntity from \"./BaseEntity.js\";\n\nexport class Organization extends BaseEntity {\n static entityType = \"organizations\";\n\n static entityTag = \"Organization\";\n\n static SCHEMA_CONSTANTS = [\n \"ADD_ORGANIZATION\",\n \"UPDATE_BLOCK_DESCRIPTION\",\n \"UPDATE_BLOCK_INFO\",\n \"UPDATE_BLOCK_SOCIAL\",\n \"UPDATE_BLOCK_LOCALITY\",\n \"UPDATE_BLOCK_SLUG\",\n \"PROFIL_IMAGE\"\n ];\n\n static ADD_BLOCKS = new Map([\n [\"ADD_ORGANIZATION\", \"addOrganization\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n static UPDATE_BLOCKS = new Map([\n [\"UPDATE_BLOCK_DESCRIPTION\", \"updateDescription\"],\n [\"UPDATE_BLOCK_SOCIAL\", \"updateSocial\"],\n [\"UPDATE_BLOCK_LOCALITY\", \"updateLocality\"],\n [\"UPDATE_BLOCK_INFO\", \"updateInfo\"],\n [\"UPDATE_BLOCK_SLUG\", \"updateSlug\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n defaultFields = {\n typeElement: this.getEntityType()\n };\n\n removeFields = [\n \"typeElement\"\n ];\n\n // role = admin c'est bizarre car en faite c'est gérer dans links sur user et l'orga\n // links.members.${this.userId}.isAdmin === true\n transforms = {\n github: (val, full) => full?.socialNetwork?.github,\n gitlab: (val, full) => full?.socialNetwork?.gitlab,\n facebook: (val, full) => full?.socialNetwork?.facebook,\n twitter: (val, full) => full?.socialNetwork?.twitter,\n instagram: (val, full) => full?.socialNetwork?.instagram,\n diaspora: (val, full) => full?.socialNetwork?.diaspora,\n mastodon: (val, full) => full?.socialNetwork?.mastodon,\n telegram: (val, full) => full?.socialNetwork?.telegram,\n signal: (val, full) => full?.socialNetwork?.signal\n };\n\n async _add(payload) {\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _add, utilisez save\");\n }\n\n payload.id = this._newId?.();\n if (payload.slug) delete payload.slug;\n\n for (const [constant, methodName] of Organization.ADD_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => {}\n );\n if (blockData && Object.keys(blockData).length > 0) {\n const data = await this[methodName](blockData);\n if (!this.id && data?.map?.id) {\n this._draftData.id = data.map.id;\n this._draftData.slug = data.map.slug;\n }\n }\n }\n }\n\n async _update(payload) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour modifier cette organisation\", 403);\n }\n\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _update, utilisez save\");\n }\n\n if (payload.id) delete payload.id;\n let hasChanged = false;\n\n for (const [constant, methodName] of Organization.UPDATE_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => this.initialDraftData,\n this.removeFields\n );\n if (blockData && Object.keys(blockData).length > 0) {\n await this[methodName](blockData);\n hasChanged = true;\n }\n }\n\n return hasChanged;\n }\n\n async addOrganization(data = {}) {\n return this.callIsConnected(() => this.endpointApi.addOrganization(data));\n }\n\n\n async getOrganizations() {\n throw new ApiError(\"getOrganizations n'existe pas dans Organization\");\n }\n\n async getProjects(data = {}) {\n return super.getProjects(data);\n }\n\n async getEvents() {\n throw new ApiError(\"getEvents pas encore implémenté dans Organization\");\n }\n\n async getPois(data = {}) {\n return super.getPois(data);\n }\n\n async getBadgesIssuer(data = {}) {\n return super.getBadgesIssuer(data);\n }\n\n async getNews(data = {}) {\n return super.getNews(data);\n }\n\n async getSubscribers(data = {}) {\n return super.getSubscribers(data);\n }\n\n /**\n * Récupérer les membres de l'organisation.\n * Constant : GET_MEMBERS_ADMIN / GET_MEMBERS_NO_ADMIN\n * @param {Object} data - Les données de requête.\n * @param {Object} options - Options supplémentaires.\n * @param {boolean} options.toBeValidated - Indique si les membres doivent être validés.\n * @param {boolean} options.isAdmin - Indique si l'utilisateur est admin.\n * @param {boolean} options.isAdminPending - Indique si l'utilisateur est en attente de validation pour être admin.\n * @param {boolean} options.isInviting - Indique si l'utilisateur est en attente d'invitation.\n * @param {Array} options.roles - Liste des rôles à filtrer.\n * @param {boolean} isNext - Indique si c'est une recherche suivante (pagination).\n * @returns {Promise<Object>} - Un objet contenant le nombre de membres et la liste des membres.\n * @throws {ApiResponseError} - Si une erreur se produit lors de la récupération des contributeurs.\n * \n * @example\n * // Récupérer tous les membres\n * const members = await organization.getMembers();\n * \n * // Récupérer les membres avec validation en attente\n * const membersToBeValidated = await organization.getMembers({}, { toBeValidated: true });\n * \n * // Récupérer les membres avec un rôle spécifique\n * const membersWithRole = await organization.getMembers({}, { roles: ['admin'] });\n * \n * // Récupérer les membres en attente d'invitation\n * const invitingMembers = await organization.getMembers({}, { isInviting: true });\n * \n * // Récupérer les membres admin\n * const adminMembers = await organization.getMembers({}, { isAdmin: true });\n * \n * // Récupérer les membres admin et en attente d'invitation\n * const adminInvitingMembers = await organization.getMembers({}, { isAdmin: true, isInviting: true });\n * \n * // Récupérer les membres avec validation en attente et admin\n * const adminToBeValidatedMembers = await organization.getMembers({}, { toBeValidated: true, isAdmin: true });\n * \n * // Récupérer les membres en attente de validation pour être admin\n * const adminPendingMembers = await organization.getMembers({}, { isAdminPending: true });\n * \n * \n */\n async getMembers(data = {}, options = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_MEMBERS_ADMIN\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n\n const { toBeValidated, isAdmin, isAdminPending, isInviting, roles = [] } = options;\n\n if(this.isMe){\n finalData.pathParams = { type: this.getEntityType(), id: this.id };\n // finalData.filters = {\n // [`links.memberOf.${this.id}`]: { \"$exists\": true },\n // [`links.memberOf.${this.id}.toBeValidated`]: { \"$exists\": false },\n // [`links.memberOf.${this.id}.isInviting`]: { \"$exists\": false }\n // };\n finalData.filters = this._buildLinkFilters(this.id, { linkType: \"memberOf\", toBeValidated, isAdmin, isAdminPending, isInviting, roles });\n } else {\n delete finalData?.pathParams;\n finalData.filters = this._buildLinkFilters(this.id, { linkType: \"memberOf\", toBeValidated: false, isAdmin, isInviting, roles });\n }\n \n const fetchFn = this.isMe\n ? () => this.callIsMe(() => this.endpointApi.getMembersAdmin(finalData))\n : () => this.endpointApi.getMembersNoAdmin(finalData);\n\n return fetchFn();\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupère la galerie de l'organisation.\n *\n * @param {Object} data - Les données de requête.\n * @returns {Promise<Object>} - Un objet contenant les éléments de la galerie.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getGallery(data = {}) {\n return super.getGallery(data);\n }\n\n /**\n * Crée une instance de projet et récupère son profil si nécessaire.\n *\n * @param {Object} projectData - Les données nécessaires pour initialiser le projet.\n * @returns {Promise<Project>} Une promesse qui résout l'objet Projet créé.\n * @throws {Error} Si une erreur se produit lors de la création du projet.\n */\n async project(projectData = {}) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour créer un projet dans cette organisation\", 403);\n }\n return super.project(projectData);\n }\n\n /**\n * Crée une instance de POI et la récupère si nécessaire.\n * \n * @param {Object} poiData - Les données nécessaires pour initialiser le POI.\n * @returns {Promise<Poi>} Une promesse qui résout l'objet POI créé.\n * @throws {Error} Si une erreur se produit lors de la création du POI.\n */\n async poi(poiData = {}) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour créer un poi dans cette organisation\", 403);\n }\n return super.poi(poiData);\n }\n\n /**\n * Crée une instance d'événement et la récupère si nécessaire.\n * \n * @param {Object} eventData - Les données nécessaires pour initialiser l'événement.\n * @returns {Promise<Event>} Une promesse qui résout l'objet Événement créé.\n * @throws {Error} Si une erreur se produit lors de la création de l'événement.\n */\n async event(eventData = {}) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour créer un event dans cette organisation\", 403);\n }\n return super.event(eventData);\n }\n\n /**\n * Crée une instance de badge et la récupère si nécessaire.\n * \n * @param {Object} badgeData - Les données nécessaires pour initialiser le badge.\n * @returns {Promise<Badge>} Une promesse qui résout l'objet Badge créé.\n * @throws {Error} Si une erreur se produit lors de la création du badge.\n */\n async badge(badgeData = {}) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour créer un badge dans cette organisation\", 403);\n }\n return super.badge(badgeData);\n }\n\n /**\n * Crée une instance de news et la récupère si nécessaire.\n * \n * @param {Object} newsData - Les données nécessaires pour initialiser la news.\n * @returns {Promise<News>} Une promesse qui résout l'objet News créé.\n * @throws {Error} Si une erreur se produit lors de la création de la news.\n */\n async news(newsData = {}) {\n // TODO: qui peut créer une news sur l'organisation ?\n return super.news(newsData);\n }\n \n /**\n * ───────────────────────────────\n * Lien utilisateur ↔ organisation\n * (rejoindre, valider, quitter, devenir admin)\n * ───────────────────────────────\n */\n\n\n /**\n * Envoie une demande pour rejoindre l'organisation en tant que membre.\n * L'action est soumise à validation par un administrateur de l'organisation.\n *\n * @returns {Promise<Object>} - Résultat de la requête d'adhésion.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité ne supporte pas l'action.\n */\n async requestToJoin(){\n return super.requestToJoin();\n }\n\n /**\n * Envoie une demande pour rejoindre l'organisation en tant qu'administrateur.\n * L'action est soumise à validation par un administrateur existant.\n *\n * @returns {Promise<Object>} - Résultat de la requête d'administration.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité ne supporte pas l'action.\n */\n async requestToJoinAdmin(){\n return super.requestToJoinAdmin();\n }\n\n /**\n * Accepte une invitation à rejoindre l'organisation.\n * Cette action valide un lien en attente avec l'option `isInviting`.\n *\n * @returns {Promise<Object>} - Résultat de la validation du lien.\n * @throws {ApiError} - Si aucune invitation n'est en attente ou si l'entité ne supporte pas l'action.\n */\n async acceptInvitation(){\n return super.acceptInvitation();\n }\n\n /**\n * Quitte l'organisation, que ce soit en tant que membre ou administrateur.\n * Cette action supprime le lien entre l'utilisateur et l'organisation.\n *\n * @returns {Promise<Object>} - Résultat de la déconnexion.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou non membre.\n */\n async leave() {\n return super.leave();\n }\n\n /**\n * Suivre une organisation.\n * Cette action permet à l'utilisateur de suivre l'organisation.\n * \n * @returns {Promise<Object>} - Résultat de l'action de suivi.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité ne supporte pas l'action.\n */\n async follow() {\n return super.follow();\n }\n\n /**\n * Se désabonne d'une organisation.\n * \n * @returns {Promise<Object>} - Résultat de la désinscription.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité n'est pas enregistrée.\n */\n async unfollow() {\n return super.unfollow();\n }\n\n /**\n * ───────────────────────────────\n * costum\n * ───────────────────────────────\n */\n\n /**\n * Récupère le JSON personnalisé de l'organisation.\n * \n * @returns {Promise<Object>} - Le JSON personnalisé de l'organisation.\n * @throws {ApiError} - Si le slug de l'organisation n'est pas défini.\n */\n async getCostumJson() {\n return super.getCostumJson();\n }\n\n /**\n * recherche lié à l'organisation\n *\n * @param {Object} data - Les données de recherche.\n * @returns {Promise<Object>} - Résultat de la recherche.\n * @throws {ApiError} - Si le slug ou l'id de l'organisation n'est pas défini.\n */\n async searchCostum(data = {}) {\n return super.searchCostum(data);\n }\n\n}\n","import { ApiError } from \"../error.js\";\nimport BaseEntity from \"./BaseEntity.js\";\n\nexport class Poi extends BaseEntity {\n static entityType = \"poi\";\n\n static entityTag = \"Poi\";\n\n static SCHEMA_CONSTANTS = [\n \"ADD_POI\",\n \"UPDATE_BLOCK_DESCRIPTION\",\n \"UPDATE_BLOCK_INFO\",\n \"UPDATE_BLOCK_LOCALITY\",\n \"UPDATE_BLOCK_SLUG\",\n \"PROFIL_IMAGE\"\n ];\n\n static ADD_BLOCKS = new Map([\n [\"ADD_POI\", \"addPoi\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n static UPDATE_BLOCKS = new Map([\n [\"UPDATE_BLOCK_DESCRIPTION\", \"updateDescription\"],\n [\"UPDATE_BLOCK_LOCALITY\", \"updateLocality\"],\n [\"UPDATE_BLOCK_INFO\", \"updateInfo\"],\n [\"UPDATE_BLOCK_SLUG\", \"updateSlug\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n defaultFields = {\n typeElement: this.getEntityType()\n };\n\n removeFields = [\n \"typeElement\"\n ];\n\n transforms = {\n\n };\n\n async _add(payload) {\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _add, utilisez save\");\n }\n\n payload.id = this._newId?.();\n if (payload.slug) delete payload.slug;\n\n for (const [constant, methodName] of Poi.ADD_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => {}\n );\n if (blockData && Object.keys(blockData).length > 0) {\n const data = await this[methodName](blockData);\n if (!this.id && data?.map?.id) {\n this._draftData.id = data.map.id;\n this._draftData.slug = data.map.slug;\n }\n }\n }\n }\n\n async _update(payload) {\n if(!this.isAuthor()){\n throw new ApiError(\"Vous n'avez pas les droits pour modifier ce POI\", 403);\n }\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _update, utilisez save\");\n }\n\n if (payload.id) delete payload.id;\n let hasChanged = false;\n\n for (const [constant, methodName] of Poi.UPDATE_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => this.initialDraftData,\n this.removeFields\n );\n if (blockData && Object.keys(blockData).length > 0) {\n await this[methodName](blockData);\n hasChanged = true;\n }\n }\n\n return hasChanged;\n }\n\n async addPoi(data = {}) {\n\n if (!this.isMe) {\n data.parent = {};\n data.parent[`${this.parent.id}`] = {\n type: this.parent.getEntityType(),\n name: this.parent.name\n };\n }\n\n return this.callIsConnected(() => this.endpointApi.addPoi(data));\n }\n\n async getOrganizations() {\n throw new ApiError(`getOrganizations n'existe pas dans ${this.constructor.name}`);\n }\n\n async getProjects() {\n throw new ApiError(`getProjects n'existe pas dans ${this.constructor.name}`);\n }\n\n async getEvents() {\n throw new ApiError(`getEvents n'existe pas dans${this.constructor.name}`);\n }\n\n async getPois() {\n throw new ApiError(`getPois n'existe pas dans ${this.constructor.name}`);\n }\n\n async getBadgesIssuer() {\n throw new ApiError(`getBadgesIssuer n'existe pas dans ${this.constructor.name}`);\n }\n\n async getNews(data = {}) {\n return super.getNews(data);\n }\n\n async getSubscribers(data = {}) {\n return super.getSubscribers(data);\n }\n\n async project() {\n throw new ApiError(`project n'existe pas dans ${this.constructor.name}`);\n }\n\n async poi() {\n throw new ApiError(`poi n'existe pas dans ${this.constructor.name}`);\n }\n\n async event() {\n throw new ApiError(`event n'existe pas dans ${this.constructor.name}`);\n }\n\n async badge() {\n throw new ApiError(`badge n'existe pas dans ${this.constructor.name}`);\n }\n\n /**\n * Crée une instance de news et la récupère si nécessaire.\n * \n * @param {Object} newsData - Les données nécessaires pour initialiser la news.\n * @returns {Promise<News>} Une promesse qui résout l'objet News créé.\n * @throws {ApiError} Si une erreur se produit lors de la création de la news.\n */\n async news(newsData = {}) {\n return super.news(newsData);\n }\n\n /**\n * Suivre un POI.\n * Cette action permet à l'utilisateur de suivre un POI.\n * \n * @returns {Promise<Object>} - Résultat de l'action de suivi.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité ne supporte pas l'action.\n */\n async follow() {\n return super.follow();\n }\n\n /**\n * Se désabonne d'un POI.\n * \n * @returns {Promise<Object>} - Résultat de la désinscription.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité n'est pas enregistrée.\n */\n async unfollow() {\n return super.unfollow();\n }\n\n \n}\n","import { ApiError } from \"../error.js\";\nimport BaseEntity from \"./BaseEntity.js\";\n\nexport class Project extends BaseEntity {\n static entityType = \"projects\";\n\n static entityTag = \"Project\";\n\n static SCHEMA_CONSTANTS = [\n \"ADD_PROJECT\",\n \"UPDATE_BLOCK_DESCRIPTION\",\n \"UPDATE_BLOCK_INFO\",\n \"UPDATE_BLOCK_SOCIAL\",\n \"UPDATE_BLOCK_LOCALITY\",\n \"UPDATE_BLOCK_SLUG\",\n \"PROFIL_IMAGE\"\n ];\n\n static ADD_BLOCKS = new Map([\n [\"ADD_PROJECT\", \"addProject\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n static UPDATE_BLOCKS = new Map([\n [\"UPDATE_BLOCK_DESCRIPTION\", \"updateDescription\"],\n [\"UPDATE_BLOCK_SOCIAL\", \"updateSocial\"],\n [\"UPDATE_BLOCK_LOCALITY\", \"updateLocality\"],\n [\"UPDATE_BLOCK_INFO\", \"updateInfo\"],\n [\"UPDATE_BLOCK_SLUG\", \"updateSlug\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n defaultFields = {\n typeElement: this.getEntityType()\n };\n\n removeFields = [\n \"typeElement\"\n ];\n\n // links.contributors.${this.userId}.isAdmin === true\n transforms = {\n github: (val, full) => full?.socialNetwork?.github,\n gitlab: (val, full) => full?.socialNetwork?.gitlab,\n facebook: (val, full) => full?.socialNetwork?.facebook,\n twitter: (val, full) => full?.socialNetwork?.twitter,\n instagram: (val, full) => full?.socialNetwork?.instagram,\n diaspora: (val, full) => full?.socialNetwork?.diaspora,\n mastodon: (val, full) => full?.socialNetwork?.mastodon,\n telegram: (val, full) => full?.socialNetwork?.telegram,\n signal: (val, full) => full?.socialNetwork?.signal,\n parent: (val) => {\n if (!val || typeof val !== \"object\") return null;\n \n return Object.fromEntries(\n Object.entries(val).map(([key, obj]) => [\n key,\n {\n type: obj?.type ?? null,\n name: obj?.name ?? null\n }\n ])\n );\n }\n };\n\n async _add(payload) {\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _add, utilisez save\");\n }\n\n payload.id = this._newId?.();\n if (payload.slug) delete payload.slug;\n\n for (const [constant, methodName] of Project.ADD_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => {}\n );\n if (blockData && Object.keys(blockData).length > 0) {\n const data = await this[methodName](blockData);\n if (!this.id && data?.map?.id) {\n this._draftData.id = data.map.id;\n this._draftData.slug = data.map.slug;\n }\n }\n }\n }\n\n async _update(payload) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour modifier ce projet\", 403);\n }\n\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _update, utilisez save\");\n }\n\n if (payload.id) delete payload.id;\n let hasChanged = false;\n\n for (const [constant, methodName] of Project.UPDATE_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => this.initialDraftData,\n this.removeFields\n );\n if (blockData && Object.keys(blockData).length > 0) {\n await this[methodName](blockData);\n hasChanged = true;\n }\n }\n\n return hasChanged;\n }\n\n async addProject(data = {}) {\n\n // le parent n'est pas me donc on doit ajouter le parent\n if (!this.isMe) {\n data.parent = {};\n data.parent[`${this.parent.id}`] = {\n type: this.parent.getEntityType(),\n name: this.parent.name\n };\n }\n\n return this.callIsConnected(() => this.endpointApi.addProject(data));\n }\n\n async getOrganizations() {\n throw new ApiError(`getOrganizations n'existe pas dans ${this.constructor.name}`);\n }\n\n async getProjects(data = {}) {\n return super.getProjects(data);\n }\n\n async getEvents() {\n throw new ApiError(`getEvents pas encore implémenté dans ${this.constructor.name}`);\n }\n\n async getPois(data = {}) {\n return super.getPois(data);\n }\n\n async getBadgesIssuer(data = {}) {\n return super.getBadgesIssuer(data);\n }\n\n async getNews(data = {}) {\n return super.getNews(data);\n }\n\n async getSubscribers(data = {}) {\n return super.getSubscribers(data);\n }\n\n /**\n * Récupérer les contributeurs d'un projet.\n * Constant : GET_CONTRIBUTORS_ADMIN / GET_CONTRIBUTORS_NO_ADMIN\n * @param {Object} data - Les données de requête.\n * @param {Object} options - Options supplémentaires.\n * @param {boolean} options.toBeValidated - Indique si les contributeurs doivent être validés.\n * @param {boolean} options.isAdmin - Indique si l'utilisateur est admin.\n * @param {boolean} options.isInviting - Indique si l'utilisateur est en attente d'invitation.\n * @param {Array} options.roles - Liste des rôles à filtrer.\n * @param {boolean} isNext - Indique si c'est une recherche suivante (pagination).\n * @returns {Promise<Object>} - Un objet contenant le nombre de contributeurs et la liste des contributeurs.\n * @throws {ApiResponseError} - Si une erreur se produit lors de la récupération des contributeurs.\n * \n * @example\n * // Récupérer tous les contributeurs\n * const contributors = await project.getContributors();\n * \n * // Récupérer les contributeurs avec validation en attente\n * const contributorsToBeValidated = await project.getContributors({}, { toBeValidated: true });\n * \n * // Récupérer les contributeurs avec un rôle spécifique\n * const contributorsWithRole = await project.getContributors({}, { roles: [\"admin\"] });\n * \n * // Récupérer les contributeurs administrateurs\n * const adminContributors = await project.getContributors({}, { isAdmin: true });\n * \n * // Récupérer les contributeurs en attente d'invitation\n * const invitingContributors = await project.getContributors({}, { isInviting: true });\n * \n */\n async getContributors(data = {}, options = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_CONTRIBUTORS_ADMIN\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n\n const { toBeValidated, isAdmin, isInviting, isAdminPending, roles = [] } = options;\n\n if(this.isMe){\n finalData.pathParams = { type: this.getEntityType(), id: this.id };\n // NOTE : dans le schema je crois que si pas de finalData.filters alors le default ce fait avec finalData.pathParams\n // finalData.filters = {\n // [`links.projects.${this.id}`]: { \"$exists\": true },\n // [`links.projects.${this.id}.toBeValidated`]: { \"$exists\": false },\n // [`links.projects.${this.id}.isInviting`]: { \"$exists\": false }\n // };\n finalData.filters = this._buildLinkFilters(this.id, { linkType: \"projects\", toBeValidated, isAdmin, isAdminPending, isInviting, roles });\n } else {\n delete finalData?.pathParams;\n finalData.filters = this._buildLinkFilters(this.id, { linkType: \"projects\", toBeValidated: false, isAdmin, isInviting, roles });\n }\n \n const fetchFn = this.isMe\n ? () => this.callIsMe(() => this.endpointApi.getContributorsAdmin(finalData))\n : () => this.endpointApi.getContributorsNoAdmin(finalData);\n\n return fetchFn();\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupère la galerie d'un projet.\n * \n * @param {Object} data - Les données de requête pour la galerie.\n * @returns {Promise<Object>} - Un objet contenant les images de la galerie.\n * @throws {ApiResponseError} - Si une erreur se produit lors de la récupération de la galerie.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getGallery(data = {}) {\n return super.getGallery(data);\n }\n\n /**\n * Crée une instance de projet et récupère son profil si nécessaire.\n *\n * @param {Object} projectData - Les données nécessaires pour initialiser le projet.\n * @returns {Promise<Project>} Une promesse qui résout l'objet Projet créé.\n * @throws {Error} Si une erreur se produit lors de la création du projet.\n */\n async project(projectData = {}) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour créer un projet dans ce projet\", 403);\n }\n return super.project(projectData);\n }\n\n /**\n * Crée une instance de POI et la récupère si nécessaire.\n * \n * @param {Object} poiData - Les données nécessaires pour initialiser le POI.\n * @returns {Promise<Poi>} Une promesse qui résout l'objet POI créé.\n * @throws {Error} Si une erreur se produit lors de la création du POI.\n */\n async poi(poiData = {}) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour créer un POI dans ce projet\", 403);\n }\n return super.poi(poiData);\n }\n\n /**\n * Crée une instance d'événement et la récupère si nécessaire.\n * \n * @param {Object} eventData - Les données nécessaires pour initialiser l'événement.\n * @returns {Promise<Event>} Une promesse qui résout l'objet Événement créé.\n * @throws {Error} Si une erreur se produit lors de la création de l'événement.\n */\n async event(eventData = {}) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour créer un événement dans ce projet\", 403);\n }\n return super.event(eventData);\n }\n\n /**\n * Crée une instance de badge et la récupère si nécessaire.\n * \n * @param {Object} badgeData - Les données nécessaires pour initialiser le badge.\n * @returns {Promise<Badge>} Une promesse qui résout l'objet Badge créé.\n * @throws {Error} Si une erreur se produit lors de la création du badge.\n */\n async badge(badgeData = {}) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour créer un badge dans ce projet\", 403);\n }\n return super.badge(badgeData);\n }\n\n /**\n * Crée une instance de news et la récupère si nécessaire.\n * \n * @param {Object} newsData - Les données nécessaires pour initialiser la news.\n * @returns {Promise<News>} Une promesse qui résout l'objet News créé.\n * @throws {Error} Si une erreur se produit lors de la création de la news.\n */\n async news(newsData = {}) {\n // TODO: qui peut créer une news sur le projet ?\n return super.news(newsData);\n }\n\n /**\n * ───────────────────────────────\n * Lien utilisateur ↔ projet\n * (rejoindre, valider, quitter, devenir admin)\n * ───────────────────────────────\n */\n\n /**\n * Envoie une demande pour rejoindre le projet en tant que contributeur.\n * L'action est soumise à validation par un administrateur du projet.\n *\n * @returns {Promise<Object>} - Résultat de la requête d'adhésion.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si le projet ne supporte pas l'action.\n */\n async requestToJoin(){\n return super.requestToJoin();\n }\n\n /**\n * Envoie une demande pour devenir administrateur du projet.\n * L'action est soumise à validation par un administrateur existant.\n *\n * @returns {Promise<Object>} - Résultat de la requête d'administration.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si le projet ne supporte pas l'action.\n */\n async requestToJoinAdmin(){\n return super.requestToJoinAdmin();\n }\n\n /**\n * Accepte une invitation à rejoindre le projet.\n * Cette action valide un lien en attente avec l'option `isInviting`.\n *\n * @returns {Promise<Object>} - Résultat de la validation du lien.\n * @throws {ApiError} - Si aucune invitation n'est en attente ou si le projet ne supporte pas l'action.\n */\n async acceptInvitation(){\n return super.acceptInvitation();\n }\n\n /**\n * Quitte le projet, que ce soit en tant que contributeur ou administrateur.\n * Cette action supprime le lien entre l'utilisateur et le projet.\n *\n * @returns {Promise<Object>} - Résultat de la déconnexion.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou non contributeur.\n */\n async leave() {\n return super.leave();\n }\n\n /**\n * Suivre un projet.\n * Cette action permet à l'utilisateur de suivre le projet.\n * \n * @returns {Promise<Object>} - Résultat de l'action de suivi.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité ne supporte pas l'action.\n */\n async follow() {\n return super.follow();\n }\n\n /**\n * Se désabonne d'un projet.\n * \n * @returns {Promise<Object>} - Résultat de la désinscription.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité n'est pas enregistrée.\n */\n async unfollow() {\n return super.unfollow();\n }\n\n}\n","import { ApiError } from \"../error.js\";\nimport BaseEntity from \"./BaseEntity.js\";\nimport { UserMixin } from \"../mixin/UserMixin.js\";\n\n// User.js\nexport class User extends BaseEntity {\n\n static entityType = \"citoyens\";\n\n static entityTag = \"User\";\n\n static SCHEMA_CONSTANTS = [\n \"UPDATE_BLOCK_DESCRIPTION\",\n \"UPDATE_BLOCK_INFO\",\n \"UPDATE_BLOCK_SOCIAL\",\n \"UPDATE_BLOCK_LOCALITY\",\n \"UPDATE_BLOCK_SLUG\",\n \"PROFIL_IMAGE\"\n ];\n\n static UPDATE_BLOCKS = new Map([\n [\"UPDATE_BLOCK_DESCRIPTION\", \"updateDescription\"],\n [\"UPDATE_BLOCK_SOCIAL\", \"updateSocial\"],\n [\"UPDATE_BLOCK_LOCALITY\", \"updateLocality\"],\n [\"UPDATE_BLOCK_INFO\", \"updateInfo\"],\n [\"UPDATE_BLOCK_SLUG\", \"updateSlug\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n defaultFields = {\n typeElement: this.getEntityType(), \n };\n \n removeFields = [\n \"typeElement\",\n ];\n \n transforms = {\n github: (val, full) => full?.socialNetwork?.github,\n gitlab: (val, full) => full?.socialNetwork?.gitlab,\n facebook: (val, full) => full?.socialNetwork?.facebook,\n twitter: (val, full) => full?.socialNetwork?.twitter,\n instagram: (val, full) => full?.socialNetwork?.instagram,\n diaspora: (val, full) => full?.socialNetwork?.diaspora,\n mastodon: (val, full) => full?.socialNetwork?.mastodon,\n telegram: (val, full) => full?.socialNetwork?.telegram,\n signal: (val, full) => full?.socialNetwork?.signal\n };\n \n /**\n * Crée une instance de User.\n *\n * @param {ApiClient} apiClient - Le client API connecté.\n * @param {Object} data - Données initiales (peuvent inclure `id`, `slug`, etc.).\n * @param {string} [data.id] - ID de l'utilisateur.\n * @param {string} [data.slug] - Slug de l'utilisateur.\n * @param {Object} deps - Dépendances injectées.\n * @param {function|object} deps.EndpointApi - Classe ou instance de EndpointApi.\n * @param {function} deps.Organization - Classe Organization.\n * @param {function} deps.Project - Classe Project.\n * @param {function} deps.Event - Classe Events.\n * @param {function} deps.Poi - Classe Poi.\n * @param {function} deps.Badge - Classe Badge.\n * @param {function} deps.News - Classe News.\n *\n * @throws {ApiError} - Si des dépendances nécessaires sont manquantes ou invalides.\n */\n\n constructor(parent, data = {}, deps = {}) {\n if(!deps.EndpointApi){\n throw new ApiError(\"EndpointApi class must be injected to avoid circular dependency.\");\n }\n if (!data?.id && !data?.slug) {\n throw new ApiError(\"Vous devez fournir un id ou un slug pour créer un User.\");\n }\n\n if (!deps.Organization) throw new ApiError(\"Organization class must be injected.\");\n if (!deps.Project) throw new ApiError(\"Project class must be injected.\");\n if (!deps.Event) throw new ApiError(\"Event class must be injected.\");\n if (!deps.Poi) throw new ApiError(\"Poi class must be injected.\");\n if (!deps.Badge) throw new ApiError(\"Badge class must be injected.\");\n if (!deps.News) throw new ApiError(\"News class must be injected.\");\n \n super(parent, data, deps);\n }\n\n get slug() {\n return this._draftData.slug || null;\n }\n \n get isMe() {\n return this.isConnected && this.userId === this.id;\n }\n\n get parentIsMe() {\n return super.isMe;\n }\n\n get isActingUser() {\n return this.parentIsMe && !this.isMe;\n }\n\n /**\n * Récupère le profil complet de l'utilisateur.\n * Si l'utilisateur est connecté, on appelle le endpoint ME_INFO_URL,\n * sinon, on peut imaginer appeler un endpoint public.\n *\n * @returns {Promise<Object>} Le profil complet.\n */\n async get() {\n return this.apiClient.safeCall(async () => {\n if (this.isMe) {\n const data = await this.endpointApi.meInfoUrl();\n this._setData(data);\n return data;\n } else {\n const data = await this._getPublicProfile();\n this._setData(data);\n return data;\n }\n });\n }\n\n /**\n * Changer le mot de passe : Permet de changer le mot de passe d'un utilisateur.\n * Constant : CHANGE_PASSWORD\n */\n async changePassword(data = {}) {\n return this.callIsMe(() => this.endpointApi.changePassword(data));\n }\n\n /**\n * Supprimer un compte : Permet de supprimer un compte utilisateur.\n * Constant : DELETE_ACCOUNT\n */\n async delete(data = {}) {\n return this.callIsMe(() => this.endpointApi.deleteAccount(data));\n }\n \n /**\n * Sauvegarde les modifications de l'utilisateur en appelant les endpoints correspondants.\n * Seul l'utilisateur connecté peut se modifier lui-même.\n *\n * @returns {Promise<Object>} - Données serveur mises à jour si applicable.\n * @throws {ApiError} - Si l'utilisateur n'est pas autorisé.\n */\n async save() {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour sauvegarder.\");\n }\n await super.save();\n }\n\n async _add() {\n throw new ApiError(\"Vous ne pouvez pas ajouter un utilisateur par ce moyen.\");\n }\n\n /**\n * Met à jour les blocs modifiés de l'utilisateur via les constantes de schéma définies.\n *\n * @param {Object} payload - Données courantes à comparer et envoyer.\n * @returns {Promise<boolean>} - Indique s'il y a eu une modification réelle.\n */\n async _update(payload){\n if (!this._calledFromSave) {\n throw new Error(\"utilisation invalide de _update, utilisez save\");\n }\n\n if(payload.id){\n delete payload.id;\n }\n\n let hasChanged = false;\n\n // Sinon, on fait les updates en blocs\n for (const [constant, methodName] of User.UPDATE_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields},\n () => this.initialDraftData,\n this.removeFields\n );\n if (blockData && Object.keys(blockData).length > 0) {\n await this[methodName](blockData);\n hasChanged = true;\n }\n }\n \n return hasChanged;\n }\n\n static fromServerData(data, parent, deps) {\n const instance = new User(parent.apiClient, data, deps);\n if (typeof data === \"object\" || Object.keys(data).length > 0) {\n instance._setData(data);\n }\n return instance;\n }\n\n /**\n * Mettre à jour les paramètres utilisateur : Mise à jour des paramètres spécifiques d'un utilisateur.\n * Constant : UPDATE_SETTINGS\n * @param {Object} data - Données à mettre à jour.\n * @param {\"birthDate\"|\"email\"|\"locality\"|\"phone\"|\"directory\"} data.type - Type de paramètre à mettre à jour.\n * @param {\"private\"|\"public\"|\"mask\"} data.value - Nouvelle valeur du paramètre.\n * @returns {Promise<void>} - Résultat de la mise à jour.\n */\n async updateSettings(data = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour mettre à jour les paramètres.\");\n }\n await super.updateSettings(data);\n await this.refresh();\n }\n\n /**\n * Mettre à jour la description d'un élément : Permet de mettre à jour la description courte et complète d'un élément.\n * Constant : UPDATE_BLOCK_DESCRIPTION\n */\n async updateDescription(data = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour mettre à jour la description.\");\n }\n return super.updateDescription(data);\n }\n \n /**\n * Mettre à jour les informations d'un élément : Permet de mettre à jour les informations générales d'un élément (nom, contacts, etc.).\n * Constant : UPDATE_BLOCK_INFO\n */\n async updateInfo(data = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour mettre à jour les informations.\");\n }\n return super.updateInfo(data);\n }\n \n /**\n * Mettre à jour les réseaux sociaux d'un élément : Permet de mettre à jour les liens vers les réseaux sociaux d'un élément.\n * Constant : UPDATE_BLOCK_SOCIAL\n */\n async updateSocial(data = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour mettre à jour les réseaux sociaux.\");\n }\n return super.updateSocial(data);\n }\n \n /**\n * Mettre à jour les localités d'un élément : Permet de mettre à jour l'adresse et les informations géographiques d'un élément.\n * Constant : UPDATE_BLOCK_LOCALITY\n */\n async updateLocality(data = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour mettre à jour la localité.\");\n }\n return super.updateLocality(data);\n }\n \n /**\n * Mettre à jour le slug d'un élément : Permet de mettre à jour le slug pour une URL simplifiée.\n * Constant : UPDATE_BLOCK_SLUG\n */\n async updateSlug({ slug }) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour mettre à jour le slug.\");\n }\n return super.updateSlug({ slug });\n }\n\n /**\n * Mettre à jour l'image de profil : Permet de mettre à jour l'image de profil d'un utilisateur ou d'une entité.\n * Constant : PROFIL_IMAGE\n */\n async updateImageProfil({ profil_avatar: image }) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour mettre à jour l'image de profil.\");\n }\n return super.updateImageProfil({ profil_avatar: image });\n }\n \n /**\n * Récupérer les organisations d'un utilisateur : Récupère la liste des organisations auxquelles l'utilisateur appartient.\n * Constant : GET_ORGANIZATIONS_ADMIN | GET_ORGANIZATIONS_NO_ADMIN\n */\n async getOrganizations(data = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_ORGANIZATIONS_NO_ADMIN\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n delete finalData?.pathParams;\n\n const fetchFn = this.isMe\n ? () => this.callIsMe(() => this.endpointApi.getOrganizationsAdmin(finalData))\n : () => this.endpointApi.getOrganizationsNoAdmin(finalData);\n \n if (!this.isMe && !finalData.filters) {\n finalData.filters = {\n [`links.members.${this.id}`]: { \"$exists\": true },\n [`links.members.${this.id}.toBeValidated`]: { \"$exists\": false },\n [`links.members.${this.id}.isInviting`]: { \"$exists\": false }\n };\n }\n\n return fetchFn();\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupérer les projets d'un utilisateur : Récupère la liste des projets auxquels l'utilisateur contribue.\n * Constant : GET_PROJECTS_ADMIN | GET_PROJECTS_NO_ADMIN\n */\n async getProjects(data = {}) {\n return super.getProjects(data);\n }\n\n /**\n * Récupérer les POIs\n * Constant : GET_POIS_NO_ADMIN / GET_POIS_ADMIN\n */\n async getPois(data = {}) {\n return super.getPois(data);\n }\n\n /**\n * Récupérer les actualités : Récupère la liste des actualités liées à l'utilisateur.\n * Constant : GET_NEWS\n */\n async getNews(data = {}) {\n return super.getNews(data);\n }\n\n /**\n * Récupérer les amis administrables : Récupère les amis administrée par l’utilisateur.\n * Constant : GET_FRIENDS_ADMIN\n * question : qui peut voir la liste d'amis, seulement l'utilisateur connecté ? ou tous les utilisateurs connectés ?\n * actuellement, c'est tous les utilisateurs connectés\n */\n async getFriends(data = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_FRIENDS_ADMIN\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n\n delete finalData?.pathParams;\n \n if (!this.isMe){\n // is not me add id\n finalData.pathParams = { id: this.id };\n }\n\n return this.endpointApi.getFriendsAdmin(finalData);;\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupérer les suivis\n * Constant : GET_SUBSCRIPTIONS / GET_SUBSCRIPTIONS_ADMIN\n */\n async getSubscriptions(data = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_SUBSCRIPTIONS\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n\n delete finalData?.pathParams;\n \n const fetchFn = this.isMe\n ? () => this.callIsMe(() => this.endpointApi.getSubscriptionsAdmin(finalData))\n : () => this.endpointApi.getSubscriptions(finalData);\n \n if (!this.isMe && !finalData.filters) {\n finalData.filters = {\n [`links.followers.${this.id}`]: { \"$exists\": true },\n };\n }\n\n return fetchFn();\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupérer les abonnés\n * Constant : GET_SUBSCRIBERS\n */\n async getSubscribers(data = {}) {\n return super.getSubscribers(data);\n }\n\n /**\n * Obtenir la liste des événements\n * Constant : GET_EVENTS\n * TODO : il n'est pas fait encore pour GET_EVENTS_ADMIN / GET_EVENTS_NO_ADMIN comme les autres dans endpointApi\n */\n\n /**\n * Liste des badges créés par l'utilisateur\n * Constant : GET_BADGES\n */\n async getBadgesIssuer(data = {}) {\n return super.getBadgesIssuer(data);\n }\n\n /**\n * Liste des badges associés à l'utilisateur\n * \n * TODO : documenté le fonctionnement et sont utilisation avec un exemple\n */\n async getBadges(filter = {}) {\n /*\n \"badges\": {\n \"627df5663a0fae60e57f4a31\": {\n \"attenteRecepteur\": true,\n \"expiredOn\": false,\n \"isParcours\": \"false\",\n \"issuedOn\": \"2023-10-02T14:00:00.000Z\",\n \"name\": \"CODEV\",\n \"show\": \"true\",\n },\n },\n */\n\n const filteredBadges = await this.linkEntitiesFromServerData(\"badges\", filter);\n // voir si je les met dans objet { count, results }\n return filteredBadges;\n }\n\n /**\n * Récupérer la galerie de l'utilisateur\n * Constant : GET_GALLERY\n */\n async getGallery(data = {}) {\n return super.getGallery(data);\n }\n\n async user(userData) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur\");\n }\n if (!userData.id && !userData.slug) {\n throw new ApiError(\"Vous devez fournir un id ou un slug pour créer un User.\");\n }\n const user = new User(this, userData, this.deps);\n await user.get();\n return user;\n }\n\n /**\n * Crée une instance d'organisation et récupère son profil si nécessaire.\n *\n * @param {Object} organizationData - Les données nécessaires pour initialiser l'organisation.\n * @returns {Promise<Organization>} Une promesse qui résout l'objet Organisation créé.\n * @throws {Error} Si une erreur se produit lors de la création de l'organisation.\n */\n async organization(organizationData = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour créer une organisation.\");\n }\n return super.organization(organizationData);\n }\n\n /**\n * Crée une instance de projet et récupère son profil si nécessaire.\n *\n * @param {Object} projectData - Les données nécessaires pour initialiser le projet.\n * @returns {Promise<Project>} Une promesse qui résout l'objet Projet créé.\n * @throws {Error} Si une erreur se produit lors de la création du projet.\n */\n async project(projectData = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour créer un projet.\");\n }\n return super.project(projectData);\n }\n\n /**\n * Crée une instance de news et la récupère si nécessaire.\n * \n * @param {Object} newsData - Les données nécessaires pour initialiser la news.\n * @returns {Promise<News>} Une promesse qui résout l'objet News créé.\n * @throws {Error} Si une erreur se produit lors de la création de la news.\n */\n async news(newsData = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour créer une actualité.\");\n }\n return super.news(newsData);\n }\n\n /**\n * Crée une instance de POI et la récupère si nécessaire.\n * \n * @param {Object} poiData - Les données nécessaires pour initialiser le POI.\n * @returns {Promise<Poi>} Une promesse qui résout l'objet POI créé.\n * @throws {Error} Si une erreur se produit lors de la création du POI.\n */\n async poi(poiData = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour créer un POI.\");\n }\n return super.poi(poiData);\n }\n\n /**\n * Crée une instance d'événement et la récupère si nécessaire.\n * \n * @param {Object} eventData - Les données nécessaires pour initialiser l'événement.\n * @returns {Promise<Event>} Une promesse qui résout l'objet Événement créé.\n * @throws {Error} Si une erreur se produit lors de la création de l'événement.\n */\n async event(eventData = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour créer un événement.\");\n }\n return super.event(eventData);\n }\n\n /**\n * Crée une instance de badge et la récupère si nécessaire.\n * \n * @param {Object} badgeData - Les données nécessaires pour initialiser le badge.\n * @returns {Promise<Badge>} Une promesse qui résout l'objet Badge créé.\n * @throws {Error} Si une erreur se produit lors de la création du badge.\n */\n async badge(badgeData = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour créer un badge.\");\n }\n return super.badge(badgeData);\n }\n\n /**\n * ───────────────────────────────\n * Lien utilisateur ↔ utilisateur (ami)\n * (demander, valider, se retirer)\n * ───────────────────────────────\n */\n\n /**\n * Envoie une demande d'amitié à cet utilisateur.\n * L'utilisateur ciblé devra valider la demande pour établir la relation.\n *\n * @returns {Promise<Object>} - Résultat de la requête.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'action est interdite.\n */\n async sendFriendRequest() {\n if (!this.isActingUser) {\n throw new ApiError(\"Vous devez être connecté pour envoyer une demande d'amis.\");\n }\n\n this._checkLinkableEntity();\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const { connectTypeConnect } = this._getLinkMeta();\n const userLink = this._getLinkFromConnectedUser();\n\n if (!userLink) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n connectType: connectTypeConnect\n };\n const retour = await this.endpointApi.connect(data);\n // TODO : reflechier au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n await this.userContext.refresh();\n return retour;\n }\n\n if (userLink.isInviting && userLink.invitorId === this.id) {\n return this.acceptFriendRequest();\n }\n\n if (userLink.isInviting && userLink.invitorId === this.userId) {\n throw new ApiError(\"Vous avez déjà envoyé une demande d'amis à cet utilisateur.\");\n }\n\n throw new ApiError(\"Vous êtes déjà connecté à cette entité.\");\n }\n\n /**\n * Accepte une demande d'amitié envoyée par cet utilisateur.\n * Cette action établit un lien entre les deux utilisateurs.\n *\n * @returns {Promise<Object>} - Résultat de la validation du lien.\n * @throws {ApiError} - Si aucune invitation n'est en attente ou si l'action est interdite.\n */\n async acceptFriendRequest() {\n if (!this.isActingUser) {\n throw new ApiError(\"Vous devez être connecté pour accepter une demande d'amitié.\");\n }\n\n this._checkLinkableEntity();\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const userLink = this._getLinkFromConnectedUser();\n\n if (userLink?.isInviting && userLink.invitorId === this.id) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n linkOption: \"isInviting\"\n };\n const retour = await this.endpointApi.linkValidate(data);\n // TODO : reflechier au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n await this.userContext.refresh();\n return retour;\n }\n\n throw new ApiError(\"Vous n'avez pas d'invitation à valider.\");\n }\n\n /**\n * Supprime la relation d'amitié avec cet utilisateur.\n * Cette action annule tout lien existant entre les deux profils.\n *\n * @returns {Promise<Object>} - Résultat de la suppression.\n * @throws {ApiError} - Si aucune relation n'existe.\n */\n async removeFriend() {\n if (!this.isActingUser) {\n throw new ApiError(\"Vous devez être connecté pour supprimer un ami.\");\n }\n\n this._checkLinkableEntity();\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const { connectTypeDisconnect } = this._getLinkMeta();\n const userLink = this._getLinkFromConnectedUser();\n\n if (!userLink) {\n throw new ApiError(\"Vous n'êtes pas connecté à cette entité.\");\n }\n\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n connectType: connectTypeDisconnect\n };\n const retour = await this.endpointApi.disconnect(data);\n // TODO : reflechier au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n await this.userContext.refresh();\n return retour;\n }\n \n\n requestToJoin() {\n throw new ApiError(\"l'utilisation de requestToJoin n'est pas autorisée sur un utilisateur.\");\n }\n\n requestToJoinAdmin() {\n throw new ApiError(\"l'utilisation de requestToJoinAdmin n'est pas autorisée sur un utilisateur.\");\n }\n\n acceptInvitation() {\n throw new ApiError(\"l'utilisation de acceptInvitation n'est pas autorisée sur un utilisateur.\");\n }\n\n leave() {\n throw new ApiError(\"l'utilisation de leave n'est pas autorisée sur un utilisateur.\");\n }\n\n /**\n * Suivre un utilisateur\n * Cette action permet à l'utilisateur connecté de suivre un autre utilisateur.\n * Elle nécessite que l'utilisateur soit connecté.\n * \n * @returns {Promise<Object>} - Résultat de la requête.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'action est interdite.\n */\n async follow() {\n if (!this.isActingUser) {\n throw new ApiError(\"Vous devez être connecté pour suivre un utilisateur.\");\n }\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const userLink = this.userContext?.serverData?.links?.[\"follows\"]?.[this.id] || null;\n\n if (!userLink) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id\n };\n const retour = await this.endpointApi.follow(data);\n // TODO : reflechier au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n await this.userContext.refresh();\n return retour;\n }\n\n throw new ApiError(\"Vous êtes déjà abonné à cet utilisateur.\");\n }\n\n /**\n * Se désabonner d'un utilisateur\n * Cette action permet à l'utilisateur connecté de se désabonner d'un autre utilisateur.\n * Elle nécessite que l'utilisateur soit connecté.\n * \n * @returns {Promise<Object>} - Résultat de la requête.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'action est interdite.\n */\n async unfollow() {\n if (!this.isActingUser) {\n throw new ApiError(\"Vous devez être connecté pour vous désabonner d'un utilisateur.\");\n }\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const userLink = this.userContext?.serverData?.links?.[\"follows\"]?.[this.id] || null;\n\n if (userLink) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n connectType: \"followers\"\n };\n const retour = await this.endpointApi.disconnect(data);\n // TODO : reflechir au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n await this.userContext.refresh();\n return retour;\n }\n\n throw new ApiError(\"Vous n'êtes pas abonné à cet utilisateur.\");\n }\n\n /**\n * Vérifie si l'utilisateur connecté est ami avec cet utilisateur.\n * \n * @returns {boolean} - True si l'utilisateur connecté est ami, sinon false.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté.\n */\n isFriend() {\n if (!this.isActingUser) {\n throw new ApiError(\"Vous devez être connecté pour vérifier si vous êtes ami.\");\n }\n this._assertEntityType(\"citoyens\");\n const userLink = this._getLinkFromConnectedUser();\n return this._validateUserLink(userLink);\n }\n\n /**\n * Vérifie si l'utilisateur suit l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur suit l'entité, `false` sinon.\n * @throws {ApiError}\n */\n isFollower() {\n if (!this.isActingUser) {\n throw new ApiError(\"Vous devez être connecté pour vérifier si il vous suit.\");\n }\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n this._assertEntityType(\"citoyens\");\n return this._isLinked(\"followers\");\n }\n\n /**\n * Vérifie si l'utilisateur est abonné à l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur est abonné, `false` sinon.\n * @throws {ApiError}\n */\n isFollowing() {\n if (!this.isActingUser) {\n throw new ApiError(\"Vous devez être connecté pour vérifier si vous le suivez.\");\n }\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n this._assertEntityType(\"citoyens\");\n return this._isLinked(\"follows\");\n }\n\n\n}\n\n// Incorporation des mixins dans User\nObject.assign(User.prototype, UserMixin);\n ","// eslint-disable-next-line no-unused-vars\nimport { ApiResponseError } from \"../error.js\";\n\n// UserMixin.js\nexport const UserMixin = {\n\n};\n ","const MongoID = {};\n\nMongoID._looksLikeObjectID = str => str.length === 24 && /^[0-9a-f]*$/.test(str);\n\nMongoID.ObjectID = class ObjectID {\n constructor (hexString) {\n //random-based impl of Mongo ObjectID\n if (hexString) {\n hexString = hexString.toLowerCase();\n if (!MongoID._looksLikeObjectID(hexString)) {\n throw new Error(\"Invalid hexadecimal string for creating an ObjectID\");\n }\n // meant to work with _.isEqual(), which relies on structural equality\n this._str = hexString;\n }\n }\n\n equals(other) {\n return other instanceof MongoID.ObjectID &&\n this.valueOf() === other.valueOf();\n }\n\n toString() {\n return `ObjectID(\"${this._str}\")`;\n }\n\n clone() {\n return new MongoID.ObjectID(this._str);\n }\n\n typeName() {\n return \"oid\";\n }\n\n getTimestamp() {\n return Number.parseInt(this._str.substr(0, 8), 16);\n }\n\n valueOf() {\n return this._str;\n }\n\n toJSONValue() {\n return this.valueOf();\n }\n\n toHexString() {\n return this.valueOf();\n }\n\n};\n\nexport default MongoID;","// Définitions communes extraites automatiquement\nconst common = {\"common1\":{\"type\":\"string\"},\"common2\":{\"format\":\"email\",\"type\":\"string\"},\"common3\":{\"type\":\"boolean\"},\"common4\":{\"format\":\"uri\",\"type\":\"string\"},\"common5\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\",\"type\":\"string\"},\"common6\":{\"additionalProperties\":false,\"properties\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\",\"type\":\"string\"}},\"required\":[\"id\"],\"type\":\"object\"},\"common7\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\",\"type\":\"string\"}},\"common8\":{\"additionalProperties\":false,\"properties\":{\"reason\":{\"default\":\"\",\"type\":\"string\"}},\"required\":[\"reason\"],\"type\":\"object\"},\"common9\":{\"reason\":{\"default\":\"\",\"type\":\"string\"}},\"common10\":{\"default\":\"\",\"type\":\"string\"},\"common11\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"common12\":{\"const\":\"citoyens\"},\"common13\":{\"properties\":{\"value\":{\"type\":\"boolean\"}}},\"common14\":{\"value\":{\"type\":\"boolean\"}},\"common15\":{\"enum\":[\"isOpenData\",\"isOpenEdition\",\"private\",\"feedback\"]},\"common16\":{\"const\":\"organizations\"},\"common17\":{\"const\":\"projects\"},\"common18\":{\"const\":\"events\"},\"common19\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\",\"events\"],\"type\":\"string\"},\"common20\":{},\"common21\":{\"else\":{\"properties\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"}}},\"if\":{\"properties\":{\"typeElement\":{\"const\":\"citoyens\"}}},\"then\":{\"properties\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\",\"type\":\"string\"}}}},\"common22\":{\"properties\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"}}},\"common23\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"}},\"common24\":{\"properties\":{\"typeElement\":{\"const\":\"citoyens\"}}},\"common25\":{\"typeElement\":{\"const\":\"citoyens\"}},\"common26\":{\"properties\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\",\"type\":\"string\"}}},\"common27\":{\"not\":{\"type\":\"null\"}},\"common28\":{\"type\":\"null\"},\"common29\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\",\"poi\",\"events\"],\"type\":\"string\"},\"common30\":{\"anyOf\":[{\"items\":{\"type\":\"string\"},\"type\":\"array\"},{\"enum\":[\"\"],\"type\":\"string\"}]},\"common31\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"common32\":{\"enum\":[\"\"],\"type\":\"string\"},\"common33\":{\"properties\":{\"name\":{\"not\":{\"type\":\"null\"}}},\"required\":[\"name\"]},\"common34\":{\"name\":{\"not\":{\"type\":\"null\"}}},\"common35\":{\"properties\":{\"url\":{\"not\":{\"type\":\"null\"}}},\"required\":[\"url\"]},\"common36\":{\"url\":{\"not\":{\"type\":\"null\"}}},\"common37\":{\"properties\":{\"tags\":{\"not\":{\"type\":\"null\"}}},\"required\":[\"tags\"]},\"common38\":{\"tags\":{\"not\":{\"type\":\"null\"}}},\"common39\":{\"properties\":{\"email\":{\"not\":{\"type\":\"null\"}}},\"required\":[\"email\"]},\"common40\":{\"email\":{\"not\":{\"type\":\"null\"}}},\"common41\":{\"format\":\"date\",\"type\":\"string\"},\"common42\":{\"const\":\"info\",\"default\":\"info\",\"type\":\"string\"},\"common43\":{\"$ref\":\"#/$defs/sharedFields/email\"},\"common44\":{\"$ref\":\"#/$defs/sharedFields/name\"},\"common45\":{\"$ref\":\"#/$defs/sharedFields/tags\"},\"common46\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\"],\"type\":\"string\"},\"common47\":{\"$ref\":\"#/$defs/sharedFields/url\"},\"common48\":{\"properties\":{\"avancement\":{\"not\":{\"type\":\"null\"}}},\"required\":[\"avancement\"]},\"common49\":{\"avancement\":{\"not\":{\"type\":\"null\"}}},\"common50\":{\"properties\":{\"parent\":{\"not\":{\"type\":\"null\"}}},\"required\":[\"parent\"]},\"common51\":{\"parent\":{\"not\":{\"type\":\"null\"}}},\"common52\":{\"additionalProperties\":false,\"patternProperties\":{\"^[a-fA-F0-9]{24}$\":{\"additionalProperties\":false,\"properties\":{\"name\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\",\"name\"],\"type\":\"object\"}},\"type\":\"object\"},\"common53\":{\"^[a-fA-F0-9]{24}$\":{\"additionalProperties\":false,\"properties\":{\"name\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\",\"name\"],\"type\":\"object\"}},\"common54\":{\"additionalProperties\":false,\"properties\":{\"name\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\",\"name\"],\"type\":\"object\"},\"common55\":{\"name\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"common56\":{\"properties\":{\"type\":{\"not\":{\"type\":\"null\"}}},\"required\":[\"type\"]},\"common57\":{\"type\":{\"not\":{\"type\":\"null\"}}},\"common58\":{\"additionalProperties\":false,\"patternProperties\":{\"^(?:[a-f0-9]{24}|@userId)$\":{\"additionalProperties\":false,\"properties\":{\"name\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\"],\"type\":\"object\"}},\"type\":\"object\"},\"common59\":{\"^(?:[a-f0-9]{24}|@userId)$\":{\"additionalProperties\":false,\"properties\":{\"name\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\"],\"type\":\"object\"}},\"common60\":{\"additionalProperties\":false,\"properties\":{\"name\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\"],\"type\":\"object\"},\"common61\":{\"enum\":[\"workshop\",\"competition\",\"concert\",\"contest\",\"conference\",\"debate\",\"exhibition\",\"festival\",\"crowdfunding\",\"fair\",\"course\",\"protest\",\"market\",\"film\",\"getTogether\",\"meeting\",\"spectacle\",\"internship\",\"stand\",\"others\"],\"type\":\"string\"},\"common62\":{\"enum\":[\"link\",\"tool\",\"machine\",\"software\",\"rh\",\"Resource material\",\"Financial Ressource\",\"ficheBlanche\",\"geoJson\",\"compostPickup\",\"video\",\"sharedLibrary\",\"recoveryCenter\",\"trash\",\"history\",\"something2See\",\"funPlace\",\"place\",\"artPiece\",\"streetArts\",\"openScene\",\"stand\",\"parking\",\"other\"],\"type\":\"string\"},\"common63\":{\"enum\":[\"poi\"],\"type\":\"string\"},\"common64\":{\"$ref\":\"#/$defs/socialField\"},\"common65\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\"],\"type\":\"string\"},\"common66\":{\"properties\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\"}}},\"common67\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\"}},\"common68\":{\"pattern\":\"^[a-f0-9]{24}$\"},\"common69\":{\"const\":\"\",\"type\":\"string\"},\"common70\":{\"additionalProperties\":false,\"properties\":{\"@type\":{\"const\":\"PostalAddress\",\"type\":\"string\"},\"addressCountry\":{\"type\":\"string\"},\"addressLocality\":{\"type\":\"string\"},\"codeInsee\":{\"type\":\"string\"},\"level1\":{\"type\":\"string\"},\"level1Name\":{\"type\":\"string\"},\"level3\":{\"minLength\":0,\"type\":\"string\"},\"level3Name\":{\"minLength\":0,\"type\":\"string\"},\"level4\":{\"minLength\":0,\"type\":\"string\"},\"level4Name\":{\"minLength\":0,\"type\":\"string\"},\"localityId\":{\"type\":\"string\"},\"postalCode\":{\"type\":\"string\"},\"streetAddress\":{\"type\":\"string\"}},\"required\":[\"@type\",\"addressCountry\",\"codeInsee\",\"addressLocality\",\"localityId\",\"level1\",\"level1Name\"],\"type\":\"object\"},\"common71\":{\"@type\":{\"const\":\"PostalAddress\",\"type\":\"string\"},\"addressCountry\":{\"type\":\"string\"},\"addressLocality\":{\"type\":\"string\"},\"codeInsee\":{\"type\":\"string\"},\"level1\":{\"type\":\"string\"},\"level1Name\":{\"type\":\"string\"},\"level3\":{\"minLength\":0,\"type\":\"string\"},\"level3Name\":{\"minLength\":0,\"type\":\"string\"},\"level4\":{\"minLength\":0,\"type\":\"string\"},\"level4Name\":{\"minLength\":0,\"type\":\"string\"},\"localityId\":{\"type\":\"string\"},\"postalCode\":{\"type\":\"string\"},\"streetAddress\":{\"type\":\"string\"}},\"common72\":{\"const\":\"PostalAddress\",\"type\":\"string\"},\"common73\":{\"minLength\":0,\"type\":\"string\"},\"common74\":{\"additionalProperties\":false,\"properties\":{\"@type\":{\"const\":\"GeoCoordinates\",\"type\":\"string\"},\"latitude\":{\"type\":[\"string\",\"number\"]},\"longitude\":{\"type\":[\"string\",\"number\"]}},\"required\":[\"latitude\",\"longitude\"],\"type\":\"object\"},\"common75\":{\"@type\":{\"const\":\"GeoCoordinates\",\"type\":\"string\"},\"latitude\":{\"type\":[\"string\",\"number\"]},\"longitude\":{\"type\":[\"string\",\"number\"]}},\"common76\":{\"const\":\"GeoCoordinates\",\"type\":\"string\"},\"common77\":{\"type\":[\"string\",\"number\"]},\"common78\":{\"additionalProperties\":true,\"properties\":{\"coordinates\":{\"items\":{\"type\":\"number\"},\"maxItems\":2,\"minItems\":2,\"type\":\"array\"},\"float\":{\"const\":true,\"default\":true,\"type\":\"boolean\"},\"type\":{\"const\":\"Point\",\"type\":\"string\"}},\"required\":[\"type\",\"coordinates\",\"float\"],\"type\":\"object\"},\"common79\":{\"coordinates\":{\"items\":{\"type\":\"number\"},\"maxItems\":2,\"minItems\":2,\"type\":\"array\"},\"float\":{\"const\":true,\"default\":true,\"type\":\"boolean\"},\"type\":{\"const\":\"Point\",\"type\":\"string\"}},\"common80\":{\"items\":{\"type\":\"number\"},\"maxItems\":2,\"minItems\":2,\"type\":\"array\"},\"common81\":{\"type\":\"number\"},\"common82\":{\"const\":true,\"default\":true,\"type\":\"boolean\"},\"common83\":{\"const\":\"Point\",\"type\":\"string\"},\"common84\":{\"properties\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}}},\"common85\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}},\"common86\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"},\"common87\":{\"maxLength\":100,\"minLength\":3,\"pattern\":\"^[a-zA-Z0-9]+$\",\"type\":\"string\"},\"common88\":{\"properties\":{\"type\":{\"const\":\"citoyens\"}}},\"common89\":{\"type\":{\"const\":\"citoyens\"}},\"common90\":{\"properties\":{\"ownerId\":{\"pattern\":\"^[a-f0-9]{24}$\"}}},\"common91\":{\"ownerId\":{\"pattern\":\"^[a-f0-9]{24}$\"}},\"common92\":{\"properties\":{\"folder\":{\"const\":\"citoyens\"}}},\"common93\":{\"folder\":{\"const\":\"citoyens\"}},\"common94\":{\"properties\":{\"ownerId\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}}},\"common95\":{\"ownerId\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}},\"common96\":{\"properties\":{\"parentId\":{\"pattern\":\"^[a-f0-9]{24}$\"}}},\"common97\":{\"parentId\":{\"pattern\":\"^[a-f0-9]{24}$\"}},\"common98\":{\"properties\":{\"parentType\":{\"const\":\"citoyens\"}}},\"common99\":{\"parentType\":{\"const\":\"citoyens\"}},\"common100\":{\"properties\":{\"parentId\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}}},\"common101\":{\"parentId\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}},\"common102\":{\"default\":true,\"type\":\"boolean\"},\"common103\":{\"default\":0,\"type\":\"integer\"},\"common104\":{\"required\":[\"text\"]},\"common105\":{\"required\":[\"mediaImg\"]},\"common106\":{\"required\":[\"mediaFile\"]},\"common107\":{\"additionalProperties\":false,\"properties\":{\"countFiles\":{\"type\":\"number\"},\"files\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"countFiles\",\"files\"],\"type\":\"object\"},\"common108\":{\"countFiles\":{\"type\":\"number\"},\"files\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"common109\":{\"additionalProperties\":false,\"properties\":{\"countImages\":{\"type\":\"number\"},\"images\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"countImages\",\"images\"],\"type\":\"object\"},\"common110\":{\"countImages\":{\"type\":\"number\"},\"images\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"common111\":{\"items\":{\"properties\":{\"count\":{\"minimum\":1,\"type\":\"integer\"},\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"slug\",\"type\",\"value\",\"count\"],\"type\":\"object\"},\"type\":\"array\"},\"common112\":{\"properties\":{\"count\":{\"minimum\":1,\"type\":\"integer\"},\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"slug\",\"type\",\"value\",\"count\"],\"type\":\"object\"},\"common113\":{\"count\":{\"minimum\":1,\"type\":\"integer\"},\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"common114\":{\"minimum\":1,\"type\":\"integer\"},\"common115\":{\"default\":\"public\",\"enum\":[\"public\",\"private\",\"restricted\"],\"type\":\"string\"},\"common116\":{\"const\":\"news\",\"default\":\"news\",\"type\":\"string\"},\"common117\":{\"additionalProperties\":false,\"else\":{\"properties\":{\"ownerId\":{\"pattern\":\"^[a-f0-9]{24}$\"}}},\"if\":{\"properties\":{\"folder\":{\"const\":\"citoyens\"}}},\"properties\":{\"folder\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\"],\"type\":\"string\"},\"ownerId\":{\"type\":\"string\"}},\"required\":[\"folder\",\"ownerId\"],\"then\":{\"properties\":{\"ownerId\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}}},\"type\":\"object\"},\"common118\":{\"folder\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\"],\"type\":\"string\"},\"ownerId\":{\"type\":\"string\"}},\"common119\":{\"additionalProperties\":false,\"properties\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"}},\"required\":[\"id\"],\"type\":\"object\"},\"common120\":{\"default\":false,\"type\":\"boolean\"},\"common121\":{\"properties\":{\"childId\":{\"pattern\":\"^[a-f0-9]{24}$\"}}},\"common122\":{\"childId\":{\"pattern\":\"^[a-f0-9]{24}$\"}},\"common123\":{\"properties\":{\"childType\":{\"const\":\"citoyens\"}}},\"common124\":{\"childType\":{\"const\":\"citoyens\"}},\"common125\":{\"const\":\"share\",\"default\":\"share\",\"type\":\"string\"},\"common126\":{\"properties\":{\"childId\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}}},\"common127\":{\"childId\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}},\"common128\":{\"additionalProperties\":false,\"properties\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"type\":{\"default\":\"news\",\"enum\":[\"news\"],\"type\":\"string\"}},\"required\":[\"type\",\"id\"],\"type\":\"object\"},\"common129\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"type\":{\"default\":\"news\",\"enum\":[\"news\"],\"type\":\"string\"}},\"common130\":{\"default\":\"news\",\"enum\":[\"news\"],\"type\":\"string\"},\"common131\":{\"items\":{\"additionalProperties\":false,\"properties\":{\"count\":{\"type\":\"number\"},\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"slug\",\"type\",\"value\",\"count\"],\"type\":\"object\"},\"type\":\"array\"},\"common132\":{\"additionalProperties\":false,\"properties\":{\"count\":{\"type\":\"number\"},\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"slug\",\"type\",\"value\",\"count\"],\"type\":\"object\"},\"common133\":{\"count\":{\"type\":\"number\"},\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"common134\":{\"enum\":[\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\",\"projects\",\"citoyens\",\"poi\"],\"type\":\"string\"},\"common135\":{\"const\":false,\"default\":false,\"type\":\"boolean\"},\"common136\":{\"const\":\"\",\"default\":\"\",\"type\":\"string\"},\"common137\":{\"default\":0,\"type\":\"number\"},\"common138\":{\"default\":30,\"type\":\"number\"},\"common139\":{\"additionalProperties\":false,\"patternProperties\":{\"^[^\\\\s]+$\":{\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"type\":{\"enum\":[\"cities\",\"level1\"],\"type\":\"string\"}},\"required\":[\"id\",\"type\"],\"type\":\"object\"}},\"type\":\"object\"},\"common140\":{\"^[^\\\\s]+$\":{\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"type\":{\"enum\":[\"cities\",\"level1\"],\"type\":\"string\"}},\"required\":[\"id\",\"type\"],\"type\":\"object\"}},\"common141\":{\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"type\":{\"enum\":[\"cities\",\"level1\"],\"type\":\"string\"}},\"required\":[\"id\",\"type\"],\"type\":\"object\"},\"common142\":{\"id\":{\"type\":\"string\"},\"type\":{\"enum\":[\"cities\",\"level1\"],\"type\":\"string\"}},\"common143\":{\"enum\":[\"cities\",\"level1\"],\"type\":\"string\"},\"common144\":{\"additionalProperties\":false,\"patternProperties\":{\"^[^\\\\s]+$\":{\"additionalProperties\":false,\"properties\":{\"indexMax\":{\"type\":\"number\"},\"indexMin\":{\"type\":\"number\"}},\"required\":[\"indexMin\",\"indexMax\"],\"type\":\"object\"}},\"type\":\"object\"},\"common145\":{\"^[^\\\\s]+$\":{\"additionalProperties\":false,\"properties\":{\"indexMax\":{\"type\":\"number\"},\"indexMin\":{\"type\":\"number\"}},\"required\":[\"indexMin\",\"indexMax\"],\"type\":\"object\"}},\"common146\":{\"additionalProperties\":false,\"properties\":{\"indexMax\":{\"type\":\"number\"},\"indexMin\":{\"type\":\"number\"}},\"required\":[\"indexMin\",\"indexMax\"],\"type\":\"object\"},\"common147\":{\"indexMax\":{\"type\":\"number\"},\"indexMin\":{\"type\":\"number\"}},\"common148\":{\"enum\":[\"ALL\"],\"type\":\"string\"},\"common149\":{\"default\":0,\"minimum\":0,\"type\":\"integer\"},\"common150\":{\"const\":[\"projects\"],\"default\":[\"projects\"],\"items\":{\"enum\":[\"projects\"],\"type\":\"string\"},\"type\":\"array\"},\"common151\":{\"enum\":[\"projects\"],\"type\":\"string\"},\"common152\":{\"$exists\":true},\"common153\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":true}},\"required\":[\"$exists\"],\"type\":\"object\"},\"common154\":{\"$exists\":{\"const\":true}},\"common155\":{\"const\":true},\"common156\":{\"additionalProperties\":false,\"else\":{\"properties\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\"}}},\"if\":{\"properties\":{\"type\":{\"const\":\"citoyens\"}}},\"properties\":{\"id\":{\"type\":\"string\"},\"type\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\"],\"type\":\"string\"}},\"required\":[\"type\",\"id\"],\"then\":{\"properties\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}}},\"type\":\"object\"},\"common157\":{\"id\":{\"type\":\"string\"},\"type\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\"],\"type\":\"string\"}},\"common158\":{\"const\":[\"poi\"],\"default\":[\"poi\"],\"items\":{\"enum\":[\"poi\"],\"type\":\"string\"},\"type\":\"array\"},\"common159\":{\"const\":[\"NGO\",\"Cooperative\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\"],\"default\":[\"NGO\",\"Cooperative\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\"],\"items\":{\"enum\":[\"NGO\",\"Cooperative\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\"],\"type\":\"string\"},\"type\":\"array\"},\"common160\":{\"enum\":[\"NGO\",\"Cooperative\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\"],\"type\":\"string\"},\"common161\":{\"$exists\":false},\"common162\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":false}},\"required\":[\"$exists\"],\"type\":\"object\"},\"common163\":{\"$exists\":{\"const\":false}},\"common164\":{\"const\":false},\"common165\":{\"default\":30,\"type\":\"integer\"},\"common166\":{\"const\":[\"citoyens\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"default\":[\"citoyens\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"items\":{\"enum\":[\"citoyens\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"type\":\"string\"},\"type\":\"array\"},\"common167\":{\"enum\":[\"citoyens\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"type\":\"string\"},\"common168\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"default\":false,\"type\":\"boolean\"}},\"required\":[\"$exists\"],\"type\":\"object\"},\"common169\":{\"$exists\":{\"default\":false,\"type\":\"boolean\"}},\"common170\":{\"additionalProperties\":false,\"properties\":{\"$in\":{\"items\":{\"type\":\"string\"},\"minItems\":1,\"type\":\"array\"}},\"required\":[\"$in\"],\"type\":\"object\"},\"common171\":{\"$in\":{\"items\":{\"type\":\"string\"},\"minItems\":1,\"type\":\"array\"}},\"common172\":{\"items\":{\"type\":\"string\"},\"minItems\":1,\"type\":\"array\"},\"common173\":{\"const\":[\"citoyens\"],\"default\":[\"citoyens\"],\"items\":{\"enum\":[\"citoyens\"],\"type\":\"string\"},\"type\":\"array\"},\"common174\":{\"enum\":[\"citoyens\"],\"type\":\"string\"},\"common175\":{\"const\":[\"citoyens\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\",\"projects\"],\"default\":[\"citoyens\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\",\"projects\"],\"items\":{\"enum\":[\"citoyens\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\",\"projects\"],\"type\":\"string\"},\"type\":\"array\"},\"common176\":{\"enum\":[\"citoyens\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\",\"projects\"],\"type\":\"string\"},\"common177\":{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.followers\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"}}},\"common178\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.followers\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"}},\"common179\":{\"pattern\":\"^(?!links\\\\.followers\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"},\"common180\":{\"^links\\\\.followers\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":true}},\"required\":[\"$exists\"],\"type\":\"object\"},\"^links\\\\.followers\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isInviting$\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":false}},\"required\":[\"$exists\"],\"type\":\"object\"},\"^links\\\\.followers\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.toBeValidated$\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":false}},\"required\":[\"$exists\"],\"type\":\"object\"}},\"common181\":{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.follows\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"}}},\"common182\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.follows\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"}},\"common183\":{\"pattern\":\"^(?!links\\\\.follows\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"},\"common184\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"organizations\",\"projects\"],\"type\":\"string\"},\"common185\":{\"const\":[\"badges\"],\"default\":[\"badges\"],\"items\":{\"enum\":[\"badges\"],\"type\":\"string\"},\"type\":\"array\"},\"common186\":{\"enum\":[\"badges\"],\"type\":\"string\"},\"common187\":{\"const\":[\"citoyens\",\"projects\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"default\":[\"citoyens\",\"projects\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"items\":{\"enum\":[\"citoyens\",\"projects\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"type\":\"string\"},\"type\":\"array\"},\"common188\":{\"enum\":[\"citoyens\",\"projects\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"type\":\"string\"},\"common189\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":true,\"type\":\"boolean\"}},\"required\":[\"$exists\"],\"type\":\"object\"},\"common190\":{\"$exists\":{\"const\":true,\"type\":\"boolean\"}},\"common191\":{\"const\":true,\"type\":\"boolean\"},\"common192\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":false,\"type\":\"boolean\"}},\"required\":[\"$exists\"],\"type\":\"object\"},\"common193\":{\"$exists\":{\"const\":false,\"type\":\"boolean\"}},\"common194\":{\"const\":false,\"type\":\"boolean\"},\"common195\":{\"badges\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.attenteEmetteur$\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":false,\"type\":\"boolean\"}},\"required\":[\"$exists\"],\"type\":\"object\"},\"badges\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.attenteRecepteur$\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":true,\"type\":\"boolean\"}},\"required\":[\"$exists\"],\"type\":\"object\"}},\"common196\":{\"indexMax\":30,\"indexMin\":0},\"common197\":{\"properties\":{\"parentType\":{\"const\":\"organizations\"}}},\"common198\":{\"parentType\":{\"const\":\"organizations\"}},\"common199\":{\"properties\":{\"parentType\":{\"const\":\"projects\"}}},\"common200\":{\"parentType\":{\"const\":\"projects\"}},\"common201\":{\"properties\":{\"parentType\":{\"const\":\"events\"}}},\"common202\":{\"parentType\":{\"const\":\"events\"}},\"common203\":{\"default\":\"@userId\",\"pattern\":\"^([a-f0-9]{24}|@\\\\w+)$\",\"type\":\"string\"},\"common204\":{\"const\":\"citoyens\",\"default\":\"citoyens\",\"enum\":[\"citoyens\"],\"type\":\"string\"},\"common205\":{\"enum\":[\"citoyens\",\"organizations\",\"projects\",\"events\"],\"type\":\"string\"},\"common206\":{\"const\":\"citoyens\",\"default\":\"citoyens\",\"type\":\"string\"},\"common207\":{\"const\":\"@userId\",\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\",\"type\":\"string\"},\"common208\":{\"default\":{\"isOpenData\":true,\"isOpenEdition\":true},\"properties\":{\"isOpenData\":{\"default\":true,\"type\":\"boolean\"},\"isOpenEdition\":{\"default\":true,\"type\":\"boolean\"}},\"required\":[\"isOpenData\",\"isOpenEdition\"],\"type\":\"object\"},\"common209\":{\"isOpenData\":true,\"isOpenEdition\":true},\"common210\":{\"isOpenData\":{\"default\":true,\"type\":\"boolean\"},\"isOpenEdition\":{\"default\":true,\"type\":\"boolean\"}},\"common211\":{\"additionalProperties\":false,\"default\":{\"@userId\":{\"type\":\"citoyens\"}},\"patternProperties\":{\"^(?:[a-f0-9]{24}|@userId)$\":{\"additionalProperties\":false,\"properties\":{\"name\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\"],\"type\":\"object\"}},\"type\":\"object\"},\"common212\":{\"@userId\":{\"type\":\"citoyens\"}},\"common213\":{\"type\":\"citoyens\"},\"common214\":{\"const\":\"poi\",\"default\":\"poi\",\"type\":\"string\"},\"common215\":{\"const\":\"events\",\"default\":\"events\",\"type\":\"string\"},\"common216\":{\"format\":\"date-time\",\"type\":\"string\"},\"common217\":{\"pattern\":\"^([01]\\\\d|2[0-3]):[0-5]\\\\d$\",\"type\":\"string\"},\"common218\":{\"type\":\"integer\"},\"common219\":{\"additionalProperties\":false,\"properties\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"type\":{\"const\":\"citoyens\",\"default\":\"citoyens\",\"type\":\"string\"}},\"required\":[\"type\",\"id\"],\"type\":\"object\"},\"common220\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"type\":{\"const\":\"citoyens\",\"default\":\"citoyens\",\"type\":\"string\"}},\"common221\":{\"default\":\"@userId\",\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"common222\":{\"const\":\"badges\",\"default\":\"badges\",\"type\":\"string\"},\"common223\":{\"const\":\"badge\",\"default\":\"badge\",\"type\":\"string\"},\"common224\":{\"patternProperties\":{\"^[0-9a-f]{24}$\":{\"additionalProperties\":false,\"properties\":{\"isAdmin\":{\"default\":\"\",\"enum\":[\"\",\"admin\"],\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"roles\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"name\"],\"type\":\"object\"}},\"type\":\"object\"},\"common225\":{\"^[0-9a-f]{24}$\":{\"additionalProperties\":false,\"properties\":{\"isAdmin\":{\"default\":\"\",\"enum\":[\"\",\"admin\"],\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"roles\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"name\"],\"type\":\"object\"}},\"common226\":{\"additionalProperties\":false,\"properties\":{\"isAdmin\":{\"default\":\"\",\"enum\":[\"\",\"admin\"],\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"roles\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"name\"],\"type\":\"object\"},\"common227\":{\"isAdmin\":{\"default\":\"\",\"enum\":[\"\",\"admin\"],\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"roles\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"common228\":{\"default\":\"\",\"enum\":[\"\",\"admin\"],\"type\":\"string\"},\"common229\":{\"enum\":[\"projects\",\"organizations\"],\"type\":\"string\"},\"common230\":{\"items\":{\"enum\":[\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\",\"organizations\",\"projects\",\"events\",\"citoyens\",\"poi\"],\"type\":\"string\"},\"type\":\"array\"},\"common231\":{\"enum\":[\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\",\"organizations\",\"projects\",\"events\",\"citoyens\",\"poi\"],\"type\":\"string\"},\"common232\":{\"additionalProperties\":false,\"properties\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"type\":{\"default\":\"events\",\"type\":\"string\"}},\"required\":[\"id\",\"type\"],\"type\":\"object\"},\"common233\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"type\":{\"default\":\"events\",\"type\":\"string\"}},\"common234\":{\"default\":\"events\",\"type\":\"string\"},\"common235\":{\"items\":{\"properties\":{\"id\":{\"type\":\"string\"}},\"required\":[\"id\"],\"type\":\"object\"},\"type\":\"array\"},\"common236\":{\"properties\":{\"id\":{\"type\":\"string\"}},\"required\":[\"id\"],\"type\":\"object\"},\"common237\":{\"id\":{\"type\":\"string\"}},\"common238\":{\"additionalProperties\":false,\"properties\":{\"contextId\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"contextType\":{\"enum\":[\"projects\",\"organizations\"],\"type\":\"string\"},\"costumEditMode\":{\"default\":false,\"type\":\"boolean\"},\"costumSlug\":{\"type\":\"string\"},\"sourceKey\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"common239\":{\"contextId\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"contextType\":{\"enum\":[\"projects\",\"organizations\"],\"type\":\"string\"},\"costumEditMode\":{\"default\":false,\"type\":\"boolean\"},\"costumSlug\":{\"type\":\"string\"},\"sourceKey\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}}};\n\n// Endpoints avec intégration des définitions communes\nexport default {\"endpoints\":[{\"auth\":\"none\",\"constant\":\"PERSON_REGISTER\",\"contentType\":\"application/x-www-form-urlencoded\",\"generateModule\":\"UserNoAuth\",\"method\":\"POST\",\"onlyAuthNone\":true,\"path\":\"/co2/person/register\",\"request\":{\"additionalProperties\":false,\"properties\":{\"app\":common.common1,\"email\":common.common2,\"isInvitation\":common.common3,\"mode\":common.common1,\"name\":common.common1,\"pendingUserId\":common.common1,\"pwd\":common.common1,\"username\":common.common1},\"required\":[\"name\",\"username\",\"email\",\"pwd\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"AUTHENTICATE_URL\",\"contentType\":\"application/json\",\"generateModule\":\"UserNoAuth\",\"method\":\"POST\",\"onlyAuthNone\":true,\"path\":\"/api/cocolight/authenticate\",\"postActions\":[{\"path\":\"accessToken\",\"type\":\"setToken\"},{\"path\":\"refreshToken\",\"type\":\"setRefreshToken\"},{\"event\":\"userLoggedIn\",\"path\":\"user\",\"type\":\"emitEvent\"}],\"request\":{\"additionalProperties\":false,\"properties\":{\"email\":common.common2,\"password\":common.common1},\"required\":[\"email\",\"password\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"REFRESH_TOKEN_URL\",\"contentType\":\"application/json\",\"method\":\"POST\",\"path\":\"/api/cocolight/refreshtoken\",\"request\":{\"additionalProperties\":false,\"properties\":{\"refreshToken\":common.common1},\"required\":[\"refreshToken\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ME_INFO_URL\",\"contentType\":\"application/json\",\"method\":\"POST\",\"path\":\"/api/cocolight/me\"},{\"auth\":\"none\",\"constant\":\"PASSWORD_RECOVERY\",\"contentType\":\"application/x-www-form-urlencoded\",\"generateModule\":\"UserNoAuth\",\"method\":\"POST\",\"onlyAuthNone\":true,\"path\":\"/co2/person/sendemail\",\"request\":{\"additionalProperties\":false,\"properties\":{\"email\":common.common2,\"type\":{\"const\":\"password\",\"default\":\"password\",\"type\":\"string\"}},\"required\":[\"email\",\"type\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"SERVER_EXCHANGE_TOKEN\",\"contentType\":\"application/json\",\"method\":\"POST\",\"path\":\"/api/cocolight/exchangetoken\",\"request\":{\"additionalProperties\":false,\"properties\":{\"serverUrl\":common.common4},\"required\":[\"serverUrl\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"CHANGE_PASSWORD\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/person/changepassword\",\"request\":{\"additionalProperties\":false,\"properties\":{\"mode\":{\"const\":\"changePassword\",\"default\":\"changePassword\",\"type\":\"string\"},\"newPassword\":common.common1,\"newPassword2\":common.common1,\"oldPassword\":common.common1,\"scope\":{\"default\":\"\",\"type\":[\"string\"]},\"userId\":common.common5},\"required\":[\"mode\",\"userId\",\"oldPassword\",\"newPassword\",\"newPassword2\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"DELETE_ACCOUNT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/delete/id/{id}/type/citoyens\",\"pathParams\":common.common6,\"postActions\":[{\"type\":\"resetSession\"},{\"event\":\"accountDeleted\",\"path\":null,\"type\":\"emitEvent\"}],\"request\":common.common8},{\"auth\":\"bearer\",\"constant\":\"UPDATE_SETTINGS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/updatesettings\",\"request\":{\"additionalProperties\":false,\"allOf\":[{\"else\":{\"properties\":{\"idEntity\":common.common11}},\"if\":{\"properties\":{\"typeEntity\":common.common12}},\"then\":{\"properties\":{\"idEntity\":common.common5}}},{\"if\":{\"properties\":{\"type\":{\"enum\":[\"birthDate\",\"email\",\"locality\",\"phone\",\"directory\"]},\"typeEntity\":common.common12}},\"then\":{\"properties\":{\"value\":{\"enum\":[\"private\",\"public\",\"mask\"],\"type\":\"string\"}}}},{\"if\":{\"properties\":{\"type\":{\"enum\":[\"activitypub\",\"isOpenData\"]},\"typeEntity\":common.common12}},\"then\":common.common13},{\"if\":{\"properties\":{\"type\":common.common15,\"typeEntity\":common.common16}},\"then\":common.common13},{\"if\":{\"properties\":{\"type\":common.common15,\"typeEntity\":common.common17}},\"then\":common.common13},{\"if\":{\"properties\":{\"type\":{\"enum\":[\"isOpenData\",\"isOpenEdition\",\"public\"]},\"typeEntity\":common.common18}},\"then\":common.common13}],\"properties\":{\"idEntity\":common.common1,\"type\":common.common1,\"typeEntity\":common.common19,\"value\":common.common20},\"required\":[\"type\",\"value\",\"typeEntity\",\"idEntity\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"UPDATE_BLOCK_DESCRIPTION\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/updateblock/\",\"request\":{\"additionalProperties\":false,\"allOf\":[common.common21,{\"anyOf\":[{\"properties\":{\"description\":common.common27},\"required\":[\"description\"]},{\"properties\":{\"shortDescription\":common.common27},\"required\":[\"shortDescription\"]}]}],\"properties\":{\"block\":{\"const\":\"descriptions\",\"default\":\"descriptions\",\"type\":\"string\"},\"descMentions\":common.common10,\"description\":common.common1,\"id\":common.common1,\"scope\":{\"default\":\"\",\"type\":[\"string\",\"null\"]},\"shortDescription\":common.common1,\"typeElement\":common.common29},\"required\":[\"block\",\"typeElement\",\"id\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"UPDATE_BLOCK_INFO\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/updateblock/\",\"request\":{\"$defs\":{\"sharedFields\":{\"email\":common.common2,\"name\":common.common1,\"tags\":common.common30,\"url\":common.common4}},\"allOf\":[{\"if\":common.common24,\"then\":{\"additionalProperties\":false,\"anyOf\":[common.common33,{\"properties\":{\"birthDate\":common.common27},\"required\":[\"birthDate\"]},{\"properties\":{\"fixe\":common.common27},\"required\":[\"fixe\"]},{\"properties\":{\"mobile\":common.common27},\"required\":[\"mobile\"]},common.common35,common.common37,common.common39],\"properties\":{\"birthDate\":common.common41,\"block\":common.common42,\"email\":common.common43,\"fixe\":common.common1,\"id\":common.common5,\"mobile\":common.common1,\"name\":common.common44,\"scope\":common.common10,\"tags\":common.common45,\"typeElement\":common.common46,\"url\":common.common47}}},{\"if\":{\"properties\":{\"typeElement\":common.common17}},\"then\":{\"additionalProperties\":false,\"anyOf\":[common.common33,common.common35,common.common37,common.common39,common.common48,common.common50],\"properties\":{\"avancement\":{\"enum\":[\"abandoned\",\"concept\",\"development\",\"production\",\"started\",\"testing\",\"idea\",\"mature\",\"qa\",\"finished\"],\"type\":\"string\"},\"block\":common.common42,\"email\":common.common43,\"id\":common.common1,\"name\":common.common44,\"parent\":common.common52,\"scope\":common.common10,\"tags\":common.common45,\"typeElement\":{\"default\":\"citoyens\",\"enum\":[\"projects\"],\"type\":\"string\"},\"url\":common.common47}}},{\"if\":{\"properties\":{\"typeElement\":common.common18}},\"then\":{\"additionalProperties\":false,\"anyOf\":[common.common33,common.common35,common.common37,common.common39,common.common48,common.common56,{\"properties\":{\"organizer\":common.common27},\"required\":[\"organizer\"]},common.common50],\"properties\":{\"block\":common.common42,\"email\":common.common43,\"id\":common.common1,\"name\":common.common44,\"organizer\":common.common58,\"parent\":common.common52,\"scope\":common.common10,\"tags\":common.common45,\"type\":common.common61,\"typeElement\":{\"default\":\"citoyens\",\"enum\":[\"events\"],\"type\":\"string\"},\"url\":common.common47}}},{\"if\":{\"properties\":{\"typeElement\":common.common16}},\"then\":{\"additionalProperties\":false,\"anyOf\":[common.common33,common.common35,common.common37,common.common39,common.common56],\"properties\":{\"block\":common.common42,\"email\":common.common43,\"id\":common.common1,\"name\":common.common44,\"scope\":common.common10,\"tags\":common.common45,\"type\":{\"enum\":[\"NGO\",\"Cooperative\",\"LocalBusiness\",\"GovernmentOrganizationautre\"],\"type\":\"string\"},\"typeElement\":{\"enum\":[\"organizations\"],\"type\":\"string\"},\"url\":common.common47}}},{\"if\":{\"properties\":{\"typeElement\":{\"const\":\"poi\"}}},\"then\":{\"additionalProperties\":false,\"anyOf\":[common.common33,common.common35,common.common37,common.common39,common.common56,{\"properties\":{\"urls\":common.common27},\"required\":[\"urls\"]}],\"properties\":{\"block\":common.common42,\"email\":common.common43,\"id\":common.common1,\"name\":common.common44,\"scope\":common.common10,\"tags\":common.common45,\"type\":common.common62,\"typeElement\":common.common63,\"url\":common.common47,\"urls\":common.common31}}}],\"properties\":{\"block\":common.common42,\"id\":common.common1,\"scope\":common.common10,\"typeElement\":common.common29},\"required\":[\"block\",\"typeElement\",\"id\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"UPDATE_BLOCK_SOCIAL\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/updateblock/\",\"request\":{\"$defs\":{\"socialField\":{\"anyOf\":[common.common32,common.common4]}},\"allOf\":[common.common21,{\"anyOf\":[{\"properties\":{\"gitlab\":common.common27},\"required\":[\"gitlab\"]},{\"properties\":{\"github\":common.common27},\"required\":[\"github\"]},{\"properties\":{\"twitter\":common.common27},\"required\":[\"twitter\"]},{\"properties\":{\"facebook\":common.common27},\"required\":[\"facebook\"]},{\"properties\":{\"instagram\":common.common27},\"required\":[\"instagram\"]},{\"properties\":{\"diaspora\":common.common27},\"required\":[\"diaspora\"]},{\"properties\":{\"mastodon\":common.common27},\"required\":[\"mastodon\"]},{\"properties\":{\"telegram\":common.common27},\"required\":[\"telegram\"]},{\"properties\":{\"signal\":common.common27},\"required\":[\"signal\"]}]}],\"properties\":{\"block\":{\"const\":\"network\",\"default\":\"network\",\"type\":\"string\"},\"diaspora\":common.common64,\"facebook\":common.common64,\"github\":common.common64,\"gitlab\":common.common64,\"id\":common.common1,\"instagram\":common.common64,\"mastodon\":common.common64,\"scope\":common.common10,\"signal\":common.common64,\"telegram\":common.common64,\"twitter\":common.common64,\"typeElement\":common.common65},\"required\":[\"block\",\"typeElement\",\"id\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"UPDATE_BLOCK_LOCALITY\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/updateblock/\",\"request\":{\"else\":common.common66,\"if\":common.common24,\"properties\":{\"address\":{\"oneOf\":[common.common69,common.common70]},\"block\":{\"const\":\"localities\",\"default\":\"localities\",\"type\":\"string\"},\"geo\":{\"oneOf\":[common.common69,common.common74]},\"geoPosition\":{\"oneOf\":[common.common69,common.common78]},\"id\":common.common1,\"scope\":common.common10,\"typeElement\":common.common29},\"required\":[\"block\",\"typeElement\",\"id\",\"address\"],\"then\":common.common84,\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"UPDATE_BLOCK_SLUG\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/updateblock/\",\"request\":{\"else\":common.common66,\"if\":common.common24,\"properties\":{\"block\":common.common42,\"id\":common.common1,\"scope\":common.common10,\"slug\":common.common87,\"typeElement\":common.common29},\"required\":[\"block\",\"typeElement\",\"id\",\"slug\"],\"then\":common.common84,\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"CHECK\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/slug/check\",\"request\":{\"additionalProperties\":false,\"else\":common.common66,\"if\":common.common88,\"properties\":{\"block\":common.common42,\"id\":common.common1,\"slug\":common.common87,\"type\":common.common19},\"required\":[\"block\",\"type\",\"id\",\"slug\"],\"then\":common.common84,\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"PROFIL_IMAGE\",\"contentType\":\"multipart/form-data\",\"method\":\"POST\",\"path\":\"/co2/document/upload-save/dir/communecter/folder/{folder}/ownerId/{ownerId}/input/profil_avatar/contentKey/profil/docType/image\",\"pathParams\":{\"additionalProperties\":false,\"else\":common.common90,\"if\":common.common92,\"properties\":{\"folder\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\",\"events\",\"poi\"],\"type\":\"string\"},\"ownerId\":common.common1},\"required\":[\"folder\",\"ownerId\"],\"then\":common.common94,\"type\":\"object\"},\"request\":{\"additionalProperties\":false,\"properties\":{\"profil_avatar\":common.common20},\"required\":[\"profil_avatar\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_ELEMENTS_ABOUT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/about/type/{type}/id/{id}/json/true\",\"pathParams\":{\"additionalProperties\":false,\"else\":common.common66,\"if\":common.common88,\"properties\":{\"id\":common.common1,\"type\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\",\"events\",\"poi\",\"badges\"],\"type\":\"string\"}},\"required\":[\"type\",\"id\"],\"then\":common.common84,\"type\":\"object\"},\"request\":{\"additionalProperties\":false,\"properties\":{\"tpl\":{\"const\":\"ficheInfoElement\",\"default\":\"ficheInfoElement\",\"type\":\"string\"}},\"required\":[\"tpl\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"MULTICONNECT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/link/multiconnect\",\"request\":{\"additionalProperties\":false,\"else\":common.common96,\"if\":common.common98,\"properties\":{\"listInvite\":{\"additionalProperties\":false,\"patternProperties\":{\"^(citoyens|projects|organizations)$\":{\"additionalProperties\":false,\"patternProperties\":{\"^[0-9a-fA-F]{24}$\":{\"additionalProperties\":false,\"properties\":{\"name\":common.common1},\"required\":[\"name\"],\"type\":\"object\"}},\"type\":\"object\"}},\"type\":\"object\"},\"parentId\":common.common1,\"parentType\":common.common65},\"required\":[\"parentId\",\"parentType\",\"listInvite\"],\"then\":common.common100,\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_NEWS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/news/co/get/type/{type}/id/{id}/isLive/{isLive}/json/true\",\"pathParams\":{\"additionalProperties\":false,\"else\":common.common66,\"if\":common.common88,\"properties\":{\"id\":common.common1,\"isLive\":common.common102,\"type\":common.common65},\"required\":[\"isLive\",\"type\",\"id\"],\"then\":common.common84,\"type\":\"object\"},\"request\":{\"additionalProperties\":false,\"properties\":{\"dateLimit\":common.common103,\"indexStep\":{\"default\":12,\"type\":\"integer\"},\"search\":{\"additionalProperties\":false,\"properties\":{\"name\":common.common10},\"required\":[\"name\"],\"type\":\"object\"}},\"required\":[\"dateLimit\",\"indexStep\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_NEWS_BY_ID\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/news/co/getbyids\",\"request\":{\"additionalProperties\":false,\"properties\":{\"ids\":{\"items\":common.common11,\"type\":\"array\"}},\"required\":[\"ids\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ADD_NEWS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/news/co/save\",\"request\":{\"additionalProperties\":false,\"anyOf\":[common.common104,common.common105,common.common106],\"else\":common.common96,\"if\":common.common98,\"properties\":{\"json\":common.common82,\"markdownActive\":common.common102,\"mediaFile\":common.common107,\"mediaImg\":common.common109,\"mentions\":common.common111,\"parentId\":common.common1,\"parentType\":common.common65,\"scope\":common.common115,\"tags\":common.common30,\"text\":common.common1,\"type\":common.common116},\"required\":[\"scope\",\"markdownActive\",\"parentId\",\"parentType\",\"type\",\"json\"],\"then\":common.common100,\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ADD_IMAGE_NEWS\",\"contentType\":\"multipart/form-data\",\"method\":\"POST\",\"path\":\"/co2/document/uploadSave/dir/communecter/folder/{folder}/ownerId/{ownerId}/input/newsImage/docType/image/contentKey/slider\",\"pathParams\":common.common117,\"request\":{\"additionalProperties\":false,\"properties\":{\"newsImage\":common.common20},\"required\":[\"newsImage\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ADD_FILE_NEWS\",\"contentType\":\"multipart/form-data\",\"method\":\"POST\",\"path\":\"/co2/document/uploadSave/dir/communecter/folder/{folder}/ownerId/{ownerId}}/input/newsFile/docType/file\",\"pathParams\":common.common117,\"request\":{\"additionalProperties\":false,\"properties\":{\"newsFile\":common.common20},\"required\":[\"newsFile\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"DELETE_NEWS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/news/co/delete/id/{id}\",\"pathParams\":common.common119,\"request\":{\"additionalProperties\":false,\"properties\":{\"isLive\":common.common120},\"required\":[\"isLive\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"UPDATE_NEWS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/news/co/update\",\"request\":{\"additionalProperties\":false,\"anyOf\":[common.common104,common.common105,common.common106],\"else\":common.common96,\"if\":common.common98,\"properties\":{\"idNews\":common.common11,\"markdownActive\":common.common102,\"mediaFile\":common.common107,\"mediaImg\":common.common109,\"mentions\":common.common111,\"parentId\":common.common1,\"parentType\":common.common65,\"scope\":common.common115,\"tags\":common.common30,\"text\":common.common1,\"type\":common.common116},\"required\":[\"idNews\",\"scope\",\"markdownActive\",\"parentId\",\"parentType\",\"type\"],\"then\":common.common100,\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"SHARE_NEWS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/news/co/share\",\"request\":{\"additionalProperties\":false,\"else\":common.common121,\"if\":common.common123,\"properties\":{\"childId\":common.common11,\"childType\":common.common65,\"comment\":common.common1,\"connectType\":common.common125,\"parentId\":common.common11,\"parentType\":common.common116},\"required\":[\"parentId\",\"parentType\",\"childId\",\"childType\",\"connectType\"],\"then\":common.common126,\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_COMMENTS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/comment/index/type/{type}/id/{id}/json/true\",\"pathParams\":common.common128},{\"auth\":\"bearer\",\"constant\":\"ADD_COMMENTS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/comment/save\",\"request\":{\"additionalProperties\":false,\"properties\":{\"argval\":common.common10,\"contextId\":common.common11,\"contextType\":common.common130,\"mentions\":common.common131,\"parentCommentId\":common.common11,\"path\":common.common10,\"text\":common.common1},\"required\":[\"text\",\"contextId\",\"contextType\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"DELETE_COMMENTS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/comment/delete/id/{id}\",\"pathParams\":common.common119},{\"auth\":\"bearer\",\"constant\":\"UPDATE_COMMENTS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/comment/update\",\"request\":{\"additionalProperties\":false,\"properties\":{\"id\":common.common11,\"params\":{\"properties\":{\"mentions\":common.common131,\"text\":common.common1},\"required\":[\"text\"],\"type\":\"object\"}},\"required\":[\"id\",\"params\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"SEARCH_TAGS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/api/tags/search?q={q}\",\"pathParams\":{\"additionalProperties\":false,\"properties\":{\"q\":common.common1},\"required\":[\"q\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"SHOW_VOTE\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/action/list/type/{type}/id/{id}/actionType/vote/json/true\",\"pathParams\":common.common128},{\"auth\":\"none\",\"constant\":\"GLOBAL_AUTOCOMPLETE\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":{\"default\":[\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\",\"projects\",\"citoyens\",\"poi\"],\"items\":common.common134,\"type\":\"array\"},\"fediverse\":common.common135,\"filters\":common.common136,\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common139,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchTags\":common.common31,\"searchType\":{\"items\":common.common134,\"type\":\"array\"}},\"required\":[\"name\",\"searchType\",\"countType\",\"indexMin\",\"indexStep\",\"initType\",\"count\",\"notSourceKey\",\"filters\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"CITY_AUTOCOMPLETE\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"indexMax\":{\"minimum\":5,\"type\":\"integer\"},\"indexMin\":{\"minimum\":0,\"type\":\"integer\"},\"locality\":common.common136,\"name\":common.common1,\"searchBy\":{\"const\":\"ALL\",\"default\":\"ALL\",\"type\":\"string\"},\"searchType\":{\"const\":[\"cities\"],\"default\":[\"cities\"],\"items\":{\"enum\":[\"cities\"],\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"name\",\"locality\",\"searchType\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"CITY_AUTOCOMPLETE_BY_COUNTRY\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/city/autocompletemultiscope\",\"request\":{\"additionalProperties\":false,\"properties\":{\"countryCode\":{\"default\":\"FR\",\"type\":\"string\"},\"formInMap\":common.common120,\"scopeValue\":common.common1,\"type\":{\"enum\":[\"locality\"],\"type\":\"string\"}},\"required\":[\"type\",\"countryCode\",\"scopeValue\",\"formInMap\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"SUGGESTION_INPUT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"indexMax\":{\"default\":20,\"minimum\":20,\"type\":\"integer\"},\"indexMin\":common.common149,\"name\":common.common1,\"searchType\":{\"items\":{\"enum\":[\"organizations\",\"projects\",\"poi\"],\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"name\",\"searchType\",\"indexMin\",\"indexMax\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_PROJECTS_NO_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common150,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"default\":{\"$or\":{\"links.contributors.@userId\":common.common152,\"parent.@userId\":common.common152},\"links.contributors.@userId\":common.common152},\"patternProperties\":{\"^links\\\\.contributors\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common153},\"properties\":{\"$or\":{\"additionalProperties\":false,\"maxProperties\":2,\"minProperties\":2,\"patternProperties\":{\"^links\\\\.contributors\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common153,\"^parent\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common153},\"type\":\"object\"}},\"required\":[\"$or\"],\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common150},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_PROJECTS_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocompleteadmin/type/{type}/id/{id}/canSee/true\",\"pathParams\":common.common156,\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common150,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"default\":{\"$or\":{\"links.contributors.@{pathParams.id}\":common.common152,\"parent.@{pathParams.id}\":common.common152},\"links.contributors.@{pathParams.id}\":common.common152},\"patternProperties\":{\"^links\\\\.contributors\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153},\"properties\":{\"$or\":{\"additionalProperties\":false,\"maxProperties\":2,\"minProperties\":2,\"patternProperties\":{\"^links\\\\.contributors\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153,\"^parent\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153},\"type\":\"object\"}},\"required\":[\"$or\"],\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common150},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_POIS_NO_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common158,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"default\":{\"parent.@userId\":common.common152},\"patternProperties\":{\"^parent\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common153},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common158},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_POIS_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocompleteadmin/type/{type}/id/{id}/canSee/true\",\"pathParams\":common.common156,\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common158,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"default\":{\"parent.@{pathParams.id}\":common.common152},\"patternProperties\":{\"^parent\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common158},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_ORGANIZATIONS_NO_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common159,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"default\":{\"links.members.@userId\":common.common152,\"links.members.@userId.isInviting\":common.common161,\"links.members.@userId.toBeValidated\":common.common161},\"patternProperties\":{\"^links\\\\.members\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common153,\"^links\\\\.members\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.isInviting$\":common.common162,\"^links\\\\.members\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.toBeValidated$\":common.common162},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common149,\"indexStep\":common.common165,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common159},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_ORGANIZATIONS_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocompleteadmin/type/{type}/id/{id}/canSee/true\",\"pathParams\":{\"additionalProperties\":false,\"else\":common.common66,\"if\":common.common88,\"properties\":{\"id\":common.common1,\"type\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"organizations\"],\"type\":\"string\"}},\"required\":[\"type\",\"id\"],\"then\":common.common84,\"type\":\"object\"},\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common159,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"default\":{\"links.members.@{pathParams.id}\":common.common152,\"links.members.@{pathParams.id}.isInviting\":common.common161,\"links.members.@{pathParams.id}.toBeValidated\":common.common161},\"patternProperties\":{\"^links\\\\.members\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153,\"^links\\\\.members\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isInviting$\":common.common162,\"^links\\\\.members\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.toBeValidated$\":common.common162},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common149,\"indexStep\":common.common165,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common159},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_MEMBERS_NO_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common166,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@\\\\w+)$)\"}}},{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.toBeValidated$)\"}}}],\"patternProperties\":{\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common153,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.isAdmin$\":common.common153,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.isAdminPending$\":common.common153,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.isInviting$\":common.common168,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.roles$\":common.common170,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.toBeValidated$\":common.common162},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common166},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_MEMBERS_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocompleteadmin/type/organizations/id/{id}/canSee/true\",\"pathParams\":common.common119,\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common166,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"}}}],\"default\":{\"links.memberOf.@{pathParams.id}\":common.common152,\"links.memberOf.@{pathParams.id}.isInviting\":common.common161,\"links.memberOf.@{pathParams.id}.toBeValidated\":common.common161},\"patternProperties\":{\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isAdmin$\":common.common153,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isAdminPending$\":common.common153,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isInviting$\":common.common168,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.roles$\":common.common170,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.toBeValidated$\":common.common168},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common166},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_FRIENDS_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocompleteadmin/type/citoyens/id/{id}/canSee/true\",\"pathParams\":common.common6,\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common173,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.friends\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"}}}],\"default\":{\"links.friends.@{pathParams.id}\":common.common152,\"links.friends.@{pathParams.id}.isInviting\":common.common161,\"links.friends.@{pathParams.id}.toBeValidated\":common.common161},\"patternProperties\":{\"^links\\\\.friends\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153,\"^links\\\\.friends\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isInviting$\":common.common168,\"^links\\\\.friends\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.toBeValidated$\":common.common168},\"type\":\"object\"},\"indexMin\":common.common149,\"indexStep\":common.common165,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"searchType\":common.common173},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_SUBSCRIPTIONS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common175,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[common.common177],\"default\":{\"links.followers.@userId\":common.common152,\"links.followers.@{userId}.isInviting\":common.common161,\"links.followers.@{userId}.toBeValidated\":common.common161},\"patternProperties\":common.common180,\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common175},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_SUBSCRIPTIONS_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocompleteadmin/type/citoyens/id/{id}/canSee/true\",\"pathParams\":common.common6,\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common175,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[common.common177],\"default\":{\"links.followers.@{pathParams.id}\":common.common152,\"links.followers.@{pathParams.id}.isInviting\":common.common161,\"links.followers.@{pathParams.id}.toBeValidated\":common.common161},\"patternProperties\":common.common180,\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common175},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_SUBSCRIBERS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common173,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[common.common181],\"default\":{\"links.follows.@userId\":common.common152,\"links.follows.@{userId}.isInviting\":common.common161,\"links.follows.@{userId}.toBeValidated\":common.common161},\"patternProperties\":{\"^links\\\\.follows\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153,\"^links\\\\.follows\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isInviting$\":common.common162,\"^links\\\\.follows\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.toBeValidated$\":common.common162},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common173},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_SUBSCRIBERS_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocompleteadmin/type/{type}/id/{id}/canSee/true\",\"pathParams\":{\"additionalProperties\":false,\"allOf\":[{\"else\":common.common66,\"if\":common.common88,\"then\":common.common84}],\"properties\":{\"id\":common.common1,\"type\":common.common184},\"required\":[\"type\",\"id\"],\"type\":\"object\"},\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common173,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[common.common181],\"default\":{\"links.follows.@{pathParams.id}\":common.common152},\"maxProperties\":1,\"minProperties\":1,\"patternProperties\":{\"^links\\\\.follows\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153},\"type\":\"object\"},\"indexMin\":common.common149,\"indexStep\":common.common165,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"searchType\":common.common173},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_CONTRIBUTORS_NO_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common166,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.projects\\\\.(?:[a-f0-9]{24}|@\\\\w+)$)\"}}},{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.projects\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.toBeValidated$)\"}}}],\"patternProperties\":{\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common153,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.isAdmin$\":common.common153,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.isAdminPending$\":common.common153,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.isInviting$\":common.common168,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.roles$\":common.common170,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.toBeValidated$\":common.common162},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common166},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_CONTRIBUTORS_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocompleteadmin/type/projects/id/{id}/canSee/true\",\"pathParams\":common.common119,\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common166,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.projects\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"}}}],\"default\":{\"links.projects.@{pathParams.id}\":common.common152,\"links.projects.@{pathParams.id}.isInviting\":common.common161,\"links.projects.@{pathParams.id}.toBeValidated\":common.common161},\"patternProperties\":{\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isAdmin$\":common.common153,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isAdminPending$\":common.common153,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isInviting$\":common.common168,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.roles$\":common.common170,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.toBeValidated$\":common.common168},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common166},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_BADGES\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common185,\"fediverse\":common.common135,\"filters\":{\"properties\":{\"$or\":{\"additionalProperties\":false,\"minProperties\":1,\"patternProperties\":{\"^issuer\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common153},\"type\":\"object\"},\"isParcours\":common.common3,\"preferences.private\":common.common135},\"required\":[\"preferences.private\"],\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common185},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_BADGES_FILTERS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common187,\"fediverse\":common.common135,\"fields\":common.common185,\"filters\":{\"oneOf\":[{\"additionalProperties\":false,\"maxProperties\":1,\"minProperties\":1,\"patternProperties\":{\"badges\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common189}},{\"additionalProperties\":false,\"maxProperties\":3,\"minProperties\":3,\"patternProperties\":{\"badges\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common189,\"badges\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.attenteEmetteur$\":common.common192,\"badges\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.attenteRecepteur$\":common.common192}},{\"additionalProperties\":false,\"maxProperties\":2,\"minProperties\":2,\"patternProperties\":common.common195},{\"additionalProperties\":false,\"maxProperties\":1,\"minProperties\":1,\"properties\":{\"$or\":{\"additionalProperties\":false,\"maxProperties\":2,\"minProperties\":2,\"patternProperties\":common.common195,\"type\":\"object\"}},\"required\":[\"$or\"]},{\"additionalProperties\":false,\"maxProperties\":1,\"minProperties\":1,\"patternProperties\":{\"badges\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.revoke$\":common.common191}},{\"additionalProperties\":false,\"maxProperties\":1,\"minProperties\":1,\"patternProperties\":{\"badges\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.attenteEmetteur$\":common.common189}}],\"type\":\"object\"},\"indexMin\":common.common149,\"indexStep\":common.common165,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":{\"additionalProperties\":false,\"default\":{\"Cooperative\":common.common196,\"GovernmentOrganization\":common.common196,\"Group\":common.common196,\"LocalBusiness\":common.common196,\"NGO\":common.common196,\"citoyens\":common.common196,\"projects\":common.common196},\"maxProperties\":7,\"minProperties\":7,\"patternProperties\":{\"^[a-zA-Z][a-zA-Z0-9]*$\":common.common146},\"type\":\"object\"},\"searchType\":common.common187},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"CONNECT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/link/connect\",\"request\":{\"additionalProperties\":false,\"allOf\":[{\"if\":common.common98,\"then\":{\"properties\":{\"connectType\":{\"const\":\"friend\",\"default\":\"friend\"}}}},{\"if\":common.common197,\"then\":{\"properties\":{\"connectType\":{\"enum\":[\"admin\",\"member\"]}}}},{\"if\":common.common199,\"then\":{\"properties\":{\"connectType\":{\"enum\":[\"admin\",\"contributor\"]}}}},{\"if\":common.common201,\"then\":{\"properties\":{\"connectType\":{\"default\":\"attendee\",\"enum\":[\"attendee\",\"connect\"]}}}}],\"properties\":{\"childId\":common.common203,\"childType\":common.common204,\"connectType\":{\"enum\":[\"admin\",\"member\",\"contributor\",\"attendee\",\"friend\",\"connect\"],\"type\":\"string\"},\"parentId\":common.common11,\"parentType\":common.common205},\"required\":[\"childId\",\"childType\",\"parentType\",\"parentId\",\"connectType\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"DISCONNECT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/link/disconnect\",\"request\":{\"additionalProperties\":false,\"allOf\":[{\"if\":common.common98,\"then\":{\"properties\":{\"connectType\":{\"default\":\"friends\",\"enum\":[\"friends\",\"followers\"]}}}},{\"if\":common.common197,\"then\":{\"properties\":{\"connectType\":{\"default\":\"members\",\"enum\":[\"members\",\"followers\"]}}}},{\"if\":common.common199,\"then\":{\"properties\":{\"connectType\":{\"default\":\"contributors\",\"enum\":[\"contributors\",\"followers\"]}}}},{\"if\":common.common201,\"then\":{\"properties\":{\"connectType\":{\"default\":\"attendees\",\"enum\":[\"attendees\",\"followers\"]}}}}],\"properties\":{\"childId\":common.common203,\"childType\":common.common204,\"connectType\":{\"enum\":[\"members\",\"contributors\",\"attendees\",\"friends\",\"followers\"],\"type\":\"string\"},\"parentId\":common.common11,\"parentType\":common.common205},\"required\":[\"childId\",\"childType\",\"parentType\",\"parentId\",\"connectType\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_ELEMENTS_KEY\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/slug/getinfo/key/{slug}\",\"pathParams\":{\"additionalProperties\":false,\"properties\":{\"slug\":{\"pattern\":\"^([a-zA-Z0-9-_]+)$\",\"type\":\"string\"}},\"required\":[\"slug\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_FAVORIS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/app/config/type/citoyens/id/{id}/json/true\",\"pathParams\":common.common6},{\"auth\":\"bearer\",\"constant\":\"DELETE_FAVORIS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/updatepathvalue?index={index}\",\"pathParams\":{\"properties\":{\"index\":common.common81},\"type\":\"object\"},\"request\":{\"additionalProperties\":false,\"properties\":{\"collection\":common.common206,\"id\":common.common207,\"path\":{\"const\":\"preferences.search.@{pathParams.index}\",\"default\":\"preferences.search.@{pathParams.index}\",\"type\":\"string\"},\"pull\":{\"const\":\"preferences.search\",\"type\":\"string\"},\"value\":common.common136},\"required\":[\"id\",\"collection\",\"path\",\"pull\",\"value\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ADD_FAVORIS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/updatepathvalue\",\"request\":{\"additionalProperties\":false,\"properties\":{\"arrayForm\":common.common191,\"collection\":common.common206,\"id\":common.common207,\"path\":{\"const\":\"preferences.search\",\"default\":\"preferences.search\",\"type\":\"string\"},\"value\":{\"additionalProperties\":false,\"properties\":{\"description\":common.common1,\"locality\":{\"patternProperties\":{\"^[a-f0-9]{24}$\":{\"additionalProperties\":false,\"properties\":common.common55,\"required\":[\"name\",\"type\"]}},\"type\":\"object\"},\"name\":common.common1,\"tags\":common.common31,\"url\":common.common1},\"required\":[\"url\",\"name\"],\"type\":\"object\"}},\"required\":[\"id\",\"collection\",\"path\",\"arrayForm\",\"value\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ADD_ORGANIZATION\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/save\",\"request\":{\"additionalProperties\":false,\"properties\":{\"address\":common.common70,\"collection\":{\"const\":\"organizations\",\"default\":\"organizations\",\"type\":\"string\"},\"email\":common.common2,\"geo\":common.common74,\"geoPosition\":common.common78,\"id\":common.common11,\"key\":{\"const\":\"organization\",\"default\":\"organization\",\"type\":\"string\"},\"name\":{\"minLength\":3,\"type\":\"string\"},\"preferences\":common.common208,\"role\":{\"enum\":[\"admin\",\"member\"],\"type\":\"string\"},\"scope\":common.common136,\"shortDescription\":common.common1,\"tags\":common.common31,\"type\":{\"enum\":[\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"type\":\"string\"},\"url\":common.common4},\"required\":[\"id\",\"collection\",\"key\",\"name\",\"type\",\"role\",\"scope\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ADD_PROJECT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/save\",\"request\":{\"additionalProperties\":false,\"properties\":{\"address\":common.common70,\"collection\":{\"const\":\"projects\",\"default\":\"projects\",\"type\":\"string\"},\"geo\":common.common74,\"geoPosition\":common.common78,\"id\":common.common11,\"key\":{\"const\":\"project\",\"default\":\"project\",\"type\":\"string\"},\"name\":common.common1,\"parent\":common.common211,\"preferences\":{\"default\":{\"crowdfunding\":true,\"isOpenData\":false,\"isOpenEdition\":false},\"properties\":{\"crowdfunding\":common.common102,\"isOpenData\":common.common120,\"isOpenEdition\":common.common120},\"required\":[\"isOpenData\",\"isOpenEdition\"],\"type\":\"object\"},\"public\":common.common102,\"scope\":common.common136,\"shortDescription\":common.common1,\"tags\":common.common31,\"url\":common.common4},\"required\":[\"id\",\"collection\",\"key\",\"parent\",\"name\",\"public\",\"scope\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ADD_POI\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/save\",\"request\":{\"additionalProperties\":false,\"properties\":{\"address\":common.common70,\"collection\":common.common214,\"description\":common.common1,\"geo\":common.common74,\"geoPosition\":common.common78,\"id\":common.common11,\"key\":common.common214,\"name\":common.common1,\"parent\":common.common211,\"scope\":common.common136,\"tags\":common.common31,\"type\":common.common62,\"urls\":common.common31},\"required\":[\"id\",\"collection\",\"key\",\"parent\",\"type\",\"name\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ADD_EVENT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/save\",\"request\":{\"additionalProperties\":false,\"else\":{\"required\":[\"openingHours\"]},\"if\":{\"properties\":{\"recurrency\":common.common164}},\"properties\":{\"address\":common.common70,\"collection\":common.common215,\"email\":common.common2,\"endDate\":common.common216,\"geo\":common.common74,\"geoPosition\":common.common78,\"id\":common.common11,\"key\":{\"const\":\"event\",\"default\":\"event\",\"type\":\"string\"},\"name\":{\"minLength\":2,\"type\":\"string\"},\"openingHours\":{\"default\":[\"\",\"\",\"\",\"\",\"\",\"\",\"\"],\"items\":{\"anyOf\":[common.common69,{\"additionalProperties\":false,\"properties\":{\"dayOfWeek\":{\"enum\":[\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\",\"Su\"],\"type\":\"string\"},\"hours\":{\"default\":[],\"items\":{\"additionalProperties\":false,\"properties\":{\"closes\":common.common217,\"opens\":common.common217},\"required\":[\"opens\",\"closes\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"dayOfWeek\",\"hours\"],\"type\":\"object\"}]},\"maxItems\":7,\"minItems\":7,\"type\":\"array\"},\"organizer\":common.common211,\"parent\":common.common58,\"preferences\":{\"default\":{\"isOpenData\":false,\"isOpenEdition\":false},\"properties\":{\"isOpenData\":common.common120,\"isOpenEdition\":common.common120},\"required\":[\"isOpenData\",\"isOpenEdition\"],\"type\":\"object\"},\"public\":common.common102,\"recurrency\":common.common120,\"scope\":common.common136,\"shortDescription\":{\"format\":\"textarea\",\"type\":\"string\"},\"startDate\":common.common216,\"tags\":common.common31,\"timeZone\":common.common1,\"type\":common.common61,\"url\":common.common4},\"required\":[\"id\",\"collection\",\"key\",\"organizer\",\"type\",\"name\",\"scope\"],\"startBeforeEnd\":true,\"then\":{\"required\":[\"startDate\",\"endDate\"]},\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"DELETE_POI\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/delete/type/poi/id/{id}\",\"pathParams\":common.common119,\"request\":common.common8},{\"auth\":\"bearer\",\"constant\":\"DELETE_EVENT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/delete/type/events/id/{id}/\",\"pathParams\":common.common119,\"request\":common.common8},{\"auth\":\"bearer\",\"constant\":\"DELETE_ELEMENT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/delete/type/{type}/id/{id}\",\"pathParams\":{\"additionalProperties\":false,\"properties\":{\"id\":common.common11,\"type\":common.common1},\"required\":[\"type\",\"id\"],\"type\":\"object\"},\"request\":common.common8},{\"auth\":\"bearer\",\"constant\":\"ADD_IMAGE_ELEMENT\",\"contentType\":\"multipart/form-data\",\"method\":\"POST\",\"path\":\"/co2/document/upload-save/dir/communecter/folder/{folder}/ownerId/{ownerId}/input/qqfile/docType/image/contentKey/profil\",\"pathParams\":{\"additionalProperties\":false,\"properties\":{\"folder\":{\"enum\":[\"badges\",\"events\"],\"type\":\"string\"},\"ownerId\":common.common11},\"required\":[\"folder\",\"ownerId\"],\"type\":\"object\"},\"request\":{\"additionalProperties\":false,\"properties\":{\"qqfile\":common.common20,\"qqfilename\":common.common1,\"qqtotalfilesize\":common.common218,\"qquuid\":common.common11},\"required\":[\"qquuid\",\"qqfilename\",\"qqtotalfilesize\",\"qqfile\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"LINK_VALIDATE\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/link/validate\",\"request\":{\"additionalProperties\":false,\"properties\":{\"childId\":common.common5,\"childType\":common.common46,\"linkOption\":{\"enum\":[\"isInviting\",\"toBeValidated\",\"isAdminPending\"],\"type\":\"string\"},\"parentId\":common.common11,\"parentType\":common.common205},\"required\":[\"childId\",\"childType\",\"parentType\",\"parentId\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"SEARCH_MEMBER_AUTOCOMPLETE\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/searchmemberautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"search\":common.common1,\"searchMode\":{\"default\":\"personOnly\",\"enum\":[\"personOnly\",\"organizationOnly\",\"mixte\"],\"type\":\"string\"}},\"required\":[\"search\",\"searchMode\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_NOTIFICATIONS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/notification/getnotifications/type/{type}/id/{id}\",\"pathParams\":common.common219,\"request\":{\"additionalProperties\":false,\"properties\":{\"indexMin\":common.common103},\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_NOTIFICATIONS_COUNT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/notification/getnotifications/type/{type}/id/{id}\",\"pathParams\":common.common219,\"request\":{\"additionalProperties\":false,\"properties\":{\"refreshTimestamp\":common.common218},\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"NOTIFICATION_UPDATE\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/notification/update\",\"request\":{\"additionalProperties\":false,\"properties\":{\"action\":{\"enum\":[\"seen\",\"read\"],\"type\":\"string\"},\"all\":common.common82},\"required\":[\"action\",\"all\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"REMOVE_ALL_NOTIFICATIONS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/notification/removeall\"},{\"auth\":\"bearer\",\"constant\":\"MARK_NOTIFICATION_AS_READ\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/notification/marknotificationasread\",\"request\":common.common119},{\"auth\":\"none\",\"constant\":\"ACTIVITYPUB_SEARCH\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"GET\",\"params\":[common.common20],\"path\":\"/api/activitypub/search?address={address}\",\"pathParams\":{\"additionalProperties\":false,\"properties\":{\"address\":common.common1},\"required\":[\"address\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ACTIVITYPUB_LINK\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/api/activitypub/link\",\"request\":{\"additionalProperties\":false,\"properties\":{\"action\":{\"enum\":[\"undo_follow\",\"accept_invitation\",\"reject_invitation\",\"undo_accept\",\"undo_request_follow\",\"follow\",\"remove_follow\",\"accept_follower\",\"reject_follower\",\"remove_follower\",\"remove_invitation\"],\"type\":\"string\"},\"actor\":{\"additionalProperties\":false,\"properties\":{\"id\":common.common1,\"name\":common.common1,\"type\":{\"enum\":[\"person\"],\"type\":\"string\"}},\"required\":[\"id\",\"type\",\"name\"],\"type\":\"object\"},\"payload\":common.common4},\"required\":[\"action\",\"payload\",\"actor\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"ACTIVITYPUB_GET_COMMUNITY\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/api/activitypub/getcommunity/userId/${userId}/type/${type}/actor/person\",\"pathParams\":{\"additionalProperties\":false,\"properties\":{\"type\":{\"enum\":[\"follows\",\"followers\"],\"type\":\"string\"},\"userId\":common.common11},\"required\":[\"userId\",\"type\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_BADGE\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/app/page/type/badges/id/{id}/json/true\",\"pathParams\":common.common119},{\"auth\":\"none\",\"constant\":\"GET_EMETTEUR_BADGES\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/app/badge/json/true\"},{\"auth\":\"bearer\",\"constant\":\"ADD_BADGES\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/save\",\"request\":{\"additionalProperties\":false,\"properties\":{\"collection\":common.common222,\"criteria\":{\"additionalProperties\":false,\"properties\":{\"narrative\":common.common1},\"required\":[\"narrative\"],\"type\":\"object\"},\"description\":common.common1,\"id\":common.common11,\"isParcours\":common.common120,\"issuer\":{\"additionalProperties\":false,\"patternProperties\":{\"^(?:[a-f0-9]{24}|@userId)$\":{\"additionalProperties\":false,\"properties\":{\"name\":common.common1,\"type\":{\"enum\":[\"citoyens\",\"organizations\",\"projects\"],\"type\":\"string\"}},\"required\":[\"type\"],\"type\":\"object\"}},\"type\":\"object\"},\"key\":common.common223,\"name\":common.common1,\"parent\":{\"additionalProperties\":false,\"patternProperties\":{\"^[a-f0-9]{24}$\":{\"additionalProperties\":false,\"properties\":{\"name\":common.common1,\"type\":common.common222},\"required\":[\"type\"],\"type\":\"object\"}},\"type\":\"object\"},\"preferences\":common.common208,\"public\":common.common102,\"scope\":common.common136,\"tags\":common.common31},\"required\":[\"id\",\"collection\",\"key\",\"name\",\"public\",\"scope\",\"issuer\",\"criteria\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ASSIGN_BADGES\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/badges/assign\",\"request\":{\"additionalProperties\":false,\"properties\":{\"award\":{\"patternProperties\":{\"^[0-9a-f]{24}$\":common.common54},\"type\":\"object\"},\"badgeId\":common.common11,\"collection\":common.common222,\"evidences\":{\"items\":{\"additionalProperties\":false,\"properties\":{\"narative\":common.common1,\"url\":common.common4},\"required\":[\"narative\"],\"type\":\"object\"},\"type\":\"array\"},\"key\":common.common223,\"narative\":common.common1,\"scope\":common.common136},\"required\":[\"key\",\"collection\",\"badgeId\",\"award\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_EVENTS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/agenda\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common120,\"countType\":{\"const\":[\"events\"],\"default\":[\"events\"],\"type\":\"array\"},\"endDateUTC\":common.common216,\"fediverse\":common.common120,\"indexMin\":common.common103,\"indexStep\":{\"default\":100,\"type\":\"integer\"},\"locality\":{\"patternProperties\":{\"^[^\\\\s]+$\":{\"type\":\"object\"}},\"type\":\"object\"},\"name\":common.common1,\"searchType\":{\"const\":[\"events\"],\"default\":[\"events\"],\"items\":common.common1,\"type\":\"array\"},\"startDate\":common.common81,\"startDateUTC\":common.common216,\"type\":common.common61},\"required\":[\"searchType\",\"indexMin\",\"indexStep\",\"startDate\",\"startDateUTC\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"SHARE_EVENTS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/news/co/share\",\"request\":{\"additionalProperties\":false,\"else\":common.common121,\"if\":common.common123,\"properties\":{\"childId\":common.common11,\"childType\":common.common65,\"comment\":common.common1,\"connectType\":common.common125,\"parentId\":common.common11,\"parentType\":common.common215},\"required\":[\"parentId\",\"childId\",\"childType\",\"connectType\",\"parentType\"],\"then\":common.common126,\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"INVITE_EVENT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/link/multiconnect\",\"request\":{\"additionalProperties\":false,\"else\":common.common96,\"if\":common.common98,\"properties\":{\"listInvite\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"citoyens\":common.common224,\"invites\":{\"patternProperties\":{\"^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$\":{\"additionalProperties\":false,\"properties\":{\"email\":common.common2,\"isAdmin\":common.common228,\"msg\":common.common1,\"name\":common.common1,\"roles\":common.common31},\"required\":[\"name\",\"email\"],\"type\":\"object\"}},\"type\":\"object\"},\"organizations\":common.common224,\"projects\":common.common224},\"type\":\"object\"},\"parentId\":common.common1,\"parentType\":common.common65},\"required\":[\"parentId\",\"parentType\",\"listInvite\"],\"then\":common.common100,\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"FOLLOW\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/link/follow\",\"request\":{\"additionalProperties\":false,\"properties\":{\"childId\":common.common203,\"childType\":common.common204,\"parentId\":common.common11,\"parentType\":common.common205},\"required\":[\"childId\",\"childType\",\"parentType\",\"parentId\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_COSTUM_JSON\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/cms/getcostumjson?slug={slug}\",\"pathParams\":{\"slug\":common.common1}},{\"auth\":\"none\",\"constant\":\"GLOBAL_AUTOCOMPLETE_COSTUM\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"globalautocomplete\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"contextId\":common.common11,\"contextType\":common.common229,\"costumEditMode\":common.common120,\"costumSlug\":common.common1,\"count\":common.common82,\"countType\":common.common230,\"fediverse\":common.common120,\"fields\":common.common31,\"filters\":{\"default\":\"\",\"oneOf\":[{\"additionalProperties\":true,\"type\":\"object\"},common.common69]},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common139,\"mapUsed\":common.common120,\"name\":common.common1,\"notSourceKey\":common.common3,\"options\":{\"additionalProperties\":true,\"properties\":{\"tags\":{\"additionalProperties\":true,\"properties\":{\"verb\":common.common1},\"type\":\"object\"}},\"type\":\"object\"},\"ranges\":common.common144,\"searchBy\":common.common148,\"searchTags\":common.common31,\"searchType\":common.common230,\"sortBy\":{\"additionalProperties\":{\"enum\":[1,-1],\"type\":\"integer\"},\"type\":\"object\"},\"sourceKey\":common.common31},\"required\":[\"searchType\",\"countType\",\"indexMin\",\"indexStep\",\"initType\",\"count\",\"fediverse\",\"mapUsed\",\"costumSlug\",\"sourceKey\",\"costumEditMode\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"COSTUM_EVENT_REQUEST_ACTORS\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"costumEventRequestActors\",\"method\":\"POST\",\"path\":\"/costum/coevent/get_events/request/actors/id/{id}/type/{type}\",\"pathParams\":common.common232,\"request\":{\"additionalProperties\":false,\"properties\":{\"contextId\":common.common11,\"contextType\":common.common229,\"costumEditMode\":common.common120,\"costumSlug\":common.common1,\"parent_only\":common.common3,\"sourceKey\":common.common31,\"types\":{\"items\":{\"enum\":[\"organizer\",\"links.attendees\",\"creator\",\"links.creator\",\"links.organizer\",\"organizerName\",\"animator\"],\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"COSTUM_EVENT_REQUEST_SUBEVENTS\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"costumEventRequestSubevents\",\"method\":\"POST\",\"path\":\"/costum/coevent/get_events/request/subevents/id/{id}/type/{type}\",\"pathParams\":common.common232,\"request\":{\"additionalProperties\":false,\"allOf\":[{\"if\":{\"properties\":{\"date\":common.common1},\"required\":[\"date\"]},\"then\":{\"required\":[\"timezone\"]}}],\"properties\":{\"contextId\":common.common11,\"contextType\":common.common229,\"costumEditMode\":common.common120,\"costumSlug\":common.common1,\"date\":{\"oneOf\":[common.common1,{\"properties\":{\"between\":{\"properties\":{\"end\":common.common41,\"start\":common.common41},\"required\":[\"start\",\"end\"],\"type\":\"object\"}},\"required\":[\"between\"],\"type\":\"object\"}]},\"fromToday\":common.common3,\"regions\":common.common235,\"sourceKey\":common.common31,\"tags\":common.common31,\"timezone\":common.common1,\"type\":common.common1},\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"COSTUM_EVENT_REQUEST_ELEMENT_EVENT\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"costumEventRequestElementEvent\",\"method\":\"POST\",\"path\":\"/costum/coevent/get_events/request/element_event/id/{id}/type/{type}\",\"pathParams\":common.common232,\"request\":common.common238},{\"auth\":\"none\",\"constant\":\"COSTUM_EVENT_REQUEST_CATEGORIES\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"costumEventRequestCategories\",\"method\":\"POST\",\"path\":\"/costum/coevent/get_events/request/categories/id/{id}/type/{type}\",\"pathParams\":common.common232,\"request\":common.common238},{\"auth\":\"none\",\"constant\":\"COSTUM_EVENT_REQUEST_DATES\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"costumEventRequestDates\",\"method\":\"POST\",\"path\":\"/costum/coevent/get_events/request/dates/id/{id}/type/{type}\",\"pathParams\":common.common232,\"request\":{\"additionalProperties\":false,\"properties\":{\"contextId\":common.common11,\"contextType\":common.common229,\"costumEditMode\":common.common120,\"costumSlug\":common.common1,\"regions\":common.common235,\"sourceKey\":common.common31,\"tags\":common.common31,\"type\":common.common1},\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"COSTUM_EVENT_REQUEST_EVENT\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"costumEventRequestEvent\",\"method\":\"POST\",\"path\":\"/costum/coevent/get_events/request/event/id/{id}/type/{type}\",\"pathParams\":common.common232,\"request\":common.common238},{\"auth\":\"none\",\"constant\":\"COSTUM_EVENT_REQUEST_LINK_TL_TO_EVENT\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"costumEventRequestLinkTlToEvent\",\"method\":\"POST\",\"path\":\"/costum/coevent/get_events/request/link_tl_to_event/id/{id}/type/{type}\",\"pathParams\":common.common232,\"request\":{\"additionalProperties\":false,\"properties\":{\"contextId\":common.common11,\"contextType\":common.common229,\"costumEditMode\":common.common120,\"costumSlug\":common.common1,\"event\":common.common1,\"sourceKey\":common.common31,\"tl\":common.common1},\"required\":[\"tl\",\"event\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"COSTUM_EVENT_REQUEST_LOAD_CONTEXT_TAG\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"costumEventRequestLoadContextTag\",\"method\":\"POST\",\"path\":\"/costum/coevent/get_events/request/load_context_tag/id/{id}/type/{type}\",\"pathParams\":common.common232,\"request\":{\"additionalProperties\":false,\"properties\":{\"contextId\":common.common11,\"contextType\":common.common229,\"costumEditMode\":common.common120,\"costumSlug\":common.common1,\"event\":common.common11,\"search\":common.common1,\"sourceKey\":common.common31},\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_GALLERY\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"\",\"method\":\"POST\",\"path\":\"/co2/gallery/index/type/{type}/id/{id}/docType/{docType}/tpl/json\",\"pathParams\":{\"additionalProperties\":false,\"else\":common.common66,\"if\":common.common88,\"properties\":{\"docType\":{\"default\":\"image\",\"enum\":[\"image\",\"file\",\"bookmarks\"],\"type\":\"string\"},\"id\":common.common1,\"type\":common.common184},\"required\":[\"id\",\"type\",\"docType\"],\"then\":common.common84,\"type\":\"object\"},\"request\":{\"additionalProperties\":false,\"properties\":{\"contentKey\":common.common1,\"folderId\":common.common1},\"type\":\"object\"}}]};\n","// src/utils/TokenStorage.js\n\nexport class TokenStorageStrategy {\n getAccessToken() {\n throw new Error(\"getAccessToken() doit être implémenté\");\n }\n \n // eslint-disable-next-line no-unused-vars\n setAccessToken(token) {\n throw new Error(\"setAccessToken() doit être implémenté\");\n }\n \n getRefreshToken() {\n throw new Error(\"getRefreshToken() doit être implémenté\");\n }\n \n // eslint-disable-next-line no-unused-vars\n setRefreshToken(token) {\n throw new Error(\"setRefreshToken() doit être implémenté\");\n }\n \n clear() {\n throw new Error(\"clear() doit être implémenté\");\n }\n}\n \nexport class MemoryStorageStrategy extends TokenStorageStrategy {\n constructor() {\n super();\n this._accessToken = null;\n this._refreshToken = null;\n }\n \n getAccessToken() {\n return this._accessToken;\n }\n \n setAccessToken(token) {\n this._accessToken = token;\n }\n \n getRefreshToken() {\n return this._refreshToken;\n }\n \n setRefreshToken(token) {\n this._refreshToken = token;\n }\n \n clear() {\n this._accessToken = null;\n this._refreshToken = null;\n }\n}\n \nexport class LocalStorageStrategy extends TokenStorageStrategy {\n constructor(prefix = \"cocolight\") {\n super();\n this.prefix = prefix;\n }\n \n getAccessToken() {\n return typeof localStorage !== \"undefined\"\n ? localStorage.getItem(`${this.prefix}_accessToken`)\n : null;\n }\n \n setAccessToken(token) {\n if (typeof localStorage !== \"undefined\") {\n localStorage.setItem(`${this.prefix}_accessToken`, token);\n }\n }\n \n getRefreshToken() {\n return typeof localStorage !== \"undefined\"\n ? localStorage.getItem(`${this.prefix}_refreshToken`)\n : null;\n }\n \n setRefreshToken(token) {\n if (typeof localStorage !== \"undefined\") {\n localStorage.setItem(`${this.prefix}_refreshToken`, token);\n }\n }\n \n clear() {\n if (typeof localStorage !== \"undefined\") {\n localStorage.removeItem(`${this.prefix}_accessToken`);\n localStorage.removeItem(`${this.prefix}_refreshToken`);\n }\n }\n}\n ","// MultiServerTokenStorageStrategy.js\nimport { TokenStorageStrategy } from \"./TokenStorage.js\";\n\nexport class MultiServerTokenStorageStrategy extends TokenStorageStrategy {\n constructor() {\n super();\n this._currentBaseURL = null;\n }\n\n use(baseURL) {\n if (!baseURL) throw new Error(\"baseURL est requis\");\n this._currentBaseURL = baseURL.replace(/\\/+$/, \"\");\n }\n\n _ensureContext() {\n if (!this._currentBaseURL) throw new Error(\"baseURL non défini. Appelez use(baseURL)\");\n }\n\n getServers() {\n throw new Error(\"getServers() doit être implémenté\");\n }\n\n exportAll() {\n throw new Error(\"exportAll() doit être implémenté\");\n }\n}\n\n// Mémoire\nexport class MultiServerMemoryStorageStrategy extends MultiServerTokenStorageStrategy {\n constructor() {\n super();\n this._storage = new Map();\n }\n \n getAccessToken() {\n this._ensureContext();\n return this._storage.get(this._currentBaseURL)?.accessToken || null;\n }\n \n setAccessToken(token) {\n this._ensureContext();\n const current = this._storage.get(this._currentBaseURL) || {};\n this._storage.set(this._currentBaseURL, { ...current, accessToken: token });\n }\n \n getRefreshToken() {\n this._ensureContext();\n return this._storage.get(this._currentBaseURL)?.refreshToken || null;\n }\n \n setRefreshToken(token) {\n this._ensureContext();\n const current = this._storage.get(this._currentBaseURL) || {};\n this._storage.set(this._currentBaseURL, { ...current, refreshToken: token });\n }\n \n clear() {\n this._ensureContext();\n this._storage.delete(this._currentBaseURL);\n }\n \n getServers() {\n return [...this._storage.keys()];\n }\n \n exportAll() {\n return Object.fromEntries(this._storage.entries());\n }\n}\n \n// Navigateur (localStorage)\nexport class MultiServerLocalStorageStrategy extends MultiServerTokenStorageStrategy {\n constructor(prefix = \"cocolight\") {\n super();\n this.prefix = prefix;\n }\n \n _key(baseURL) {\n return `${this.prefix}_tokens_${baseURL}`;\n }\n \n _getData() {\n this._ensureContext();\n const raw = localStorage.getItem(this._key(this._currentBaseURL));\n return raw ? JSON.parse(raw) : {};\n }\n \n _setData(data) {\n localStorage.setItem(this._key(this._currentBaseURL), JSON.stringify(data));\n }\n \n getAccessToken() {\n return this._getData().accessToken || null;\n }\n \n setAccessToken(token) {\n const data = this._getData();\n data.accessToken = token;\n this._setData(data);\n }\n \n getRefreshToken() {\n return this._getData().refreshToken || null;\n }\n \n setRefreshToken(token) {\n const data = this._getData();\n data.refreshToken = token;\n this._setData(data);\n }\n \n clear() {\n localStorage.removeItem(this._key(this._currentBaseURL));\n }\n \n getServers() {\n const keys = Object.keys(localStorage);\n return keys\n .filter(k => k.startsWith(`${this.prefix}_tokens_`))\n .map(k => k.replace(`${this.prefix}_tokens_`, \"\"));\n }\n \n exportAll() {\n const result = {};\n for (const baseURL of this.getServers()) {\n const raw = localStorage.getItem(this._key(baseURL));\n if (raw) result[baseURL] = JSON.parse(raw);\n }\n return result;\n }\n}","import { EventEmitter } from \"events\";\n\nimport { AggregateAjvError } from \"@segment/ajv-human-errors\";\nimport Ajv from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport axios from \"axios\";\nimport axiosRetry from \"axios-retry\";\nimport EJSON from \"ejson\";\nimport { jwtDecode } from \"jwt-decode\";\nimport pino from \"pino\";\n\nimport MongoID from \"./EJSONType.js\";\nimport endpointsJson from \"./endpoints.module.js\";\nimport { ApiClientError, ApiResponseError, ApiValidationError, CircuitBreakerError } from \"./error.js\";\nimport { MultiServerTokenStorageStrategy } from \"./utils/MultiServerTokenStorageStrategy.js\";\nimport { MemoryStorageStrategy } from \"./utils/TokenStorage.js\";\n\n\nEJSON.addType(\"oid\", value => {\n return new MongoID.ObjectID(value);\n});\n\n/**\n * Client générique pour consommer une API REST avec validation AJV, gestion des tokens,\n * circuit breaker, retry automatique, et support offline.\n *\n * @extends EventEmitter\n *\n * @fires ApiClient#retryAttempt\n * @fires ApiClient#queuedOffline\n * @fires ApiClient#circuitBreakerOpen\n * @fires ApiClient#circuitBreakerReset\n * @fires ApiClient#refreshSuccess\n * @fires ApiClient#refreshFailed\n * @fires ApiClient#sessionReset\n * @fires ApiClient#validationError\n * @fires ApiClient#offlineModeChanged\n * @fires ApiClient#userLoggedIn\n */\nexport default class ApiClient extends EventEmitter {\n /**\n * @param {Object} options\n * @param {string} options.baseURL\n * @param {string} [options.accessToken]\n * @param {string} [options.refreshToken]\n * @param {string} [options.refreshUrl=/api/cocolight/refreshtoken]\n * @param {Array} [options.endpoints=endpointsJson.endpoints]\n * @param {number} [options.timeout=30000]\n * @param {boolean} [options.debug=false]\n * @param {number} [options.maxRetries=0] - Nombre de tentatives auto (axios-retry)\n * @param {number} [options.circuitBreakerThreshold=5] - Nb d'erreurs avant de bloquer\n * @param {number} [options.circuitBreakerResetTime=60000] - Ms avant de reset le breaker\n * @param {boolean} [options.fromJSONValue=true] - Si true, les données sont transformées en EJSON\n * @param {TokenStorageStrategy} [options.tokenStorageStrategy=null] - Stratégie de stockage des tokens\n */\n constructor({\n baseURL,\n accessToken,\n refreshToken,\n refreshUrl = \"/api/cocolight/refreshtoken\",\n endpoints = endpointsJson.endpoints,\n timeout = 30000,\n debug = false,\n maxRetries = 0,\n circuitBreakerThreshold = 5,\n circuitBreakerResetTime = 60000,\n fromJSONValue = true,\n tokenStorageStrategy = null\n } = {}) {\n super(); // EventEmitter\n\n if (!baseURL) {\n throw new ApiClientError(\"Le paramètre \\\"baseURL\\\" est obligatoire.\", 500);\n }\n\n this.__entityTag = \"ApiClient\";\n \n this._baseURL = baseURL;\n this._refreshUrl = refreshUrl;\n this._endpoints = endpoints;\n this._debug = debug;\n let _userId = null;\n this._offlineClientManager = null;\n\n // Active la transformation des données en EJSON globalement\n this._fromJSONValue = fromJSONValue;\n\n Object.defineProperty(this, \"userId\", {\n get: () => _userId,\n set: () => {\n throw new Error(\"Modification directe de userId non autorisée.\");\n },\n enumerable: true\n });\n\n this._setUserId = (id) => {\n _userId = id;\n this._logger.debug(`[ApiClient] userId set: ${id}`);\n };\n\n // AJV\n this._ajv = new Ajv({ strict: false, useDefaults: true, allErrors: true, verbose: true });\n addFormats(this._ajv);\n\n this._ajv.addFormat(\"textarea\", true);\n\n this._ajv.addKeyword({\n keyword: \"startBeforeEnd\",\n type: \"object\",\n errors: true,\n validate: this._startBeforeEndValidate\n });\n\n // Pino logger\n this._logger = pino({\n transport: {\n target: \"pino-pretty\",\n options: { colorize: true }\n },\n level: debug ? \"debug\" : \"info\"\n });\n\n // Création instance Axios\n this._client = axios.create({\n baseURL,\n timeout\n });\n\n // axios-retry : pour retenter en cas de soucis réseau ou code 5xx\n if (maxRetries > 0) {\n axiosRetry(this._client, {\n retries: maxRetries,\n retryDelay: axiosRetry.exponentialDelay,\n retryCondition: (error) => {\n // Retry sur erreurs 5xx ou erreurs réseau\n return axiosRetry.isNetworkError(error) || axiosRetry.isRetryableError(error);\n },\n onRetry: (retryCount, error, requestConfig) => {\n this._logger.warn(`[Retry] Tentative #${retryCount} pour ${requestConfig?.url}`);\n this.emit(\"retryAttempt\", { retryCount, url: requestConfig?.url });\n }\n });\n this._logger.info(`[ApiClient] Retry activé : ${maxRetries} max`);\n }\n\n // Circuit breaker (simplifié)\n this._breakerThreshold = circuitBreakerThreshold;\n this._breakerResetTime = circuitBreakerResetTime;\n this._breakerErrorCount = 0;\n this._breakerOpen = false;\n this._lastBreakerOpenTime = null;\n\n this._accessToken = null;\n this._refreshToken = null;\n\n if (tokenStorageStrategy instanceof MultiServerTokenStorageStrategy) {\n tokenStorageStrategy.use(this._baseURL);\n }\n \n this._tokenStorage = tokenStorageStrategy || new MemoryStorageStrategy();\n\n if (\n typeof this._tokenStorage?.getAccessToken !== \"function\" ||\n typeof this._tokenStorage?.setAccessToken !== \"function\" ||\n typeof this._tokenStorage?.getRefreshToken !== \"function\" ||\n typeof this._tokenStorage?.setRefreshToken !== \"function\" ||\n typeof this._tokenStorage?.clear !== \"function\"\n ) {\n throw new Error(\"[ApiClient] La stratégie de stockage des tokens n’est pas valide. Elle doit implémenter les méthodes requises.\");\n }\n \n // Applique un token initial s'il est fourni\n if(refreshToken){\n this.setRefreshToken(refreshToken);\n }\n\n if (accessToken) {\n this.setToken(accessToken);\n }\n\n const initialAccessToken = this._tokenStorage.getAccessToken();\n if (initialAccessToken) {\n this.setToken(initialAccessToken);\n }\n\n const initialRefreshToken = this._tokenStorage.getRefreshToken();\n if (initialRefreshToken) {\n this.setRefreshToken(initialRefreshToken);\n }\n \n\n // Intercepteur 401 -> refresh\n this._client.interceptors.response.use(\n response => response,\n async error => {\n const originalRequest = error.config;\n\n // Si la requête est déjà réessayée, abandonne\n if (originalRequest._retry) {\n this._logger.error(\"[ApiClient] Requête déjà retentée, échec définitif.\");\n throw error;\n }\n\n if (error.response && error.response.status === 401 && this._refreshToken) {\n originalRequest._retry = true;\n\n try {\n this._logger.info(\"[ApiClient] Tentative de refresh du token...\");\n const refreshed = await this._refreshAccessToken();\n\n if (refreshed) {\n this._logger.info(\"[ApiClient] Token rafraîchi avec succès.\");\n\n // 🔑 Mise à jour EXPLICITE du header Authorization dans la requête originale\n originalRequest.headers[\"Authorization\"] = \"Bearer \" + this.getToken();\n\n this._logger.info(\"[ApiClient] Retente la requête originale avec le nouveau token.\");\n return this._client.request(originalRequest);\n } else {\n this.resetSession();\n throw new ApiClientError(\"Impossible de rafraîchir le token.\", 401);\n }\n } catch (err) {\n this.resetSession();\n throw new ApiClientError(\"Erreur lors du rafraîchissement du token.\", 401, err);\n }\n }\n\n throw error;\n }\n );\n\n }\n\n /**\n * Sets the access token for the API client and updates the authorization header.\n *\n * @param {string} token - The access token to be set.\n */\n setToken(token) {\n this._accessToken = token;\n this._tokenStorage.setAccessToken(token);\n this._client.defaults.headers.common[\"Authorization\"] = \"Bearer \" + token;\n // Extrait l'id depuis le token et le stocke si disponible\n const userId = this._getIdFromToken(token);\n if (userId) {\n this._setUserId(userId);\n this._logger.debug(`[ApiClient] userId extrait et défini : ${userId}`);\n }\n this._logger.debug(`[ApiClient] setToken: ${token}`);\n }\n\n /**\n * Retrieves the current access token.\n *\n * @returns {string} The access token.\n */\n getToken() {\n return this._accessToken;\n }\n\n /**\n * Sets the refresh token for the API client.\n *\n * @param {string} refreshToken - The refresh token to be set.\n */\n setRefreshToken(token) {\n this._refreshToken = token;\n this._tokenStorage.setRefreshToken(token);\n if(this.userId === null){\n // Extrait l'id depuis le token et le stocke si disponible\n const userId = this._getIdFromToken(token);\n if (userId) {\n this._setUserId(userId);\n this._logger.debug(`[ApiClient] userId extrait depuis refreshToken : ${userId}`);\n }\n }\n this._logger.debug(`[ApiClient] setRefreshToken: ${token}`);\n }\n\n /**\n * Retrieves the current refresh token.\n *\n * @returns {string} The refresh token.\n */\n getRefreshToken() {\n return this._refreshToken;\n }\n\n /**\n * Indique si le client est connecté.\n * On considère que le client est connecté si un token d'accès (_accessToken) est défini.\n *\n * @returns {boolean} True si connecté, false sinon.\n */\n get isConnected() {\n return !!this._accessToken;\n }\n\n /**\n * Extrait l'identifiant depuis un JWT.\n *\n * @param {string} token - Le token JWT (accessToken ou refreshToken).\n * @returns {string|null} L'identifiant extrait ou null si non trouvé.\n */\n _getIdFromToken(token) {\n if (!token) return null;\n try {\n // Décodage du token grâce à jwt-decode\n const payload = jwtDecode(token);\n // L'identifiant peut être dans \"id\" ou \"userId\"\n this._logger.debug(\"[ApiClient] Payload décodé :\", payload);\n return payload.id || payload.userId || null;\n } catch (err) {\n this._logger.error(\"[ApiClient] Erreur lors du décodage du token :\", err);\n return null;\n }\n }\n\n /**\n * Méthode simplifiée de refresh (en JSON). \n * Emet un event refreshSuccess si ça marche\n */\n async _refreshAccessToken() {\n if (!this._refreshToken) return false;\n\n const refreshClient = axios.create({\n baseURL: this._baseURL,\n timeout: 10000, // ajuster si nécessaire\n headers: { \"Content-Type\": \"application/json\" }\n });\n\n try {\n const response = await refreshClient.post(this._refreshUrl, {\n refreshToken: this._refreshToken\n });\n if (response.data && response.data.token) {\n this.setToken(response.data.token);\n if (response.data.refreshToken) {\n this.setRefreshToken(response.data.refreshToken);\n }\n this.emit(\"refreshSuccess\", response.data);\n return true;\n }\n return false;\n } catch (err) {\n // Si on a une erreur, on reset la session\n this.emit(\"refreshFailed\", { error: err.message });\n this.resetSession();\n this._logger.error(`[ApiClient] Refresh Error : ${err.message}`);\n return false;\n }\n }\n\n /**\n * checkCircuitBreaker : vérifie si on peut appeler l'API ou non\n * si le breaker est \\\"open\\\", on regarde si on peut \\\"reset\\\" \n */\n _checkCircuitBreaker() {\n if (!this._breakerOpen) return true;\n const now = Date.now();\n if (now - this._lastBreakerOpenTime > this._breakerResetTime) {\n // On reset\n this._breakerOpen = false;\n this._breakerErrorCount = 0;\n this._logger.warn(\"[ApiClient] Circuit breaker réinitialisé\");\n this.emit(\"circuitBreakerReset\");\n return true;\n }\n return false;\n }\n\n /**\n * updateCircuitBreaker : incremente le compteur d'erreurs \n * si on dépasse le threshold, on \\\"open\\\" le breaker.\n */\n _updateCircuitBreakerError() {\n this._breakerErrorCount += 1;\n this._logger.warn(`[ApiClient] Erreur #${this._breakerErrorCount} sur ${this._breakerThreshold}`);\n if (this._breakerErrorCount >= this._breakerThreshold) {\n this._breakerOpen = true;\n this._lastBreakerOpenTime = Date.now();\n this._logger.error(\"[ApiClient] Circuit breaker ACTIVÉ - L'API est considérée indisponible\");\n this.emit(\"circuitBreakerOpen\", { timestamp: this._lastBreakerOpenTime });\n }\n }\n\n /**\n * resetCircuitBreaker : en cas de succès on reset le compteur\n */\n _resetCircuitBreakerSuccess() {\n this._breakerErrorCount = 0;\n if (this._breakerOpen) {\n this._breakerOpen = false;\n this._logger.warn(\"[ApiClient] Circuit breaker refermé suite à un succès\");\n }\n }\n\n static stripNullsInPlace(obj) {\n // Si l'objet semble être un \"fichier uploadé\", c'est-à-dire qu'il possède une propriété \"value\" qui est un stream, on le laisse intact.\n if (obj && typeof obj === \"object\" && obj.value && typeof obj.value.pipe === \"function\") {\n return obj;\n }\n \n if (Array.isArray(obj)) {\n for (let i = obj.length - 1; i >= 0; i--) {\n if (obj[i] === null || obj[i] === undefined) {\n obj.splice(i, 1);\n } else if (typeof obj[i] === \"object\") {\n ApiClient.stripNullsInPlace(obj[i]);\n }\n }\n } else if (obj && typeof obj === \"object\") {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n if (obj[key] === null || obj[key] === undefined) {\n delete obj[key];\n } else if (typeof obj[key] === \"object\") {\n ApiClient.stripNullsInPlace(obj[key]);\n }\n }\n }\n }\n return obj;\n }\n\n _resolveSpecialValuesInPlace(obj, pathParams = {}) {\n const aliasMap = {\n userId: () => this.userId,\n accessToken: () => this._accessToken,\n refreshToken: () => this._refreshToken,\n baseURL: () => this._baseURL,\n pathParams: (subPath) => {\n // Si la valeur existe dans pathParams, on la retourne\n const value = this._getValueByPath(pathParams, subPath);\n return value !== undefined && value !== null ? value : undefined;\n }\n };\n \n // Expression régulière qui capture les alias sous forme délimitée @{...} ou simple @...\n const regex = /@(?:\\{([^}]+)\\}|([\\w.]+))/g;\n\n const resolveString = (str) => {\n if (typeof str !== \"string\") return str;\n return str.replace(regex, (_, delimitedAlias, plainAlias) => {\n // Si alias délimité, on traite toute la chaîne à l'intérieur des accolades.\n if (delimitedAlias) {\n // On s'attend à une forme comme \"pathParams.id.autre\"\n if (delimitedAlias.startsWith(\"pathParams.\")) {\n const subPath = delimitedAlias.substring(\"pathParams.\".length);\n const value = aliasMap.pathParams(subPath);\n return value !== undefined && value !== null ? value : `@{${delimitedAlias}}`;\n } else {\n // Pour d'autres alias délimités, on cherche directement dans aliasMap\n const fn = aliasMap[delimitedAlias];\n if (typeof fn === \"function\") {\n const value = fn();\n return value !== undefined && value !== null ? value : `@{${delimitedAlias}}`;\n }\n return `@{${delimitedAlias}}`;\n }\n } else if (plainAlias) {\n // Traitement de l'alias simple, potentiellement avec des segments\n // Vérifier s'il commence par \"pathParams.\"\n if (plainAlias.startsWith(\"pathParams.\")) {\n // Extrait la partie après \"pathParams.\" et sépare le premier segment et le reste.\n const match = plainAlias.match(/^pathParams\\.([^.]+)(.*)$/);\n if (match) {\n const subKey = match[1]; // ex: \"id\"\n const remainder = match[2]; // ex: \"\" ou \".autrechose\"\n // Si le reste est vide, ou s'il ne doit pas être remplacé (on remplace toujours le premier segment uniquement)\n const value = aliasMap.pathParams(subKey);\n return value !== undefined && value !== null ? value + remainder : `@${plainAlias}`;\n }\n return `@${plainAlias}`;\n } else {\n // Pour tout autre alias simple sans point ou autre\n const fn = aliasMap[plainAlias];\n if (typeof fn === \"function\") {\n const value = fn();\n return value !== undefined && value !== null ? value : `@${plainAlias}`;\n }\n return `@${plainAlias}`;\n }\n }\n return str;\n });\n };\n\n \n // Vérifie si l'objet est un binaire (par exemple un flux ou un Buffer)\n const isBinary = (input) => {\n return input && typeof input === \"object\" &&\n (typeof input.pipe === \"function\" || (typeof Buffer !== \"undefined\" && input instanceof Buffer));\n };\n \n // Vérifie si l'objet est un \"plain object\"\n const isPlainObject = (input) => {\n return Object.prototype.toString.call(input) === \"[object Object]\";\n };\n \n const internal = (input) => {\n // Si c'est un binaire, ne rien modifier\n if (isBinary(input)) {\n return input;\n }\n // Si c'est un tableau, on traite chaque élément\n if (Array.isArray(input)) {\n return input.map(internal);\n }\n // Si c'est un plain object, on crée un nouvel objet avec remplacement dans les clés et valeurs\n if (isPlainObject(input)) {\n const result = {};\n for (const [key, value] of Object.entries(input)) {\n const resolvedKey = resolveString(key);\n result[resolvedKey] = internal(value);\n }\n return result;\n }\n // Si c'est une string, on applique le remplacement\n if (typeof input === \"string\") {\n return resolveString(input);\n }\n // Sinon (nombre, booléen, etc.), on retourne la valeur telle quelle\n return input;\n };\n \n return internal(obj);\n }\n \n\n _cleanSchemaLeftoverAlias(obj) {\n // Expression régulière qui détecte n'importe quel alias du type \"@quelqueChose\"\n const aliasRegex = /@\\w+/;\n \n if (Array.isArray(obj)) {\n return obj.map(item => this._cleanSchemaLeftoverAlias(item));\n } else if (obj && typeof obj === \"object\") {\n const newObj = {};\n for (const key of Object.keys(obj)) {\n const val = obj[key];\n \n // Si le nom de la clé contient un alias (exemple : \"@userId\", \"@anything\"), on ne la copie pas\n if (aliasRegex.test(key)) {\n continue;\n }\n \n // Si la propriété s'appelle \"default\"\n if (key === \"default\") {\n // Si la valeur est une chaîne et qu'elle contient un alias, on ne la copie pas\n if (typeof val === \"string\" && aliasRegex.test(val)) {\n continue;\n }\n // Si la valeur est un objet, on le nettoie récursivement\n if (val && typeof val === \"object\") {\n const cleanedDefault = this._cleanSchemaLeftoverAlias(val);\n // On ajoute seulement si l'objet nettoyé n'est pas vide\n if (Object.keys(cleanedDefault).length > 0) {\n newObj[key] = cleanedDefault;\n }\n continue;\n }\n }\n \n // Si la valeur est une chaîne contenant un alias, on ne la copie pas\n if (typeof val === \"string\" && aliasRegex.test(val)) {\n continue;\n }\n \n // Sinon, on nettoie récursivement la valeur\n newObj[key] = this._cleanSchemaLeftoverAlias(val);\n }\n return newObj;\n }\n return obj;\n }\n \n /**\n * Safely calls an asynchronous function and handles any errors that occur.\n * Logs the error message using the instance's logger before re-throwing the error.\n *\n * @param {Function} fn - The asynchronous function to be called.\n * @param {...any} args - The arguments to pass to the function.\n * @returns {Promise<any>} The result of the asynchronous function.\n * @throws {Error} Re-throws any error that occurs during the function execution.\n */\n async safeCall(fn, ...args) {\n try {\n return await fn(...args);\n } catch (error) {\n this._logger.error(`[ApiClient.safeCall] Erreur: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Calls an API endpoint with the specified parameters.\n *\n * @param {string} constant - The constant representing the endpoint to call.\n * @param {Object} [data={}] - The data to send with the request.\n * @param {boolean|function} [transformResponseData=true] - Whether to transform the response data or a function to transform it.\n * @param {boolean} [validateResponseSchema=true] - Whether to validate the response schema.\n * @returns {Promise<Object>} The response from the API.\n * @throws {CircuitBreakerError} If the circuit breaker is activated.\n * @throws {ApiClientError} If the endpoint is not found, token is required but not provided, or validation fails.\n */\n async callEndpoint(constant, data = {}, transformResponseData = true, validateResponseSchema = true) {\n\n const endpoint = this._endpoints.find((ep) => ep.constant === constant);\n if (!endpoint) {\n throw new ApiClientError(`Endpoint introuvable : ${constant}`, 404);\n }\n \n const {\n path,\n method,\n contentType,\n auth,\n pathParams: pathSchema,\n request: requestSchema,\n responses\n } = endpoint;\n \n const lowerMethod = (method || \"GET\").toLowerCase();\n const realContentType = contentType || \"application/json\";\n const headers = { \"Content-Type\": realContentType };\n \n // Auth headers\n if (this._accessToken) {\n if (auth === \"bearer\") {\n headers[\"Authorization\"] = `Bearer ${this._accessToken}`;\n } else if (!auth || auth === \"none\") {\n if (!headers[\"Authorization\"]) {\n headers[\"Authorization\"] = `Bearer ${this._accessToken}`;\n }\n }\n } else if (auth === \"bearer\") {\n throw new ApiClientError(`Token requis pour l'endpoint sécurisé : ${constant}`, 401);\n }\n \n // === 1. PathParams ===\n let resolvedPath = path;\n let resolvedParams = {};\n if (pathSchema) {\n\n // Si auth est \"none\" et que userId n'est pas défini, on nettoie le schéma\n let schemaToCompile = pathSchema;\n if (auth === \"none\" && this.userId === null) {\n schemaToCompile = this._cleanSchemaLeftoverAlias(pathSchema);\n }\n\n const pathParams = data.pathParams || {};\n const validatePathParams = this._ajv.compile(schemaToCompile);\n const valid = validatePathParams(pathParams);\n \n if (!valid) {\n const errorMessages = this._ajvErrorHuman(validatePathParams.errors);\n this.emit(\"validationError\", { stage: \"pathParams\", errors: validatePathParams.errors });\n throw new ApiValidationError(`callEndpoint: ${constant} - Path parameter validation failed.`, 400, errorMessages, validatePathParams.errors);\n }\n \n resolvedParams = this._resolveSpecialValuesInPlace(pathParams);\n \n resolvedPath = resolvedPath.replace(/\\{(\\w+)\\}/g, (_, key) => {\n const val = resolvedParams[key];\n if (val !== undefined) return encodeURIComponent(val);\n throw new ApiClientError(`Path param manquant ou non résolu : {${key}}`, 400);\n });\n }\n \n // === 2. Validation données (request schema) ===\n if (requestSchema) {\n // Si auth est \"none\" et que userId n'est pas défini, on nettoie le schéma\n let schemaToCompile = requestSchema;\n if (auth === \"none\" && this.userId === null) {\n schemaToCompile = this._cleanSchemaLeftoverAlias(requestSchema);\n }\n\n const dataForValidation = { ...data };\n delete dataForValidation.pathParams;\n const cleanedData = ApiClient.stripNullsInPlace(dataForValidation);\n \n const validateRequest = this._ajv.compile(schemaToCompile);\n const valid = validateRequest(cleanedData);\n if (!valid) {\n const errorMessages = validateRequest.errors ? this._ajvErrorHuman(validateRequest.errors) : [];\n this.emit(\"validationError\", { stage: \"request\", errors: validateRequest.errors });\n throw new ApiValidationError(`callEndpoint: ${constant} - Request validation failed.`, 400, errorMessages , validateRequest.errors);\n }\n\n data = this._resolveSpecialValuesInPlace(cleanedData, resolvedParams);\n }\n \n // === 3. ENQUEUE SI OFFLINE (après validations, avant le breaker)\n if (this._offlineClientManager?.isOffline()) {\n if (typeof this._offlineClientManager._enqueueOfflineAction === \"function\") {\n this._logger.warn(`[ApiClient] Mode dégradé : mise en file de ${constant}`);\n await this._offlineClientManager._enqueueOfflineAction({\n constant,\n data,\n options: { transformResponseData, validateResponseSchema }\n });\n\n this._logger.info(`[ApiClient] Requête ${constant} mise en file (offline mode)`);\n\n this.emit(\"queuedOffline\", {\n constant,\n reason: \"offlineMode\",\n data\n });\n\n return { data: null, offline: true };\n } else {\n this._logger.warn(\"[ApiClient] Mode dégradé actif mais offlineManager non initialisé correctement\");\n throw new ApiClientError(\"Mode hors-ligne actif, mais gestionnaire offline non disponible.\", 503);\n }\n }\n\n // === 4. Circuit Breaker\n if (!this._checkCircuitBreaker()) {\n if (\n this._offlineClientManager?.isOffline?.() === false && // pas déjà en mode offline\n typeof this._offlineClientManager._enqueueOfflineAction === \"function\"\n ) {\n this._logger.warn(`[ApiClient] Circuit breaker actif → mise en file de ${constant}`);\n await this._offlineClientManager._enqueueOfflineAction({\n constant,\n data,\n options: { transformResponseData, validateResponseSchema }\n });\n\n this._logger.info(`[ApiClient] Requête ${constant} mise en file (circuit breaker)`);\n\n this.emit(\"queuedOffline\", {\n constant,\n reason: \"circuitBreaker\",\n data\n });\n\n return { data: null, breaker: true };\n }\n\n throw new CircuitBreakerError(\"Le circuit breaker est activé, impossible d'appeler l'API\");\n }\n\n // === 5. Payload ===\n let payload;\n if (realContentType === \"application/json\" || realContentType === \"multipart/form-data\") {\n payload = data;\n } else if (realContentType === \"application/x-www-form-urlencoded\") {\n payload = ApiClient.toURLSearchParams(data);\n }\n \n this._logger.debug(`[ApiClient] callEndpoint: ${constant} -> ${resolvedPath}, method=${lowerMethod}`);\n\n try {\n const response = await this._client.request({\n url: resolvedPath,\n method: lowerMethod,\n headers,\n [lowerMethod === \"get\" ? \"params\" : \"data\"]: payload\n });\n \n if (validateResponseSchema) {\n const status = response.status.toString();\n const schema = responses?.[status];\n if (schema) {\n const validateResponse = this._ajv.compile(schema);\n const valid = validateResponse(response.data);\n if (!valid) {\n const errorMessages = this._ajvErrorHuman(validateResponse.errors);\n this.emit(\"validationError\", { stage: \"response\", errors: validateResponse.errors });\n throw new ApiValidationError(\"Response validation failed.\", status, errorMessages, validateResponse.errors);\n }\n }\n }\n \n this._resetCircuitBreakerSuccess();\n \n if (typeof transformResponseData === \"function\") {\n response.data = transformResponseData(response.data);\n } else if (transformResponseData === true) {\n response.data = this._transformData(response.data);\n }\n \n // postActions éventuelles\n if (Array.isArray(endpoint.postActions)) {\n endpoint.postActions.forEach(action => {\n const value = action.path ? this._getValueByPath(response.data, action.path) : null;\n \n switch (action.type) {\n case \"setToken\":\n this.setToken(value);\n break;\n \n case \"setRefreshToken\":\n this.setRefreshToken(value);\n break;\n \n // case \"setUserId\":\n // this._setUserId(value);\n // break;\n \n case \"resetSession\":\n this.resetSession();\n break;\n \n case \"emitEvent\":\n if (action.event) {\n this.emit(action.event, value);\n this._logger.debug(`[ApiClient] Event émis : ${action.event}`, value);\n }\n break;\n \n case \"callMethod\":\n if (typeof this[action.method] === \"function\") {\n this[action.method]();\n this._logger.debug(`[ApiClient] Méthode appelée : ${action.method}`);\n } else {\n this._logger.warn(`[ApiClient] Méthode inconnue : ${action.method}`);\n }\n break;\n \n default:\n this._logger.warn(`[ApiClient] Action inconnue : ${action.type}`);\n }\n });\n }\n \n \n return response;\n } catch (error) {\n this._updateCircuitBreakerError();\n this._logger.error(`[ApiClient] Erreur lors de l'appel de ${constant}: ${error.message}`);\n if(error instanceof ApiValidationError) {\n throw error;\n } else {\n throw new ApiClientError(\n `Erreur lors de l'appel de l'API : ${error.message}`,\n error.response ? error.response.status : 500,\n error.response ? error.response.data : null\n );\n }\n\n }\n }\n \n /**\n * Converts AJV (Another JSON Schema Validator) errors into human-readable messages.\n *\n * @param {Array} errors - An array of AJV validation error objects.\n * @returns {Array<string>} An array of human-readable error messages extracted from the AJV errors.\n */\n _ajvErrorHuman(errors){\n try {\n const errorsMessages = new AggregateAjvError(errors);\n const messages = errorsMessages.errors.map(({ message }) => message);\n return messages;\n } catch (e) {\n this._logger.error(\"[ApiClient] _ajvErrorHuman\", e);\n return errors.map(({ message }) => message);\n }\n }\n\n /**\n * Checks the API response for errors and throws an `ApiResponseError` if any are found.\n *\n * This method examines the `response.data` object to determine if it contains\n * error information. It handles both standard and nested error cases:\n * \n * - Standard case: If `data.result` is a boolean and is `false`, an error is thrown.\n * - Nested case: If `data.resultErrors` exists and contains a `result` property\n * that is a boolean and is `false`, an error is thrown.\n *\n * If no errors are found, the original `response` is returned.\n *\n * @param {Object} response - The API response object to check.\n * @param {Object} response.data - The data payload of the response.\n * @param {number} response.status - The HTTP status code of the response.\n * @throws {ApiResponseError} If an error is detected in the response data.\n * @returns {Object} The original `response` object if no errors are found.\n */\n checkAndThrowApiResponseError(response) {\n const data = response.data;\n if (!data || typeof data !== \"object\") {\n return response;\n }\n \n // Cas standard : vérifie si data.result vaut false\n if (typeof data.result === \"boolean\" && data.result === false) {\n throw new ApiResponseError(\n data.msg || \"Erreur inconnue\",\n response.status,\n data\n );\n }\n \n // Cas imbriqué : vérifie si data.resultErrors existe et contient une erreur\n if (data.resultErrors && typeof data.resultErrors === \"object\") {\n if (typeof data.resultErrors.result === \"boolean\" && data.resultErrors.result === false) {\n throw new ApiResponseError(\n data.resultErrors.msg || \"Erreur inconnue\",\n response.status,\n data\n );\n }\n }\n \n return response;\n }\n \n /**\n * Réinitialise complètement la session de l'utilisateur :\n * - Token d'accès\n * - Token de rafraîchissement\n * - userId\n * - En-têtes Axios\n */\n resetSession() {\n this.setToken(null);\n this.setRefreshToken(null);\n this._setUserId(null);\n this._tokenStorage.clear();\n\n // Suppression des en-têtes\n delete this._client.defaults.headers.common[\"Authorization\"];\n\n this._logger.info(\"[ApiClient] Session utilisateur réinitialisée.\");\n this.emit(\"sessionReset\");\n }\n\n /**\n * Retrieves the value from an object based on a dot-separated path.\n *\n * @param {Object} obj - The object from which to retrieve the value.\n * @param {string} path - The dot-separated path string indicating the value to retrieve.\n * @returns {*} - The value found at the specified path, or undefined if the path is invalid.\n */\n _getValueByPath(obj, path) {\n if (!path) return undefined;\n const keys = path.split(\".\");\n return keys.reduce((acc, key) => acc && acc[key], obj);\n }\n \n // Conversions\n\n /**\n * Converts an object to URL search parameters.\n *\n * @param {Object} obj - The object to be converted to URL search parameters.\n * @param {Object} [options={}] - Optional settings for the conversion.\n * @returns {URLSearchParams} The URL search parameters generated from the object.\n */\n static toURLSearchParams(obj, options = {}) {\n return this._buildParams(obj, new URLSearchParams(), options);\n }\n\n /**\n * Builds parameters for an API request from a given object.\n *\n * @param {Object} obj - The object to be converted into parameters.\n * @param {FormData|URLSearchParams} paramsInstance - The instance to which the parameters will be appended.\n * @param {Object} [options={}] - Optional settings.\n * @param {boolean} [options.dots=false] - Whether to use dots in the parameter keys.\n * @param {boolean} [options.indexes=false] - Whether to include array indexes in the parameter keys.\n * @param {boolean} [options.metaTokens=true] - Whether to include meta tokens in the parameter keys.\n * @throws {TypeError} If the provided obj is not an object or is null.\n * @returns {FormData|URLSearchParams} The instance with the appended parameters.\n */\n static _buildParams(obj, paramsInstance, options = {}) {\n if (typeof obj !== \"object\" || obj === null) {\n throw new TypeError(\"La donnée doit être un objet non nul.\");\n }\n\n const { dots = false, indexes = false, metaTokens = true } = options;\n const stack = [];\n\n function isVisitable(thing) {\n return Object.prototype.toString.call(thing) === \"[object Object]\" || Array.isArray(thing);\n }\n\n function removeBrackets(key) {\n return key.endsWith(\"[]\") ? key.slice(0, -2) : key;\n }\n\n function renderKey(path, key, useDots = false) {\n if (!path) return key;\n return path.concat(key).map((token, i) => {\n token = removeBrackets(token);\n return !useDots && i ? `[${token}]` : token;\n }).join(useDots ? \".\" : \"\");\n }\n\n function convertValue(value) {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return value.toISOString();\n if (\n value instanceof Blob ||\n value instanceof File ||\n value instanceof ArrayBuffer ||\n ArrayBuffer.isView(value)\n ) {\n return value;\n }\n return value;\n }\n\n function defaultVisitor(value, key, path) {\n if (value && typeof value === \"object\") {\n if (key.endsWith(\"{}\")) {\n key = metaTokens ? key : key.slice(0, -2);\n paramsInstance.append(renderKey(path, key, dots), JSON.stringify(value));\n return false;\n }\n\n if ((Array.isArray(value) && !value.some(isVisitable)) || key.endsWith(\"[]\")) {\n key = removeBrackets(key);\n value.forEach((el, index) => {\n if (el !== undefined && el !== null) {\n // const fieldKey = indexes ? renderKey([key], index, dots) : `${key}[]`;\n const fieldKey = indexes\n ? renderKey(path.concat(key), index, dots)\n : `${renderKey(path, key, dots)}[]`;\n paramsInstance.append(fieldKey, convertValue(el));\n }\n });\n return false;\n }\n }\n\n if (isVisitable(value)) return true;\n paramsInstance.append(renderKey(path, key, dots), convertValue(value));\n return false;\n }\n\n function build(value, path = []) {\n if (value === undefined || value === null || stack.includes(value)) return;\n stack.push(value);\n\n Object.entries(value).forEach(([k, el]) => {\n if (el !== undefined && defaultVisitor(el, k.trim(), path)) {\n build(el, path.concat(removeBrackets(k)));\n }\n });\n\n stack.pop();\n }\n\n build(obj);\n return paramsInstance;\n }\n\n\n /**\n * Transforms the given data based on its structure.\n * \n * This method normalizes various structures of data into a consistent format.\n * It handles different types of data including objects, arrays, and specific\n * nested structures like `resultGoods`, `resultErrors`, `results`, `news`, \n * `notif`, `citoyens`, `organizations`, `cities`, `newComment`, `map`, and `object`.\n * \n * @param {Object|Array} data - The data to be transformed.\n * @returns {Object|Array} - The transformed data.\n * \n * @private\n */\n _transformData(data) {\n if (data && typeof data === \"object\") {\n if (data.resultGoods?.msg) {\n data = this._normalizeJsonData({ msg: data.resultGoods.msg, ...data });\n } else if (data.resultErrors?.msg) {\n data = this._normalizeJsonData({ msg: data.resultErrors.msg, ...data });\n } else if (data.results && typeof data.results === \"object\" && !Array.isArray(data.results)) {\n data.results = Object.keys(data.results).map((key) => {\n return this._normalizeJsonData({ id: key, ...data.results[key] });\n });\n } else if (Array.isArray(data.results) && data.results.length > 0) {\n data.results = data.results.map((item) => this._normalizeJsonData(item));\n } else if (data.news && Array.isArray(data.news) && data.news.length === 0) {\n data = data.news;\n } else if (data.news && typeof data.news === \"object\" && !Array.isArray(data.news)) {\n data = Object.keys(data.news).map((key) => {\n return this._normalizeJsonData({ id: key, ...data.news[key] });\n });\n } else if (data.notif && typeof data.notif === \"object\" && !Array.isArray(data.notif)) {\n data.notif = Object.keys(data.notif).map((key) => {\n return this._normalizeJsonData({ id: key, ...data.notif[key] });\n });\n } else if (\n data.citoyens && typeof data.citoyens === \"object\" && !Array.isArray(data.citoyens) &&\n data.organizations && typeof data.organizations === \"object\" && !Array.isArray(data.organizations)\n ) {\n data = [\n ...Object.keys(data.citoyens).map(key => this._normalizeJsonData({ id: key, ...data.citoyens[key] })),\n ...Object.keys(data.organizations).map(key => this._normalizeJsonData({ id: key, ...data.organizations[key] }))\n ];\n } else if (\n data.citoyens && typeof data.citoyens === \"object\" && !Array.isArray(data.citoyens)\n ) {\n data = Object.keys(data.citoyens).map(key => this._normalizeJsonData({ id: key, ...data.citoyens[key] }));\n } else if (data.cities && typeof data.cities === \"object\" && !Array.isArray(data.cities)) {\n data = Object.keys(data.cities).map(key => this._normalizeJsonData({ id: key, ...data.cities[key] }));\n } else if (data.cities && Array.isArray(data.cities) && data.cities.length === 0) {\n data = data.cities;\n } else if (data.newComment && typeof data.newComment === \"object\") {\n data.newComment = this._normalizeJsonData({ ...data.newComment });\n } else if (Array.isArray(data)) {\n data = data.map((item) => this._normalizeJsonData(item));\n } else if (data.map && typeof data.map === \"object\") {\n data.map = this._normalizeJsonData(data.map);\n } else if (data.object && typeof data.object === \"object\") {\n data.object = this._normalizeJsonData(data.object);\n } else if (typeof data === \"object\" && Object.keys(data).length > 0) {\n // Vérifie si toutes les clés sont des IDs mongo\n const allMongoIds = Object.keys(data).every((key) => /^[0-9a-fA-F]{24}$/.test(key));\n if (allMongoIds) {\n data = Object.keys(data).map((key) => ({\n id: key,\n ...this._normalizeJsonData(data[key])\n }));\n } else {\n data = this._normalizeJsonData(data);\n }\n }\n }\n return data;\n }\n \n\n /**\n * Normalizes JSON data by transforming specific fields and ensuring URLs are complete.\n *\n * @param {Object} item - The JSON object to be normalized.\n * @returns {Object} - The normalized JSON object.\n *\n * The function performs the following transformations:\n * - Normalizes the ID field if it matches a specific pattern.\n * - Converts date fields from seconds to milliseconds.\n * - Ensures URLs in specific fields are complete.\n * - Filters and normalizes nested objects and arrays.\n * - Removes the `timeAgo` field if it exists.\n * - Converts the object to EJSON format if necessary.\n */\n _normalizeJsonData(item) {\n if (!item || typeof item !== \"object\") {\n return item;\n }\n \n // Application des normalisations récursives\n item = this._normalizeRecursively(item);\n\n // item = this._normalizeIdRecursively(item);\n // item = this._normalizeDatesRecursively(item);\n // item = this._normalizeImagesRecursively(item);\n\n // if(item?.preferences){\n // item.preferences = this._normalizeBooleansRecursively(item.preferences);\n // }\n\n if (item?.mediaImg?.images && Array.isArray(item.mediaImg.images) && item.mediaImg.images.length > 0) {\n item.mediaImg.countImages = item.mediaImg.images.length;\n }\n \n if (item?.mediaFile?.files && Array.isArray(item.mediaFile.files) && item.mediaFile.files.length > 0) {\n item.mediaFile.countFiles = item.mediaFile.files.length;\n }\n\n if (\n item?.src?.changes &&\n typeof item.src.changes === \"object\" &&\n Object.keys(item.src.changes).length > 0\n ) {\n Object.keys(item.src.changes).forEach((key) => {\n if (item.src.changes[key]) {\n item.src.changes[key] = this._ensureFullURL(item.src.changes[key]);\n }\n });\n }\n \n if (item?.openingHours && Array.isArray(item.openingHours) && item.openingHours.length > 0) {\n item.openingHours = item.openingHours.filter(\n (day) => day.dayOfWeek && day.hours && day.hours[0] && day.hours[0].opens\n );\n }\n \n if (item.replies && typeof item.replies === \"object\" && Object.keys(item.replies).length > 0) {\n item.replies = Object.keys(item.replies).map((key) => {\n return this._normalizeJsonData({ id: key, ...item.replies[key] });\n });\n }\n \n if (\n item?.author &&\n typeof item.author === \"object\" &&\n Object.keys(item.author).length > 0\n ) {\n // Si author contient déjà une propriété attendue (ici \"profilThumbImageUrl\"),\n // on considère qu'il est déjà aplatit.\n if (!(\"profilThumbImageUrl\" in item.author)) {\n // Sinon, on considère que author est un mapping et on prend le premier sous-objet.\n const firstKey = Object.keys(item.author)[0];\n // On remplace author par le contenu du sous-objet\n item.author = { ...item.author[firstKey] };\n }\n }\n \n // Supprime timeAgo\n if (item?.timeAgo) {\n delete item.timeAgo;\n }\n \n // Convertit en EJSON si besoin\n return this._fromJSONValue ? EJSON.fromJSONValue(item) : item;\n }\n \n\n /**\n * Ensures that the given image path is a full URL. If the image path is already a full URL\n * (i.e., it starts with \"http://\" or \"https://\"), it is returned as is. Otherwise, the image path\n * is concatenated with the base URL of the ApiClient instance.\n *\n * @param {string} imagePath - The image path to ensure as a full URL.\n * @returns {string} - The full URL of the image path.\n */\n _ensureFullURL(imagePath) {\n if (!imagePath) return imagePath;\n imagePath = imagePath.trim();\n if (!imagePath || /^https?:\\/\\//i.test(imagePath)) {\n return imagePath;\n }\n \n let separator = \"/\";\n if (this._baseURL.endsWith(\"/\") && imagePath.startsWith(\"/\")) {\n separator = \"\";\n } else if (!this._baseURL.endsWith(\"/\") && !imagePath.startsWith(\"/\")) {\n separator = \"/\";\n } else {\n separator = \"\";\n }\n \n return `${this._baseURL}${separator}${imagePath}`;\n }\n\n /**\n * Parcourt récursivement un objet pour normaliser les champs de date.\n * Pour chaque clé présente dans dateFields, si la valeur est un nombre ou un objet\n * contenant une propriété sec (nombre), la transforme en { $date: valeurEnMs }.\n *\n * @param {Object} obj - L’objet à normaliser.\n * @returns {Object} L’objet normalisé.\n */\n // _normalizeDatesRecursively(obj) {\n // if (obj === null || typeof obj !== \"object\") return obj;\n\n // // Si c'est un tableau, on traite chaque élément récursivement.\n // if (Array.isArray(obj)) {\n // return obj.map(item => this._normalizeDatesRecursively(item));\n // }\n\n // Object.keys(obj).forEach((key) => {\n // if (this._dateFields.includes(key)) {\n // if (obj[key] && typeof obj[key] === \"object\" && obj[key].sec && typeof obj[key].sec === \"number\") {\n // obj[key] = { $date: obj[key].sec * 1000 };\n // } else if (typeof obj[key] === \"number\") {\n // obj[key] = { $date: obj[key] * 1000 };\n // }\n // }\n // if (obj[key] && typeof obj[key] === \"object\") {\n // this._normalizeDatesRecursively(obj[key]);\n // }\n // });\n // return obj;\n // }\n\n /**\n * Parcourt récursivement un objet pour normaliser les chemins d'images.\n * Pour chaque propriété correspondant à un champ d'image (dans imageFields),\n * vérifie et convertit le chemin en URL complète à l’aide de _ensureFullURL.\n * Les cas particuliers (comme mediaImg.images ou mediaFile.files) sont également gérés.\n *\n * @param {Object} obj - L’objet à normaliser.\n * @returns {Object} L’objet normalisé.\n */\n // _normalizeImagesRecursively(obj) {\n // if (obj === null || typeof obj !== \"object\") return obj;\n\n // // Si c'est un tableau, on traite chaque élément récursivement.\n // if (Array.isArray(obj)) {\n // return obj.map(item => this._normalizeImagesRecursively(item));\n // }\n\n // Object.keys(obj).forEach((key) => {\n // if (this._imageFields.includes(key) && typeof obj[key] === \"string\" && obj[key].trim() !== \"\") {\n // obj[key] = this._ensureFullURL(obj[key]);\n // }\n\n // // Cas particulier pour content.image\n // if (key === \"content\" && obj[key]?.image) {\n // obj[key].image = this._ensureFullURL(obj[key].image);\n // }\n\n // if (obj[key] && typeof obj[key] === \"object\") {\n // this._normalizeImagesRecursively(obj[key]);\n // }\n // });\n // return obj;\n // }\n\n /**\n * Parcourt récursivement un objet ou un tableau pour normaliser les identifiants (ID).\n * Si un objet possède une propriété \"_id\" ou \"id\" contenant un sous-objet \"$id\" valide,\n * l'ID est normalisé et la propriété _id est convertie au format EJSON attendu.\n *\n * @param {Object|Array} obj - L'objet ou le tableau à normaliser.\n * @returns {Object|Array} L'objet ou le tableau normalisé.\n */\n // _normalizeIdRecursively(obj) {\n // if (obj === null || typeof obj !== \"object\") return obj;\n\n // // Si c'est un tableau, on traite chaque élément récursivement.\n // if (Array.isArray(obj)) {\n // return obj.map(item => this._normalizeIdRecursively(item));\n // }\n\n // // Vérifier et normaliser l'ID dans l'objet\n // if (obj._id && obj._id.$id && /^[0-9a-fA-F]{24}$/.test(obj._id.$id)) {\n // obj.id = obj._id.$id;\n // obj._id = { $type: \"oid\", $value: obj._id.$id };\n // }\n // if (obj.id && obj.id.$id && /^[0-9a-fA-F]{24}$/.test(obj.id.$id)) {\n // obj._id = { $type: \"oid\", $value: obj.id.$id };\n // obj.id = obj.id.$id;\n // }\n\n // // Appel récursif pour chaque propriété de l'objet\n // Object.keys(obj).forEach(key => {\n // if (obj[key] && typeof obj[key] === \"object\") {\n // obj[key] = this._normalizeIdRecursively(obj[key]);\n // }\n // });\n\n // return obj;\n // }\n\n /**\n * Normalise récursivement les valeurs booléennes.\n * Si une valeur est une chaîne \"true\" ou \"false\", elle est convertie en booléen.\n *\n * @param {any} data - L'objet, le tableau ou la valeur à normaliser.\n * @returns {any} La donnée normalisée.\n */\n // _normalizeBooleansRecursively(data) {\n // if (typeof data === \"string\") {\n // if (data === \"true\") return true;\n // if (data === \"false\") return false;\n // return data;\n // }\n // if (Array.isArray(data)) {\n // return data.map(item => this._normalizeBooleansRecursively(item));\n // }\n // if (data !== null && typeof data === \"object\") {\n // Object.keys(data).forEach(key => {\n // data[key] = this._normalizeBooleansRecursively(data[key]);\n // });\n // }\n // return data;\n // }\n\n /**\n * Transforme une chaîne \"true\" ou \"false\" en booléen.\n *\n * @param {string} str - La chaîne à normaliser.\n * @returns {boolean|string} La valeur booléenne ou la chaîne originale.\n */\n _normalizeString(str) {\n if (str === \"true\") return true;\n if (str === \"false\") return false;\n return str;\n }\n\n /**\n * Normalise les identifiants dans un objet.\n * Si l'objet possède une propriété \"_id\" ou \"id\" contenant un sous-objet \"$id\" valide,\n * il met à jour l'objet en assignant la valeur de l'ID et en formattant _id en EJSON.\n *\n * @param {Object} obj - L'objet à normaliser.\n * @returns {Object} L'objet avec l'ID normalisé.\n */\n _normalizeId(obj) {\n if (obj._id && obj._id.$id && /^[0-9a-fA-F]{24}$/.test(obj._id.$id)) {\n obj.id = obj._id.$id;\n obj._id = { $type: \"oid\", $value: obj._id.$id };\n }\n if (obj.id && obj.id.$id && /^[0-9a-fA-F]{24}$/.test(obj.id.$id)) {\n obj._id = { $type: \"oid\", $value: obj.id.$id };\n obj.id = obj.id.$id;\n }\n return obj;\n }\n\n /**\n * Normalise une valeur de date.\n * Si la valeur est un objet contenant \"sec\" (nombre) ou un nombre,\n * elle est convertie en { $date: valeurEnMs }.\n *\n * @param {any} value - La valeur à normaliser.\n * @returns {any} La valeur normalisée.\n */\n _normalizeDate(value) {\n if (value && typeof value === \"object\" && typeof value.sec === \"number\") {\n return { $date: value.sec * 1000 };\n } else if (typeof value === \"number\") {\n return { $date: value * 1000 };\n }\n return value;\n }\n\n /**\n * Normalise une URL d'image.\n * Si la valeur est une chaîne non vide, retourne l'URL complète via _ensureFullURL.\n *\n * @param {any} value - La valeur à normaliser.\n * @returns {any} La valeur normalisée.\n */\n _normalizeImage(value) {\n if (typeof value === \"string\" && value.trim() !== \"\") {\n return this._ensureFullURL(value);\n }\n return value;\n }\n\n /**\n * Liste des champs d'image à normaliser.\n */\n _imageFields = [\n \"profilImageUrl\",\n \"profilThumbImageUrl\",\n \"profilMediumImageUrl\",\n \"profilMarkerImageUrl\",\n \"profilBannerUrl\",\n \"profilRealBannerUrl\",\n \"imagePath\",\n \"imageThumbPath\",\n \"docPath\",\n \"imageThumb\",\n \"imageMediumPath\"\n ];\n\n /**\n * Liste des champs de date à normaliser.\n */\n _dateFields = [\"modified\", \"created\", \"updated\", \"birthDate\", \"lastLoginDate\", \"startDate\", \"endDate\", \"date\", \"issuedOn\"];\n\n /**\n * Normalise récursivement un objet, un tableau ou une valeur simple.\n * Cette fonction réalise en une seule passe les opérations suivantes :\n * - Conversion des chaînes \"true\"/\"false\" en booléens.\n * - Normalisation des dates (pour les champs spécifiés).\n * - Normalisation des images (pour les champs spécifiés).\n * - Transformation récursive des objets et tableaux.\n * - Normalisation des identifiants.\n *\n * @param {any} data - La donnée à normaliser.\n * @returns {any} La donnée normalisée.\n */\n _normalizeRecursively(data) {\n // Cas de base pour les chaînes\n if (typeof data === \"string\") {\n return this._normalizeString(data);\n }\n\n // Traitement des tableaux\n if (Array.isArray(data)) {\n return data.map(item => this._normalizeRecursively(item));\n }\n\n // Traitement des objets non nuls\n if (data !== null && typeof data === \"object\") {\n // On crée une copie de l'objet pour éviter les effets de bord.\n const normalizedData = {};\n\n Object.keys(data).forEach(key => {\n // Appliquer récursivement la normalisation sur la valeur.\n let value = this._normalizeRecursively(data[key]);\n\n // Si la clé correspond à un champ de date, on applique la normalisation de date.\n if (this._dateFields.includes(key)) {\n value = this._normalizeDate(value);\n }\n\n // Si la clé correspond à un champ d'image, on applique la normalisation d'image.\n if (this._imageFields.includes(key)) {\n value = this._normalizeImage(value);\n }\n\n // Cas particulier : si la clé est \"content\" et qu'elle possède une propriété \"image\".\n if (key === \"content\" && value && typeof value === \"object\" && value.image) {\n value.image = this._normalizeImage(value.image);\n }\n\n normalizedData[key] = value;\n });\n\n // Normalisation des identifiants après traitement de l'objet.\n return this._normalizeId(normalizedData);\n }\n\n // Pour les autres types (nombres, booléens déjà, etc.), on renvoie la donnée inchangée.\n return data;\n }\n\n _startBeforeEndValidate = (schema, data) => {\n if (!data.startDate || !data.endDate) return true;\n \n const isValid = new Date(data.startDate) < new Date(data.endDate);\n if (!isValid) {\n this._startBeforeEndValidate.errors = [\n {\n instancePath: \"/startDate\", // ou \".\" si tu veux le chemin actuel\n schemaPath: \"#/startBeforeEnd\",\n keyword: \"startBeforeEnd\",\n params: {},\n message: \"startDate must be before endDate\"\n }\n ];\n }\n return isValid;\n };\n \n\n getRequestSchema(constant) {\n const endpoint = this._endpoints.find(e => e.constant === constant);\n return endpoint?.request || null;\n }\n\n getPathSchema(constant) {\n return this._endpoints.find(e => e.constant === constant)?.pathParams || null;\n }\n\n /**\n * Permet d'écouter facilement un ensemble d'événements importants émis par l'ApiClient.\n *\n * @param {Object} handlers - Un objet avec des fonctions à appeler selon l'événement.\n * @param {Function} [handlers.retryAttempt] - Lors d'une tentative de retry axios.\n * @param {Function} [handlers.queuedOffline] - Lorsqu'une requête est mise en file.\n * @param {Function} [handlers.circuitBreakerOpen] - Quand le breaker s'ouvre.\n * @param {Function} [handlers.circuitBreakerReset] - Quand le breaker se referme.\n * @param {Function} [handlers.refreshSuccess] - Quand le token est rafraîchi.\n * @param {Function} [handlers.refreshFailed] - Quand le refresh échoue.\n * @param {Function} [handlers.sessionReset] - Quand la session est réinitialisée.\n * @param {Function} [handlers.validationError] - Quand une validation échoue.\n * @param {Function} [handlers.offlineModeChanged] - Quand le mode offline change.\n * @param {Function} [handlers.userLoggedIn] - Quand un utilisateur se connecte.\n */\n onEvent(handlers = {}) {\n const availableEvents = [\n \"retryAttempt\",\n \"queuedOffline\",\n \"circuitBreakerOpen\",\n \"circuitBreakerReset\",\n \"refreshSuccess\",\n \"refreshFailed\",\n \"sessionReset\",\n \"validationError\",\n \"offlineModeChanged\",\n \"userLoggedIn\"\n ];\n\n for (const eventName of availableEvents) {\n if (typeof handlers[eventName] === \"function\") {\n this.on(eventName, handlers[eventName]);\n }\n }\n }\n\n /**\n * Retourne la liste des noms d'événements personnalisés déclarés dans les endpoints.\n * Utile pour introspection ou documentation.\n *\n * @returns {string[]} Liste des événements émis dynamiquement via postActions.\n */\n getDeclaredEvents() {\n const events = new Set();\n for (const endpoint of this._endpoints) {\n if (Array.isArray(endpoint.postActions)) {\n for (const action of endpoint.postActions) {\n if (action.type === \"emitEvent\" && action.event) {\n events.add(action.event);\n }\n }\n }\n }\n return Array.from(events);\n }\n\n}\n/**\n * @event ApiClient#retryAttempt\n * @type {Object}\n * @property {number} retryCount - Le numéro de tentative.\n * @property {string} url - L'URL de la requête ayant échoué.\n\n * @event ApiClient#queuedOffline\n * @type {Object}\n * @property {string} constant - Le nom de l'endpoint.\n * @property {Object} data - Les données envoyées.\n * @property {\"offlineMode\"|\"circuitBreaker\"} reason - La raison de la mise en file.\n\n * @event ApiClient#circuitBreakerOpen\n * @type {Object}\n * @property {number} timestamp - Date (ms) à laquelle le breaker s'est ouvert.\n\n * @event ApiClient#circuitBreakerReset\n * @type {void}\n\n * @event ApiClient#refreshSuccess\n * @type {Object}\n * @property {string} token - Le nouveau token d'accès.\n * @property {string} [refreshToken] - Le nouveau refreshToken (optionnel).\n\n * @event ApiClient#refreshFailed\n * @type {Object}\n * @property {string} error - Le message d’erreur de refresh.\n\n * @event ApiClient#sessionReset\n * @type {void}\n\n * @event ApiClient#validationError\n * @type {Object}\n * @property {\"pathParams\"|\"request\"|\"response\"} stage - Étape de validation échouée.\n * @property {Array<Object>} errors - Erreurs AJV brutes.\n\n * @event ApiClient#offlineModeChanged\n * @type {boolean} - true si le client est offline, false sinon.\n * \n * @event ApiClient#userLoggedIn\n * @param {Object} user - Les données utilisateur extraites de la réponse.\n */\n ","// UserApi.js\nimport ApiClient from \"../ApiClient.js\";\nimport { ApiError, ApiResponseError } from \"../error.js\";\nimport { Badge } from \"./Badge.js\";\nimport EndpointApi from \"./EndpointApi.js\";\nimport { Event } from \"./Event.js\";\nimport { News } from \"./News.js\";\nimport { Organization } from \"./Organization.js\";\nimport { Poi } from \"./Poi.js\";\nimport { Project } from \"./Project.js\";\nimport { User } from \"./User.js\";\n\nexport class UserApi {\n\n constructor(clientOrOptions) {\n if (clientOrOptions instanceof ApiClient) {\n this.client = clientOrOptions;\n } else {\n // Injection de dépendance : ApiClient est créé à partir des options\n this.client = new ApiClient(clientOrOptions);\n // si l'option \"tokenStorageStrategy\" est définie, on l'utilise pour créer une instance de ApiClient\n }\n \n this.loggedUser = null;\n }\n\n get isConnected() {\n return this.client.isConnected;\n }\n get userId() {\n return this.client.userId;\n }\n \n // Méthode d'authentification : récupère les données utilisateur depuis un endpoint\n async login(email, password) {\n return this.client.safeCall(async () => {\n // Appel à un endpoint d'authentification\n const response = await this.client.callEndpoint(\"AUTHENTICATE_URL\", { email, password });\n // Création d'une instance de LoggedInUser à partir des données reçues\n this.loggedUser = new User(this.client, response.data.user, { EndpointApi, Organization, Project, Event, Poi, Badge, News });\n return this.loggedUser;\n });\n }\n\n async meIsconnected() {\n if(!this.client.isConnected || !this.client.userId) {\n throw new ApiError(\"User not connected\", 401);\n }\n this.client._logger.info(\"UserApi\", \"meIsconnected\", this.client.userId);\n this.loggedUser = new User(this.client, { id: this.client.userId }, { EndpointApi, Organization, Project, Event, Poi, Badge, News });\n return this.loggedUser;\n }\n\n\n async register({\n name,\n username,\n email,\n pwd,\n } = {}) {\n return this.client.safeCall(async () => {\n const response = await this.client.callEndpoint(\"PERSON_REGISTER\", { name, username, email, pwd });\n if(response?.data?.result === false) {\n throw new ApiResponseError(response.data.msg, response.status, response.data);\n }\n return response.data;\n });\n }\n\n\n async recoverPassword(email) {\n return this.client.safeCall(async () => {\n const response = await this.client.callEndpoint(\"PASSWORD_RECOVERY\", { email });\n if(response?.data?.result === false) {\n throw new ApiResponseError(response.data.msg, response.status, response.data);\n }\n return response.data;\n });\n }\n\n}","// Api.js\nimport { Badge } from \"./api/Badge.js\";\nimport EndpointApi from \"./api/EndpointApi.js\";\nimport { createFromCollection, registerEntity } from \"./api/EntityRegistry.js\";\nimport { Event } from \"./api/Event.js\";\nimport { News } from \"./api/News.js\";\nimport { Organization } from \"./api/Organization.js\";\nimport { Poi } from \"./api/Poi.js\";\nimport { Project } from \"./api/Project.js\";\nimport { User } from \"./api/User.js\";\nimport { UserApi } from \"./api/UserApi.js\";\nimport { ApiAuthenticationError, ApiClientError, ApiError, ApiResponseError } from \"./error.js\";\n\nregisterEntity(\"User\", User);\nregisterEntity(\"Organization\", Organization);\nregisterEntity(\"Project\", Project);\nregisterEntity(\"Event\", Event);\nregisterEntity(\"Poi\", Poi);\nregisterEntity(\"Badge\", Badge);\nregisterEntity(\"EndpointApi\", EndpointApi);\nregisterEntity(\"UserApi\", UserApi);\nregisterEntity(\"News\", News);\n\nexport default class Api {\n /**\n * Authentifie l'utilisateur et retourne une instance d'Api.\n *\n * @param {string} email - L'adresse email.\n * @param {string} password - Le mot de passe.\n * @param {function|object} options - Options pour l'ApiClient (baseURL, debug, etc.) ou une instance d'ApiClient.\n * @returns {Promise<Api>}\n */\n static async userLogin(email, password, options) {\n const userApi = Api.userApi(options);\n return await Api.userApiLogin(userApi, email, password);\n }\n\n /**\n * Creates an instance of the UserApi class with the provided options.\n *\n * @param @param {function|object} options - Options for the ApiClient (baseURL, debug, etc.) or an instance of ApiClient.\n * @returns {UserApi} An instance of the UserApi class.\n * @throws {Error} Throws an error if the UserApi instance cannot be created.\n */\n static userApi(options) {\n try {\n const userApi = new UserApi(options);\n return userApi;\n } catch (error) {\n console.error(\"[Api.userApi] Erreur lors de la création d'un objet utilisateur :\", error.message);\n throw error;\n }\n }\n \n /**\n * Logs in a user using the provided userApi instance, email, and password.\n *\n * @param {Object} userApi - The API instance used for user authentication.\n * @param {string} email - The email address of the user.\n * @param {string} password - The password of the user.\n * @returns {Promise<Api>} A promise that resolves to an instance of the Api class\n * initialized with the logged-in user and the API client.\n * @throws {ApiAuthenticationError} If the login fails due to authentication issues.\n * @throws {Error} If an unexpected error occurs during the login process.\n */\n static async userApiLogin(userApi, email, password) {\n try {\n\n if (!userApi) {\n throw new ApiError(\"userApi is not defined\");\n }\n if(!userApi.client) {\n throw new ApiError(\"userApi.client is not defined\");\n }\n\n if(userApi.client.isConnected) {\n // Si l'utilisateur est déjà connecté, on le récupère\n // et on ne fait pas de login\n const loggedUser = await userApi.meIsconnected();\n return new Api(loggedUser, userApi.client);\n } else {\n if (!email || !password) {\n throw new ApiError(\"email and password are required\");\n }\n const loggedUser = await userApi.login(email, password);\n return new Api(loggedUser, userApi.client);\n }\n\n } catch (error) {\n if(error instanceof ApiClientError) {\n if(error?.details?.error) {\n throw new ApiAuthenticationError(error.details.error, error.status, error.details);\n }\n }\n throw error;\n }\n }\n \n /**\n * Construit une instance d'Api.\n *\n * @param {User|null} loggedUser - L'utilisateur connecté ou null.\n * @param {ApiClient} client - L'instance d'ApiClient.\n */\n constructor(loggedUser, client) {\n this._loggedUser = loggedUser;\n this._client = client;\n }\n\n /**\n * Retourne l'utilisateur connecté.\n *\n * @returns {Promise<User>} L'utilisateur connecté.\n * @throws {ApiAuthenticationError} Si l'utilisateur n'est pas authentifié.\n */\n async me() {\n if (!this._loggedUser) {\n throw new ApiAuthenticationError(\"Accès refusé : utilisateur non authentifié.\");\n }\n await this._loggedUser.get();\n return this._loggedUser;\n }\n\n /**\n * Crée une instance User pour un utilisateur donné (autre que le connecté).\n *\n * @param {Object} userData - Les données de l'utilisateur public.\n * @returns {Promise<User>} Une promesse qui résout l'instance User.\n * @throws {Error} Si une erreur se produit lors de la création de l'utilisateur.\n */\n async user(userData) {\n try {\n if (!userData.id && !userData.slug) {\n return new User(this._client, userData, { EndpointApi, Organization, Project, Event, Poi, Badge, News });\n } else {\n const user = new User(this._client, userData, { EndpointApi, Organization, Project, Event, Poi, Badge, News });\n await user.get();\n return user;\n }\n } catch (error) {\n console.error(\"[Api.user] Erreur lors de la création d'un objet utilisateur public :\", error.message);\n throw error;\n }\n }\n\n\n /**\n * Creates an Organization object and optionally retrieves its profile.\n *\n * @param {Object} organizationData - The data required to initialize the Organization object.\n * @returns {Promise<Organization>} A promise that resolves to the created Organization object.\n * @throws {Error} Throws an error if the organization creation or profile retrieval fails.\n */\n async organization(organizationData) {\n try {\n const organization = new Organization(this._client, organizationData, { EndpointApi, User, Project, Event, Poi, Badge, News });\n if (!organizationData.id && !organizationData.slug) {\n throw new Error(\"Vous devez fournir un id ou un slug pour créer une instance Organization.\");\n }\n await organization.get();\n return organization;\n } catch (error) {\n console.error(\"[Api.organization] Erreur lors de la création d'un objet organisation :\", error.message);\n throw error;\n }\n }\n\n /**\n * Creates a new Project instance and optionally retrieves its profile.\n *\n * @param {Object} projectData - The data used to initialize the Project instance.\n * @returns {Promise<Project>} A promise that resolves to the created Project instance.\n * @throws {Error} If an error occurs during project creation or profile retrieval.\n */\n async project(projectData) {\n try {\n const project = new Project(this._client, projectData, { EndpointApi, User, Organization, Event, Poi, Badge, News });\n if (!projectData.id && !projectData.slug) {\n throw new Error(\"Vous devez fournir un id ou un slug pour créer une instance Project.\");\n }\n await project.get();\n return project;\n } catch (error) {\n console.error(\"[Api.project] Erreur lors de la création d'un objet projet :\", error.message);\n throw error;\n }\n }\n\n async event(eventData) {\n try {\n const event = new Event(this._client, eventData, { EndpointApi, User, Organization, Project, Poi, Badge, News });\n if (!eventData.id && !eventData.slug) {\n throw new Error(\"Vous devez fournir un id ou un slug pour créer une instance Event.\");\n }\n await event.get();\n return event;\n } catch (error) {\n console.error(\"[Api.event] Erreur lors de la création d'un objet événement :\", error.message);\n throw error;\n }\n }\n\n async entitySlug(slug) {\n if (slug) {\n try {\n const data = await this.endpointApi.getElementsKey({\n pathParams:{\n slug: slug\n }\n });\n if(data?.contextId && data?.contextType) {\n const entity = createFromCollection(data?.contextType, this._client, { id: data?.contextId });\n await entity.get();\n return entity;\n } else {\n throw new ApiResponseError(`Le slug ${slug} n'est pas valide`, 200, data);\n }\n } catch (error) {\n if(error instanceof ApiResponseError) {\n throw new ApiResponseError(`Impossible de récupérer l'identifiant pour le slug ${slug}`, error.status, error.responseData);\n } else {\n throw error;\n }\n }\n }\n }\n\n /**\n * Retourne l'instance d'ApiClient.\n *\n * @returns {ApiClient}\n */\n get client() {\n return this._client;\n }\n\n /**\n * Retourne l'instance d'EndpointApi.\n * \n * @returns {EndpointApi}\n */\n get endpointApi() {\n return new EndpointApi(this._client);\n }\n\n logout () {\n this.loggedUser = null;\n this._client.resetSession();\n this._client._logger.info(\"UserApi: User logged out\");\n }\n \n}\n","// OfflineQueueStorageStrategy.js\n\nexport class OfflineQueueStorageStrategy {\n async loadQueue() {\n throw new Error(\"loadQueue() doit être implémenté\");\n }\n \n // eslint-disable-next-line no-unused-vars\n async saveQueue(queue) {\n throw new Error(\"saveQueue(queue) doit être implémenté\");\n }\n}\n \nexport class MemoryOfflineStorage extends OfflineQueueStorageStrategy {\n constructor() {\n super();\n this._queue = [];\n }\n \n async loadQueue() {\n return this._queue;\n }\n \n async saveQueue(queue) {\n this._queue = [...queue];\n }\n}\n \nexport class LocalStorageOfflineStorage extends OfflineQueueStorageStrategy {\n constructor(key = \"cocolight-api-offline-queue\") {\n super();\n this.key = key;\n }\n \n async loadQueue() {\n try {\n const raw = localStorage.getItem(this.key);\n return raw ? JSON.parse(raw) : [];\n } catch {\n return [];\n }\n }\n \n async saveQueue(queue) {\n try {\n localStorage.setItem(this.key, JSON.stringify(queue));\n } catch (e) {\n console.warn(\"[Offline] Échec du stockage localStorage\", e);\n }\n }\n}\n","// OfflineClientManager.js\nimport ApiClient from \"../ApiClient.js\";\nimport { createDefaultOfflineStrategy } from \"./createDefaultOfflineStrategy.js\";\n\nexport class OfflineClientManager {\n /**\n * Initialise un gestionnaire de mode offline pour un ApiClient donné.\n * \n * @param {ApiClient} apiClient - Instance du client principal.\n */\n constructor(apiClient) {\n if(!apiClient || !(apiClient instanceof ApiClient)) {\n throw new Error(\"[OfflineClientManager] apiClient doit être une instance de ApiClient\");\n }\n this._clients = new Map();\n this._client = apiClient;\n }\n\n /**\n * Attache le gestionnaire offline à une instance ApiClient.\n * Configure la file d'attente offline, le monitoring réseau, et le ping serveur.\n *\n * @param {ApiClient} apiClient - L'instance du client à enrichir.\n * @param {Object} options\n * @param {Object} [options.offlineStorageStrategy] - Stratégie de stockage offline.\n * @param {boolean} [options.disableOfflineMonitoring] - Si true, désactive le monitoring réseau.\n */\n static async attachTo(apiClient, options = {}) {\n apiClient._offlineClientManager = new OfflineClientManager(apiClient);\n const strategy = await createDefaultOfflineStrategy(options?.offlineStorageStrategy || \"auto\");\n await apiClient._offlineClientManager._initOfflineQueue(strategy);\n if (!options?.disableOfflineMonitoring) {\n apiClient._offlineClientManager.startOfflineMonitoring(options);\n }\n }\n\n /**\n * Retourne un ApiClient configuré avec les bons tokens/baseURL pour rejouer une action offline.\n * Met en cache l'instance pour éviter les recréations.\n *\n * @param {Object} meta - Métadonnées contenant baseURL et tokens.\n * @returns {Promise<ApiClient>}\n */\n async getClient(meta) {\n const key = `${meta.baseURL}|${meta.accessToken}`;\n if (this._clients.has(key)) return this._clients.get(key);\n\n const client = new ApiClient({\n baseURL: meta.baseURL,\n accessToken: meta.accessToken,\n refreshToken: meta.refreshToken,\n debug: this._client._debug,\n });\n\n this._clients.set(key, client);\n return client;\n }\n\n /**\n * Rejoue une action unique depuis la file offline.\n * \n * @param {Object} action - Objet contenant constant, data, options et meta.\n * @returns {Promise<any>}\n */\n async replayAction(action) {\n const client = await this.getClient(action.meta);\n try {\n \n const result = await client.callEndpoint(\n action.constant,\n action.data,\n action.options?.transformResponseData ?? true,\n action.options?.validateResponseSchema ?? true\n );\n this._client._logger.info(`[OfflineReplay] Succès ${action.constant} sur ${action.meta.baseURL}`);\n return result;\n } catch (err) {\n this._client._logger.error(`[OfflineReplay] Échec ${action.constant}`, err.message);\n throw err;\n }\n }\n\n /**\n * Démarre la surveillance de l'état réseau.\n * Basé sur navigator.onLine + un ping serveur régulier.\n *\n * @param {Object} [options]\n * @param {number} [options.interval=30000] - Intervalle de vérification en ms.\n * @param {boolean} [options.disableOfflineMonitoring=false] - Pour désactiver.\n */\n startOfflineMonitoring({ interval = 30000, disableOfflineMonitoring = false } = {}) {\n if (disableOfflineMonitoring || this._monitoringStarted) return;\n \n this._monitoringStarted = true;\n this._offlineMode = typeof window !== \"undefined\" && typeof navigator !== \"undefined\" && !navigator.onLine;\n \n if (typeof window !== \"undefined\") {\n window.addEventListener(\"online\", () => this.setOfflineMode(false));\n window.addEventListener(\"offline\", () => this.setOfflineMode(true));\n }\n \n this._pingInterval = setInterval(async () => {\n const wasOffline = this._offlineMode;\n try {\n await this._client._client.head(\"/api/cocolight/infoserver\", { timeout: 5000 }); // ✅ utilise la fonction injectée\n if (wasOffline) this.setOfflineMode(false);\n \n // eslint-disable-next-line no-unused-vars\n } catch (err) {\n this._client._logger.error(\"[OfflineMonitor] ping() échoué → passage en offline\");\n this.setOfflineMode(true);\n }\n }, interval);\n }\n\n /**\n * Change l'état offline et émet un événement si l'état change.\n * Déclenche la relecture de la file si on revient online.\n *\n * @param {boolean} isOffline\n */\n setOfflineMode(isOffline) {\n if (this._offlineMode === isOffline) return;\n this._offlineMode = isOffline;\n if (typeof this._emit === \"function\") {\n this._client.emit(\"offlineModeChanged\", isOffline);\n }\n this._client._logger.info(`[ApiClient] Mode offline : ${isOffline} (set depuis monitoring)`);\n\n if (!isOffline && typeof this._replayOfflineQueue === \"function\") {\n this._replayOfflineQueue();\n }\n }\n\n /**\n * Indique si le client est actuellement en mode offline.\n *\n * @returns {boolean}\n */\n isOffline() {\n return !!this._offlineMode;\n }\n\n /**\n * Met une action API dans la file offline.\n *\n * @param {Object} params\n * @param {string} params.constant - Le nom de l'endpoint.\n * @param {Object} params.data - Données à envoyer.\n * @param {Object} [params.options] - Options de transformation/validation.\n */\n async _enqueueOfflineAction({ constant, data, options = {} }) {\n const hasToken = this._client.getToken() || this._client.getRefreshToken();\n const endpoint = this._client._endpoints.find(e => e.constant === constant);\n const authPolicy = endpoint?.authPolicy || (endpoint?.auth === \"none\" ? \"none\" : \"required\");\n if (authPolicy === \"required\" && !hasToken) {\n this._client._logger.warn(`[Offline] Action ignorée : token requis mais absent (${constant})`);\n return;\n }\n\n const action = {\n constant,\n data,\n options,\n meta: {\n baseURL: this._client._baseURL,\n accessToken: this._client.getToken(),\n refreshToken: this._client.getRefreshToken(),\n timestamp: Date.now()\n }\n };\n\n this._offlineQueue.push(action);\n await this._offlineQueueStorage.saveQueue(this._offlineQueue);\n this._client._logger.info(`[Offline] Action mise en file : ${constant}`);\n }\n\n /**\n * Rejoue toutes les actions offline.\n * Ré-insère celles qui échouent dans la file.\n */\n async _replayOfflineQueue() {\n const queueCopy = [...this._offlineQueue];\n this._offlineQueue = [];\n await this._offlineQueueStorage.saveQueue([]);\n\n for (const action of queueCopy) {\n const endpoint = this._client._endpoints.find(e => e.constant === action.constant);\n const authPolicy = endpoint?.authPolicy || (endpoint?.auth === \"none\" ? \"none\" : \"required\");\n const hasToken = action.meta.accessToken || action.meta.refreshToken;\n\n if (authPolicy === \"required\" && !hasToken) {\n this._client._logger.warn(`[Offline] Rejetée : token requis manquant (${action.constant})`);\n continue;\n }\n\n try {\n await this.replayAction(action);\n \n } catch (e) {\n this._client._logger.error(\"[Offline] Relecture échouée :\", e.message);\n this._offlineQueue.push(action); // requeue si erreur\n }\n }\n\n await this._offlineQueueStorage.saveQueue(this._offlineQueue);\n }\n\n /**\n * Initialise la stratégie de stockage offline et charge la file d’attente.\n *\n * @param {OfflineQueueStorageStrategy} storageStrategy\n */\n async _initOfflineQueue(storageStrategy) {\n this._offlineQueueStorage = storageStrategy;\n this._offlineQueue = await storageStrategy.loadQueue();\n }\n}\n\nexport default OfflineClientManager;\n","import { LocalStorageOfflineStorage, MemoryOfflineStorage } from \"./OfflineQueueStorageStrategy.js\";\n\nexport async function createDefaultOfflineStrategy(offlineStorageStrategy = \"auto\") {\n if (offlineStorageStrategy === \"memory\") {\n return new MemoryOfflineStorage();\n }\n if (offlineStorageStrategy === \"localStorage\") {\n if (typeof window !== \"undefined\" && window.localStorage) {\n return new LocalStorageOfflineStorage();\n } else {\n throw new Error(\"localStorage is not available in this environment.\");\n }\n }\n if (offlineStorageStrategy === \"file\") {\n if (typeof window !== \"undefined\" && window.localStorage) {\n throw new Error(\"file storage is not available in this environment.\");\n }\n const { FileOfflineStorage } = await import(\"./FileOfflineStorageStrategy.node.js\");\n return new FileOfflineStorage();\n }\n if (offlineStorageStrategy === \"auto\") {\n if (typeof window !== \"undefined\" && window.localStorage) {\n return new LocalStorageOfflineStorage();\n } else {\n const { FileOfflineStorage } = await import(\"./FileOfflineStorageStrategy.node.js\");\n return new FileOfflineStorage();\n }\n }\n}","import { fromEntityJSON } from \"./api/EntityRegistry.js\";\nimport Api from \"./Api.js\";\nimport ApiClient from \"./ApiClient.js\";\nimport * as error from \"./error.js\";\nimport { createDefaultMultiServerTokenStorageStrategy } from \"./utils/createDefaultMultiServerTokenStorageStrategy.js\";\nimport { createDefaultTokenStorageStrategy } from \"./utils/createDefaultTokenStorageStrategy.js\";\nimport { MultiServerTokenStorageStrategy } from \"./utils/MultiServerTokenStorageStrategy.js\";\nimport OfflineClientManager from \"./utils/OfflineClientManager.js\";\nimport * as reactive from \"./utils/reactive.js\";\nimport { TokenStorageStrategy } from \"./utils/TokenStorage.js\";\n\nexport default {\n ApiClient,\n Api,\n error,\n\n // Accès aux primitives réactives via .reactive\n reactive,\n\n // Accès direct à chaque primitive (reactive, effect, watch...) en racine\n ...reactive,\n\n tokenStorageStrategy: {\n createDefaultTokenStorageStrategy,\n TokenStorageStrategy,\n createDefaultMultiServerTokenStorageStrategy,\n MultiServerTokenStorageStrategy\n },\n helper: {\n fromEntityJSON\n },\n\n OfflineClientManager\n};\n","import { LocalStorageStrategy, MemoryStorageStrategy } from \"./TokenStorage.js\";\n\n/**\n * Crée une stratégie de stockage de jetons par défaut en fonction de l'option fournie.\n *\n * @param {string} [tokenStorageStrategy=\"auto\"] - La stratégie de stockage de jetons souhaitée.\n * Les valeurs possibles sont :\n * - \"memory\" : Utilise une stratégie de stockage en mémoire.\n * - \"localStorage\" : Utilise le localStorage du navigateur (si disponible).\n * - \"file\" : Utilise une stratégie de stockage basée sur des fichiers (non disponible dans les environnements navigateur).\n * - \"auto\" : Sélectionne automatiquement la meilleure stratégie de stockage disponible.\n *\n * @returns {Promise<Object>} Une promesse qui se résout avec une instance de la stratégie de stockage sélectionnée.\n *\n * @throws {Error} Lève une erreur si la stratégie sélectionnée n'est pas disponible dans l'environnement actuel.\n */\nexport async function createDefaultTokenStorageStrategy(tokenStorageStrategy = \"auto\") {\n if (tokenStorageStrategy === \"memory\") {\n return new MemoryStorageStrategy();\n }\n if (tokenStorageStrategy === \"localStorage\") {\n if (typeof window !== \"undefined\" && window.localStorage) {\n return new LocalStorageStrategy();\n } else {\n throw new Error(\"localStorage is not available in this environment.\");\n }\n }\n if (tokenStorageStrategy === \"file\") {\n if (typeof window !== \"undefined\" && window.localStorage) {\n throw new Error(\"file storage is not available in this environment.\");\n }\n const { FileStorageStrategy } = await import(\"./FileStorageStrategy.node.js\");\n return new FileStorageStrategy();\n }\n if (tokenStorageStrategy === \"auto\") {\n if (typeof window !== \"undefined\" && window.localStorage) {\n return new LocalStorageStrategy();\n } else {\n const { FileStorageStrategy } = await import(\"./FileStorageStrategy.node.js\");\n return new FileStorageStrategy();\n }\n }\n}","import {\n MultiServerMemoryStorageStrategy,\n MultiServerLocalStorageStrategy,\n} from \"./MultiServerTokenStorageStrategy.js\";\n \n/**\n * Crée une stratégie de stockage de tokens multi-serveurs adaptée à l’environnement.\n *\n * @param {string} [strategyType=\"auto\"] - Type de stockage souhaité :\n * - \"memory\" : en mémoire (non persistant)\n * - \"localStorage\" : navigateur uniquement\n * - \"file\" : Node.js uniquement\n * - \"auto\" : choisit automatiquement selon l’environnement\n * @returns {Promise<MultiServerTokenStorageStrategy>}\n */\nexport async function createDefaultMultiServerTokenStorageStrategy(strategyType = \"auto\") {\n if (strategyType === \"memory\") {\n return new MultiServerMemoryStorageStrategy();\n }\n \n if (strategyType === \"localStorage\") {\n if (typeof window !== \"undefined\" && window.localStorage) {\n return new MultiServerLocalStorageStrategy();\n } else {\n throw new Error(\"localStorage n’est pas disponible dans cet environnement.\");\n }\n }\n \n if (strategyType === \"file\") {\n if (typeof window !== \"undefined\" && window.localStorage) {\n throw new Error(\"Le stockage fichier n’est pas disponible côté navigateur.\");\n }\n const { MultiServerFileStorageStrategy } = await import(\"./MultiServerFileStorageStrategy.node.js\");\n return new MultiServerFileStorageStrategy();\n }\n \n // stratégie \"auto\"\n if (typeof window !== \"undefined\" && window.localStorage) {\n return new MultiServerLocalStorageStrategy();\n } else {\n const { MultiServerFileStorageStrategy } = await import(\"./MultiServerFileStorageStrategy.node.js\");\n return new MultiServerFileStorageStrategy();\n }\n}\n ","// utils/stream-utils.node.js\nexport async function bufferToReadable(buffer) {\n const { Readable } = await import(\"stream\");\n return Readable.from(buffer);\n}\n \nexport async function createPassThrough() {\n const { PassThrough } = await import(\"stream\");\n return new PassThrough();\n}","import fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { MultiServerTokenStorageStrategy } from \"./MultiServerTokenStorageStrategy.js\";\n\nexport class MultiServerFileStorageStrategy extends MultiServerTokenStorageStrategy {\n constructor(filename = \"tokens.json\", dir = path.join(os.homedir(), \".config\", \"cocolight\")) {\n super();\n this.filePath = path.join(dir, filename);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n }\n\n _readFile() {\n if (!fs.existsSync(this.filePath)) return {};\n try {\n return JSON.parse(fs.readFileSync(this.filePath, \"utf8\"));\n } catch {\n return {};\n }\n }\n\n _writeFile(data) {\n fs.writeFileSync(this.filePath, JSON.stringify(data, null, 2), \"utf8\");\n }\n\n getAccessToken() {\n this._ensureContext();\n return this._readFile()[this._currentBaseURL]?.accessToken || null;\n }\n\n setAccessToken(token) {\n this._ensureContext();\n const all = this._readFile();\n all[this._currentBaseURL] = { ...(all[this._currentBaseURL] || {}), accessToken: token };\n this._writeFile(all);\n }\n\n getRefreshToken() {\n this._ensureContext();\n return this._readFile()[this._currentBaseURL]?.refreshToken || null;\n }\n\n setRefreshToken(token) {\n this._ensureContext();\n const all = this._readFile();\n all[this._currentBaseURL] = { ...(all[this._currentBaseURL] || {}), refreshToken: token };\n this._writeFile(all);\n }\n\n clear() {\n this._ensureContext();\n const all = this._readFile();\n delete all[this._currentBaseURL];\n this._writeFile(all);\n }\n\n getServers() {\n return Object.keys(this._readFile());\n }\n\n exportAll() {\n return this._readFile();\n }\n}\n","// src/utils/FileStorageStrategy.node.js\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { TokenStorageStrategy } from \"./TokenStorage.js\";\n\nexport class FileStorageStrategy extends TokenStorageStrategy {\n constructor(filename = \"tokens.json\", dir = path.join(os.homedir(), \".config\", \"cocolight\")) {\n super();\n this.dir = dir;\n this.filePath = path.join(dir, filename);\n this._ensureDirectoryExists();\n }\n\n _ensureDirectoryExists() {\n if (!fs.existsSync(this.dir)) {\n fs.mkdirSync(this.dir, { recursive: true });\n }\n }\n\n _readFile() {\n if (!fs.existsSync(this.filePath)) return {};\n try {\n return JSON.parse(fs.readFileSync(this.filePath, \"utf8\"));\n \n } catch (e) {\n console.error(\"Error reading token file:\", e);\n return {};\n }\n }\n\n _writeFile(data) {\n fs.writeFileSync(this.filePath, JSON.stringify(data, null, 2), \"utf8\");\n }\n\n getAccessToken() {\n return this._readFile().accessToken || null;\n }\n\n setAccessToken(token) {\n const data = this._readFile();\n data.accessToken = token;\n this._writeFile(data);\n }\n\n getRefreshToken() {\n return this._readFile().refreshToken || null;\n }\n\n setRefreshToken(token) {\n const data = this._readFile();\n data.refreshToken = token;\n this._writeFile(data);\n }\n\n clear() {\n this._writeFile({});\n }\n}\n","// src/utils/FileOfflineStorage.node.js\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { OfflineQueueStorageStrategy } from \"./OfflineQueueStorageStrategy.js\";\n\nexport class FileOfflineStorage extends OfflineQueueStorageStrategy {\n constructor(filename = \"offline-queue.json\", dir = path.join(os.homedir(), \".config\", \"cocolight\")) {\n super();\n this.dir = dir;\n this.filePath = path.join(dir, filename);\n this._ensureDirectoryExists();\n }\n\n _ensureDirectoryExists() {\n if (!fs.existsSync(this.dir)) {\n fs.mkdirSync(this.dir, { recursive: true });\n }\n }\n _readFile() {\n if (!fs.existsSync(this.filePath)) return [];\n try {\n const json = JSON.parse(fs.readFileSync(this.filePath, \"utf8\"));\n return json;\n } catch (e) {\n console.error(\"Erreur lecture offline queue :\", e);\n return [];\n }\n }\n\n _writeFile(queue) {\n try {\n fs.writeFileSync(this.filePath, JSON.stringify(queue, null, 2), \"utf8\");\n } catch (e) {\n console.warn(\"[OfflineQueue] Erreur d'écriture:\", e);\n }\n }\n\n async loadQueue() {\n return this._readFile();\n }\n\n async saveQueue(queue) {\n this._writeFile(queue);\n }\n}\n"],"names":["EntityRegistry","Map","registerEntity","tag","EntityClass","set","createFromCollection","collection","parent","data","_collectionMap","citoyens","entityTag","meta","_buildMeta","remove","organizations","projects","events","poi","news","badges","get","deps","EndpointApi","User","Organization","Project","entityClass","_buildCustomMeta","entry","console","warn","options","allDeps","Event","Poi","Badge","News","forEach","dep","ApiError","Error","constructor","message","status","details","super","this","name","ApiClientError","ApiValidationError","messages","CircuitBreakerError","ApiResponseError","responseData","ApiAuthenticationError","effectStack","computedCache","WeakMap","signalRegistry","batchDepth","pendingEffects","Set","effect","fn","wrapper","push","pop","createSignal","initialValue","value","subscribers","currentEffect","length","add","newValue","subscribe","delete","__isSignal","isSignal","obj","_wrapReactive","path","Array","isArray","arr","Proxy","target","prop","isNaN","val","isReactive","reactive","concat","Reflect","_wrapArray","__isReactive","signalMap","proxy","receiver","has","signal","toRaw","deleteProperty","getSignals","effects","from","clear","result","key","callback","signals","getter","oldValue","fromBuffer","pkg","BaseEntity","_draftData","_initialDraftData","_serverData","_calledFromSave","_syncReactiveDraft","static","config","__entityTag","getEntityTag","apiClient","userContext","endpointApi","draft","initial","_buildDraftAndProxy","defaultFields","serverData","constant","SCHEMA_CONSTANTS","transforms","removeFields","replace","id","slug","_id","newId","isConnected","userId","draftData","initialDraftData","isMe","getEntityType","entityType","hasChanges","_serialize","_toRawDeep","refresh","save","payload","_add","_resetInitialDraftData","_update","hasChanged","fromServerData","instance","_setData","newData","forceInitialDraftReset","_logger","info","Object","assign","clientDraft","mergedData","previousDraft","structuredClone","_updateDraftPreservingUserChanges","keys","current","undefined","raw","map","item","toJSON","parentMeta","type","__isSerializedEntity","JSON","parse","EJSON","stringify","_removeUnserializables","e","error","seen","WeakSet","__raw","el","clean","_revive","fromJSONValue","fromJSON","json","call","safeCall","async","response","callEndpoint","checkAndThrowApiResponseError","callNoConnected","callIsConnected","param","callIsMe","_validateImage","imageInput","_validateUploadInput","allowedMimeTypes","expectedType","_validateFile","fileInput","input","isNode","window","process","mimeType","output","File","includes","Blob","ext","split","fileName","Date","now","Buffer","isBuffer","fileTypeResult","mime","filename","_createReadStreamFromBuffer","readable","_read","previewChunks","tee","_passThrough","resultStream","MAX_BYTES","bytesRead","on","chunk","pipe","Promise","resolve","setTimeout","previewBuffer","buffer","stream","_bufferToReadable","bufferToReadable","then","streamUtils_node","createPassThrough","_omitProps","propsToRemove","_pickProps","_hasAtLeastOne","some","_createFilteredProxy","list","filter","n","_isDeleted","args","_newId","ObjectID","toString","_createDraftProxy","server","allowedFields","_","transformer","throwOnError","field","ownKeys","getOwnPropertyDescriptor","enumerable","configurable","_extractWritableFields","schema","ctx","defs","visited","$id","$defs","definitions","fields","$ref","refKey","resolved","allOf","s","if","condition","properties","matches","expected","const","else","entries","def","readOnly","constants","combinedSchema","sch","getRequestSchema","defKey","defVal","allowed","indexOf","k","rawDraft","fromEntries","v","reactiveServer","_extractChangedFieldsFromSchema","getInitialDraft","changed","initialDraft","_extractAllValidFieldsFromSchema","updated","_resolveId","getElementsKey","pathParams","contextId","contextType","_getPublicProfile","getElementsAbout","_getEntityMeta","selfClass","selfTag","commonDeps","_linkEntity","entityData","_linkEntityById","entityId","entity","skipGet","_linkEntities","results","flatMap","d","linkEntitiesFromServerData","filters","mapFn","isTruthy","isFalsy","every","actual","err","RegExp","test","toLowerCase","getTime","_entityInstanceData","selfKey","fetchKeys","entityBySlug","_buildLinkFilters","linkType","isAdmin","isAdminPending","isInviting","toBeValidated","roles","TypeError","$exists","$in","_getLinkMeta","connectTypeConnect","connectTypeDisconnect","_checkLinkableEntity","_getLinkFromConnectedUser","links","_submitLinkRequest","userLink","parentType","parentId","connectType","retour","connect","_acceptLinkRequest","_submitLinkRequestAdmin","linkOption","linkValidate","_leaveLinkRequest","disconnect","updateSettings","idEntity","typeEntity","updateDescription","typeElement","updateBlockDescription","updateInfo","updateBlockInfo","updateSocial","updateBlockSocial","updateLocality","updateBlockLocality","updateSlug","check","updateBlockSlug","updateImageProfil","profil_avatar","image","folder","ownerId","profilImage","organization","organizationData","project","projectData","poiData","event","eventData","badge","badgeData","newsData","getOrganizations","searchType","_getDefaultFromEndpoint","_createPaginatorEngine","initialData","finalizer","finalData","getOrganizationsAdmin","getOrganizationsNoAdmin","next","getProjects","$or","getProjectsAdmin","getProjectsNoAdmin","getPois","getPoisAdmin","getPoisNoAdmin","getSubscribers","getBadgesIssuer","getBadges","getNews","arrayObjet","rawList","getGallery","docType","requestToJoin","requestToJoinAdmin","acceptInvitation","leave","follow","unfollow","_checkAccess","action","_validateUserLink","_assertEntityType","types","expectedTypes","join","_isLinked","isAuthor","creator","isAuthorOrAdmin","isMember","isContributor","isAttendee","isFollower","isFollowing","getCostumJson","_generateRanges","indexStep","previousRanges","ranges","previous","indexMax","indexMin","_normalizeCount","count","spam","total","values","reduce","acc","endpoint","_endpoints","find","ep","request","default","Entity","state","cursor","index","history","sizes","hasStep","getPage","isNext","countType","searchBy","hasNext","hasPrev","pageIndex","pageNumber","prev","lastPageSize","Math","max","_withCostumContext","baseFinalizer","costumSlug","sourceKey","searchCostum","globalAutocompleteCostum","costumEventRequestActors","wrappedFinalizer","costumEventRequestSubevents","costumEventRequestDates","costumEventRequestElementEvent","costumEventRequestCategories","costumEventRequestEvent","costumEventRequestLinkTlToEvent","costumEventRequestLoadContextTag","methodName","ADD_BLOCKS","blockData","UPDATE_BLOCKS","getEvents","personRegister","authenticateUrl","refreshTokenUrl","meInfoUrl","passwordRecovery","serverExchangeToken","changePassword","deleteAccount","multiconnect","getNewsById","addNews","addImageNews","addFileNews","deleteNews","updateNews","shareNews","getComments","addComments","deleteComments","updateComments","searchTags","showVote","globalAutocomplete","cityAutocomplete","cityAutocompleteByCountry","suggestionInput","getMembersNoAdmin","getMembersAdmin","getFriendsAdmin","getSubscriptions","getSubscriptionsAdmin","getSubscribersAdmin","getContributorsNoAdmin","getContributorsAdmin","getBadgesFilters","getFavoris","deleteFavoris","addFavoris","addOrganization","addProject","addPoi","addEvent","deletePoi","deleteEvent","deleteElement","addImageElement","searchMemberAutocomplete","getNotifications","getNotificationsCount","notificationUpdate","removeAllNotifications","markNotificationAsRead","activitypubSearch","activitypubLink","activitypubGetCommunity","getBadge","getEmetteurBadges","addBadges","assignBadges","shareEvents","inviteEvent","organizer","scope","mentions","m","parseInt","mediaImg","images","img","Boolean","countImages","mediaFile","files","f","countFiles","newsArray","ids","text","object","idNews","addMention","userInstance","user","mention","addImage","newsImage","dataImage","addFile","file","newsFile","dataFile","github","full","socialNetwork","gitlab","facebook","twitter","instagram","diaspora","mastodon","telegram","getMembers","getContributors","parentIsMe","isActingUser","fetchFn","getFriends","userData","sendFriendRequest","invitorId","acceptFriendRequest","removeFriend","isFriend","prototype","MongoID","str","hexString","_looksLikeObjectID","_str","equals","other","valueOf","clone","typeName","getTimestamp","Number","substr","toJSONValue","toHexString","common","common1","common2","format","common3","common4","common5","pattern","common6","additionalProperties","required","common8","reason","common10","common11","common12","common13","common15","enum","common16","common17","common18","common19","common20","common21","common24","common27","not","common29","common30","anyOf","items","common31","common32","common33","common35","url","common37","tags","common39","email","common41","common42","common43","common44","common45","common46","common47","common48","avancement","common50","common52","patternProperties","common54","common55","common56","common58","common61","common62","common63","common64","common65","common66","common69","common70","addressCountry","addressLocality","codeInsee","level1","level1Name","level3","minLength","level3Name","level4","level4Name","localityId","postalCode","streetAddress","common74","latitude","longitude","common78","coordinates","maxItems","minItems","float","common81","common82","common84","common87","maxLength","common88","common90","common92","common94","common96","common98","common100","common102","common103","common104","common105","common106","common107","common109","common111","minimum","common115","common116","common117","common119","common120","common121","childId","common123","childType","common125","common126","common128","common130","common131","common134","common135","common136","common137","common138","common139","common144","common146","common148","common149","common150","common152","common153","common156","common158","common159","common161","common162","common164","common165","common166","common168","common170","common173","common175","common177","propertyNames","common180","common181","common184","common185","common187","common189","common191","common192","common195","common196","common197","common199","common201","common203","common204","common205","common206","common207","common208","isOpenData","isOpenEdition","common211","common214","common215","common216","common217","common218","common219","common222","common223","common224","common228","common229","common230","common232","common235","common238","costumEditMode","endpointsJson","auth","contentType","generateModule","method","onlyAuthNone","app","isInvitation","mode","pendingUserId","pwd","username","postActions","password","refreshToken","serverUrl","newPassword","newPassword2","oldPassword","description","shortDescription","block","descMentions","sharedFields","birthDate","fixe","mobile","urls","socialField","address","oneOf","geo","geoPosition","tpl","listInvite","isLive","dateLimit","search","markdownActive","comment","argval","parentCommentId","params","q","fediverse","initType","locality","notSourceKey","countryCode","formInMap","scopeValue","maxProperties","minProperties","isParcours","Cooperative","GovernmentOrganization","Group","LocalBusiness","NGO","pull","arrayForm","preferences","role","crowdfunding","public","recurrency","endDate","openingHours","dayOfWeek","hours","closes","opens","startDate","timeZone","startBeforeEnd","qqfile","qqfilename","qqtotalfilesize","qquuid","searchMode","refreshTimestamp","all","actor","criteria","narrative","issuer","award","badgeId","evidences","narative","endDateUTC","startDateUTC","invites","msg","functionCocostum","mapUsed","verb","sortBy","parent_only","date","between","end","start","fromToday","regions","timezone","tl","contentKey","folderId","TokenStorageStrategy","getAccessToken","setAccessToken","token","getRefreshToken","setRefreshToken","MemoryStorageStrategy","_accessToken","_refreshToken","LocalStorageStrategy","prefix","localStorage","getItem","setItem","removeItem","MultiServerTokenStorageStrategy","_currentBaseURL","use","baseURL","_ensureContext","getServers","exportAll","MultiServerMemoryStorageStrategy","_storage","accessToken","MultiServerLocalStorageStrategy","_key","_getData","startsWith","addType","ApiClient","EventEmitter","refreshUrl","endpoints","timeout","debug","maxRetries","circuitBreakerThreshold","circuitBreakerResetTime","tokenStorageStrategy","_baseURL","_refreshUrl","_debug","_userId","_offlineClientManager","_fromJSONValue","defineProperty","_setUserId","_ajv","Ajv","strict","useDefaults","allErrors","verbose","addFormats","addFormat","addKeyword","keyword","errors","validate","_startBeforeEndValidate","pino","transport","colorize","level","_client","axios","create","axiosRetry","retries","retryDelay","exponentialDelay","retryCondition","isNetworkError","isRetryableError","onRetry","retryCount","requestConfig","emit","_breakerThreshold","_breakerResetTime","_breakerErrorCount","_breakerOpen","_lastBreakerOpenTime","_tokenStorage","setToken","initialAccessToken","initialRefreshToken","interceptors","originalRequest","_retry","_refreshAccessToken","headers","getToken","resetSession","defaults","_getIdFromToken","jwtDecode","refreshClient","post","_checkCircuitBreaker","_updateCircuitBreakerError","timestamp","_resetCircuitBreakerSuccess","stripNullsInPlace","i","splice","hasOwnProperty","_resolveSpecialValuesInPlace","aliasMap","subPath","_getValueByPath","regex","resolveString","delimitedAlias","plainAlias","substring","match","subKey","remainder","internal","isBinary","isPlainObject","_cleanSchemaLeftoverAlias","aliasRegex","newObj","cleanedDefault","transformResponseData","validateResponseSchema","pathSchema","requestSchema","responses","lowerMethod","realContentType","resolvedPath","resolvedParams","schemaToCompile","validatePathParams","compile","errorMessages","_ajvErrorHuman","stage","encodeURIComponent","dataForValidation","cleanedData","validateRequest","isOffline","_enqueueOfflineAction","offline","breaker","toURLSearchParams","validateResponse","_transformData","errorsMessages","AggregateAjvError","resultErrors","_buildParams","URLSearchParams","paramsInstance","dots","indexes","metaTokens","stack","isVisitable","thing","removeBrackets","endsWith","slice","renderKey","useDots","convertValue","toISOString","ArrayBuffer","isView","build","append","fieldKey","defaultVisitor","trim","resultGoods","_normalizeJsonData","notif","cities","newComment","allMongoIds","_normalizeRecursively","src","changes","_ensureFullURL","day","replies","author","firstKey","timeAgo","imagePath","separator","_normalizeString","_normalizeId","$type","$value","_normalizeDate","sec","$date","_normalizeImage","_imageFields","_dateFields","normalizedData","isValid","instancePath","schemaPath","getPathSchema","onEvent","handlers","availableEvents","eventName","getDeclaredEvents","UserApi","clientOrOptions","client","loggedUser","login","meIsconnected","register","recoverPassword","Api","userLogin","userApi","userApiLogin","_loggedUser","me","entitySlug","logout","OfflineQueueStorageStrategy","loadQueue","saveQueue","queue","MemoryOfflineStorage","_queue","LocalStorageOfflineStorage","OfflineClientManager","_clients","attachTo","strategy","offlineStorageStrategy","FileOfflineStorage","FileOfflineStorageStrategy_node","createDefaultOfflineStrategy","_initOfflineQueue","disableOfflineMonitoring","startOfflineMonitoring","getClient","replayAction","interval","_monitoringStarted","_offlineMode","navigator","onLine","addEventListener","setOfflineMode","_pingInterval","setInterval","wasOffline","head","_emit","_replayOfflineQueue","hasToken","authPolicy","_offlineQueue","_offlineQueueStorage","queueCopy","storageStrategy","createDefaultTokenStorageStrategy","FileStorageStrategy","FileStorageStrategy_node","createDefaultMultiServerTokenStorageStrategy","strategyType","MultiServerFileStorageStrategy","MultiServerFileStorageStrategy_node","helper","fromEntityJSON","Readable","import","PassThrough","dir","os","homedir","filePath","fs","existsSync","mkdirSync","recursive","_readFile","readFileSync","_writeFile","writeFileSync","_ensureDirectoryExists"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cocolight-api-client.vite.mjs.js","sources":["../src/api/EntityRegistry.js","../src/error.js","../src/utils/reactive.js","../src/api/BaseEntity.js","../src/api/Badge.js","../src/api/EndpointApi.js","../src/api/Event.js","../src/api/News.js","../src/api/Organization.js","../src/api/Poi.js","../src/api/Project.js","../src/api/User.js","../src/mixin/UserMixin.js","../src/EJSONType.js","../src/endpoints.module.js","../src/utils/TokenStorage.js","../src/utils/MultiServerTokenStorageStrategy.js","../src/ApiClient.js","../src/api/UserApi.js","../src/Api.js","../src/utils/OfflineQueueStorageStrategy.js","../src/utils/OfflineClientManager.js","../src/utils/createDefaultOfflineStrategy.js","../src/index.js","../src/utils/createDefaultTokenStorageStrategy.js","../src/utils/createDefaultMultiServerTokenStorageStrategy.js","../src/utils/stream-utils.node.js","../src/utils/MultiServerFileStorageStrategy.node.js","../src/utils/FileStorageStrategy.node.js","../src/utils/FileOfflineStorageStrategy.node.js"],"sourcesContent":["export const EntityRegistry = new Map();\n\n/**\n * Enregistre une entité dans la registry.\n * @param {string} tag - ex: \"User\", \"Organization\"\n * @param {Function} EntityClass - la classe constructeur\n */\nexport function registerEntity(tag, EntityClass) {\n EntityRegistry.set(tag, EntityClass);\n}\n\n/**\n * Récupère une instance depuis un JSON générique.\n * @param {Object} json - doit contenir __entityTag\n * @param {Object} parent - ApiClient ou entité parent\n * @param {Object} deps - dépendances (comme dans le constructeur)\n * @returns {BaseEntity|null}\n */\nexport function fromEntityJSON(json, parent = null) {\n if (!json?.__entityTag) return null;\n if (!json.serverData?.collection) return json;\n const meta = _getEntityMeta(json.serverData.collection, json.__entityTag);\n if (!meta) return json;\n if (!meta?.entityClass?.fromJSON) throw new Error(`Classe inconnue ou fromJSON manquant pour ${json.__entityTag}`);\n return meta.entityClass.fromJSON(json, parent, meta.deps);\n}\n\n/**\n * Récupère la classe d'entité et ses dépendances à partir du type d'entité.\n * \n * @param {string} entityType - Le type d'entité.\n * @param {string} __entityTag - Le tag de l'entité.\n * @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é.\n */\nfunction _getEntityMeta(entityType, __entityTag) {\n const selfClass = EntityRegistry.get(__entityTag);\n const selfTag = __entityTag;\n \n const commonDeps = {\n EndpointApi: EntityRegistry.get(\"EndpointApi\"),\n User: selfTag === \"User\" ? selfClass : EntityRegistry.get(\"User\"),\n Organization: selfTag === \"Organization\" ? selfClass : EntityRegistry.get(\"Organization\"),\n Project: selfTag === \"Project\" ? selfClass : EntityRegistry.get(\"Project\"),\n Event: selfTag === \"Event\" ? selfClass : EntityRegistry.get(\"Event\"),\n Poi: selfTag === \"Poi\" ? selfClass : EntityRegistry.get(\"Poi\"),\n Badge: selfTag === \"Badge\" ? selfClass : EntityRegistry.get(\"Badge\"),\n News: selfTag === \"News\" ? selfClass : EntityRegistry.get(\"News\")\n };\n \n const map = {\n citoyens: { entityClass: commonDeps.User, deps: commonDeps },\n organizations:{ entityClass: commonDeps.Organization, deps: commonDeps },\n projects: { entityClass: commonDeps.Project, deps: commonDeps },\n events: { entityClass: commonDeps.Event, deps: { ...commonDeps, Badge: undefined } },\n poi: { entityClass: commonDeps.Poi, deps: { ...commonDeps, Badge: undefined, News: undefined } },\n news: { entityClass: commonDeps.News, deps: { ...commonDeps } },\n badges: { entityClass: commonDeps.Badge, deps: { \n EndpointApi: commonDeps.EndpointApi, \n User: commonDeps.User, \n Organization: commonDeps.Organization, \n Project: commonDeps.Project \n } }\n };\n \n return map[entityType] || null;\n}\n\n/**\n * Crée une instance d'entité basée sur le seul nom de la collection.\n * @param {string} collection - ex: \"citoyens\", \"projects\", ...\n * @param {Object} parent - ApiClient ou entité parente\n * @returns {BaseEntity|null}\n */\nexport function createFromCollection(collection, parent = null, data = {}) {\n const _collectionMap = {\n citoyens: {\n entityTag: \"User\",\n meta: tag => _buildMeta(tag, { remove: [] })\n },\n organizations: {\n entityTag: \"Organization\",\n meta: tag => _buildMeta(tag, { remove: [] })\n },\n projects: {\n entityTag: \"Project\",\n meta: tag => _buildMeta(tag, { remove: [] })\n },\n events: {\n entityTag: \"Event\",\n meta: tag => _buildMeta(tag, { remove: [\"Badge\"] })\n },\n poi: {\n entityTag: \"Poi\",\n meta: tag => _buildMeta(tag, { remove: [\"Badge\",\"News\"] })\n },\n news: {\n entityTag: \"News\",\n meta: tag => _buildMeta(tag, { remove: [] })\n },\n badges: {\n entityTag: \"Badge\",\n meta: tag => _buildCustomMeta(tag)\n }\n };\n const entry = _collectionMap[collection];\n if (!entry) {\n console.warn(`Collection inconnue : '${collection}'`);\n return null;\n }\n const { entityTag, meta } = entry;\n const { entityClass, deps } = meta(entityTag);\n return new entityClass(parent, data, deps);\n}\n\n/**\n * Construit entityClass et deps pour une collection standard.\n * @param {string} tag\n * @param {{remove: string[]}} options\n */\nfunction _buildMeta(tag, options) {\n const EntityClass = EntityRegistry.get(tag);\n const allDeps = {\n EndpointApi: EntityRegistry.get(\"EndpointApi\"),\n User: EntityRegistry.get(\"User\"),\n Organization: EntityRegistry.get(\"Organization\"),\n Project: EntityRegistry.get(\"Project\"),\n Event: EntityRegistry.get(\"Event\"),\n Poi: EntityRegistry.get(\"Poi\"),\n Badge: EntityRegistry.get(\"Badge\"),\n News: EntityRegistry.get(\"News\")\n };\n // inject self\n allDeps[tag] = EntityClass;\n // remove undesired\n options.remove.forEach(dep => delete allDeps[dep]);\n return { entityClass: EntityClass, deps: allDeps };\n}\n\n/**\n * Cas spécifique des badges : seules certaines dépendances.\n */\nfunction _buildCustomMeta(tag) {\n const EntityClass = EntityRegistry.get(tag);\n const deps = {\n EndpointApi: EntityRegistry.get(\"EndpointApi\"),\n User: EntityRegistry.get(\"User\"),\n Organization: EntityRegistry.get(\"Organization\"),\n Project: EntityRegistry.get(\"Project\")\n };\n deps[tag] = EntityClass;\n return { entityClass: EntityClass, deps };\n}\n","\n/**\n * Classe de base pour toutes les erreurs de l'API.\n */\nexport class ApiError extends Error {\n constructor(message, status, details) {\n super(message);\n this.name = \"ApiError\";\n this.status = status;\n this.details = details;\n }\n}\n\n/**\n * Erreur levée par le client API lorsqu'un appel échoue.\n */\nexport class ApiClientError extends ApiError {\n constructor(message, status, details) {\n super(message, status, details);\n this.name = \"ApiClientError\";\n }\n}\n\nexport class ApiValidationError extends Error {\n constructor(message, status, messages, details = null) {\n super(message);\n this.name = \"ApiValidationError\";\n this.status = status;\n this.messages = messages;\n this.details = details;\n }\n}\n\n\n/**\n * CircuitBreakerError : levée lorsqu'on bloque l'accès à l'API (trop d'erreurs).\n */\nexport class CircuitBreakerError extends ApiError {\n constructor(message) {\n super(message, 503);\n this.name = \"CircuitBreakerError\";\n }\n}\n \nexport class ApiResponseError extends Error {\n /**\n * Crée une instance d'ApiResponseError.\n *\n * @param {string} message - Message d'erreur.\n * @param {number} status - Le code HTTP (souvent 200 quand c'est une erreur logique).\n * @param {Object} responseData - Les données renvoyées par l'API.\n * @param {any} details - Informations supplémentaires (facultatif).\n */\n constructor(message, status, responseData, details = null) {\n super(message);\n this.name = \"ApiResponseError\";\n this.status = status;\n this.responseData = responseData;\n this.details = details;\n }\n}\n\nexport class ApiAuthenticationError extends ApiError {\n constructor(message, status, details) {\n super(message, status, details);\n this.name = \"ApiAuthenticationError\";\n }\n}","// reactive.js - Système maison combinant Signal + Proxy pour réactivité profonde et fine\n\nconst effectStack = [];\nconst computedCache = new WeakMap();\nconst signalRegistry = new WeakMap();\nlet batchDepth = 0;\nconst pendingEffects = new Set();\n\n/**\n * Crée une fonction réactive qui se relance automatiquement\n * lorsqu'une valeur réactive qu'elle utilise change.\n * @param {Function} fn\n * @returns {Function} le wrapper exécuté\n */\nexport function effect(fn) {\n const wrapper = () => {\n try {\n effectStack.push(wrapper);\n fn();\n } finally {\n effectStack.pop();\n }\n };\n wrapper();\n return wrapper;\n}\n\n/**\n * Exécute une fonction dans un lot, en retardant l'exécution\n * des effets jusqu'à ce que le lot soit terminé.\n * @param {Function} fn\n * @returns {void}\n */\nexport function batch(fn) {\n batchDepth++;\n try {\n fn();\n } finally {\n batchDepth--;\n if (batchDepth === 0) {\n const effects = Array.from(pendingEffects);\n pendingEffects.clear();\n for (const effect of effects) effect();\n }\n }\n}\n\n/**\n * Crée un signal observable pour une valeur primitive ou complexe.\n * @param {*} initialValue\n * @returns {{value: *, subscribe: Function, __isSignal: boolean}}\n */\nfunction createSignal(initialValue) {\n let value = initialValue;\n const subscribers = new Set();\n\n const signal = {\n get value() {\n const currentEffect = effectStack[effectStack.length - 1];\n if (currentEffect) subscribers.add(currentEffect);\n return value;\n },\n set value(newValue) {\n if (value !== newValue) {\n value = newValue;\n if (batchDepth > 0) {\n subscribers.forEach((fn) => pendingEffects.add(fn));\n } else {\n subscribers.forEach((fn) => fn());\n }\n }\n },\n subscribe(fn) {\n subscribers.add(fn);\n return () => subscribers.delete(fn);\n },\n __isSignal: true\n };\n\n return signal;\n}\n\n/**\n * vérifie si un objet est un signal.\n * @param {*} obj\n * @returns {boolean}\n */\nexport function isSignal(obj) {\n return obj && obj.__isSignal === true;\n}\n\nfunction toRaw(obj) {\n return isSignal(obj) ? obj.value : obj;\n}\n\nfunction _wrapArray(arr, path) {\n const proxy = new Proxy(arr, {\n get(target, prop) {\n if (typeof prop === \"string\" && !isNaN(prop)) {\n const val = target[prop];\n return isReactive(val) ? val : reactive(val, path.concat(prop));\n }\n return Reflect.get(target, prop);\n },\n set(target, prop, value) {\n const val = reactive(value, path.concat(prop));\n target[prop] = val;\n return true;\n }\n });\n return proxy;\n}\n\nfunction _wrapReactive(obj, path = []) {\n if (typeof obj !== \"object\" || obj === null) return obj;\n if (Array.isArray(obj)) return _wrapArray(obj, path);\n if (obj.__isReactive) return obj;\n\n const signalMap = new Map();\n const proxy = new Proxy(obj, {\n // eslint-disable-next-line no-unused-vars\n get(target, prop, receiver) {\n if (prop === \"__raw\") return target;\n if (prop === \"__isReactive\") return true;\n\n if (!signalMap.has(prop)) {\n const val = target[prop];\n const reactiveVal = _wrapReactive(val, path.concat(prop));\n const signal = createSignal(reactiveVal);\n signalMap.set(prop, signal);\n }\n\n const signal = signalMap.get(prop);\n return signal.value;\n },\n\n set(target, prop, value) {\n const val = _wrapReactive(value, path.concat(prop));\n if (!signalMap.has(prop)) {\n const signal = createSignal(val);\n signalMap.set(prop, signal);\n }\n signalMap.get(prop).value = val;\n target[prop] = toRaw(val);\n return true;\n },\n\n deleteProperty(target, prop) {\n signalMap.delete(prop);\n return Reflect.deleteProperty(target, prop);\n }\n });\n\n signalRegistry.set(proxy, signalMap);\n return proxy;\n}\n\n/**\n * Rend un objet profondément réactif.\n * @param {object} obj\n * @returns {object}\n */\nexport function reactive(obj) {\n if (typeof obj !== \"object\" || obj === null) return obj;\n if (obj.__isReactive) return obj;\n return _wrapReactive(obj);\n}\n\n/**\n * Teste si un objet est réactif.\n * @param {*} obj\n * @returns {boolean}\n */\nexport function isReactive(obj) {\n return obj !== null && typeof obj === \"object\" && obj.__isReactive === true;\n}\n\n/**\n * Crée une valeur dérivée automatiquement recalculée.\n * @param {Function} fn\n * @returns {{value: *}}\n */\nexport function computed(fn) {\n if (computedCache.has(fn)) return computedCache.get(fn);\n\n const result = createSignal();\n effect(() => result.value = fn());\n computedCache.set(fn, result);\n return result;\n}\n\n/**\n * Observe les changements de valeur retournée par un getter.\n * @param {Function} getter\n * @param {Function} callback\n */\nexport function watch(getter, callback) {\n let oldValue;\n effect(() => {\n const newValue = getter();\n if (newValue !== oldValue) {\n callback(newValue, oldValue);\n oldValue = newValue;\n }\n });\n}\n\n/**\n * Récupère les signaux internes d’un objet réactif.\n * @param {object} obj\n * @returns {Map|null}\n */\nexport function getSignals(obj) {\n if (!isReactive(obj)) return null;\n return signalRegistry.get(obj);\n}\n\n/**\n * Permet à React de s'abonner à une propriété réactive (champ simple).\n * @param {object} obj - Objet réactif\n * @param {string} key - Nom de la propriété à écouter\n * @param {(newValue: any, oldValue: any) => void} callback\n * @returns {() => void} fonction de nettoyage\n */\nexport function subscribeTo(obj, key, callback) {\n const signals = getSignals(obj);\n if (!signals || !signals.has(key)) return () => {};\n const signal = signals.get(key);\n return signal?.subscribe?.(() => callback(signal.value)) ?? (() => {});\n}\n","// BaseEntity.js\nimport ObjectID from \"bson-objectid\";\n// import { fileTypeFromBuffer } from \"file-type\";\nimport EJSON from \"ejson\";\nimport pkg from \"file-type\";\n\nimport { ApiAuthenticationError, ApiError, ApiResponseError, ApiValidationError } from \"../error.js\";\nimport { isReactive, isSignal, reactive } from \"../utils/reactive.js\";\nconst { fromBuffer } = pkg;\n\n/**\n * @typedef {import(\"../ApiClient.js\").default} ApiClient\n * @typedef {import(\"./EndpointApi.js\").default} EndpointApi\n */\n\n/**\n * Classe de base pour toutes les entités métiers : utilisateurs, projets, organisations, etc.\n * Fournit un système de brouillon (draft), transformation, appel API sécurisé,\n * et gestion de données côté client avec support du mode offline.\n * @abstract\n */\nexport class BaseEntity {\n /** @type {Object} Données de brouillon modifiables */\n _draftData = {};\n\n /** @type {Object} Snapshot initial des données de brouillon */\n _initialDraftData = {};\n\n /** @type {Object|null} Données reçues du serveur */\n _serverData = null;\n\n /** @type {boolean} Indique si `save()` est en cours */\n _calledFromSave = false;\n\n /** @type {boolean} Indique si le draft est synchronisé avec le serveur */\n _syncReactiveDraft = false;\n\n static entityTag = \"BaseEntity\";\n\n /**\n * Constructeur de l'entité.\n * @param {Object} parent - L'ApiClient ou une entité parente.\n * @param {Object} parent.apiClient - Instance de l'ApiClient.\n * @param {Object} [parent.parent] - Instance parente.\n * @param {Object} [data={}] - Données initiales.\n * @param {Object} [deps={}] - Dépendances injectées (EndpointApi, autres entités).\n * @param {Object|function} deps.EndpointApi - Instance de l'API.\n * @param {function} deps.User - Classe d'entité utilisateur.\n * @param {function} deps.Organization - Classe d'entité organisation.\n * @param {function} deps.Project - Classe d'entité projet.\n * @param {function} deps.Poi - Classe d'entité point d'intérêt.\n * @param {function} deps.Event - Classe d'entité événement.\n * @param {function} deps.Badge - Classe d'entité badge.\n * @param {function} deps.News - Classe d'entité actualité.\n * @param {string} [config.entityTag] - Tag d'entité (ex: \"User\", \"Organization\").\n * @param {Object} [config={}] - Configuration optionnelle.\n * @throws {ApiError} Si les dépendances ou parent sont invalides.\n */\n constructor(parent, data = {}, deps = {}, config = {}) {\n this.__entityTag = config.entityTag || this.getEntityTag(this.constructor.entityTag) || \"BaseEntity\";\n this.deps = deps;\n\n if (this.getEntityTag(parent?.__entityTag) === \"ApiClient\") {\n /** @type {ApiClient} */\n this.apiClient = parent;\n this.parent = null;\n this.userContext = null;\n } else if (parent?.apiClient) {\n /** @type {ApiClient} */\n this.apiClient = parent.apiClient;\n this.parent = parent;\n if (this.getEntityTag(parent?.__entityTag) === \"User\") {\n this.userContext = parent;\n } else if (parent?.userContext) {\n this.userContext = parent.userContext;\n }\n } else {\n throw new ApiError(\"Parent invalide ou ApiClient manquant.\");\n }\n\n // Gérer les deux cas : fonction constructeur ou instance\n if (typeof deps.EndpointApi === \"function\") {\n /** @type {EndpointApi} */\n this.endpointApi = new deps.EndpointApi(this.apiClient);\n } else if (typeof deps.EndpointApi === \"object\") {\n /** @type {EndpointApi} */\n this.endpointApi = deps.EndpointApi;\n } else {\n throw new ApiError(\"deps.EndpointApi doit être une classe ou une instance valide.\");\n }\n\n this._serverData = reactive({});\n\n const { draft, proxy, initial } = this._buildDraftAndProxy({\n data: { ...data, ...this.defaultFields },\n serverData: this._serverData,\n constant: this.constructor.SCHEMA_CONSTANTS,\n apiClient: this.apiClient,\n transforms: this.transforms,\n removeFields: this.removeFields\n });\n\n this._initialDraftData = initial;\n this._draftData = draft;\n this.data = proxy;\n }\n\n getEntityTag = (__entityTag) => __entityTag?.replace(/^_/, \"\");\n\n /** @returns {string|null} Identifiant de l'entité */\n get id() {\n return this._draftData.id || null;\n }\n\n /** @returns {string|null} Slug de l'entité */\n get slug() {\n return this._draftData.slug || null;\n }\n\n /** Définit un ID (utilisé en interne) */\n _id(newId) {\n this._draftData.id = newId;\n }\n\n /** @returns {boolean} Indique si l'utilisateur est connecté */\n get isConnected() {\n return this.apiClient.isConnected;\n }\n\n /** @returns {string|null} Identifiant utilisateur associé */\n get userId() {\n return this.apiClient.userId;\n }\n\n /** @returns {Object} Données de brouillon courantes */\n get draftData() {\n return this._draftData;\n }\n\n /** @returns {Object} Données de brouillon initiales */\n get initialDraftData() {\n return this._initialDraftData;\n }\n\n /** @returns {Object|null} Données brutes du serveur */\n get serverData() {\n return this._serverData;\n }\n\n /** @returns {boolean} Indique si cette entité représente l'utilisateur connecté */\n get isMe() {\n return this.isConnected && this.userId === this.userContext?.id;\n }\n\n /** @returns {string} Type de l'entité (ex: 'citoyens') */\n getEntityType() {\n return this.constructor.entityType;\n }\n\n /**\n * Indique si le draft contient des modifications par rapport aux données initiales.\n * @returns {boolean}\n */\n hasChanges() {\n return this._serialize(this._toRawDeep(this._draftData)) !== this._serialize(this._initialDraftData);\n }\n\n /**\n * Rafraîchit l'entité en rechargeant ses données depuis le serveur.\n * @returns {Promise<Object>} Données mises à jour\n */\n async refresh() {\n if (!this.id) throw new ApiError(\"Impossible de rafraîchir sans ID.\");\n return this.get();\n }\n\n /**\n * Sauvegarde les modifications locales vers le serveur (add ou update).\n * @returns {Promise<Object>} Données serveur mises à jour\n */\n async save() {\n if (!this.isConnected) throw new ApiError(\"Non connecté.\");\n this._calledFromSave = true;\n try {\n const payload = { ...this._draftData };\n\n if (!this.id && typeof this._add === \"function\") {\n await this._add(payload);\n this._resetInitialDraftData();\n // on refresh le contexte utilisateur si besoin\n if(this.userContext) {\n await this.userContext.refresh();\n }\n return await this.refresh();\n } else if (typeof this._update === \"function\") {\n const hasChanged = await this._update(payload);\n this._resetInitialDraftData();\n if (hasChanged) return await this.refresh();\n }\n\n return this._serverData;\n } finally {\n this._calledFromSave = false;\n }\n }\n\n /**\n * Crée une nouvelle instance d'entité à partir des données du serveur.\n * \n * @param {Object} data - Données du serveur.\n * @param {BaseEntity} parent - Instance parente.\n * @param {Object} deps - Dépendances injectées.\n * @returns {BaseEntity} Nouvelle instance d'entité.\n */\n static fromServerData(data, parent, deps) {\n const instance = new this(parent, {}, deps);\n instance._setData(data);\n return instance;\n }\n\n /**\n * Met à jour les données de l'entité avec de nouvelles données.\n * \n * @param {Object} newData - Les nouvelles données à appliquer.\n * @returns {void}\n * @private\n */\n _setData(newData, { forceInitialDraftReset = false } = {}) {\n if (this.userContext && this.userContext !== this) {\n this.apiClient._logger?.info?.(`[${this.__entityTag}] Mise à jour liée à userContext : ${this.userContext.id}`);\n }\n\n if (isReactive(this._serverData)) {\n Object.assign(this._serverData, newData);\n } else {\n this._serverData = reactive({ ...newData });\n }\n\n const clientDraft = this._draftData ? this._toRawDeep(this._draftData) : {};\n\n const mergedData = {\n ...newData,\n ...this.defaultFields,\n ...clientDraft\n };\n\n const { draft, proxy, initial } = this._buildDraftAndProxy({\n data: mergedData,\n serverData: this._serverData,\n previousDraft: this._draftData,\n constant: this.constructor.SCHEMA_CONSTANTS,\n apiClient: this.apiClient,\n transforms: this.transforms,\n removeFields: this.removeFields\n });\n\n if (forceInitialDraftReset) {\n this._initialDraftData = structuredClone(this._toRawDeep(draft));\n } else if (!this._initialDraftData) {\n this._initialDraftData = initial;\n }\n\n if (isReactive(this._draftData)) {\n this._updateDraftPreservingUserChanges(draft);\n } else {\n this._draftData = reactive(draft);\n }\n\n if (!this.data) {\n this.data = proxy;\n }\n\n }\n\n _updateDraftPreservingUserChanges(draft) {\n for (const key of Object.keys(draft)) {\n const current = this._draftData?.[key];\n const initialValue = this._initialDraftData?.[key];\n\n const isModified =\n current !== undefined &&\n initialValue !== undefined &&\n this._serialize(this._toRawDeep(current)) !== this._serialize(initialValue);\n\n if (!isModified) {\n this._draftData[key] = draft[key];\n }\n }\n }\n\n _resetInitialDraftData() {\n const raw = this._toRawDeep(this._draftData);\n this._initialDraftData = structuredClone(raw);\n }\n\n\n _toRawDeep(obj) {\n\n if (!this || typeof this._toRawDeep !== \"function\") {\n throw new Error(\"`this._toRawDeep` is not bound correctly. Use a lambda to preserve context.\");\n }\n \n if (isSignal(obj)) {\n return this._toRawDeep(obj.value);\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => this._toRawDeep(item));\n }\n\n if (typeof obj === \"object\" && obj !== null) {\n const result = {};\n for (const key of Object.keys(obj)) {\n result[key] = this._toRawDeep(obj[key]);\n }\n return result;\n }\n\n return obj; // valeur primitive\n }\n\n /**\n * Champs à ajouter automatiquement à chaque draft (ex: `typeElement`).\n * Souvent utilisés dans les conditions `if/then` du JSON Schema.\n * @type {Object<string, any>}\n */\n defaultFields = {};\n\n /**\n * Champs à exclure explicitement du draft et des payloads.\n * @type {string[]}\n */\n removeFields = [];\n\n /**\n * Transformations à appliquer à certains champs lors de la lecture depuis le draft.\n * Clé = champ, valeur = fonction (val, full) => valeur transformée.\n * @type {Object<string, function(any, object): any>}\n */\n transforms = {};\n\n /**\n * ───────────────────────────────\n * JSON\n * ───────────────────────────────\n */\n\n /**\n * Convertit l'instance en JSON pour l'envoi au serveur.\n * \n * @returns {Object} Représentation JSON de l'instance.\n */\n toJSON() {\n const parentMeta = {};\n if (this.parent?.id) parentMeta.id = this.parent.id;\n if (typeof this.parent?.getEntityType === \"function\") parentMeta.type = this.parent.getEntityType();\n if (this.parent?.__entityTag) parentMeta.__entityTag = this.parent.__entityTag;\n if (this.parent?.slug) parentMeta.slug = this.parent.slug;\n\n return {\n __entityTag: this.__entityTag,\n __isSerializedEntity: true,\n serverData: this._serialize(this._serverData),\n parent: Object.keys(parentMeta).length > 0 ? parentMeta : null\n };\n }\n\n\n _serialize(obj) {\n try {\n return JSON.parse(EJSON.stringify(this._removeUnserializables(obj)));\n } catch (e) {\n this.apiClient?._logger?.error?.(\"Erreur de sérialisation EJSON\", e);\n return null;\n }\n }\n\n /**\n * Supprime les propriétés non sérialisables d'un objet.\n * \n * @param {Object} obj - L'objet à nettoyer.\n * @param {WeakSet} [seen] - Ensemble pour éviter les références circulaires.\n * @returns {Object} L'objet nettoyé.\n * @private\n */\n _removeUnserializables(obj, seen = new WeakSet()) {\n if (obj === null || typeof obj !== \"object\") return obj;\n\n if (seen.has(obj)) return null;\n seen.add(obj);\n\n // Ignore les proxys réactifs\n if (obj.__isReactive && typeof obj.__raw === \"object\") {\n return this._removeUnserializables(obj.__raw, seen);\n }\n\n if (Array.isArray(obj)) {\n return obj.map((el) => this._removeUnserializables(el, seen));\n }\n\n const clean = {};\n for (const key of Object.keys(obj)) {\n const val = obj[key];\n\n if (\n typeof val === \"function\" ||\n typeof val === \"symbol\" ||\n typeof val === \"undefined\"\n ) {\n continue;\n }\n\n try {\n clean[key] = this._removeUnserializables(val, seen);\n // eslint-disable-next-line no-unused-vars\n } catch (e) {\n clean[key] = null;\n }\n }\n\n return clean;\n }\n\n /**\n * Restaure les données sérialisées en un objet d'origine.\n *\n * @param {Object} obj - L'objet à restaurer.\n * @returns {Object} L'objet restauré.\n */\n static _revive(obj) {\n return EJSON.fromJSONValue(obj);\n }\n\n /**\n * Crée une instance d'entité à partir de données JSON.\n * \n * @param {Object} json - Données JSON à utiliser.\n * @param {Object} parent - Instance parente.\n * @param {Object} deps - Dépendances injectées.\n * @returns {object} Nouvelle instance d'entité.\n */\n static fromJSON(json, parent, deps) {\n\n const { serverData } = json;\n\n const instance = this.fromServerData(this._revive(serverData), parent, deps);\n\n return instance;\n }\n\n /**\n * ───────────────────────────────\n * UtilMixin\n * ───────────────────────────────\n */\n\n /**\n * Appelle une méthode de l'API.\n * \n * @param {string} constant - Le nom de la méthode à appeler.\n * @param {object} data - Les données à passer à la méthode.\n * @returns {Promise<any>} - La promesse de la méthode appelée.\n * @throws {ApiValidationError} - Si une erreur se produit lors de l'appel de l'API.\n * @throws {ApiResponseError} - Si une erreur se produit lors de l'appel de l'API.\n * @throws {ApiClientError} - Si l'utilisateur n'est pas authentifié.\n */\n async call(constant, data = {}) {\n return this.apiClient.safeCall(async () => {\n const response = await this.apiClient.callEndpoint(constant, data);\n this.apiClient.checkAndThrowApiResponseError(response);\n return response.data;\n });\n }\n\n /**\n * Appelle une méthode de l'API si l'utilisateur n'est pas connecté.\n * \n * @param {string} constant - Le nom de la méthode à appeler.\n * @param {object} data - Les données à passer à la méthode.\n * @returns {Promise<any>} - La promesse de la méthode appelée.\n * @throws {ApiAuthenticationError} - Si l'utilisateur est connecté.\n * @throws {ApiValidationError} - Si une erreur se produit lors de l'appel de l'API.\n * @throws {ApiResponseError} - Si une erreur se produit lors de l'appel de l'API.\n * @throws {ApiClientError} - Si une erreur se produit lors de l'appel de l'API.\n */\n async callNoConnected(constant, data = {}) {\n if(this.isConnected) {\n throw new ApiAuthenticationError(\"Vous devez ne devez pas être connecté pour faire cette action.\");\n }\n return this.call(constant, data);\n }\n\n /**\n * Appelle une méthode de l'API si l'utilisateur est connecté.\n * \n * @param {string|function} param - Le nom de la méthode à appeler ou une fonction de rappel.\n * @param {object} data - Les données à passer à la méthode.\n * @returns {Promise<any>} - La promesse de la méthode appelée.\n * @throws {ApiAuthenticationError} - Si l'utilisateur n'est pas connecté.\n * @throws {ApiValidationError} - Si une erreur se produit lors de l'appel de l'API.\n * @throws {ApiResponseError} - Si une erreur se produit lors de l'appel de l'API.\n * @throws {ApiClientError} - Si une erreur se produit lors de l'appel de l'API.\n */\n async callIsConnected(param, data = {}) {\n if(!this.isConnected) {\n throw new ApiAuthenticationError(\"Vous devez être connecté pour faire cette action.\");\n }\n // Si le premier paramètre est une fonction, on l'exécute en tant que callback\n if (typeof param === \"function\") {\n return await param();\n }\n return this.call(param, data);\n }\n\n /**\n * Appelle une méthode de l'API si l'utilisateur est lui-même.\n * \n * @param {string|function} param - Le nom de la méthode à appeler ou une fonction de rappel.\n * @param {object} data - Les données à passer à la méthode.\n * @returns {Promise<any>} - La promesse de la méthode appelée.\n * @throws {ApiAuthenticationError} - Si l'utilisateur n'est pas lui-même.\n * @throws {ApiValidationError} - Si une erreur se produit lors de l'appel de l'API.\n * @throws {ApiResponseError} - Si une erreur se produit lors de l'appel de l'API.\n * @throws {ApiClientError} - Si une erreur se produit lors de l'appel de l'API.\n */\n async callIsMe(param, data = {}) {\n if (!this.isMe) {\n throw new ApiAuthenticationError(\"Vous devez être vous-même pour faire cette action.\");\n }\n // Si le premier paramètre est une fonction, on l'exécute en tant que callback\n if (typeof param === \"function\") {\n return await param();\n }\n // Sinon, on considère qu'il s'agit d'un constant et on appelle la méthode par défaut\n return await this.callIsConnected(param, data);\n }\n\n /**\n * Valide une image d'entrée.\n * \n * @param {File|Blob|Buffer|ReadableStream} imageInput - L'image à valider.\n * @returns {Promise<File|Buffer|ReadableStream>} - L'image validée.\n * @private\n */\n async _validateImage(imageInput){\n const image = await this._validateUploadInput(imageInput, {\n allowedMimeTypes: [\"image/jpeg\", \"image/png\", \"image/jpg\"],\n expectedType: \"image\"\n });\n return image;\n }\n\n /**\n * Valide un fichier d'entrée.\n * \n * @param {File|Blob|Buffer|ReadableStream} fileInput - Le fichier à valider.\n * @returns {Promise<File|Buffer|ReadableStream>} - Le fichier validé.\n * @private\n */\n async _validateFile(fileInput){\n const file = await this._validateUploadInput(fileInput, {\n allowedMimeTypes: [\"application/pdf\", \"text/plain\", \"text/csv\"],\n expectedType: \"file\"\n });\n return file;\n }\n\n /**\n * Valide les entrées d'upload de fichiers.\n * \n * @param {File|Blob|Buffer|ReadableStream} input - Le fichier à valider.\n * @param {Object} options - Options de validation.\n * @param {Array} options.allowedMimeTypes - Types MIME autorisés.\n * @param {string} options.expectedType - Type de fichier attendu (ex: \"image\", \"file\").\n * @returns {Promise<File|Buffer|ReadableStream>} - Le fichier validé.\n * @throws {ApiValidationError} - Si le type de fichier est invalide.\n * @throws {Error} - Si le type de fichier est inconnu.\n * @private\n */\n async _validateUploadInput(input, { allowedMimeTypes = [], expectedType = \"any\" }) {\n if (!input) {\n throw new ApiValidationError(\"Le fichier est requis.\");\n }\n \n const isNode = typeof window === \"undefined\" && typeof process !== \"undefined\";\n let mimeType = \"\";\n let output = input;\n \n // Navigateur : File\n if (typeof File !== \"undefined\" && input instanceof File) {\n mimeType = input.type;\n if (!allowedMimeTypes.includes(mimeType)) {\n throw new ApiValidationError(\"Le type du fichier est invalide.\");\n }\n }\n \n // Navigateur : Blob\n else if (typeof Blob !== \"undefined\" && input instanceof Blob) {\n mimeType = input.type;\n if (!allowedMimeTypes.includes(mimeType)) {\n throw new ApiValidationError(\"Le type du fichier est invalide.\");\n }\n \n const ext = mimeType.split(\"/\")[1] || \"bin\";\n const fileName = `${Date.now()}.${ext}`;\n output = new File([input], fileName, { type: mimeType });\n }\n \n // Node.js : Buffer\n else if (isNode && Buffer.isBuffer(input)) {\n const fileTypeResult = await fromBuffer(input);\n mimeType = fileTypeResult?.mime;\n \n if (!fileTypeResult || !allowedMimeTypes.includes(mimeType)) {\n throw new ApiValidationError(\"Le type du fichier est invalide.\");\n }\n \n // Pour un fichier image, on transforme en stream\n if (expectedType === \"image\") {\n const ext = fileTypeResult.ext;\n const filename = `${Date.now()}.${ext}`;\n output = await this._createReadStreamFromBuffer(input, filename, mimeType);\n }\n }\n \n // Node.js : ReadableStream\n else if (isNode && input?.readable && typeof input._read === \"function\") {\n const previewChunks = [];\n const tee = await this._passThrough();\n const resultStream = await this._passThrough();\n \n const MAX_BYTES = 4100;\n let bytesRead = 0;\n \n input.on(\"data\", (chunk) => {\n if (bytesRead < MAX_BYTES) {\n previewChunks.push(chunk);\n bytesRead += chunk.length;\n }\n });\n \n input.pipe(tee).pipe(resultStream);\n await new Promise((resolve) => setTimeout(resolve, 10));\n \n const previewBuffer = Buffer.concat(previewChunks);\n const fileTypeResult = await fromBuffer(previewBuffer);\n mimeType = fileTypeResult?.mime;\n \n if (!fileTypeResult || !allowedMimeTypes.includes(mimeType)) {\n throw new ApiValidationError(\"Le type du fichier est invalide.\");\n }\n \n resultStream.path = `${Date.now()}.${fileTypeResult.ext}`;\n resultStream.mimeType = mimeType;\n output = resultStream;\n }\n \n else {\n throw new ApiValidationError(\"Type de fichier non reconnu.\");\n }\n \n return output;\n }\n\n /**\n * Transforme un Buffer en ReadableStream équivalent à fs.createReadStream\n * @param {Buffer} buffer - Le buffer contenant les données binaires\n * @param {string} filename - Nom de fichier (utilisé dans FormData)\n * @param {string} mimeType - Type MIME (utilisé dans FormData)\n * @returns {Object} - { stream, filename, mimeType }\n * @private\n */\n async _createReadStreamFromBuffer(buffer, filename = \"file.bin\", mimeType = \"application/octet-stream\") {\n const stream = await this._bufferToReadable(buffer);\n stream.path = filename; // 👈 hack pour simuler un vrai fichier ReadStream\n stream.mimeType = mimeType;\n return stream;\n }\n\n /**\n * Transforme un Buffer en ReadableStream.\n * \n * @param {Buffer} buffer - Le buffer à transformer.\n * @returns {Promise<stream.Readable>} - Un ReadableStream.\n * @throws {Error} - Si appelé dans le navigateur.\n * @private\n */\n async _bufferToReadable(buffer) {\n if (typeof window === \"undefined\") {\n const { bufferToReadable } = await import(\"../utils/stream-utils.node.js\");\n return bufferToReadable(buffer);\n } else {\n throw new Error(\"bufferToReadable ne doit pas être appelé dans le navigateur\");\n }\n }\n \n /**\n * Crée un PassThrough stream pour le traitement des fichiers.\n * \n * @returns {Promise<stream.PassThrough>} - Un PassThrough stream.\n * @throws {Error} - Si appelé dans le navigateur.\n * @private\n */\n async _passThrough() {\n if (typeof window === \"undefined\") {\n const { createPassThrough } = await import(\"../utils/stream-utils.node.js\");\n return createPassThrough();\n } else {\n throw new Error(\"passThrough ne doit pas être appelé dans le navigateur\");\n }\n }\n\n // async _bufferToReadable(buffer) {\n // if (typeof window === \"undefined\") {\n // const { Readable } = await import(\"stream\");\n // return Readable.from(buffer);\n // } else {\n // throw new Error(\"bufferToReadable ne doit pas être appelé dans le navigateur\");\n // }\n // },\n\n // async _passThrough() {\n // if (typeof window === \"undefined\") {\n // const { PassThrough } = await import(\"stream\");\n // return new PassThrough();\n // } else {\n // throw new Error(\"passThrough ne doit pas être appelé dans le navigateur\");\n // }\n // },\n\n /**\n * Supprime les propriétés d'un objet en fonction d'une liste de clés.\n * \n * @param {Object} obj - L'objet source.\n * @param {Array} propsToRemove - Liste des clés à supprimer\n * @param {boolean} [deep=false] - Si vrai, supprime les propriétés de manière récursive.\n * @returns {Object} - Un nouvel objet sans les propriétés supprimées.\n * @private\n */\n _omitProps(obj, propsToRemove) {\n if (!obj || typeof obj !== \"object\") return {};\n \n const result = { ...obj };\n for (const prop of propsToRemove) {\n delete result[prop];\n }\n return result;\n }\n\n /**\n * Extrait les propriétés d'un objet en fonction d'une liste de clés.\n * \n * @param {Object} obj - L'objet source.\n * @param {Array} keys - Liste des clés à extraire.\n * @param {Object} [transforms={}] - Transformations à appliquer aux valeurs.\n * @returns {Object} - Un nouvel objet contenant les propriétés extraites.\n * @private\n */\n _pickProps(obj, keys, transforms = {}) {\n if (!obj || typeof obj !== \"object\") return {};\n\n const result = {};\n\n for (const key of keys) {\n if (key in obj) {\n const value = obj[key];\n if (typeof transforms[key] === \"function\") {\n result[key] = transforms[key](value, obj); // (valeur, objet source)\n } else {\n result[key] = value;\n }\n }\n }\n\n return result;\n }\n\n /**\n * Vérifie si au moins une clé est présente dans l'objet et n'est pas nulle.\n * \n * @param {Object} obj - L'objet à vérifier.\n * @param {Array} keys - Liste des clés à vérifier.\n * @returns {boolean} - true si au moins une clé est présente et non nulle, sinon false.\n * @private\n */\n _hasAtLeastOne(obj, keys = []) {\n return keys.some((key) => key in obj && obj[key] != null);\n }\n\n /**\n * Crée un proxy filtré pour une liste d'entités.\n * @param {Array} list - Liste d'entités.\n * @returns {Proxy} Proxy filtré.\n * @private\n */\n _createFilteredProxy(list) {\n return new Proxy(list, {\n get(target, prop, receiver) {\n if (typeof prop === \"string\" && !isNaN(prop)) {\n const active = target.filter(n => !n._isDeleted);\n return active[prop];\n }\n if (prop === \"length\") {\n return target.filter(n => !n._isDeleted).length;\n }\n if (typeof target[prop] === \"function\") {\n return (...args) => target.filter(n => !n._isDeleted)[prop](...args);\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n }\n \n /**\n * Génère un nouvel identifiant unique.\n * @returns {string} Un identifiant unique.\n * @private\n */\n _newId() {\n const newId = new ObjectID();\n return newId.toString();\n }\n\n /**\n * ───────────────────────────────\n * DraftStateMixin\n * ───────────────────────────────\n */\n\n /**\n * Crée un proxy combinant draft + serveur, avec transformations facultatives.\n * @param {Object} server\n * @param {Object} draft\n * @param {Array} allowedFields - champs autorisés dans le draft\n * @param {Object} [transforms={}] - transformateurs de lecture\n * @param {Object} [options={}] - options\n * @returns {Proxy}\n * @private\n */\n _createDraftProxy(apiClient, server = {}, draft = {}, allowedFields = [], transforms = {}, options = {}) {\n return new Proxy({}, {\n get: (_, prop) => {\n // Ne pas tenter d’accéder à des propriétés système\n if (typeof prop !== \"string\" && typeof prop !== \"symbol\") return undefined;\n\n // Lecture explicite — déclenche signal si draft est réactif\n if (prop in draft) {\n const value = draft[prop];\n const transformer = transforms[prop];\n return typeof transformer === \"function\" ? transformer(value) : value;\n }\n\n // Fallback vers serverData — aussi potentiellement réactif\n if (server && typeof server === \"object\" && prop in server) {\n const value = server[prop];\n const transformer = transforms[prop];\n return typeof transformer === \"function\" ? transformer(value) : value;\n }\n\n return undefined;\n },\n\n set: (_, prop, value) => {\n if (!allowedFields.includes(prop)) {\n const message = `[DraftProxy] Le champ \"${prop}\" n'est pas autorisé.`;\n if (options.throwOnError) {\n throw new ApiValidationError(message, 400, null, {\n field: prop,\n value,\n allowedFields\n });\n }\n apiClient._logger.warn(message);\n return false;\n }\n const current = draft[prop];\n\n if (current && typeof current === \"object\" && current.__isSignal === true) {\n current.value = value; // ✅ met à jour le signal\n } else {\n draft[prop] = value; // fallback classique\n }\n return true;\n },\n\n deleteProperty: (_, prop) => {\n if (!allowedFields.includes(prop)) return false;\n delete draft[prop];\n return true;\n },\n\n has: (_, prop) => prop in draft || prop in server,\n\n ownKeys: () => [...new Set([\n ...Object.keys(server || {}),\n ...Object.keys(draft || {})\n ])],\n\n getOwnPropertyDescriptor: () => ({\n enumerable: true,\n configurable: true\n })\n });\n }\n\n /**\n * Extrait les champs modifiables d'un schéma JSON.\n * \n * @param {Object} schema - Le schéma JSON à analyser.\n * @param {Object} data - Les données à comparer.\n * @param {Object} ctx - Contexte d'extraction (pour la récursion).\n * @param {Object} ctx.defs - Définitions de schéma.\n * @param {Set} ctx.visited - Ensemble des schémas déjà visités.\n * @returns {Array} - Liste des champs modifiables.\n * @private\n */\n _extractWritableFields(schema = {}, data = {}, ctx = { defs: {}, visited: new Set() }) {\n if (!schema || typeof schema !== \"object\") return [];\n if (schema.$id && ctx.visited.has(schema.$id)) return [];\n if (schema.$id) ctx.visited.add(schema.$id);\n ctx.defs = schema.$defs || schema.definitions || ctx.defs;\n\n const fields = [];\n\n if (schema.$ref) {\n const refKey = schema.$ref.replace(/^#\\/?(\\$defs|definitions)\\//, \"\");\n const resolved = ctx.defs?.[refKey];\n if (resolved) fields.push(...this._extractWritableFields(resolved, data, ctx));\n }\n\n if (schema.allOf) {\n schema.allOf.forEach(s => fields.push(...this._extractWritableFields(s, data, ctx)));\n }\n\n if (schema.if && schema.then) {\n const condition = schema.if?.properties;\n let matches = true;\n if (condition) {\n for (const key in condition) {\n const expected = condition[key]?.const;\n if (data[key] !== expected) {\n matches = false;\n break;\n }\n }\n }\n if (matches && schema.then) {\n fields.push(...this._extractWritableFields(schema.then, data, ctx));\n } else if (!matches && schema.else) {\n fields.push(...this._extractWritableFields(schema.else, data, ctx));\n }\n }\n\n if (schema.properties) {\n fields.push(...Object.entries(schema.properties)\n // eslint-disable-next-line no-unused-vars\n .filter(([_, def]) => def.readOnly !== true && def.const === undefined)\n .map(([key]) => key));\n }\n\n return [...new Set(fields)];\n }\n\n /**\n * Construit un brouillon et un proxy à partir des données et du schéma.\n * \n * @param {Object} options - Options de construction.\n * @param {Object} options.data - Données à utiliser pour le brouillon.\n * @param {Object} [options.serverData=null] - Données du serveur.\n * @param {string|Array} options.constant - Nom de la constante ou tableau de constantes.\n * @param {ApiClient} options.apiClient - Instance de l'API.\n * @param {Object} [options.transforms={}] - Transformations à appliquer.\n * @param {boolean} [options.throwOnError=true] - Si vrai, lève une erreur en cas de problème.\n * @param {Array} [options.removeFields=[]] - Liste des champs à ignorer.\n * @returns {Object} - Objet contenant le brouillon et le proxy.\n * @private\n */\n _buildDraftAndProxy({ data = {}, serverData = null, previousDraft = null, constant, apiClient, transforms = {}, throwOnError = true, removeFields = [] }) {\n const constants = Array.isArray(constant) ? constant : [constant];\n const combinedSchema = {\n allOf: [],\n $defs: {}\n };\n \n for (const key of constants) {\n const sch = apiClient.getRequestSchema(key);\n if (!sch) throw new ApiError(`Unable to find schema for ${key}.`);\n \n // Extraire et fusionner les $defs\n if (sch.$defs) {\n for (const [defKey, defVal] of Object.entries(sch.$defs)) {\n if (combinedSchema.$defs[defKey]) {\n apiClient._logger.warn(`Duplicate $defs key '${defKey}' from schema '${key}'`);\n } else {\n combinedSchema.$defs[defKey] = defVal;\n }\n }\n }\n \n combinedSchema.allOf.push(sch);\n }\n\n let allowed = this._extractWritableFields(combinedSchema, data);\n\n if (data.id && allowed.indexOf(\"id\") === -1) {\n allowed.push(\"id\");\n }\n if (data.slug && allowed.indexOf(\"slug\") === -1) { \n allowed.push(\"slug\");\n }\n\n allowed = allowed.filter(k => !removeFields.includes(k));\n\n // Transformation des champs autorisés\n const rawDraft = Object.fromEntries(\n allowed.map((key) => {\n const raw = data[key];\n const transformed = typeof transforms[key] === \"function\"\n ? transforms[key](raw, data)\n : raw;\n return [key, transformed];\n // eslint-disable-next-line no-unused-vars\n }).filter(([_, v]) => v !== undefined)\n );\n\n const initial = structuredClone ? structuredClone(rawDraft) : JSON.parse(JSON.stringify(rawDraft));\n\n const draft = isReactive(previousDraft)\n ? Object.assign(previousDraft, rawDraft)\n : reactive(rawDraft);\n\n // Assure que serverData est réactif si c'est un objet\n const reactiveServer = isReactive(serverData)\n ? serverData\n : (serverData && typeof serverData === \"object\" ? reactive(serverData) : serverData);\n\n const proxy = this._createDraftProxy(apiClient, reactiveServer, draft, allowed, transforms, { throwOnError });\n\n return { draft, proxy, initial};\n }\n\n /**\n * Extrait les champs modifiés du schéma.\n * \n * @param {ApiClient} apiClient - Instance de l'API.\n * @param {string} constant - Nom de la constante.\n * @param {Object} data - Données à comparer.\n * @param {Function} getInitialDraft - Fonction pour obtenir le brouillon initial.\n * @param {Array} removeFields - Liste des champs à ignorer.\n * @returns {Object|null} - Champs modifiés ou null.\n * @private\n */\n _extractChangedFieldsFromSchema(apiClient, constant, data = {}, getInitialDraft, removeFields = []) {\n const schema = apiClient.getRequestSchema(constant);\n let allowed = this._extractWritableFields(schema, data);\n const changed = {};\n const initialDraft = getInitialDraft?.() || {};\n \n // on enlève les champs qui ne sont pas dans le draft\n // ou qui sont dans removeFields\n allowed = allowed.filter(k => !removeFields.includes(k));\n\n for (const key of allowed) {\n // on verifie que le champ existe dans le draft\n // sinon on ne le prend pas en compte\n\n if (data[key] === undefined) continue;\n \n const current = data[key];\n const initial = initialDraft[key];\n \n const changedValue =\n JSON.stringify(current) !== JSON.stringify(initial);\n \n if (changedValue) {\n changed[key] = current;\n }\n }\n \n return Object.keys(changed).length > 0 ? changed : null;\n }\n\n /**\n * Extrait tous les champs valides selon le schéma, et retourne uniquement ceux qui ont changé par rapport au draft initial.\n * Contrairement à `_extractChangedFieldsFromSchema`, cette méthode retourne l'ensemble des champs valides (`updated`)\n * uniquement s'il y a au moins un champ modifié (`changed`).\n *\n * ⚠️ Les champs sont filtrés en fonction :\n * - des champs définis comme modifiables dans le schéma (`writeable`)\n * - des champs non exclus dans `removeFields`\n * - des champs définis dans `data` (les `undefined` sont ignorés)\n *\n * @param {ApiClient} apiClient - L’instance de client API contenant les schémas.\n * @param {string} constant - Le nom de la constante de schéma (ex: \"ADD_EVENT\").\n * @param {Object} data - Les nouvelles données à comparer avec le draft initial.\n * @param {() => Object} getInitialDraft - Fonction qui retourne le draft initial (souvent `this.initialDraftData`).\n * @param {string[]} [removeFields=[]] - Champs à ignorer même s’ils sont valides.\n * @returns {Object|null} - Un objet `updated` avec les champs valides si au moins un champ a changé, sinon `null`.\n * @private\n */\n _extractAllValidFieldsFromSchema(apiClient, constant, data = {}, getInitialDraft, removeFields = []) {\n const schema = apiClient.getRequestSchema(constant);\n let allowed = this._extractWritableFields(schema, data);\n const changed = {};\n const updated = {};\n const initialDraft = getInitialDraft?.() || {};\n \n // on enlève les champs qui ne sont pas dans le draft\n // ou qui sont dans removeFields\n allowed = allowed.filter(k => !removeFields.includes(k));\n\n for (const key of allowed) {\n // on verifie que le champ existe dans le draft\n // sinon on ne le prend pas en compte\n\n if (data[key] === undefined) continue;\n \n const current = data[key];\n const initial = initialDraft[key];\n \n const changedValue =\n JSON.stringify(current) !== JSON.stringify(initial);\n \n if (changedValue) {\n changed[key] = current;\n }\n\n updated[key] = current;\n }\n \n return Object.keys(changed).length > 0 ? updated : null;\n }\n\n /**\n * ───────────────────────────────\n * MutualEntityMixin\n * ───────────────────────────────\n */\n\n /**\n * Résout l'identifiant de l'entité si seul le slug est fourni.\n * @param {string} type - Le type d'entité (ex : \"citoyens\", \"organizations\", \"projects\").\n * @returns {Promise<string>} L'identifiant résolu.\n * @private\n */\n async _resolveId(type) {\n if (!this.id && this.slug) {\n try {\n const data = await this.endpointApi.getElementsKey({\n pathParams:{\n slug: this.slug\n }\n });\n if(data?.contextId && data?.contextType === type) {\n this._id(data.contextId);\n } else {\n throw new ApiResponseError(`Le slug ${this.slug} ne correspond pas à un ${type}`, 200, data);\n }\n } catch (error) {\n if(error instanceof ApiResponseError) {\n if(error?.responseData?.contextType !== type) {\n throw error;\n } else {\n throw new ApiResponseError(`Impossible de récupérer l'identifiant pour le slug ${this.slug}`, error.status, error.responseData);\n }\n } else {\n throw error;\n }\n }\n }\n return this.id;\n }\n \n /**\n * Récupère le profil public de l'entité.\n * \n * @returns {Promise<Object>} - Les données du profil public.\n * @private\n */\n async _getPublicProfile() {\n await this._resolveId(this.getEntityType());\n return this.endpointApi.getElementsAbout({ pathParams: { id: this.id, type: this.getEntityType() } });\n }\n\n /**\n * Récupère la classe d'entité et ses dépendances à partir du type d'entité.\n * \n * @param {string} entityType - Le type d'entité.\n * @return {{ entityClass: Function, deps: Object } | null}\n * @private\n */\n _getEntityMeta(entityType) {\n const selfClass = this.constructor;\n const selfTag = this.__entityTag;\n \n const commonDeps = {\n EndpointApi: this.deps.EndpointApi,\n User: selfTag === \"User\" ? selfClass : this.deps.User,\n Organization: selfTag === \"Organization\" ? selfClass : this.deps.Organization,\n Project: selfTag === \"Project\" ? selfClass : this.deps.Project,\n Event: selfTag === \"Event\" ? selfClass : this.deps.Event,\n Poi: selfTag === \"Poi\" ? selfClass : this.deps.Poi,\n Badge: selfTag === \"Badge\" ? selfClass : this.deps.Badge,\n News: selfTag === \"News\" ? selfClass : this.deps.News\n };\n \n const map = {\n citoyens: { entityClass: commonDeps.User, deps: commonDeps },\n organizations:{ entityClass: commonDeps.Organization, deps: commonDeps },\n projects: { entityClass: commonDeps.Project, deps: commonDeps },\n events: { entityClass: commonDeps.Event, deps: { ...commonDeps, Badge: undefined } },\n poi: { entityClass: commonDeps.Poi, deps: { ...commonDeps, Badge: undefined, News: undefined } },\n news: { entityClass: commonDeps.News, deps: { ...commonDeps } },\n badges: { entityClass: commonDeps.Badge, deps: { \n EndpointApi: commonDeps.EndpointApi, \n User: commonDeps.User, \n Organization: commonDeps.Organization, \n Project: commonDeps.Project \n } }\n };\n \n return map[entityType] || null;\n }\n\n /**\n * Lier des données d'entité à une instance d'entité.\n * \n * @param {string} entityType - Le type d'entité (ex : \"citoyens\", \"organisations\", \"projets\").\n * @param {Object} entityData - Les données de l'entité à lier.\n * @return {Object} L'entité liée.\n * @private\n */\n _linkEntity(entityType, entityData) {\n const meta = this._getEntityMeta(entityType);\n if (!meta) return entityData;\n return meta.entityClass.fromServerData(entityData, this, meta.deps);\n }\n\n /**\n * Récupère et lie une entité à partir de son ID.\n * \n * @param {string} entityType - Le type d'entité.\n * @param {string} entityId - L'identifiant de l'entité.\n * @param {Object} [options] - Options supplémentaires :\n * @param {boolean} [options.skipGet] - Si true, ne pas appeler `get()` sur l'entité.\n * @return {Promise<Object|null>} L'entité liée ou null.\n * @private\n */\n async _linkEntityById(entityType, entityId, options = {}) {\n const meta = this._getEntityMeta(entityType);\n if (!meta) return null;\n const entity = new meta.entityClass(this, { id: entityId }, meta.deps);\n if(options?.skipGet) return entity;\n await entity.get();\n return entity;\n }\n\n /**\n * Lie une liste d'entités à partir de leurs données.\n * \n * @param {Array<Object>} results - Liste de données d'entités.\n * @return {Array<Object>} Liste d'entités liées.\n * @private\n */\n _linkEntities(results) {\n return results.flatMap(d => {\n if (!d?.collection) {\n this.apiClient._logger?.warn?.(`Objet ignoré car sans 'collection' : ${d?.id}`);\n return []; // exclu de la liste\n }\n\n return [this._linkEntity?.(d.collection, d) ?? d];\n });\n }\n\n /**\n * Lie des entités présentes dans `this.serverData` à partir de leurs IDs,\n * en les filtrant dynamiquement et en optionnellement les transformant.\n *\n * @param {string} entityType - Le type d'entité (ex : \"badges\", \"citoyens\", etc.).\n * @param {Object} filters - Clés/valeurs de filtres dynamiques. Les valeurs peuvent être :\n * - un littéral (comparaison stricte ou intelligente selon le type),\n * - une chaîne (utilise `includes` insensible à la casse),\n * - une RegExp (appliquée si la valeur est une chaîne),\n * - une fonction `(value) => boolean`.\n * @param {Object} [options] - Options supplémentaires :\n * @param {string} [options.key] - Le champ de `this.serverData` à utiliser (par défaut = entityType).\n * @param {Function} [options.mapFn] - Fonction de transformation `(entity) => any` appliquée au résultat.\n *\n * @return {Promise<Array<Object>>} Liste des entités liées, filtrées et éventuellement transformées.\n *\n * @example\n * // Tous les badges avec `name` contenant \"codev\"\n * const badges = await this.linkEntitiesFromServerData(\"badges\", { name: \"codev\" });\n *\n * @example\n * // Badges non expirés et visibles\n * const badges = await this.linkEntitiesFromServerData(\"badges\", {\n * expiredOn: false,\n * show: \"true\"\n * });\n *\n * @example\n * // Badges émis après 2023\n * const badges = await this.linkEntitiesFromServerData(\"badges\", {\n * issuedOn: (v) => new Date(v) >= new Date(\"2023-01-01\")\n * });\n *\n * @example\n * // Extraire uniquement les noms des badges\n * const namesOnly = await this.linkEntitiesFromServerData(\"badges\", {}, {\n * mapFn: (badge) => badge.meta.name\n * });\n */\n async linkEntitiesFromServerData(entityType, filters = {}, options = {}) {\n const key = options.key || entityType;\n const mapFn = typeof options.mapFn === \"function\" ? options.mapFn : null;\n\n const isTruthy = (v) => v === true || v === \"true\";\n const isFalsy = (v) => v === false || v === \"false\";\n\n const data = this.serverData?.[key];\n const result = [];\n\n if (data && typeof data === \"object\" && Object.keys(data).length > 0) {\n for (const id of Object.keys(data)) {\n const meta = data[id];\n\n const matches = Object.entries(filters).every(([key, expected]) => {\n const actual = meta[key];\n\n if (typeof expected === \"function\") {\n try {\n return expected(actual);\n } catch (err) {\n console.warn(`Erreur dans le filtre personnalisé pour ${key}`, err);\n return false;\n }\n }\n\n if (expected instanceof RegExp) {\n return typeof actual === \"string\" && expected.test(actual);\n }\n\n if (typeof expected === \"string\" && typeof actual === \"string\") {\n return actual.toLowerCase().includes(expected.toLowerCase());\n }\n\n if (isTruthy(expected)) return isTruthy(actual);\n if (isFalsy(expected)) return isFalsy(actual);\n\n if (\n typeof actual === \"string\" &&\n typeof expected === \"string\" &&\n !isNaN(Date.parse(actual)) &&\n !isNaN(Date.parse(expected))\n ) {\n return new Date(actual).getTime() === new Date(expected).getTime();\n }\n\n return actual === expected;\n });\n\n if (!matches) continue;\n\n try {\n const entity = await this._linkEntityById(entityType, id);\n if (entity) {\n entity.meta = meta;\n result.push(mapFn ? mapFn(entity) : entity);\n }\n } catch (error) {\n this._logger?.error?.(`Erreur lors de la récupération de l'entité ${entityType} (${id}) :`, error);\n }\n }\n }\n return result;\n }\n\n /**\n * Crée une instance d'entité à partir des données fournies.\n * @param {string} entityType - Le type d'entité (ex : \"citoyens\", \"organisations\", \"projets\").\n * @param {Object} entityData - Les données de l'entité.\n * @return {Object} L'entité créée.\n * @private\n */\n _entityInstanceData(entityType, entityData) {\n const meta = this._getEntityMeta(entityType);\n const selfKey = this.__entityTag; // ex: \"User\", \"Organization\", etc.\n const selfClass = this.constructor;\n\n // pour citoyens la signature est différentes\n return new meta.entityClass(this, entityData, {\n [selfKey]: selfClass,\n ...meta.deps\n });\n }\n\n /**\n * Crée une instance d'entité, et déclenche get() si certaines propriétés sont présentes.\n * @param {string} entityType\n * @param {Object} entityData\n * @return {Promise<Object>}\n */\n async entity(entityType, entityData = {}) {\n try {\n const entity = this._entityInstanceData(entityType, entityData);\n\n const fetchKeysByEntity = {\n citoyens: [\"id\", \"slug\"],\n organizations: [\"id\", \"slug\"],\n projects: [\"id\", \"slug\"],\n events: [\"id\", \"slug\"],\n poi: [\"id\", \"slug\"],\n news: [\"id\"],\n badges: [\"id\"],\n };\n\n const fetchKeys = fetchKeysByEntity[entityType];\n\n if (fetchKeys && this._hasAtLeastOne(entityData, fetchKeys)) {\n await entity.get();\n }\n\n return entity;\n } catch (error) {\n this.apiClient._logger.error(`[Api.${this.__entityTag}.${entityType}] Erreur lors de la création d'une instance ${entityType} :`, error.message);\n throw error;\n }\n }\n\n /**\n * Récupère et lie une entité à partir de son slug.\n * @param {string} slug - Le slug de l'entité.\n * @return {Promise<Object|null>} L'entité liée ou null.\n */\n async entityBySlug(slug) {\n if (!slug) {\n throw new ApiError(\"Le slug est requis.\");\n }\n try {\n const data = await this.endpointApi.getElementsKey({\n pathParams:{\n slug: slug\n }\n });\n if(data?.contextId && data?.contextType) {\n const entity = await this.entity(data.contextType, { id: data.contextId });\n return entity;\n } else {\n throw new ApiResponseError(`Le slug ${slug} n'est pas valide`, 200, data);\n }\n } catch (error) {\n if(error instanceof ApiResponseError) {\n throw new ApiResponseError(`Impossible de récupérer l'identifiant pour le slug ${slug}`, error.status, error.responseData);\n } else {\n throw error;\n }\n }\n }\n\n\n /**\n * Construit dynamiquement des filtres sur un lien entre entités\n *\n * @param {string} id - L'ID de l'entité cible.\n * @param {Object} options - Options de filtrage.\n * @param {\"memberOf\" | \"projects\"} [options.linkType] - Le type de lien (ex: \"memberOf\", \"projects\", etc.).\n * @param {boolean} [options.isAdmin] - Si défini, filtre selon l'existence de isAdmin.\n * @param {boolean} [options.isAdminPending] - Si défini, filtre selon l'existence de isAdminPending.\n * @param {boolean} [options.isInviting] - Si défini, filtre selon l'existence de isInviting.\n * @param {boolean} [options.toBeValidated] - Si défini, filtre selon l'existence de toBeValidated.\n * @param {Array<string>} [options.roles] - Rôles à filtrer.\n * @returns {Object} - Un objet de filtres à passer à une requête.\n * @throws {TypeError} - Si les types des paramètres ne sont pas valides.\n * @private\n */\n _buildLinkFilters(id, {\n linkType,\n isAdmin,\n isAdminPending,\n isInviting,\n toBeValidated = false,\n roles = []\n } = {}) {\n if (typeof id !== \"string\") throw new TypeError(\"id doit être une chaîne.\");\n if (typeof linkType !== \"string\") throw new TypeError(\"linkType doit être une chaîne.\");\n if (typeof isAdmin !== \"undefined\" && typeof isAdmin !== \"boolean\") {\n throw new TypeError(\"isAdmin doit être un booléen.\");\n }\n if (typeof isAdminPending !== \"undefined\" && typeof isAdminPending !== \"boolean\") {\n throw new TypeError(\"isAdminPending doit être un booléen.\");\n }\n if (typeof isInviting !== \"undefined\" && typeof isInviting !== \"boolean\") {\n throw new TypeError(\"isInviting doit être un booléen.\");\n }\n if (typeof toBeValidated !== \"undefined\" && typeof toBeValidated !== \"boolean\") {\n throw new TypeError(\"toBeValidated doit être un booléen.\");\n }\n if (!Array.isArray(roles)) {\n throw new TypeError(\"roles doit être un tableau de chaînes.\");\n }\n\n const path = `links.${linkType}.${id}`;\n const filters = {\n [`${path}`]: { $exists: true }\n };\n\n if (typeof toBeValidated === \"boolean\") {\n filters[`${path}.toBeValidated`] = { $exists: toBeValidated };\n }\n\n if (typeof isInviting === \"boolean\") {\n filters[`${path}.isInviting`] = { $exists: isInviting };\n }\n\n if (isAdmin === true) {\n filters[`${path}.isAdmin`] = { $exists: true };\n }\n\n if(isAdminPending === true) {\n filters[`${path}.isAdminPending`] = { $exists: true };\n }\n\n if (roles.length > 0) {\n filters[`${path}.roles`] = { $in: roles };\n }\n\n return filters;\n }\n\n /**\n * Retourne les métadonnées de lien pour une entité :\n * - `linkType` : clé dans `serverData.links`\n * - `connectTypeConnect` : valeur envoyée pour `connect()`\n * - `connectTypeDisconnect` : valeur envoyée pour `disconnect()`\n * @typedef {Object} LinkMeta\n * @property {string} linkType\n * @property {string} connectTypeConnect\n * @property {string} connectTypeDisconnect\n * @returns {LinkMeta}\n * @throws {ApiError} - Si le type d'entité est inconnu.\n * @private\n */\n _getLinkMeta() {\n const map = {\n organizations: {\n linkType: \"memberOf\",\n connectTypeConnect: \"member\",\n connectTypeDisconnect: \"members\"\n },\n projects: {\n linkType: \"projects\",\n connectTypeConnect: \"contributor\",\n connectTypeDisconnect: \"contributors\"\n },\n events: {\n linkType: \"events\",\n connectTypeConnect: \"attendee\",\n connectTypeDisconnect: \"attendees\"\n },\n citoyens: {\n linkType: \"friends\",\n connectTypeConnect: \"friend\",\n connectTypeDisconnect: \"friends\"\n }\n };\n\n const entityType = this.getEntityType();\n const meta = map[entityType];\n\n if (!meta) {\n throw new ApiError(`Aucune correspondance de lien définie pour le type d'entité \"${entityType}\"`);\n }\n\n return meta;\n }\n\n /**\n * Vérifie si l'entité prend en charge les opérations de lien (`connect`, `disconnect`, etc.).\n * Utilise `_getLinkMeta()` comme source unique de vérité.\n *\n * @throws {ApiError} - Si l'entité ne supporte pas les liens.\n * @private\n */\n _checkLinkableEntity() {\n try {\n this._getLinkMeta(); // si l'entité n'est pas supportée, ça throw déjà\n } catch (error) {\n if (error instanceof ApiError) {\n throw new ApiError(`L'entité \"${this.getEntityType()}\" ne prend pas en charge les actions de lien.`);\n }\n throw error;\n }\n }\n\n /**\n * Retourne le lien de l'utilisateur connecté avec l'entité cible (dans `parent.serverData.links`)\n * @private\n */\n _getLinkFromConnectedUser() {\n const { linkType } = this._getLinkMeta();\n return this?.userContext?.serverData?.links?.[linkType]?.[this.id] || null;\n }\n\n /**\n * Soumet une demande de connexion à une entité (ex : membre, contributeur),\n * ou valide l'invitation si elle existe déjà.\n *\n * @returns {Promise<Object>} - Résultat de l'API\n * @throws {ApiError} - En cas d'erreur de connexion ou d'invitation.\n * @private\n */\n async _submitLinkRequest() {\n\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const { connectTypeConnect } = this._getLinkMeta();\n\n const userLink = this._getLinkFromConnectedUser();\n\n // Cas : aucun lien → on demande à se connecter\n if (!userLink) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n connectType: connectTypeConnect\n };\n\n // TODO : reflechir au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n const retour = await this.callIsMe(() => this.endpointApi.connect(data));\n await this.userContext.refresh();\n return retour;\n }\n\n // Cas : invitation reçue → on valide l'invitation\n if (userLink.isInviting) {\n return this._acceptLinkRequest();\n }\n\n // Cas : déjà en attente\n if (userLink.toBeValidated) {\n throw new ApiError(\"Vous êtes déjà en attente de validation.\");\n }\n\n // Cas par défaut : rien à faire\n throw new ApiError(\"Vous êtes déjà connecté à cette entité.\");\n }\n\n /**\n * Soumet une demande pour devenir administrateur d'une entité.\n *\n * @returns {Promise<Object>}\n * @throws {ApiError}\n * @private\n */\n async _submitLinkRequestAdmin() {\n\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const userLink = this._getLinkFromConnectedUser();\n\n // Aucun lien existant → envoie une demande avec rôle \"admin\"\n if (!userLink) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n connectType: \"admin\"\n };\n\n // TODO : reflechir au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n const retour = await this.callIsMe(() => this.endpointApi.connect(data));\n await this.userContext.refresh();\n return retour;\n }\n\n // Invitation reçue → accepte automatiquement\n if (userLink.isInviting) {\n return this._acceptLinkRequest();\n }\n\n // Déjà en attente pour admin\n if (userLink.toBeValidated && userLink.isAdminPending) {\n throw new ApiError(\"Vous êtes déjà en attente de validation pour devenir admin.\");\n }\n\n // Déjà en attente pour un autre rôle\n if (userLink.toBeValidated) {\n throw new ApiError(\"Vous êtes déjà en attente de validation pour rejoindre cette entité.\");\n }\n\n // Déjà connecté\n throw new ApiError(\"Vous êtes déjà connecté à cette entité.\");\n }\n\n /**\n * Accepte une demande de lien (ex : invitation à rejoindre un groupe).\n * \n * @returns {Promise<Object>} - Résultat de l'API\n * @throws {ApiError} - En cas d'erreur de connexion ou d'invitation.\n * @private\n */\n async _acceptLinkRequest() {\n\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const userLink = this._getLinkFromConnectedUser();\n\n if (userLink.isInviting) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n linkOption: \"isInviting\"\n };\n // TODO : reflechir au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n const retour = await this.callIsMe(() => this.endpointApi.linkValidate(data));\n await this.userContext.refresh();\n return retour;\n }\n\n throw new ApiError(\"Vous n'avez pas d'invitation à valider.\");\n }\n\n /**\n * Annule une demande de lien ou se déconnecte d'une entité.\n * \n * @returns {Promise<Object>} - Résultat de l'API\n * @throws {ApiError} - En cas d'erreur de connexion ou d'invitation.\n * @private\n */\n async _leaveLinkRequest() {\n\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const { connectTypeDisconnect } = this._getLinkMeta();\n\n const userLink = this._getLinkFromConnectedUser();\n\n if (!userLink) {\n throw new ApiError(\"Vous n'êtes pas connecté à cette entité.\");\n }\n\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n // Normalement en auto dans le schema mais je le met quand même\n connectType: connectTypeDisconnect\n };\n \n // TODO : reflechir au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n const retour = await this.callIsMe(() => this.endpointApi.disconnect(data));\n await this.userContext.refresh();\n return retour;\n }\n\n /**\n * ───────────────────────────────\n * EntityMixin\n * ───────────────────────────────\n */\n\n /**\n * Récupérer le profil public de l'entité\n * \n * @returns {Promise<Object>} - Les données de réponse.\n */\n async get() {\n return this.apiClient.safeCall(async () => {\n const data = await this._getPublicProfile();\n this._setData(data, { forceInitialDraftReset: true });\n return data;\n });\n }\n \n /**\n * Mettre à jour les paramètres d'un élément : Mise à jour des paramètres spécifiques d'un élément.\n * Constant : UPDATE_SETTINGS\n * @param {Object} data - Les données à envoyer.\n * @param {string} data.type - data.type\n * @param {undefined} data.value - data.value\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateSettings(data = {}) {\n data.idEntity = this.id;\n data.typeEntity = this.getEntityType();\n return this.callIsConnected(() => this.endpointApi.updateSettings(data));\n }\n \n /**\n * Mettre à jour la description d'un élément : Permet de mettre à jour la description courte et complète d'un élément.\n * Constant : UPDATE_BLOCK_DESCRIPTION\n * @param {Object} data - Les données à envoyer.\n * @param {string} data.descMentions - Mentions dans la description (default: \"\")\n * @param {string} data.shortDescription - Courte description\n * @param {string} data.description - Description complète\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateDescription(data = {}) {\n data.typeElement = this.getEntityType();\n data.id = this.id;\n return this.callIsConnected(() => this.endpointApi.updateBlockDescription(data));\n }\n \n /**\n * Mettre à jour les informations d'un élément : Permet de mettre à jour les informations générales d'un élément (nom, contacts, etc.).\n * Constant : UPDATE_BLOCK_INFO\n */\n async updateInfo(data = {}) {\n data.typeElement = this.getEntityType();\n data.id = this.id;\n return this.callIsConnected(() => this.endpointApi.updateBlockInfo(data));\n }\n \n /**\n * Mettre à jour les réseaux sociaux d'un élément : Permet de mettre à jour les liens vers les réseaux sociaux d'un élément.\n * Constant : UPDATE_BLOCK_SOCIAL\n */\n async updateSocial(data = {}) {\n data.typeElement = this.getEntityType();\n data.id = this.id;\n return this.callIsConnected(() => this.endpointApi.updateBlockSocial(data));\n }\n \n /**\n * Mettre à jour les localités d'un élément : Permet de mettre à jour l'adresse et les informations géographiques d'un élément.\n * Constant : UPDATE_BLOCK_LOCALITY\n */\n async updateLocality(data = {}) {\n data.typeElement = this.getEntityType();\n data.id = this.id;\n return this.callIsConnected(() => this.endpointApi.updateBlockLocality(data));\n }\n \n /**\n * Mettre à jour le slug d'un élément : Permet de mettre à jour le slug pour une URL simplifiée.\n * Constant : UPDATE_BLOCK_SLUG\n * @param {Object} data - Les données à envoyer.\n * @param {string} data.slug - Le nouveau slug à appliquer.\n * @returns {Promise<Object>} - Les données de réponse.\n */\n async updateSlug({ slug }) {\n try {\n await this.endpointApi.check({ type: this.getEntityType(), id: this.id, slug });\n } catch (error) {\n if(error instanceof ApiResponseError) {\n throw new ApiResponseError(\"Erreur lors de la vérification du slug.\", error.status, error.data);\n }\n throw error;\n }\n return this.callIsConnected(() => this.endpointApi.updateBlockSlug({ typeElement: this.getEntityType(), id: this.id, slug }));\n }\n \n /**\n * Mettre à jour l'image de profil : Permet de mettre à jour l'image de profil d'un utilisateur ou d'une entité.\n * Constant : PROFIL_IMAGE\n * @param {Object} data - Les données à envoyer.\n * @param {string} data.profil_avatar - L'image de profil à mettre à jour.\n * @returns {Promise<Object>} - Les données de réponse.\n */\n async updateImageProfil({ profil_avatar: image }) {\n image = await this._validateImage(image);\n const data = { pathParams: { folder: this.getEntityType(), ownerId: this.id }, profil_avatar: image };\n return this.callIsConnected(() => this.endpointApi.profilImage(data));\n }\n\n /**\n * Crée une instance d'organisation et récupère son profil si nécessaire.\n *\n * @param {Object} organizationData - Les données nécessaires pour initialiser l'organisation.\n * @returns {Promise<Organization>} Une promesse qui résout l'objet Organisation créé.\n * @throws {Error} Si une erreur se produit lors de la création de l'organisation.\n */\n async organization(organizationData = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour créer une organisation.\");\n }\n return this.entity(\"organizations\", organizationData);\n }\n\n /**\n * Crée une instance de projet et récupère son profil si nécessaire.\n *\n * @param {Object} projectData - Les données nécessaires pour initialiser le projet.\n * @returns {Promise<Project>} Une promesse qui résout l'objet Projet créé.\n * @throws {Error} Si une erreur se produit lors de la création du projet.\n */\n async project(projectData = {}) {\n // TODO: Vérifier si l'utilisateur est admin de l'organisation\n if(!this.isConnected){\n throw new ApiError(\"Vous devez être connecté pour créer un projet.\");\n }\n return this.entity(\"projects\", projectData);\n }\n\n /**\n * Crée une instance de POI et la récupère si nécessaire.\n * \n * @param {Object} poiData - Les données nécessaires pour initialiser le POI.\n * @returns {Promise<Poi>} Une promesse qui résout l'objet POI créé.\n * @throws {Error} Si une erreur se produit lors de la création du POI.\n */\n async poi(poiData = {}) {\n // TODO: Vérifier si l'utilisateur est admin de l'organisation\n if(!this.isConnected){\n throw new ApiError(\"Vous devez être connecté pour créer un POI.\");\n }\n return this.entity(\"poi\", poiData);\n }\n\n /**\n * Crée une instance d'événement et la récupère si nécessaire.\n * \n * @param {Object} eventData - Les données nécessaires pour initialiser l'événement.\n * @returns {Promise<Event>} Une promesse qui résout l'objet Événement créé.\n * @throws {Error} Si une erreur se produit lors de la création de l'événement.\n */\n async event(eventData = {}) {\n // TODO: Vérifier si l'utilisateur est admin de l'organisation\n if(!this.isConnected){\n throw new ApiError(\"Vous devez être connecté pour créer un événement.\");\n }\n return this.entity(\"events\", eventData);\n }\n\n /**\n * Crée une instance de badge et la récupère si nécessaire.\n * \n * @param {Object} badgeData - Les données nécessaires pour initialiser le badge.\n * @returns {Promise<Badge>} Une promesse qui résout l'objet Badge créé.\n * @throws {Error} Si une erreur se produit lors de la création du badge.\n */\n async badge(badgeData = {}) {\n // TODO: Vérifier si l'utilisateur est admin de l'organisation\n if(!this.isConnected){\n throw new ApiError(\"Vous devez être connecté pour créer un badge.\");\n }\n return this.entity(\"badges\", badgeData);\n }\n\n /**\n * Crée une instance de news et la récupère si nécessaire.\n * \n * @param {Object} newsData - Les données nécessaires pour initialiser la news.\n * @returns {Promise<News>} Une promesse qui résout l'objet News créé.\n * @throws {Error} Si une erreur se produit lors de la création de la news.\n */\n async news(newsData = {}) {\n if(!this.isConnected){\n throw new ApiError(\"Vous devez être connecté.\");\n }\n return this.entity(\"news\", newsData);\n }\n\n /**\n * Récupérer les organisations d'une entitée : la liste des organisations dont l'entité est membre ou admin valide.\n * Constant : GET_ORGANIZATIONS_ADMIN | GET_ORGANIZATIONS_NO_ADMIN\n * @param {Object} data - Les données à envoyer.\n * @param {boolean} isNext - Indique si c'est une recherche suivante (pagination).\n * @returns {Promise<Object>} - Les données de réponse.\n */\n async getOrganizations(data = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_ORGANIZATIONS_NO_ADMIN\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n if(this.isMe){\n finalData.pathParams = { type: this.getEntityType(), id: this.id };\n // NOTE : dans le schema je crois que si pas de finalData.filters alors le default ce fait avec finalData.pathParams\n // finalData.filters = {\n // [`links.members.${this.id}`]: { \"$exists\": true },\n // [`links.members.${this.id}.toBeValidated`]: { \"$exists\": false },\n // [`links.members.${this.id}.isInviting`]: { \"$exists\": false }\n // };\n } else {\n delete finalData?.pathParams;\n finalData.filters = {\n [`links.members.${this.id}`]: { \"$exists\": true },\n [`links.members.${this.id}.toBeValidated`]: { \"$exists\": false },\n [`links.members.${this.id}.isInviting`]: { \"$exists\": false }\n };\n }\n \n const fetchFn = this.isMe\n ? () => this.callIsMe(() => this.endpointApi.getOrganizationsAdmin(finalData))\n : () => this.endpointApi.getOrganizationsNoAdmin(finalData);\n\n return fetchFn();\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupérer les projets d'une entitée : liste des projets de l'entité ou elle est \"parent\" ou \"contributeur\".\n * Constant : GET_PROJECTS_ADMIN | GET_PROJECTS_NO_ADMIN\n * @param {Object} data - Les données à envoyer.\n * @param {boolean} isNext - Indique si c'est une recherche suivante (pagination).\n * @returns {Promise<Object>} - Les données de réponse.\n */\n async getProjects(data = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_PROJECTS_ADMIN\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n if(this.isMe){\n finalData.pathParams = { type: this.getEntityType(), id: this.id };\n // NOTE : dans le schema je crois que si pas de finalData.filters alors le default ce fait avec finalData.pathParams\n // finalData.filters = {\n // \"$or\": {\n // [`links.contributors.${this.id}`]: { \"$exists\": true },\n // [`parent.${this.id}`]: { \"$exists\": true }\n // },\n // [`links.contributors.${this.id}`]: { \"$exists\": true }\n // };\n } else {\n delete finalData?.pathParams;\n finalData.filters = {\n \"$or\": {\n [`links.contributors.${this.id}`]: { \"$exists\": true },\n [`parent.${this.id}`]: { \"$exists\": true }\n },\n [`links.contributors.${this.id}`]: { \"$exists\": true }\n };\n }\n \n const fetchFn = this.isMe\n ? () => this.callIsMe(() => this.endpointApi.getProjectsAdmin(finalData))\n : () => this.endpointApi.getProjectsNoAdmin(finalData);\n\n return fetchFn();\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupérer les POIs d'une entité : liste des POIs de l'entité ou elle est \"parent\".\n * Constant : GET_POIS_NO_ADMIN / GET_POIS_ADMIN\n * @param {Object} data - Les données à envoyer.\n * @param {boolean} isNext - Indique si c'est une recherche suivante (pagination).\n * @returns {Promise<Object>} - Les données de réponse.\n */\n async getPois(data = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_POIS_ADMIN\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n if(this.isMe){\n finalData.pathParams = { type: this.getEntityType(), id: this.id };\n // NOTE : dans le schema je crois que si pas de finalData.filters alors le default ce fait avec finalData.pathParams\n // finalData.filters = {\n // [`parent.${this.id}`]: { \"$exists\": true },\n // };\n } else {\n delete finalData?.pathParams;\n finalData.filters = {\n [`parent.${this.id}`]: { \"$exists\": true },\n };\n }\n \n const fetchFn = this.isMe\n ? () => this.callIsMe(() => this.endpointApi.getPoisAdmin(finalData))\n : () => this.endpointApi.getPoisNoAdmin(finalData);\n\n return fetchFn();\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupérer les abonnés d'une entité\n * Constant : GET_SUBSCRIBERS\n * @param {Object} data - Les données à envoyer.\n * @param {boolean} isNext - Indique si c'est une recherche suivante (pagination).\n * @returns {Promise<Object>} - Les données de réponse.\n */\n async getSubscribers(data = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_SUBSCRIBERS\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n delete finalData?.pathParams;\n\n finalData.filters = {\n [`links.follows.${this.id}`]: { \"$exists\": true },\n [`links.follows.${this.id}.toBeValidated`]: { \"$exists\": false },\n [`links.follows.${this.id}.isInviting`]: { \"$exists\": false }\n };\n\n return this.endpointApi.getSubscribers(finalData);\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Liste des badges créés par l'entité\n * Constant : GET_BADGES\n * @param {Object} data - Les données à envoyer.\n * @param {boolean} isNext - Indique si c'est une recherche suivante (pagination).\n * @returns {Promise<Object>} - Les données de réponse. \n */\n async getBadgesIssuer(data = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_BADGES\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n delete finalData?.pathParams;\n \n finalData.filters = finalData.filters || {};\n finalData.filters[\"$or\"] = {};\n finalData.filters[\"$or\"][`issuer.${this.id}`] = { \"$exists\": true };\n\n return this.endpointApi.getBadges(finalData);\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupérer les actualités : Récupère la liste d’actualités selon plusieurs critères.\n * Constant : GET_NEWS\n * @param {Object} data - Les données à envoyer.\n * @param {number} data.dateLimit - Limite de date timestamp ou 0 (default: 0)\n * @param {object} data.search - data.search\n * @param {string} data.search.name - Nom ou terme recherché (default: \"\")\n * @param {number} data.indexStep - Nombre de résultats par page (default: 12)\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getNews(data = {}) {\n data.pathParams = { type: this.getEntityType(), id: this.id };\n const arrayObjet = await this.endpointApi.getNews(data);\n if(!Array.isArray(arrayObjet)){\n throw new ApiResponseError(\"Erreur lors de la récupération des actualités.\", 500, arrayObjet);\n }\n\n const rawList = this._linkEntities(arrayObjet);\n\n return this._createFilteredProxy(rawList);\n }\n\n /**\n * Récupérer la galerie d'une entité.\n * Constant : GET_GALLERY\n * @param {Object} data - Les données à envoyer.\n * @param {string} data.pathParams.docType - Type de document (default: \"image\")\n * @param {string} data.contentKey - Clé de contenu pour la galerie (default: \"null\")\n * @param {string} data.folderId - ID du dossier pour la galerie (default: \"null\")\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getGallery(data = {}) {\n data.pathParams = { type: this.getEntityType(), id: this.id, docType: data.pathParams?.docType || \"image\" };\n const arrayObjet = await this.endpointApi.getGallery(data);\n\n return arrayObjet;\n }\n\n /**\n * Soumet une demande pour rejoindre l'entité courante (ex. organisation, projet, événement...).\n * Si une invitation est en attente, elle est automatiquement acceptée.\n *\n * @returns {Promise<Object>} - Résultat de la demande ou de la validation.\n * @throws {ApiError} - Si l'entité ne supporte pas l'action ou si une demande est déjà en cours.\n */\n async requestToJoin(){\n if (!this.isMe) {\n throw new ApiError(\"Vous devez être connecté pour envoyer une demande de participation.\");\n }\n this._checkLinkableEntity();\n return this._submitLinkRequest();\n }\n\n /**\n * Soumet une demande pour devenir administrateur de l'entité courante.\n * Si une invitation est en attente, elle est automatiquement validée.\n *\n * @returns {Promise<Object>} - Résultat de la demande ou de la validation.\n * @throws {ApiError} - Si l'entité ne supporte pas l'action ou si une demande est déjà en cours.\n */\n async requestToJoinAdmin(){\n if (!this.isMe) {\n throw new ApiError(\"Vous devez être connecté pour envoyer une demande de participation.\");\n }\n this._checkLinkableEntity();\n return this._submitLinkRequestAdmin();\n }\n\n /**\n * Accepte une invitation à rejoindre l'entité courante.\n * Ne fonctionne que si un lien avec `isInviting` est détecté.\n *\n * @returns {Promise<Object>} - Résultat de l'acceptation de l'invitation.\n * @throws {ApiError} - Si aucune invitation n'est en attente ou si l'entité ne supporte pas cette action.\n */\n async acceptInvitation(){\n if (!this.isMe) {\n throw new ApiError(\"Vous devez être connecté pour envoyer une demande de participation.\");\n }\n this._checkLinkableEntity();\n return this._acceptLinkRequest();\n }\n\n /**\n * Se désengage de l'entité courante : quitte un rôle (membre, contributeur, etc.).\n *\n * @returns {Promise<Object>} - Résultat de la déconnexion.\n * @throws {ApiError} - Si l'entité ne supporte pas l'action ou si l'utilisateur n'est pas lié à cette entité.\n */\n async leave() {\n if (!this.isMe) {\n throw new ApiError(\"Vous devez être connecté pour envoyer une demande de participation.\");\n }\n this._checkLinkableEntity();\n return this._leaveLinkRequest();\n }\n\n /**\n * S'abonne à l'entité courante.\n * \n * @returns {Promise<Object>} - Résultat de l'abonnement.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité n'est pas enregistrée.\n */\n async follow() {\n if (!this.isMe) {\n throw new ApiError(\"Vous devez être connecté pour suivre cette entité.\");\n }\n\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const userLink = this.userContext?.serverData?.links?.[\"follows\"]?.[this.id] || null;\n\n if (!userLink) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id\n };\n const retour = await this.callIsMe(() => this.endpointApi.follow(data));\n // TODO : reflechir au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n await this.userContext.refresh();\n return retour;\n }\n\n throw new ApiError(\"Vous êtes déjà abonné à cette entité.\");\n }\n\n /**\n * Se désabonne de l'entité courante.\n * \n * @returns {Promise<Object>} - Résultat de la désinscription.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité n'est pas enregistrée.\n */\n async unfollow() {\n if (!this.isMe) {\n throw new ApiError(\"Vous devez être connecté pour vous désabonner.\");\n }\n\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const userLink = this.userContext?.serverData?.links?.[\"follows\"]?.[this.id] || null;\n\n if (userLink) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n connectType: \"followers\"\n };\n const retour = await this.callIsMe(() => this.endpointApi.disconnect(data));\n // TODO : reflechir au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n await this.userContext.refresh();\n return retour;\n }\n\n throw new ApiError(\"Vous n'êtes pas abonné à cette entité.\");\n }\n \n\n /**\n * Vérifie si l'utilisateur est connecté et a accès à l'entité.\n * \n * @param {string} action - Action à effectuer.\n * @returns {void}\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité n'est pas enregistrée.\n * @private\n */\n _checkAccess(action = \"effectuer cette action\") {\n if (!this.isMe) {\n throw new ApiError(`Vous devez être connecté pour ${action}`);\n }\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n }\n\n /**\n * Vérifie si l'utilisateur a un lien valide avec l'entité.\n * \n * @param {Object} userLink - Lien de l'utilisateur avec l'entité.\n * @param {boolean} userLink.toBeValidated - Indique si le lien est en attente de validation.\n * @param {boolean} userLink.isInviting - Indique si l'utilisateur a été invité.\n * @returns {boolean} - `true` si le lien est valide, `false` sinon.\n * @private\n */\n _validateUserLink(userLink) {\n if (!userLink) return false;\n const { toBeValidated, isInviting } = userLink;\n return !toBeValidated && !isInviting;\n }\n\n /**\n * Vérifie si l'entité est d'un type spécifique.\n * \n * @param {...string} types - Types d'entité attendus.\n * @throws {ApiError} - Si l'entité n'est pas du type attendu.\n * @private\n */\n _assertEntityType(...types) {\n const expectedTypes = Array.isArray(types[0]) ? types[0] : types;\n if (!expectedTypes.includes(this.getEntityType())) {\n throw new ApiError(`L'entité doit être de type : ${expectedTypes.join(\", \")}, reçu : ${this.getEntityType()}`);\n }\n }\n\n /**\n * Vérifie si l'entité est liée à un type de lien spécifique.\n * \n * @param {string} linkType - Type de lien à vérifier.\n * @returns {boolean} - `true` si l'entité est liée, `false` sinon.\n * @private\n */\n _isLinked(linkType) {\n return !!this.userContext?.serverData?.links?.[linkType]?.[this.id];\n }\n\n /**\n * Vérifie si l'utilisateur est l'auteur de l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur est l'auteur, `false` sinon.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si les données du serveur ne sont pas disponibles.\n */\n isAuthor() {\n this._checkAccess(\"vérifier l'auteur\");\n if (!this.serverData) {\n throw new ApiError(\"Aucune donnée serveur disponible.\");\n }\n return this.userId && this.serverData?.creator === this.userId;\n }\n\n /**\n * Vérifie si l'utilisateur est administrateur de l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur est administrateur, `false` sinon.\n * @throws {ApiError}\n */\n isAdmin() {\n this._checkAccess(\"vérifier l'administrateur.\");\n this._assertEntityType(\"organizations\", \"projects\", \"events\");\n const userLink = this._getLinkFromConnectedUser();\n return this._validateUserLink(userLink) && userLink?.isAdmin === true && !userLink?.isAdminPending;\n }\n\n /**\n * Vérifie si l'utilisateur est soit l'auteur, soit administrateur de l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur est l'auteur ou administrateur, `false` sinon.\n * @throws {ApiError}\n */\n isAuthorOrAdmin() {\n this._checkAccess(\"vérifier l'auteur ou l'administrateur.\");\n return this.isAuthor() || this.isAdmin();\n }\n\n /**\n * Vérifie si l'utilisateur est membre de l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur est membre, `false` sinon.\n * @throws {ApiError}\n */\n isMember() {\n this._checkAccess(\"vérifier le membre.\");\n this._assertEntityType(\"organizations\");\n const userLink = this._getLinkFromConnectedUser();\n return this._validateUserLink(userLink);\n }\n\n /**\n * Vérifie si l'utilisateur est contributeur de l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur est contributeur, `false` sinon.\n * @throws {ApiError}\n */\n isContributor() {\n this._checkAccess(\"vérifier le contributeur.\");\n this._assertEntityType(\"projects\");\n const userLink = this._getLinkFromConnectedUser();\n return this._validateUserLink(userLink);\n }\n\n /**\n * Vérifie si l'utilisateur est participant de l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur est participant, `false` sinon.\n * @throws {ApiError}\n */\n isAttendee() {\n this._checkAccess(\"vérifier si vous êtes un participant.\");\n this._assertEntityType(\"events\");\n const userLink = this._getLinkFromConnectedUser();\n return this._validateUserLink(userLink);\n }\n\n /**\n * Vérifie si l'utilisateur suit l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur suit l'entité, `false` sinon.\n * @throws {ApiError}\n */\n isFollower() {\n this._checkAccess(\"vérifier si il vous suit.\");\n this._assertEntityType(\"citoyens\",\"organizations\", \"projects\", \"events\", \"poi\");\n return this._isLinked(\"followers\");\n }\n\n /**\n * Vérifie si l'utilisateur est abonné à l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur est abonné, `false` sinon.\n * @throws {ApiError}\n */\n isFollowing() {\n this._checkAccess(\"vérifier si vous le suivez.\");\n this._assertEntityType(\"citoyens\",\"organizations\", \"projects\", \"events\", \"poi\");\n return this._isLinked(\"follows\");\n }\n\n /**\n * Récupère le JSON personnalisé de l'entité\n * \n * @returns {Promise<Object>} - Le JSON personnalisé de l'entité.\n * @throws {ApiError} - Si le slug de l'entité n'est pas défini.\n */\n async getCostumJson() {\n if (!this.serverData.slug) {\n throw new ApiError(\"slug de l'entité non défini\");\n }\n const data = {\n pathParams: {\n slug: this.serverData.slug\n }\n };\n return this.endpointApi.getCostumJson(data);\n }\n\n /**\n * Génère des plages d'index pour la pagination.\n * \n * @param {Array<string>} searchType - Types de recherche.\n * @param {number} indexStep - Pas d'index.\n * @param {Object} previousRanges - Plages précédentes.\n * @returns {Object} - Plages d'index générées.\n * @private\n */\n _generateRanges(searchType, indexStep, previousRanges = {}) {\n const ranges = {};\n for (const type of searchType) {\n const previous = previousRanges[type] || { indexMax: 0 };\n ranges[type] = {\n indexMin: previous.indexMax || 0,\n indexMax: previous.indexMax + indexStep\n };\n }\n return ranges;\n }\n\n /**\n * Normalise le compte des résultats.\n * \n * @param {Object} count - Compte des résultats.\n * @returns {Object} - Compte normalisé.\n * @private\n */\n _normalizeCount(count = {}) {\n // suppression des indésirables\n delete count.spam;\n\n // calcul du total (somme des valeurs numériques)\n count.total = Object.values(count).reduce((acc, val) => acc + (typeof val === \"number\" ? val : 0), 0);\n\n return count;\n }\n\n /**\n * Récupère une valeur par défaut depuis un endpoint donné.\n *\n * @param {string} constant - Le nom unique de l’endpoint (ex: \"GET_ORGANIZATIONS_NO_ADMIN\")\n * @param {string} path - Le chemin vers la propriété (ex: \"searchType\")\n * @returns {*} La valeur par défaut, ou undefined si non trouvée\n */\n _getDefaultFromEndpoint(constant, path) {\n const endpoint = this.apiClient._endpoints.find((ep) => ep.constant === constant);\n if (!endpoint?.request?.properties?.[path]) return undefined;\n return endpoint.request.properties[path].default;\n }\n\n /**\n * Coeur de pagination stateless et réutilisable, sans logique métier.\n *\n * @param {Object} config\n * @param {Object} config.initialData - Paramètres de départ\n * @param {Function} config.finalizer - Fonction async qui retourne { results, count }\n *\n * @returns {Object} paginator avec .next() et .prev()\n */\n _createPaginatorEngine({ initialData, finalizer }) {\n const Entity = this;\n\n const state = {\n cursor: undefined,\n count: 0,\n index: 0,\n history: [],\n sizes: []\n };\n\n const hasStep = (d) => d?.indexStep && d.indexStep > 0;\n\n async function getPage(isNext = false) {\n let data = { ...initialData };\n\n if (!state.cursor || (!isNext && state.history.length === 0)) {\n state.count = 0;\n state.index = 0;\n state.history = [];\n state.sizes = [];\n\n data.countType = data.searchType;\n\n if (!data?.searchBy && hasStep(data)) {\n data.ranges = Entity._generateRanges(data.searchType, data.indexStep);\n data.indexMin = data.indexMin ?? 0;\n data.indexMax = data.indexMax ?? data.indexStep;\n } else if (data?.searchBy === \"ALL\" && hasStep(data)) {\n data.indexMin = data.indexMin ?? 0;\n data.indexMax = data.indexMax ?? data.indexStep;\n }\n\n state.cursor = { ...data };\n }\n\n const cursor = state.cursor;\n\n if (isNext) {\n state.history.push({ ...cursor });\n\n if (!cursor.searchBy && hasStep(cursor)) {\n cursor.ranges = Entity._generateRanges(cursor.searchType, cursor.indexStep, cursor.ranges);\n cursor.indexMin = cursor.indexMax ?? 0;\n cursor.indexMax = (cursor.indexMax ?? 0) + cursor.indexStep;\n } else if (cursor.searchBy === \"ALL\" && hasStep(cursor)) {\n cursor.indexMin = cursor.indexMax ?? 0;\n cursor.indexMax = (cursor.indexMax ?? 0) + cursor.indexStep;\n }\n\n state.cursor = { ...cursor };\n }\n\n data = { ...state.cursor };\n\n if (!isNext && (!data?.searchType || !Array.isArray(data.searchType) || data.searchType.length === 0)) {\n throw new Error(\"searchType non défini\");\n }\n\n const result = await finalizer(data);\n if (!Array.isArray(result.results)) {\n throw new Error(\"Les résultats doivent être un tableau\");\n }\n\n state.count += result.results.length;\n state.sizes.push(result.results.length);\n if (isNext) state.index++;\n\n const count = Entity._normalizeCount(result.count);\n const rawList = Entity._linkEntities(result.results);\n\n const hasNext = hasStep(data) && state.count < count.total;\n const hasPrev = state.history.length > 0;\n\n return {\n count,\n results: rawList,\n pageIndex: state.index,\n pageNumber: state.index + 1,\n hasNext,\n hasPrev,\n next: hasNext ? () => getPage(true) : undefined,\n prev: hasPrev\n ? async () => {\n const previous = state.history.pop();\n const lastPageSize = state.sizes.pop() ?? 0;\n state.count -= lastPageSize;\n state.index = Math.max(0, state.index - 1);\n state.cursor = { ...previous };\n return getPage(false);\n }\n : undefined\n };\n }\n\n return {\n next: () => getPage(false)\n };\n }\n\n /**\n * Injection de contexte Communecter dans une requête finalizer.\n *\n * @param {Function} baseFinalizer - fonction async(data) => { results, count }\n * @returns {Function} fonction enrichie\n */\n _withCostumContext(baseFinalizer) {\n return async (data) => {\n const finalData = {\n ...data,\n costumSlug: this.serverData.slug,\n contextId: this.serverData.id,\n contextType: this.getEntityType(),\n sourceKey: [...(data.sourceKey || []), this.serverData.slug]\n };\n return baseFinalizer(finalData);\n };\n }\n\n /**\n * ───────────────────────────────\n * custom\n * ───────────────────────────────\n */\n\n /**\n * Recherche liée à l'entité, version stateless.\n *\n * @param {Object} data - Données initiales de recherche.\n * @returns {Object} - Un paginateur avec .next(), .prev(), etc.\n */\n async searchCostum(data = {}) {\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: this._withCostumContext((finalData) => this.endpointApi.globalAutocompleteCostum(finalData)),\n });\n\n return paginator.next();\n }\n\n async costumEventRequestActors(data = {}){\n\n data = {\n pathParams: {\n id: this.id,\n type: this.getEntityType()\n },\n ...data\n };\n\n const wrappedFinalizer = this._withCostumContext((finalData) => this.endpointApi.costumEventRequestActors(finalData));\n\n const actors = await wrappedFinalizer(data);\n\n // const transformedActors = actors\n // .filter(actor => {\n // const isValid = !!actor?.type;\n // if (!isValid) {\n // this.apiClient._logger?.warn?.(`Objet ignoré car sans 'type' : ${actor?.id}`);\n // }\n // return isValid;\n // })\n // .map(({ id, name, type, ...meta }) => ({\n // id,\n // name,\n // collection: type,\n // meta\n // }));\n\n // const rawList = this._linkEntities(transformedActors);\n\n return actors;\n }\n\n async costumEventRequestSubevents(data = {}){\n\n data = {\n pathParams: {\n id: this.id,\n type: this.getEntityType()\n },\n ...data\n };\n\n const wrappedFinalizer = this._withCostumContext((finalData) => this.endpointApi.costumEventRequestSubevents(finalData));\n\n return wrappedFinalizer(data);\n }\n\n async costumEventRequestDates(data = {}){\n data = {\n pathParams: {\n id: this.id,\n type: this.getEntityType()\n },\n ...data\n };\n\n const wrappedFinalizer = this._withCostumContext((finalData) => this.endpointApi.costumEventRequestDates(finalData));\n\n return wrappedFinalizer(data);\n }\n\n async costumEventRequestElementEvent(data = {}){\n data = {\n pathParams: {\n id: this.id,\n type: this.getEntityType()\n },\n ...data\n };\n\n const wrappedFinalizer = this._withCostumContext((finalData) => this.endpointApi.costumEventRequestElementEvent(finalData));\n\n return wrappedFinalizer(data);\n }\n\n async costumEventRequestCategories(data = {}){\n data = {\n pathParams: {\n id: this.id,\n type: this.getEntityType()\n },\n ...data\n };\n\n const wrappedFinalizer = this._withCostumContext((finalData) => this.endpointApi.costumEventRequestCategories(finalData));\n\n return wrappedFinalizer(data);\n }\n\n async costumEventRequestEvent(data = {}){\n data = {\n pathParams: {\n id: this.id,\n type: this.getEntityType()\n },\n ...data\n };\n\n const wrappedFinalizer = this._withCostumContext((finalData) => this.endpointApi.costumEventRequestEvent(finalData));\n\n return wrappedFinalizer(data);\n }\n\n async costumEventRequestLinkTlToEvent(data = {}){\n data = {\n pathParams: {\n id: this.id,\n type: this.getEntityType()\n },\n ...data\n };\n\n const wrappedFinalizer = this._withCostumContext((finalData) => this.endpointApi.costumEventRequestLinkTlToEvent(finalData));\n\n return wrappedFinalizer(data);\n }\n\n async costumEventRequestLoadContextTag(data = {}){\n data = {\n pathParams: {\n id: this.id,\n type: this.getEntityType()\n },\n ...data\n };\n\n const wrappedFinalizer = this._withCostumContext((finalData) => this.endpointApi.costumEventRequestLoadContextTag(finalData));\n\n return wrappedFinalizer(data);\n }\n\n\n}\n\nexport default BaseEntity;\n","import { ApiError } from \"../error.js\";\nimport BaseEntity from \"./BaseEntity.js\";\n\nexport class Badge extends BaseEntity {\n static entityType = \"badges\";\n\n static entityTag = \"Badge\";\n\n static SCHEMA_CONSTANTS = [\n \"ADD_BADGES\",\n ];\n\n static ADD_BLOCKS = new Map([\n [\"ADD_BADGES\", \"addBadges\"]\n ]);\n\n static UPDATE_BLOCKS = new Map([\n ]);\n\n defaultFields = {\n\n };\n\n removeFields = [];\n\n transforms = {\n\n };\n\n async _add(payload) {\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _add, utilisez save\");\n }\n payload.id = this._newId?.();\n if (payload.slug) delete payload.slug;\n\n for (const [constant, methodName] of Badge.ADD_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => {}\n );\n if (blockData && Object.keys(blockData).length > 0) {\n const data = await this[methodName](blockData);\n if (!this.id && data?.map?.id) {\n this._draftData.id = data.map.id;\n this._draftData.slug = data.map.slug;\n }\n }\n }\n }\n\n async _update(payload) {\n // TODO: qui peut modifier un badge ?\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _update, utilisez save\");\n }\n if (payload.id) delete payload.id;\n let hasChanged = false;\n\n for (const [constant, methodName] of Badge.UPDATE_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => this.initialDraftData,\n this.removeFields\n );\n if (blockData && Object.keys(blockData).length > 0) {\n await this[methodName](blockData);\n hasChanged = true;\n }\n }\n\n return hasChanged;\n }\n\n async getOrganizations() {\n throw new ApiError(`getOrganizations n'existe pas dans ${this.constructor.name}`);\n }\n\n async getProjects() {\n throw new ApiError(`getProjects n'existe pas dans ${this.constructor.name}`);\n }\n\n async getEvents() {\n throw new ApiError(`getEvents n'existe pas dans ${this.constructor.name}`);\n }\n\n async getPois() {\n throw new ApiError(`getPois n'existe pas dans ${this.constructor.name}`);\n }\n\n async getBadgesIssuer() {\n throw new ApiError(`getBadgesIssuer n'existe pas dans ${this.constructor.name}`);\n }\n\n async getNews() {\n throw new ApiError(`getNews n'existe pas dans ${this.constructor.name}`);\n }\n\n async getSubscribers() {\n throw new ApiError(`getSubscribers n'existe pas dans ${this.constructor.name}`);\n }\n\n async project() {\n throw new ApiError(`project n'existe pas dans ${this.constructor.name}`);\n }\n\n async poi() {\n throw new ApiError(`poi n'existe pas dans ${this.constructor.name}`);\n }\n\n async event() {\n throw new ApiError(`event n'existe pas dans ${this.constructor.name}`);\n }\n\n async badge() {\n throw new ApiError(`badge n'existe pas dans ${this.constructor.name}`);\n }\n\n async news() {\n throw new ApiError(`news n'existe pas dans ${this.constructor.name}`);\n }\n\n}\n","// Fichier généré automatiquement\n// @ts-check\nimport { ApiAuthenticationError } from \"../error.js\";\n\n/**\n * @typedef {import(\"../error.js\").ApiResponseError} ApiResponseError\n */\n\n/**\n * Classe EndpointApi générée automatiquement depuis endpoints-copie.json\n */\nclass EndpointApi {\n constructor(apiClient) {\n this.apiClient = apiClient;\n }\n\n get isConnected() {\n return this.apiClient.isConnected;\n }\n\n get userId() {\n return this.apiClient.userId;\n }\n\n async call(constant, data = {}) {\n return this.apiClient.safeCall(async () => {\n const response = await this.apiClient.callEndpoint(constant, data);\n this.apiClient.checkAndThrowApiResponseError(response);\n return response.data;\n });\n }\n\n async callNoConnected(constant, data = {}) {\n if (this.isConnected) {\n throw new ApiAuthenticationError(\"Vous ne devez pas être connecté pour faire cette action.\");\n }\n return this.call(constant, data);\n }\n\n async callIsConnected(constant, data = {}) {\n if (!this.isConnected) {\n throw new ApiAuthenticationError(\"Vous devez être connecté pour effectuer cette action.\");\n }\n return this.call(constant, data);\n }\n\n \n /**\n * Enregistrement d'un utilisateur : Permet d’enregistrer un nouvel utilisateur avec ses informations personnelles.\n * Constant : PERSON_REGISTER\n * @param {import(\"./EndpointApi.types\").PersonRegisterData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async personRegister(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callNoConnected(\"PERSON_REGISTER\", data);\n }\n \n /**\n * Authentification : Permet de se connecter en utilisant une adresse email et un mot de passe.\n * Constant : AUTHENTICATE_URL\n * @param {import(\"./EndpointApi.types\").AuthenticateUrlData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async authenticateUrl(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callNoConnected(\"AUTHENTICATE_URL\", data);\n }\n \n /**\n * Rafraîchir un token : Permet de rafraîchir un token d'accès expiré en utilisant un token de rafraîchissement.\n * Constant : REFRESH_TOKEN_URL\n * @param {import(\"./EndpointApi.types\").RefreshTokenUrlData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async refreshTokenUrl(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"REFRESH_TOKEN_URL\", data);\n }\n \n /**\n * Récupérer les informations utilisateur : Récupère les informations du profil utilisateur pour un token donné.\n * Constant : ME_INFO_URL\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async meInfoUrl() {\n return this.callIsConnected(\"ME_INFO_URL\");\n }\n \n /**\n * Récupération de mot de passe : Envoie un email pour récupérer le mot de passe.\n * Constant : PASSWORD_RECOVERY\n * @param {import(\"./EndpointApi.types\").PasswordRecoveryData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async passwordRecovery(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callNoConnected(\"PASSWORD_RECOVERY\", data);\n }\n \n /**\n * Échange de token avec un autre serveur : Permet de se connecter à un autre serveur Communecter en échangeant un token.\n * Constant : SERVER_EXCHANGE_TOKEN\n * @param {import(\"./EndpointApi.types\").ServerExchangeTokenData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async serverExchangeToken(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"SERVER_EXCHANGE_TOKEN\", data);\n }\n \n /**\n * Changer le mot de passe : Permet de changer le mot de passe d'un utilisateur.\n * Constant : CHANGE_PASSWORD\n * @param {import(\"./EndpointApi.types\").ChangePasswordData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async changePassword(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"CHANGE_PASSWORD\", data);\n }\n \n /**\n * Supprimer un compte : Permet de supprimer un compte utilisateur.\n * Constant : DELETE_ACCOUNT\n * @param {import(\"./EndpointApi.types\").DeleteAccountData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async deleteAccount(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"DELETE_ACCOUNT\", data);\n }\n \n /**\n * Mettre à jour les paramètres d'un élément : Mise à jour des paramètres spécifiques d'un élément.\n * Constant : UPDATE_SETTINGS\n * @param {import(\"./EndpointApi.types\").UpdateSettingsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateSettings(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"UPDATE_SETTINGS\", data);\n }\n \n /**\n * Mettre à jour la description d'un élément : Permet de mettre à jour la description courte et complète d'un élément.\n * Constant : UPDATE_BLOCK_DESCRIPTION\n * @param {import(\"./EndpointApi.types\").UpdateBlockDescriptionData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateBlockDescription(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"UPDATE_BLOCK_DESCRIPTION\", data);\n }\n \n /**\n * Mettre à jour les informations d'un élément : Permet de mettre à jour les informations générales d'un élément (nom, contacts, etc.).\n * Constant : UPDATE_BLOCK_INFO\n * @param {import(\"./EndpointApi.types\").UpdateBlockInfoData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateBlockInfo(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"UPDATE_BLOCK_INFO\", data);\n }\n \n /**\n * Mettre à jour les réseaux sociaux d'un élément : Permet de mettre à jour les liens vers les réseaux sociaux d'un élément.\n * Constant : UPDATE_BLOCK_SOCIAL\n * @param {import(\"./EndpointApi.types\").UpdateBlockSocialData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateBlockSocial(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"UPDATE_BLOCK_SOCIAL\", data);\n }\n \n /**\n * Mettre à jour les localités d'un élément : Permet de mettre à jour l'adresse et les informations géographiques d'un élément.\n * Constant : UPDATE_BLOCK_LOCALITY\n * @param {import(\"./EndpointApi.types\").UpdateBlockLocalityData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateBlockLocality(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"UPDATE_BLOCK_LOCALITY\", data);\n }\n \n /**\n * Mettre à jour le slug d'un élément : Permet de mettre à jour le slug pour une URL simplifiée.\n * Constant : UPDATE_BLOCK_SLUG\n * @param {import(\"./EndpointApi.types\").UpdateBlockSlugData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateBlockSlug(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"UPDATE_BLOCK_SLUG\", data);\n }\n \n /**\n * Vérifier l'état d'une URL : Vérifie si une URL (slug) est valide ou disponible.\n * Constant : CHECK\n * @param {import(\"./EndpointApi.types\").CheckData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async check(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"CHECK\", data);\n }\n \n /**\n * Mettre à jour l'image de profil : Permet de mettre à jour l'image de profil d'un utilisateur ou d'une entité.\n * Constant : PROFIL_IMAGE\n * @param {import(\"./EndpointApi.types\").ProfilImageData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async profilImage(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"PROFIL_IMAGE\", data);\n }\n \n /**\n * Obtenir les éléments liés : Récupère les informations détaillées d'un élément et de ses éléments liés.\n * Constant : GET_ELEMENTS_ABOUT\n * @param {import(\"./EndpointApi.types\").GetElementsAboutData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getElementsAbout(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_ELEMENTS_ABOUT\", data);\n }\n \n /**\n * Gérer des connexions multiples : Permet d’inviter ou de connecter plusieurs utilisateurs en même temps à une entité.\n * Constant : MULTICONNECT\n * @param {import(\"./EndpointApi.types\").MulticonnectData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async multiconnect(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"MULTICONNECT\", data);\n }\n \n /**\n * Récupérer les actualités : Récupère la liste d’actualités selon plusieurs critères.\n * Constant : GET_NEWS\n * @param {import(\"./EndpointApi.types\").GetNewsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getNews(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_NEWS\", data);\n }\n \n /**\n * Récupérer des actualités par IDs : Récupère des actualités à partir d’une liste d’identifiants.\n * Constant : GET_NEWS_BY_ID\n * @param {import(\"./EndpointApi.types\").GetNewsByIdData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getNewsById(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_NEWS_BY_ID\", data);\n }\n \n /**\n * Ajouter une actualité : Ajoute une nouvelle actualité.\n * Constant : ADD_NEWS\n * @param {import(\"./EndpointApi.types\").AddNewsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addNews(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_NEWS\", data);\n }\n \n /**\n * Ajouter une image à une actualité : Ajoute une images à une actualité.\n * Constant : ADD_IMAGE_NEWS\n * @param {import(\"./EndpointApi.types\").AddImageNewsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addImageNews(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_IMAGE_NEWS\", data);\n }\n \n /**\n * Ajouter un fichier à une actualité : Ajoute un fichier à une actualité.\n * Constant : ADD_FILE_NEWS\n * @param {import(\"./EndpointApi.types\").AddFileNewsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addFileNews(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_FILE_NEWS\", data);\n }\n \n /**\n * Supprimer une actualité : Supprime une actualité existante.\n * Constant : DELETE_NEWS\n * @param {import(\"./EndpointApi.types\").DeleteNewsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async deleteNews(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"DELETE_NEWS\", data);\n }\n \n /**\n * Mettre à jour une actualité : Met à jour le contenu d’une actualité existante.\n * Constant : UPDATE_NEWS\n * @param {import(\"./EndpointApi.types\").UpdateNewsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateNews(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"UPDATE_NEWS\", data);\n }\n \n /**\n * Partager une actualité : Partage une actualité avec une entité ou un utilisateur.\n * Constant : SHARE_NEWS\n * @param {import(\"./EndpointApi.types\").ShareNewsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async shareNews(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"SHARE_NEWS\", data);\n }\n \n /**\n * Récupérer les commentaires : Récupère les commentaires d’un élément.\n * Constant : GET_COMMENTS\n * @param {import(\"./EndpointApi.types\").GetCommentsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getComments(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_COMMENTS\", data);\n }\n \n /**\n * Ajouter un commentaire : Ajoute un commentaire à une actualité ou autre contexte.\n * Constant : ADD_COMMENTS\n * @param {import(\"./EndpointApi.types\").AddCommentsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addComments(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_COMMENTS\", data);\n }\n \n /**\n * Supprimer un commentaire : Supprime un commentaire existant.\n * Constant : DELETE_COMMENTS\n * @param {import(\"./EndpointApi.types\").DeleteCommentsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async deleteComments(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"DELETE_COMMENTS\", data);\n }\n \n /**\n * Mettre à jour un commentaire : Met à jour le contenu d’un commentaire.\n * Constant : UPDATE_COMMENTS\n * @param {import(\"./EndpointApi.types\").UpdateCommentsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async updateComments(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"UPDATE_COMMENTS\", data);\n }\n \n /**\n * Rechercher des tags : Recherche des tags correspondant à un mot-clé.\n * Constant : SEARCH_TAGS\n * @param {import(\"./EndpointApi.types\").SearchTagsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async searchTags(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"SEARCH_TAGS\", data);\n }\n \n /**\n * Afficher les votes d'une actualité : Récupère la liste des votes (like, love, etc.) sur une actualité.\n * Constant : SHOW_VOTE\n * @param {import(\"./EndpointApi.types\").ShowVoteData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async showVote(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"SHOW_VOTE\", data);\n }\n \n /**\n * Recherche globale avec autocomplétion : Effectue une recherche globale avec possibilité d’autocomplétion.\n * Constant : GLOBAL_AUTOCOMPLETE\n * @param {import(\"./EndpointApi.types\").GlobalAutocompleteData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async globalAutocomplete(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GLOBAL_AUTOCOMPLETE\", data);\n }\n \n /**\n * Recherche de villes avec autocomplétion : Recherche des villes en fonction d’un nom, autocomplétion rapide.\n * Constant : CITY_AUTOCOMPLETE\n * @param {import(\"./EndpointApi.types\").CityAutocompleteData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async cityAutocomplete(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"CITY_AUTOCOMPLETE\", data);\n }\n \n /**\n * Recherche de villes par pays : Recherche de villes par pays avec autocomplétion.\n * Constant : CITY_AUTOCOMPLETE_BY_COUNTRY\n * @param {import(\"./EndpointApi.types\").CityAutocompleteByCountryData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async cityAutocompleteByCountry(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"CITY_AUTOCOMPLETE_BY_COUNTRY\", data);\n }\n \n /**\n * Suggestions d'entrée : Fournit des suggestions basées sur le nom recherché, etc.\n * Constant : SUGGESTION_INPUT\n * @param {import(\"./EndpointApi.types\").SuggestionInputData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async suggestionInput(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"SUGGESTION_INPUT\", data);\n }\n \n /**\n * Récupérer les projets non administrables : Récupère les projets accessibles sans droits d'administration.\n * Constant : GET_PROJECTS_NO_ADMIN\n * @param {import(\"./EndpointApi.types\").GetProjectsNoAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getProjectsNoAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_PROJECTS_NO_ADMIN\", data);\n }\n \n /**\n * Récupérer les projets administrables : Récupère les projets pour lesquels l'utilisateur a des droits d'administration.\n * Constant : GET_PROJECTS_ADMIN\n * @param {import(\"./EndpointApi.types\").GetProjectsAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getProjectsAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_PROJECTS_ADMIN\", data);\n }\n \n /**\n * Récupérer les POIs non administrables : Récupère la liste des POIs accessibles sans droits d'administration.\n * Constant : GET_POIS_NO_ADMIN\n * @param {import(\"./EndpointApi.types\").GetPoisNoAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getPoisNoAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_POIS_NO_ADMIN\", data);\n }\n \n /**\n * Récupérer les POIs administrables : Récupère la liste des POIs administrables par l’utilisateur.\n * Constant : GET_POIS_ADMIN\n * @param {import(\"./EndpointApi.types\").GetPoisAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getPoisAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_POIS_ADMIN\", data);\n }\n \n /**\n * Récupérer les organisations non administrables : Récupère la liste des organisations auxquelles l’utilisateur appartient sans les administrer.\n * Constant : GET_ORGANIZATIONS_NO_ADMIN\n * @param {import(\"./EndpointApi.types\").GetOrganizationsNoAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getOrganizationsNoAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_ORGANIZATIONS_NO_ADMIN\", data);\n }\n \n /**\n * Récupérer les organisations administrables : Récupère les organisations administrées par l’utilisateur.\n * Constant : GET_ORGANIZATIONS_ADMIN\n * @param {import(\"./EndpointApi.types\").GetOrganizationsAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getOrganizationsAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_ORGANIZATIONS_ADMIN\", data);\n }\n \n /**\n * Récupérer les membres non administrables : Récupère les membres d’une organisation sans droits d’admin.\n * Constant : GET_MEMBERS_NO_ADMIN\n * @param {import(\"./EndpointApi.types\").GetMembersNoAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getMembersNoAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_MEMBERS_NO_ADMIN\", data);\n }\n \n /**\n * Récupérer les membres administrables : Récupère les membres d’une organisation administrée par l’utilisateur.\n * Constant : GET_MEMBERS_ADMIN\n * @param {import(\"./EndpointApi.types\").GetMembersAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getMembersAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_MEMBERS_ADMIN\", data);\n }\n \n /**\n * Récupérer les amis administrables : Récupère les amis administrée par l’utilisateur.\n * Constant : GET_FRIENDS_ADMIN\n * @param {import(\"./EndpointApi.types\").GetFriendsAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getFriendsAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_FRIENDS_ADMIN\", data);\n }\n \n /**\n * Récupérer les suivis non administrables : Liste les entités suivies sans droits d’admin.\n * Constant : GET_SUBSCRIPTIONS\n * @param {import(\"./EndpointApi.types\").GetSubscriptionsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getSubscriptions(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_SUBSCRIPTIONS\", data);\n }\n \n /**\n * Récupérer les suivis administrables : Liste les entités suivies par l’utilisateur, sur lesquelles il est admin.\n * Constant : GET_SUBSCRIPTIONS_ADMIN\n * @param {import(\"./EndpointApi.types\").GetSubscriptionsAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getSubscriptionsAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_SUBSCRIPTIONS_ADMIN\", data);\n }\n \n /**\n * Récupérer les abonnés non administrables : Liste les abonnés sans droits d’admin.\n * Constant : GET_SUBSCRIBERS\n * @param {import(\"./EndpointApi.types\").GetSubscribersData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getSubscribers(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_SUBSCRIBERS\", data);\n }\n \n /**\n * Récupérer les abonnés administrables : Liste les abonnés d’une entité administrée par l’utilisateur.\n * Constant : GET_SUBSCRIBERS_ADMIN\n * @param {import(\"./EndpointApi.types\").GetSubscribersAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getSubscribersAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_SUBSCRIBERS_ADMIN\", data);\n }\n \n /**\n * Récupérer les contributeurs non administrables : Récupère les contributeurs sans droits d’admin.\n * Constant : GET_CONTRIBUTORS_NO_ADMIN\n * @param {import(\"./EndpointApi.types\").GetContributorsNoAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getContributorsNoAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_CONTRIBUTORS_NO_ADMIN\", data);\n }\n \n /**\n * Récupérer les contributeurs administrables : Récupère les contributeurs d’un project l’utilisateur est admin.\n * Constant : GET_CONTRIBUTORS_ADMIN\n * @param {import(\"./EndpointApi.types\").GetContributorsAdminData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getContributorsAdmin(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_CONTRIBUTORS_ADMIN\", data);\n }\n \n /**\n * Recherche globale des badges : Recherche des badges publics en fonction de divers critères.\n * Constant : GET_BADGES\n * @param {import(\"./EndpointApi.types\").GetBadgesData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getBadges(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_BADGES\", data);\n }\n \n /**\n * Recherche globale des badges : Recherche des badges publics en fonction de divers critères.\n * Constant : GET_BADGES_FILTERS\n * @param {import(\"./EndpointApi.types\").GetBadgesFiltersData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getBadgesFilters(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_BADGES_FILTERS\", data);\n }\n \n /**\n * Suivre un élément : Permet à un utilisateur de suivre un élément (projet, organisation...).\n * Constant : CONNECT\n * @param {import(\"./EndpointApi.types\").ConnectData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async connect(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"CONNECT\", data);\n }\n \n /**\n * Se déconnecter d'un élément : Permet de supprimer le lien entre un utilisateur et un élément.\n * Constant : DISCONNECT\n * @param {import(\"./EndpointApi.types\").DisconnectData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async disconnect(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"DISCONNECT\", data);\n }\n \n /**\n * Récuperer l'id et la collection d'un element en fonction du slug : Récuperer l'id et la collection d'un element en fonction du slug\n * Constant : GET_ELEMENTS_KEY\n * @param {import(\"./EndpointApi.types\").GetElementsKeyData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getElementsKey(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_ELEMENTS_KEY\", data);\n }\n \n /**\n * Récupérer les favoris d'un utilisateur : Récupère la liste des favoris d’un utilisateur.\n * Constant : GET_FAVORIS\n * @param {import(\"./EndpointApi.types\").GetFavorisData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getFavoris(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_FAVORIS\", data);\n }\n \n /**\n * Supprimer un favori : Supprime un élément des favoris de l’utilisateur.\n * Constant : DELETE_FAVORIS\n * @param {import(\"./EndpointApi.types\").DeleteFavorisData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async deleteFavoris(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"DELETE_FAVORIS\", data);\n }\n \n /**\n * Ajouter un favori : Ajoute un élément aux favoris de l’utilisateur.\n * Constant : ADD_FAVORIS\n * @param {import(\"./EndpointApi.types\").AddFavorisData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addFavoris(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_FAVORIS\", data);\n }\n \n /**\n * Créer une organisation : Crée une nouvelle organisation.\n * Constant : ADD_ORGANIZATION\n * @param {import(\"./EndpointApi.types\").AddOrganizationData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addOrganization(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_ORGANIZATION\", data);\n }\n \n /**\n * Créer un projet : Crée un nouveau projet avec des informations de base et des options supplémentaires.\n * Constant : ADD_PROJECT\n * @param {import(\"./EndpointApi.types\").AddProjectData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addProject(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_PROJECT\", data);\n }\n \n /**\n * Créer un POI : Crée un nouveau POI (Point d'Intérêt).\n * Constant : ADD_POI\n * @param {import(\"./EndpointApi.types\").AddPoiData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addPoi(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_POI\", data);\n }\n \n /**\n * Créer un événement : Crée un nouvel événement.\n * Constant : ADD_EVENT\n * @param {import(\"./EndpointApi.types\").AddEventData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addEvent(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_EVENT\", data);\n }\n \n /**\n * Supprimer un POI : Supprime un POI existant.\n * Constant : DELETE_POI\n * @param {import(\"./EndpointApi.types\").DeletePoiData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async deletePoi(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"DELETE_POI\", data);\n }\n \n /**\n * Supprimer un événement : Supprime un événement spécifique.\n * Constant : DELETE_EVENT\n * @param {import(\"./EndpointApi.types\").DeleteEventData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async deleteEvent(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"DELETE_EVENT\", data);\n }\n \n /**\n * Supprimer un élément : Supprime un élément existant.\n * Constant : DELETE_ELEMENT\n * @param {import(\"./EndpointApi.types\").DeleteElementData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async deleteElement(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"DELETE_ELEMENT\", data);\n }\n \n /**\n * Ajouter une image à un élément : Ajoute une image à un élément.\n * Constant : ADD_IMAGE_ELEMENT\n * @param {import(\"./EndpointApi.types\").AddImageElementData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addImageElement(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_IMAGE_ELEMENT\", data);\n }\n \n /**\n * Valider un lien : Permet de valider un lien (ex: rejoindre un projet, accepter un membre...).\n * Constant : LINK_VALIDATE\n * @param {import(\"./EndpointApi.types\").LinkValidateData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async linkValidate(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"LINK_VALIDATE\", data);\n }\n \n /**\n * Recherche avec autocomplétion (membres) : Recherche des membres avec autocomplétion.\n * Constant : SEARCH_MEMBER_AUTOCOMPLETE\n * @param {import(\"./EndpointApi.types\").SearchMemberAutocompleteData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async searchMemberAutocomplete(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"SEARCH_MEMBER_AUTOCOMPLETE\", data);\n }\n \n /**\n * Récupérer les notifications : Récupère la liste des notifications pour un utilisateur.\n * Constant : GET_NOTIFICATIONS\n * @param {import(\"./EndpointApi.types\").GetNotificationsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getNotifications(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_NOTIFICATIONS\", data);\n }\n \n /**\n * Récupérer le nombre de notifications : Récupère le nombre de notifications pour un utilisateur.\n * Constant : GET_NOTIFICATIONS_COUNT\n * @param {import(\"./EndpointApi.types\").GetNotificationsCountData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getNotificationsCount(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"GET_NOTIFICATIONS_COUNT\", data);\n }\n \n /**\n * Mettre à jour toutes les notifications : Marque toutes les notifications comme vues ou lues.\n * Constant : NOTIFICATION_UPDATE\n * @param {import(\"./EndpointApi.types\").NotificationUpdateData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async notificationUpdate(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"NOTIFICATION_UPDATE\", data);\n }\n \n /**\n * Supprimer toutes les notifications : Supprime toutes les notifications de l’utilisateur.\n * Constant : REMOVE_ALL_NOTIFICATIONS\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async removeAllNotifications() {\n return this.callIsConnected(\"REMOVE_ALL_NOTIFICATIONS\");\n }\n \n /**\n * Marquer une notification comme lue : Marque une notification spécifique comme lue.\n * Constant : MARK_NOTIFICATION_AS_READ\n * @param {import(\"./EndpointApi.types\").MarkNotificationAsReadData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async markNotificationAsRead(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"MARK_NOTIFICATION_AS_READ\", data);\n }\n \n /**\n * Recherche ActivityPub : Recherche des éléments ActivityPub selon une adresse ou un terme.\n * Constant : ACTIVITYPUB_SEARCH\n * @param {import(\"./EndpointApi.types\").ActivitypubSearchData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async activitypubSearch(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"ACTIVITYPUB_SEARCH\", data);\n }\n \n /**\n * Mettre à jour une activité (ActivityPub) : Met à jour une activité ActivityPub avec une action et un payload.\n * Constant : ACTIVITYPUB_LINK\n * @param {import(\"./EndpointApi.types\").ActivitypubLinkData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async activitypubLink(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ACTIVITYPUB_LINK\", data);\n }\n \n /**\n * Obtenir la liste ActivityPub : Obtient la liste des communautés ActivityPub pour un utilisateur.\n * Constant : ACTIVITYPUB_GET_COMMUNITY\n * @param {import(\"./EndpointApi.types\").ActivitypubGetCommunityData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async activitypubGetCommunity(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"ACTIVITYPUB_GET_COMMUNITY\", data);\n }\n \n /**\n * Récupérer les informations d'un badge : Récupère les détails d’un badge par son ID.\n * Constant : GET_BADGE\n * @param {import(\"./EndpointApi.types\").GetBadgeData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getBadge(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_BADGE\", data);\n }\n \n /**\n * Obtenir la liste des émetteurs de badges : Récupère la liste des émetteurs pour les badges.\n * Constant : GET_EMETTEUR_BADGES\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getEmetteurBadges() {\n return this.call(\"GET_EMETTEUR_BADGES\");\n }\n \n /**\n * Créer un badge : Crée un nouveau badge avec des informations détaillées.\n * Constant : ADD_BADGES\n * @param {import(\"./EndpointApi.types\").AddBadgesData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async addBadges(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ADD_BADGES\", data);\n }\n \n /**\n * Attribuer un badge : Attribue un badge à une ou plusieurs personnes ou entités.\n * Constant : ASSIGN_BADGES\n * @param {import(\"./EndpointApi.types\").AssignBadgesData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async assignBadges(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"ASSIGN_BADGES\", data);\n }\n \n /**\n * Obtenir la liste des événements : Permet de rechercher des événements selon plusieurs critères (dates, nom, type...).\n * Constant : GET_EVENTS\n * @param {import(\"./EndpointApi.types\").GetEventsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getEvents(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_EVENTS\", data);\n }\n \n /**\n * Partager un événement : Partage un événement avec d’autres utilisateurs ou entités.\n * Constant : SHARE_EVENTS\n * @param {import(\"./EndpointApi.types\").ShareEventsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async shareEvents(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"SHARE_EVENTS\", data);\n }\n \n /**\n * Inviter des participants à un événement : Invite plusieurs utilisateurs ou entités à participer à un événement.\n * Constant : INVITE_EVENT\n * @param {import(\"./EndpointApi.types\").InviteEventData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async inviteEvent(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"INVITE_EVENT\", data);\n }\n \n /**\n * Suivre un utilisateur ou un élément : Suivre un utilisateur ou un élément.\n * Constant : FOLLOW\n * @param {import(\"./EndpointApi.types\").FollowData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async follow(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.callIsConnected(\"FOLLOW\", data);\n }\n \n /**\n * Récuperer les data d'un JSON d'un costum : Récuperer les data d'un JSON d'un costum\n * Constant : GET_COSTUM_JSON\n * @param {import(\"./EndpointApi.types\").GetCostumJsonData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getCostumJson(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_COSTUM_JSON\", data);\n }\n \n /**\n * Recherche globale lier à un costum : Effectue une recherche globale lier à un costum\n * Constant : GLOBAL_AUTOCOMPLETE_COSTUM\n * @param {import(\"./EndpointApi.types\").GlobalAutocompleteCostumData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async globalAutocompleteCostum(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GLOBAL_AUTOCOMPLETE_COSTUM\", data);\n }\n \n /**\n * Récupérer les acteurs d'événement : Récupérer les acteurs (organizers, attendees, creators, animators) d'une entité événement.\n * Constant : COSTUM_EVENT_REQUEST_ACTORS\n * @param {import(\"./EndpointApi.types\").CostumEventRequestActorsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async costumEventRequestActors(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"COSTUM_EVENT_REQUEST_ACTORS\", data);\n }\n \n /**\n * Récupérer les sous-événements d’un événement parent : Retourne les sous-événements filtrés par date, type, tags, région, timezone.\n * Constant : COSTUM_EVENT_REQUEST_SUBEVENTS\n * @param {import(\"./EndpointApi.types\").CostumEventRequestSubeventsData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async costumEventRequestSubevents(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"COSTUM_EVENT_REQUEST_SUBEVENTS\", data);\n }\n \n /**\n * Récupérer les événements liés à un élément : Retourne les événements liés à une entité (via links.events ou parent).\n * Constant : COSTUM_EVENT_REQUEST_ELEMENT_EVENT\n * @param {import(\"./EndpointApi.types\").CostumEventRequestElementEventData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async costumEventRequestElementEvent(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"COSTUM_EVENT_REQUEST_ELEMENT_EVENT\", data);\n }\n \n /**\n * Récupérer les catégories d’événements : Retourne la liste des types (catégories) d’événements enfants liés à l'entité.\n * Constant : COSTUM_EVENT_REQUEST_CATEGORIES\n * @param {import(\"./EndpointApi.types\").CostumEventRequestCategoriesData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async costumEventRequestCategories(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"COSTUM_EVENT_REQUEST_CATEGORIES\", data);\n }\n \n /**\n * Récupérer les dates de sous-événements : Retourne les dates des sous-événements à venir et passés, groupées par jour.\n * Constant : COSTUM_EVENT_REQUEST_DATES\n * @param {import(\"./EndpointApi.types\").CostumEventRequestDatesData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async costumEventRequestDates(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"COSTUM_EVENT_REQUEST_DATES\", data);\n }\n \n /**\n * Récupérer un événement par ID : Retourne les informations détaillées d’un événement par son ID.\n * Constant : COSTUM_EVENT_REQUEST_EVENT\n * @param {import(\"./EndpointApi.types\").CostumEventRequestEventData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async costumEventRequestEvent(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"COSTUM_EVENT_REQUEST_EVENT\", data);\n }\n \n /**\n * Associer une structure à un événement (adresse) : Associe une structure existante à un événement en copiant son adresse.\n * Constant : COSTUM_EVENT_REQUEST_LINK_TL_TO_EVENT\n * @param {import(\"./EndpointApi.types\").CostumEventRequestLinkTlToEventData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async costumEventRequestLinkTlToEvent(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"COSTUM_EVENT_REQUEST_LINK_TL_TO_EVENT\", data);\n }\n \n /**\n * Charger les tags de contexte d’un événement : Retourne les tags des sous-événements et des parents d’un événement, avec filtre optionnel.\n * Constant : COSTUM_EVENT_REQUEST_LOAD_CONTEXT_TAG\n * @param {import(\"./EndpointApi.types\").CostumEventRequestLoadContextTagData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async costumEventRequestLoadContextTag(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"COSTUM_EVENT_REQUEST_LOAD_CONTEXT_TAG\", data);\n }\n \n /**\n * Récupération de la galerie : Renvoie soit la liste d’albums associés à une entité, soit les images d’un album spécifique.\n * Constant : GET_GALLERY\n * @param {import(\"./EndpointApi.types\").GetGalleryData} data - Données envoyées à l'API\n * @returns {Promise<Object>} - Les données de réponse.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getGallery(data) {\n if (!data || typeof data !== \"object\") {\n throw new TypeError(\"Le paramètre data doit être un objet.\");\n }\n return this.call(\"GET_GALLERY\", data);\n }\n \n}\n\nexport default EndpointApi;\n","import { ApiError } from \"../error.js\";\nimport BaseEntity from \"./BaseEntity.js\";\n\nexport class Event extends BaseEntity {\n static entityType = \"events\";\n\n static entityTag = \"Event\";\n\n static SCHEMA_CONSTANTS = [\n \"ADD_EVENT\",\n // \"UPDATE_BLOCK_DESCRIPTION\",\n // \"UPDATE_BLOCK_INFO\",\n // \"UPDATE_BLOCK_SOCIAL\",\n // \"UPDATE_BLOCK_LOCALITY\",\n \"UPDATE_BLOCK_SLUG\",\n \"PROFIL_IMAGE\"\n ];\n\n static ADD_BLOCKS = new Map([\n [\"ADD_EVENT\", \"addEvent\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n static UPDATE_BLOCKS = new Map([\n // [\"UPDATE_BLOCK_DESCRIPTION\", \"updateDescription\"],\n // [\"UPDATE_BLOCK_SOCIAL\", \"updateSocial\"],\n // [\"UPDATE_BLOCK_LOCALITY\", \"updateLocality\"],\n // [\"UPDATE_BLOCK_INFO\", \"updateInfo\"],\n [\"UPDATE_BLOCK_SLUG\", \"updateSlug\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n defaultFields = {\n typeElement: this.getEntityType()\n };\n\n removeFields = [\n \"typeElement\"\n ];\n\n transforms = {\n parent: (val) => {\n if (!val || typeof val !== \"object\") return null;\n \n return Object.fromEntries(\n Object.entries(val).map(([key, obj]) => [\n key,\n {\n type: obj?.type ?? null,\n name: obj?.name ?? null\n }\n ])\n );\n },\n organizer: (val) => {\n if (!val || typeof val !== \"object\") return null;\n \n return Object.fromEntries(\n Object.entries(val).map(([key, obj]) => [\n key,\n {\n type: obj?.type ?? null,\n name: obj?.name ?? null\n }\n ])\n );\n }\n };\n\n async _add(payload) {\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _add, utilisez save\");\n }\n\n payload.id = this._newId?.();\n if (payload.slug) delete payload.slug;\n\n for (const [constant, methodName] of Event.ADD_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => {}\n );\n if (blockData && Object.keys(blockData).length > 0) {\n const data = await this[methodName](blockData);\n if (!this.id && data?.map?.id) {\n this._draftData.id = data.map.id;\n this._draftData.slug = data.map.slug;\n }\n }\n }\n }\n\n async _update(payload) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour modifier cet événement\", 403);\n }\n\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _update, utilisez save\");\n }\n\n let hasChanged = false;\n\n const blockData = this._extractAllValidFieldsFromSchema(\n this.apiClient,\n \"ADD_EVENT\",\n { ...payload, ...this.defaultFields },\n () => this.initialDraftData,\n this.removeFields\n );\n if (blockData && Object.keys(blockData).length > 0) {\n await this[\"addEvent\"](blockData);\n hasChanged = true;\n }\n\n if (payload.id) delete payload.id;\n\n for (const [constant, methodName] of Event.UPDATE_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => this.initialDraftData,\n this.removeFields\n );\n if (blockData && Object.keys(blockData).length > 0) {\n await this[methodName](blockData);\n hasChanged = true;\n }\n }\n\n return hasChanged;\n }\n\n async addEvent(data = {}) {\n\n if (!this.isMe && !data.organizer) {\n data.organizer = {};\n data.organizer[`${this.parent.id}`] = {\n type: this.parent.getEntityType(),\n name: this.parent.name\n };\n }\n\n return this.callIsConnected(() => this.endpointApi.addEvent(data));\n }\n\n async getOrganizations() {\n throw new ApiError(`getOrganizations n'existe pas dans ${this.constructor.name}`);\n }\n\n async getProjects() {\n throw new ApiError(`getProjects n'existe pas dans ${this.constructor.name}`);\n }\n\n async getEvents() {\n throw new ApiError(`getEvents - les sous-events ne sont pas encore implémentés dans ${this.constructor.name}`);\n }\n\n async getPois() {\n throw new ApiError(`getPois n'existe pas dans ${this.constructor.name}`);\n }\n\n async getBadgesIssuer() {\n throw new ApiError(`getBadgesIssuer n'existe pas dans ${this.constructor.name}`);\n }\n\n async getNews(data = {}) {\n return super.getNews(data);\n }\n\n async getSubscribers(data = {}) {\n return super.getSubscribers(data);\n }\n\n async project() {\n throw new ApiError(`project n'existe pas dans ${this.constructor.name}`);\n }\n\n async poi() {\n throw new ApiError(`poi n'existe pas dans ${this.constructor.name}`);\n }\n\n async event() {\n throw new ApiError(`les sous-events ne sont pas encore implémentés dans ${this.constructor.name}`);\n }\n\n async badge() {\n throw new ApiError(`badge n'existe pas dans ${this.constructor.name}`);\n }\n\n /**\n * Crée une instance de news et la récupère si nécessaire.\n * \n * @param {Object} newsData - Les données nécessaires pour initialiser la news.\n * @returns {Promise<News>} Une promesse qui résout l'objet News créé.\n * @throws {Error} Si une erreur se produit lors de la création de la news.\n */\n async news(newsData = {}) {\n return super.news(newsData);\n }\n\n /**\n * Suivre un événement.\n * Cette action permet à l'utilisateur de suivre un événement.\n * \n * @returns {Promise<Object>} - Résultat de l'action de suivi.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité ne supporte pas l'action.\n */\n async follow() {\n return super.follow();\n }\n\n /**\n * Se désabonne d'un événement.\n * \n * @returns {Promise<Object>} - Résultat de la désinscription.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité n'est pas enregistrée.\n */\n async unfollow() {\n return super.unfollow();\n }\n \n}\n","import { ApiError } from \"../error.js\";\nimport BaseEntity from \"./BaseEntity.js\";\n\nexport class News extends BaseEntity {\n static entityType = \"news\";\n\n static entityTag = \"News\";\n\n static SCHEMA_CONSTANTS = [\n \"ADD_NEWS\"\n ];\n\n static ADD_BLOCKS = new Map([\n [\"ADD_NEWS\", \"addNews\"]\n ]);\n\n static UPDATE_BLOCKS = new Map([\n [\"ADD_NEWS\", \"updateNews\"]\n ]);\n\n defaultFields = {\n\n };\n\n removeFields = [\n\n ];\n\n transforms = {\n scope: val => val?.type,\n mentions: val =>\n Array.isArray(val)\n ? val.map(m => ({ ...m, count: parseInt(m.count) }))\n : [],\n mediaImg: val => {\n const images = val?.images?.map(img => img.id).filter(Boolean) || [];\n return images.length > 0 ? { countImages: images.length, images } : undefined;\n },\n mediaFile: val => {\n const files = val?.files?.map(f => f.id).filter(Boolean) || [];\n return files.length > 0 ? { countFiles: files.length, files } : undefined;\n }\n };\n\n /**\n * Récupérer des actualités par IDs : Récupère des actualités à partir d’une liste d’identifiants.\n * Constant : GET_NEWS_BY_ID\n */\n async get() {\n if (!this.id) throw new ApiError(\"Impossible de rafraîchir sans ID.\");\n \n const newsArray = await this.callIsConnected(() =>\n this.endpointApi.getNewsById({ ids: [this.id] })\n );\n \n if (newsArray && Array.isArray(newsArray) && newsArray.length === 1) {\n const data = newsArray[0];\n this._setData(data);\n return this.serverData;\n }\n throw new ApiError(`Aucune actualité trouvée pour l'ID ${this.id}`);\n }\n\n \n async _add(payload) {\n if (!this._calledFromSave) {\n throw new Error(\"utilisation invalide de _add, utilisez save\");\n }\n\n // si le texte est vide, on met un espace pour que le champ soit pris en compte car sur le serveur\n // il y a une vérification de la taille du texte je pense\n if(payload.text === \"\"){\n payload.text = \" \";\n }\n payload.parentId = this.parent.id;\n payload.parentType = this.parent.getEntityType();\n \n // const data = await this.callIsConnected(() => this.endpointApi.addNews(payload));\n // this._draftData.id = data.object.id;\n // // TODO : voir si j'ai ce qui faut dans reponseData de ADD_NEWS pour mettre à jour #serverData\n // // c'est dans reponseData.object\n // // if(data?.object){\n // // this._serverData = { ...data.object };\n // // }\n \n for (const [constant, methodName] of News.ADD_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => {}\n );\n if (blockData && Object.keys(blockData).length > 0) {\n const data = await this[methodName](blockData);\n if (!this.id && data?.object?.id) {\n this._draftData.id = data.object.id;\n // this._serverData = { ...data.object };\n }\n }\n }\n }\n\n async _update(payload) {\n if (!this._calledFromSave) {\n throw new Error(\"utilisation invalide de _update, utilisez save\");\n }\n\n if (payload.id) delete payload.id;\n\n // si le texte est vide, on met un espace pour que le champ soit pris en compte car sur le serveur\n // il y a une vérification de la taille du texte je pense\n if(payload?.text === \"\"){\n payload.text = \" \";\n }\n \n payload.parentId = this.parent.id;\n payload.parentType = this.parent.getEntityType();\n payload.idNews = this.id;\n\n let hasChanged = false;\n const data = await this.callIsConnected(() => this.endpointApi.updateNews(payload));\n // TODO : voir si j'ai ce qui faut dans data de UPDATE_NEWS pour mettre à jour #serverData\n // c'est dans data.object\n if(data?.object){\n this._serverData = { ...data.object };\n }\n hasChanged = true;\n return hasChanged;\n\n // if (payload.id) delete payload.id;\n // let hasChanged = false;\n\n // for (const [constant, methodName] of News.UPDATE_BLOCKS) {\n // const blockData = this._extractChangedFieldsFromSchema(\n // this.apiClient,\n // constant,\n // { ...payload, ...this.defaultFields },\n // () => this.initialDraftData,\n // this.removeFields\n // );\n // if (blockData && Object.keys(blockData).length > 0) {\n // await this[methodName](blockData);\n // hasChanged = true;\n // }\n // }\n\n // return hasChanged;\n }\n\n async addNews(data = {}) {\n return this.callIsConnected(() => this.endpointApi.addNews(data));\n }\n\n async updateNews(data = {}) {\n return this.callIsConnected(() => this.endpointApi.updateNews(data));\n }\n\n async addMention({ slug, id }) {\n try {\n if (!slug && !id) {\n throw new ApiError(\"Vous devez fournir un slug ou un id pour ajouter une mention.\");\n }\n\n const userInstance = await this.entity(\"citoyens\", { id, slug });\n // const userInstance = new this.deps.User(this.apiClient, { id, slug }, { EndpointApi: this.endpointApi });\n const user = userInstance.serverData;\n\n if (!this._draftData.mentions) {\n this._draftData.mentions = [];\n }\n // Vérification si la mention existe déjà\n if (this._draftData.mentions.find((mention) => mention.id === user.id)) {\n // Si la mention existe déjà, on incrémente le compteur\n this._draftData.mentions = this._draftData.mentions.map((mention) => {\n if (mention.id === user.id) {\n mention.count += 1;\n }\n return mention;\n });\n return this._draftData.mentions;\n }\n const mention = { id: user.id, slug: user.slug, type: userInstance.getEntityType(), name: user.name, value: user.name, count: 1 };\n this._draftData.mentions.push(mention);\n return this._draftData.mentions;\n } catch (error) {\n this.apiClient._logger.error(\"Erreur lors de l'ajout de la mention :\", error);\n throw error;\n }\n\n }\n\n \n /**\n * Ajouter une image à une actualité : Ajoute une images à une actualité.\n * Constant : ADD_IMAGE_NEWS\n */\n async addImage(image) {\n image = await this._validateImage(image);\n const data = { pathParams: { folder: this.parent.getEntityType(), ownerId: this.parent.id }, newsImage: image };\n const dataImage = await this.callIsConnected(() => this.endpointApi.addImageNews(data));\n if (this._draftData.mediaImg) {\n this._draftData.mediaImg.countImages = this._draftData.mediaImg.countImages + 1;\n this._draftData.mediaImg.images.push(dataImage.id);\n } else {\n this._draftData.mediaImg = { countImages: 1, images: [dataImage.id] };\n }\n return dataImage;\n }\n\n /**\n * Ajouter un fichier à une actualité : Ajoute un fichier à une actualité.\n * Constant : ADD_FILE_NEWS\n */\n async addFile(file) {\n file = await this._validateFile(file);\n const data = { pathParams: { folder: this.parent.getEntityType(), ownerId: this.parent.id }, newsFile: file };\n const dataFile = await this.callIsConnected(() =>this.endpointApi.addFileNews(data));\n if (this._draftData.mediaFile) {\n this._draftData.mediaFile.countFiles = this._draftData.mediaFile.countFiles + 1;\n this._draftData.mediaFile.files.push(dataFile);\n } else {\n this._draftData.mediaFile = { countFiles: 1, files: [dataFile] };\n }\n return dataFile;\n }\n\n /**\n * Supprimer une actualité : Supprime une actualité existante.\n * Constant : DELETE_NEWS\n */\n async delete() {\n if(!this.id) {\n throw new ApiError(\"Vous devez fournir un id pour supprimer une news.\");\n }\n const data = { pathParams: { id: this.id } };\n await this.callIsConnected(() => this.endpointApi.deleteNews(data));\n this._draftData = {};\n this._serverData = null;\n this._draftData.id = null;\n this._isDeleted = true;\n }\n \n\n}\n","import { ApiError } from \"../error.js\";\nimport BaseEntity from \"./BaseEntity.js\";\n\nexport class Organization extends BaseEntity {\n static entityType = \"organizations\";\n\n static entityTag = \"Organization\";\n\n static SCHEMA_CONSTANTS = [\n \"ADD_ORGANIZATION\",\n \"UPDATE_BLOCK_DESCRIPTION\",\n \"UPDATE_BLOCK_INFO\",\n \"UPDATE_BLOCK_SOCIAL\",\n \"UPDATE_BLOCK_LOCALITY\",\n \"UPDATE_BLOCK_SLUG\",\n \"PROFIL_IMAGE\"\n ];\n\n static ADD_BLOCKS = new Map([\n [\"ADD_ORGANIZATION\", \"addOrganization\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n static UPDATE_BLOCKS = new Map([\n [\"UPDATE_BLOCK_DESCRIPTION\", \"updateDescription\"],\n [\"UPDATE_BLOCK_SOCIAL\", \"updateSocial\"],\n [\"UPDATE_BLOCK_LOCALITY\", \"updateLocality\"],\n [\"UPDATE_BLOCK_INFO\", \"updateInfo\"],\n [\"UPDATE_BLOCK_SLUG\", \"updateSlug\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n defaultFields = {\n typeElement: this.getEntityType()\n };\n\n removeFields = [\n \"typeElement\"\n ];\n\n // role = admin c'est bizarre car en faite c'est gérer dans links sur user et l'orga\n // links.members.${this.userId}.isAdmin === true\n transforms = {\n github: (val, full) => full?.socialNetwork?.github,\n gitlab: (val, full) => full?.socialNetwork?.gitlab,\n facebook: (val, full) => full?.socialNetwork?.facebook,\n twitter: (val, full) => full?.socialNetwork?.twitter,\n instagram: (val, full) => full?.socialNetwork?.instagram,\n diaspora: (val, full) => full?.socialNetwork?.diaspora,\n mastodon: (val, full) => full?.socialNetwork?.mastodon,\n telegram: (val, full) => full?.socialNetwork?.telegram,\n signal: (val, full) => full?.socialNetwork?.signal\n };\n\n async _add(payload) {\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _add, utilisez save\");\n }\n\n payload.id = this._newId?.();\n if (payload.slug) delete payload.slug;\n\n for (const [constant, methodName] of Organization.ADD_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => {}\n );\n if (blockData && Object.keys(blockData).length > 0) {\n const data = await this[methodName](blockData);\n if (!this.id && data?.map?.id) {\n this._draftData.id = data.map.id;\n this._draftData.slug = data.map.slug;\n }\n }\n }\n }\n\n async _update(payload) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour modifier cette organisation\", 403);\n }\n\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _update, utilisez save\");\n }\n\n if (payload.id) delete payload.id;\n let hasChanged = false;\n\n for (const [constant, methodName] of Organization.UPDATE_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => this.initialDraftData,\n this.removeFields\n );\n if (blockData && Object.keys(blockData).length > 0) {\n await this[methodName](blockData);\n hasChanged = true;\n }\n }\n\n return hasChanged;\n }\n\n async addOrganization(data = {}) {\n return this.callIsConnected(() => this.endpointApi.addOrganization(data));\n }\n\n\n async getOrganizations() {\n throw new ApiError(\"getOrganizations n'existe pas dans Organization\");\n }\n\n async getProjects(data = {}) {\n return super.getProjects(data);\n }\n\n async getEvents() {\n throw new ApiError(\"getEvents pas encore implémenté dans Organization\");\n }\n\n async getPois(data = {}) {\n return super.getPois(data);\n }\n\n async getBadgesIssuer(data = {}) {\n return super.getBadgesIssuer(data);\n }\n\n async getNews(data = {}) {\n return super.getNews(data);\n }\n\n async getSubscribers(data = {}) {\n return super.getSubscribers(data);\n }\n\n /**\n * Récupérer les membres de l'organisation.\n * Constant : GET_MEMBERS_ADMIN / GET_MEMBERS_NO_ADMIN\n * @param {Object} data - Les données de requête.\n * @param {Object} options - Options supplémentaires.\n * @param {boolean} options.toBeValidated - Indique si les membres doivent être validés.\n * @param {boolean} options.isAdmin - Indique si l'utilisateur est admin.\n * @param {boolean} options.isAdminPending - Indique si l'utilisateur est en attente de validation pour être admin.\n * @param {boolean} options.isInviting - Indique si l'utilisateur est en attente d'invitation.\n * @param {Array} options.roles - Liste des rôles à filtrer.\n * @param {boolean} isNext - Indique si c'est une recherche suivante (pagination).\n * @returns {Promise<Object>} - Un objet contenant le nombre de membres et la liste des membres.\n * @throws {ApiResponseError} - Si une erreur se produit lors de la récupération des contributeurs.\n * \n * @example\n * // Récupérer tous les membres\n * const members = await organization.getMembers();\n * \n * // Récupérer les membres avec validation en attente\n * const membersToBeValidated = await organization.getMembers({}, { toBeValidated: true });\n * \n * // Récupérer les membres avec un rôle spécifique\n * const membersWithRole = await organization.getMembers({}, { roles: ['admin'] });\n * \n * // Récupérer les membres en attente d'invitation\n * const invitingMembers = await organization.getMembers({}, { isInviting: true });\n * \n * // Récupérer les membres admin\n * const adminMembers = await organization.getMembers({}, { isAdmin: true });\n * \n * // Récupérer les membres admin et en attente d'invitation\n * const adminInvitingMembers = await organization.getMembers({}, { isAdmin: true, isInviting: true });\n * \n * // Récupérer les membres avec validation en attente et admin\n * const adminToBeValidatedMembers = await organization.getMembers({}, { toBeValidated: true, isAdmin: true });\n * \n * // Récupérer les membres en attente de validation pour être admin\n * const adminPendingMembers = await organization.getMembers({}, { isAdminPending: true });\n * \n * \n */\n async getMembers(data = {}, options = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_MEMBERS_ADMIN\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n\n const { toBeValidated, isAdmin, isAdminPending, isInviting, roles = [] } = options;\n\n if(this.isMe){\n finalData.pathParams = { type: this.getEntityType(), id: this.id };\n // finalData.filters = {\n // [`links.memberOf.${this.id}`]: { \"$exists\": true },\n // [`links.memberOf.${this.id}.toBeValidated`]: { \"$exists\": false },\n // [`links.memberOf.${this.id}.isInviting`]: { \"$exists\": false }\n // };\n finalData.filters = this._buildLinkFilters(this.id, { linkType: \"memberOf\", toBeValidated, isAdmin, isAdminPending, isInviting, roles });\n } else {\n delete finalData?.pathParams;\n finalData.filters = this._buildLinkFilters(this.id, { linkType: \"memberOf\", toBeValidated: false, isAdmin, isInviting, roles });\n }\n \n const fetchFn = this.isMe\n ? () => this.callIsMe(() => this.endpointApi.getMembersAdmin(finalData))\n : () => this.endpointApi.getMembersNoAdmin(finalData);\n\n return fetchFn();\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupère la galerie de l'organisation.\n *\n * @param {Object} data - Les données de requête.\n * @returns {Promise<Object>} - Un objet contenant les éléments de la galerie.\n * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getGallery(data = {}) {\n return super.getGallery(data);\n }\n\n /**\n * Crée une instance de projet et récupère son profil si nécessaire.\n *\n * @param {Object} projectData - Les données nécessaires pour initialiser le projet.\n * @returns {Promise<Project>} Une promesse qui résout l'objet Projet créé.\n * @throws {Error} Si une erreur se produit lors de la création du projet.\n */\n async project(projectData = {}) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour créer un projet dans cette organisation\", 403);\n }\n return super.project(projectData);\n }\n\n /**\n * Crée une instance de POI et la récupère si nécessaire.\n * \n * @param {Object} poiData - Les données nécessaires pour initialiser le POI.\n * @returns {Promise<Poi>} Une promesse qui résout l'objet POI créé.\n * @throws {Error} Si une erreur se produit lors de la création du POI.\n */\n async poi(poiData = {}) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour créer un poi dans cette organisation\", 403);\n }\n return super.poi(poiData);\n }\n\n /**\n * Crée une instance d'événement et la récupère si nécessaire.\n * \n * @param {Object} eventData - Les données nécessaires pour initialiser l'événement.\n * @returns {Promise<Event>} Une promesse qui résout l'objet Événement créé.\n * @throws {Error} Si une erreur se produit lors de la création de l'événement.\n */\n async event(eventData = {}) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour créer un event dans cette organisation\", 403);\n }\n return super.event(eventData);\n }\n\n /**\n * Crée une instance de badge et la récupère si nécessaire.\n * \n * @param {Object} badgeData - Les données nécessaires pour initialiser le badge.\n * @returns {Promise<Badge>} Une promesse qui résout l'objet Badge créé.\n * @throws {Error} Si une erreur se produit lors de la création du badge.\n */\n async badge(badgeData = {}) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour créer un badge dans cette organisation\", 403);\n }\n return super.badge(badgeData);\n }\n\n /**\n * Crée une instance de news et la récupère si nécessaire.\n * \n * @param {Object} newsData - Les données nécessaires pour initialiser la news.\n * @returns {Promise<News>} Une promesse qui résout l'objet News créé.\n * @throws {Error} Si une erreur se produit lors de la création de la news.\n */\n async news(newsData = {}) {\n // TODO: qui peut créer une news sur l'organisation ?\n return super.news(newsData);\n }\n \n /**\n * ───────────────────────────────\n * Lien utilisateur ↔ organisation\n * (rejoindre, valider, quitter, devenir admin)\n * ───────────────────────────────\n */\n\n\n /**\n * Envoie une demande pour rejoindre l'organisation en tant que membre.\n * L'action est soumise à validation par un administrateur de l'organisation.\n *\n * @returns {Promise<Object>} - Résultat de la requête d'adhésion.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité ne supporte pas l'action.\n */\n async requestToJoin(){\n return super.requestToJoin();\n }\n\n /**\n * Envoie une demande pour rejoindre l'organisation en tant qu'administrateur.\n * L'action est soumise à validation par un administrateur existant.\n *\n * @returns {Promise<Object>} - Résultat de la requête d'administration.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité ne supporte pas l'action.\n */\n async requestToJoinAdmin(){\n return super.requestToJoinAdmin();\n }\n\n /**\n * Accepte une invitation à rejoindre l'organisation.\n * Cette action valide un lien en attente avec l'option `isInviting`.\n *\n * @returns {Promise<Object>} - Résultat de la validation du lien.\n * @throws {ApiError} - Si aucune invitation n'est en attente ou si l'entité ne supporte pas l'action.\n */\n async acceptInvitation(){\n return super.acceptInvitation();\n }\n\n /**\n * Quitte l'organisation, que ce soit en tant que membre ou administrateur.\n * Cette action supprime le lien entre l'utilisateur et l'organisation.\n *\n * @returns {Promise<Object>} - Résultat de la déconnexion.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou non membre.\n */\n async leave() {\n return super.leave();\n }\n\n /**\n * Suivre une organisation.\n * Cette action permet à l'utilisateur de suivre l'organisation.\n * \n * @returns {Promise<Object>} - Résultat de l'action de suivi.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité ne supporte pas l'action.\n */\n async follow() {\n return super.follow();\n }\n\n /**\n * Se désabonne d'une organisation.\n * \n * @returns {Promise<Object>} - Résultat de la désinscription.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité n'est pas enregistrée.\n */\n async unfollow() {\n return super.unfollow();\n }\n\n /**\n * ───────────────────────────────\n * costum\n * ───────────────────────────────\n */\n\n /**\n * Récupère le JSON personnalisé de l'organisation.\n * \n * @returns {Promise<Object>} - Le JSON personnalisé de l'organisation.\n * @throws {ApiError} - Si le slug de l'organisation n'est pas défini.\n */\n async getCostumJson() {\n return super.getCostumJson();\n }\n\n /**\n * recherche lié à l'organisation\n *\n * @param {Object} data - Les données de recherche.\n * @returns {Promise<Object>} - Résultat de la recherche.\n * @throws {ApiError} - Si le slug ou l'id de l'organisation n'est pas défini.\n */\n async searchCostum(data = {}) {\n return super.searchCostum(data);\n }\n\n}\n","import { ApiError } from \"../error.js\";\nimport BaseEntity from \"./BaseEntity.js\";\n\nexport class Poi extends BaseEntity {\n static entityType = \"poi\";\n\n static entityTag = \"Poi\";\n\n static SCHEMA_CONSTANTS = [\n \"ADD_POI\",\n \"UPDATE_BLOCK_DESCRIPTION\",\n \"UPDATE_BLOCK_INFO\",\n \"UPDATE_BLOCK_LOCALITY\",\n \"UPDATE_BLOCK_SLUG\",\n \"PROFIL_IMAGE\"\n ];\n\n static ADD_BLOCKS = new Map([\n [\"ADD_POI\", \"addPoi\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n static UPDATE_BLOCKS = new Map([\n [\"UPDATE_BLOCK_DESCRIPTION\", \"updateDescription\"],\n [\"UPDATE_BLOCK_LOCALITY\", \"updateLocality\"],\n [\"UPDATE_BLOCK_INFO\", \"updateInfo\"],\n [\"UPDATE_BLOCK_SLUG\", \"updateSlug\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n defaultFields = {\n typeElement: this.getEntityType()\n };\n\n removeFields = [\n \"typeElement\"\n ];\n\n transforms = {\n\n };\n\n async _add(payload) {\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _add, utilisez save\");\n }\n\n payload.id = this._newId?.();\n if (payload.slug) delete payload.slug;\n\n for (const [constant, methodName] of Poi.ADD_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => {}\n );\n if (blockData && Object.keys(blockData).length > 0) {\n const data = await this[methodName](blockData);\n if (!this.id && data?.map?.id) {\n this._draftData.id = data.map.id;\n this._draftData.slug = data.map.slug;\n }\n }\n }\n }\n\n async _update(payload) {\n if(!this.isAuthor()){\n throw new ApiError(\"Vous n'avez pas les droits pour modifier ce POI\", 403);\n }\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _update, utilisez save\");\n }\n\n if (payload.id) delete payload.id;\n let hasChanged = false;\n\n for (const [constant, methodName] of Poi.UPDATE_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => this.initialDraftData,\n this.removeFields\n );\n if (blockData && Object.keys(blockData).length > 0) {\n await this[methodName](blockData);\n hasChanged = true;\n }\n }\n\n return hasChanged;\n }\n\n async addPoi(data = {}) {\n\n if (!this.isMe) {\n data.parent = {};\n data.parent[`${this.parent.id}`] = {\n type: this.parent.getEntityType(),\n name: this.parent.name\n };\n }\n\n return this.callIsConnected(() => this.endpointApi.addPoi(data));\n }\n\n async getOrganizations() {\n throw new ApiError(`getOrganizations n'existe pas dans ${this.constructor.name}`);\n }\n\n async getProjects() {\n throw new ApiError(`getProjects n'existe pas dans ${this.constructor.name}`);\n }\n\n async getEvents() {\n throw new ApiError(`getEvents n'existe pas dans${this.constructor.name}`);\n }\n\n async getPois() {\n throw new ApiError(`getPois n'existe pas dans ${this.constructor.name}`);\n }\n\n async getBadgesIssuer() {\n throw new ApiError(`getBadgesIssuer n'existe pas dans ${this.constructor.name}`);\n }\n\n async getNews(data = {}) {\n return super.getNews(data);\n }\n\n async getSubscribers(data = {}) {\n return super.getSubscribers(data);\n }\n\n async project() {\n throw new ApiError(`project n'existe pas dans ${this.constructor.name}`);\n }\n\n async poi() {\n throw new ApiError(`poi n'existe pas dans ${this.constructor.name}`);\n }\n\n async event() {\n throw new ApiError(`event n'existe pas dans ${this.constructor.name}`);\n }\n\n async badge() {\n throw new ApiError(`badge n'existe pas dans ${this.constructor.name}`);\n }\n\n /**\n * Crée une instance de news et la récupère si nécessaire.\n * \n * @param {Object} newsData - Les données nécessaires pour initialiser la news.\n * @returns {Promise<News>} Une promesse qui résout l'objet News créé.\n * @throws {ApiError} Si une erreur se produit lors de la création de la news.\n */\n async news(newsData = {}) {\n return super.news(newsData);\n }\n\n /**\n * Suivre un POI.\n * Cette action permet à l'utilisateur de suivre un POI.\n * \n * @returns {Promise<Object>} - Résultat de l'action de suivi.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité ne supporte pas l'action.\n */\n async follow() {\n return super.follow();\n }\n\n /**\n * Se désabonne d'un POI.\n * \n * @returns {Promise<Object>} - Résultat de la désinscription.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité n'est pas enregistrée.\n */\n async unfollow() {\n return super.unfollow();\n }\n\n \n}\n","import { ApiError } from \"../error.js\";\nimport BaseEntity from \"./BaseEntity.js\";\n\nexport class Project extends BaseEntity {\n static entityType = \"projects\";\n\n static entityTag = \"Project\";\n\n static SCHEMA_CONSTANTS = [\n \"ADD_PROJECT\",\n \"UPDATE_BLOCK_DESCRIPTION\",\n \"UPDATE_BLOCK_INFO\",\n \"UPDATE_BLOCK_SOCIAL\",\n \"UPDATE_BLOCK_LOCALITY\",\n \"UPDATE_BLOCK_SLUG\",\n \"PROFIL_IMAGE\"\n ];\n\n static ADD_BLOCKS = new Map([\n [\"ADD_PROJECT\", \"addProject\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n static UPDATE_BLOCKS = new Map([\n [\"UPDATE_BLOCK_DESCRIPTION\", \"updateDescription\"],\n [\"UPDATE_BLOCK_SOCIAL\", \"updateSocial\"],\n [\"UPDATE_BLOCK_LOCALITY\", \"updateLocality\"],\n [\"UPDATE_BLOCK_INFO\", \"updateInfo\"],\n [\"UPDATE_BLOCK_SLUG\", \"updateSlug\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n defaultFields = {\n typeElement: this.getEntityType()\n };\n\n removeFields = [\n \"typeElement\"\n ];\n\n // links.contributors.${this.userId}.isAdmin === true\n transforms = {\n github: (val, full) => full?.socialNetwork?.github,\n gitlab: (val, full) => full?.socialNetwork?.gitlab,\n facebook: (val, full) => full?.socialNetwork?.facebook,\n twitter: (val, full) => full?.socialNetwork?.twitter,\n instagram: (val, full) => full?.socialNetwork?.instagram,\n diaspora: (val, full) => full?.socialNetwork?.diaspora,\n mastodon: (val, full) => full?.socialNetwork?.mastodon,\n telegram: (val, full) => full?.socialNetwork?.telegram,\n signal: (val, full) => full?.socialNetwork?.signal,\n parent: (val) => {\n if (!val || typeof val !== \"object\") return null;\n \n return Object.fromEntries(\n Object.entries(val).map(([key, obj]) => [\n key,\n {\n type: obj?.type ?? null,\n name: obj?.name ?? null\n }\n ])\n );\n }\n };\n\n async _add(payload) {\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _add, utilisez save\");\n }\n\n payload.id = this._newId?.();\n if (payload.slug) delete payload.slug;\n\n for (const [constant, methodName] of Project.ADD_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => {}\n );\n if (blockData && Object.keys(blockData).length > 0) {\n const data = await this[methodName](blockData);\n if (!this.id && data?.map?.id) {\n this._draftData.id = data.map.id;\n this._draftData.slug = data.map.slug;\n }\n }\n }\n }\n\n async _update(payload) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour modifier ce projet\", 403);\n }\n\n if (!this._calledFromSave) {\n throw new ApiError(\"utilisation invalide de _update, utilisez save\");\n }\n\n if (payload.id) delete payload.id;\n let hasChanged = false;\n\n for (const [constant, methodName] of Project.UPDATE_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields },\n () => this.initialDraftData,\n this.removeFields\n );\n if (blockData && Object.keys(blockData).length > 0) {\n await this[methodName](blockData);\n hasChanged = true;\n }\n }\n\n return hasChanged;\n }\n\n async addProject(data = {}) {\n\n // le parent n'est pas me donc on doit ajouter le parent\n if (!this.isMe) {\n data.parent = {};\n data.parent[`${this.parent.id}`] = {\n type: this.parent.getEntityType(),\n name: this.parent.name\n };\n }\n\n return this.callIsConnected(() => this.endpointApi.addProject(data));\n }\n\n async getOrganizations() {\n throw new ApiError(`getOrganizations n'existe pas dans ${this.constructor.name}`);\n }\n\n async getProjects(data = {}) {\n return super.getProjects(data);\n }\n\n async getEvents() {\n throw new ApiError(`getEvents pas encore implémenté dans ${this.constructor.name}`);\n }\n\n async getPois(data = {}) {\n return super.getPois(data);\n }\n\n async getBadgesIssuer(data = {}) {\n return super.getBadgesIssuer(data);\n }\n\n async getNews(data = {}) {\n return super.getNews(data);\n }\n\n async getSubscribers(data = {}) {\n return super.getSubscribers(data);\n }\n\n /**\n * Récupérer les contributeurs d'un projet.\n * Constant : GET_CONTRIBUTORS_ADMIN / GET_CONTRIBUTORS_NO_ADMIN\n * @param {Object} data - Les données de requête.\n * @param {Object} options - Options supplémentaires.\n * @param {boolean} options.toBeValidated - Indique si les contributeurs doivent être validés.\n * @param {boolean} options.isAdmin - Indique si l'utilisateur est admin.\n * @param {boolean} options.isInviting - Indique si l'utilisateur est en attente d'invitation.\n * @param {Array} options.roles - Liste des rôles à filtrer.\n * @param {boolean} isNext - Indique si c'est une recherche suivante (pagination).\n * @returns {Promise<Object>} - Un objet contenant le nombre de contributeurs et la liste des contributeurs.\n * @throws {ApiResponseError} - Si une erreur se produit lors de la récupération des contributeurs.\n * \n * @example\n * // Récupérer tous les contributeurs\n * const contributors = await project.getContributors();\n * \n * // Récupérer les contributeurs avec validation en attente\n * const contributorsToBeValidated = await project.getContributors({}, { toBeValidated: true });\n * \n * // Récupérer les contributeurs avec un rôle spécifique\n * const contributorsWithRole = await project.getContributors({}, { roles: [\"admin\"] });\n * \n * // Récupérer les contributeurs administrateurs\n * const adminContributors = await project.getContributors({}, { isAdmin: true });\n * \n * // Récupérer les contributeurs en attente d'invitation\n * const invitingContributors = await project.getContributors({}, { isInviting: true });\n * \n */\n async getContributors(data = {}, options = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_CONTRIBUTORS_ADMIN\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n\n const { toBeValidated, isAdmin, isInviting, isAdminPending, roles = [] } = options;\n\n if(this.isMe){\n finalData.pathParams = { type: this.getEntityType(), id: this.id };\n // NOTE : dans le schema je crois que si pas de finalData.filters alors le default ce fait avec finalData.pathParams\n // finalData.filters = {\n // [`links.projects.${this.id}`]: { \"$exists\": true },\n // [`links.projects.${this.id}.toBeValidated`]: { \"$exists\": false },\n // [`links.projects.${this.id}.isInviting`]: { \"$exists\": false }\n // };\n finalData.filters = this._buildLinkFilters(this.id, { linkType: \"projects\", toBeValidated, isAdmin, isAdminPending, isInviting, roles });\n } else {\n delete finalData?.pathParams;\n finalData.filters = this._buildLinkFilters(this.id, { linkType: \"projects\", toBeValidated: false, isAdmin, isInviting, roles });\n }\n \n const fetchFn = this.isMe\n ? () => this.callIsMe(() => this.endpointApi.getContributorsAdmin(finalData))\n : () => this.endpointApi.getContributorsNoAdmin(finalData);\n\n return fetchFn();\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupère la galerie d'un projet.\n * \n * @param {Object} data - Les données de requête pour la galerie.\n * @returns {Promise<Object>} - Un objet contenant les images de la galerie.\n * @throws {ApiResponseError} - Si une erreur se produit lors de la récupération de la galerie.\n * @throws {Error} - En cas d'erreur inattendue.\n */\n async getGallery(data = {}) {\n return super.getGallery(data);\n }\n\n /**\n * Crée une instance de projet et récupère son profil si nécessaire.\n *\n * @param {Object} projectData - Les données nécessaires pour initialiser le projet.\n * @returns {Promise<Project>} Une promesse qui résout l'objet Projet créé.\n * @throws {Error} Si une erreur se produit lors de la création du projet.\n */\n async project(projectData = {}) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour créer un projet dans ce projet\", 403);\n }\n return super.project(projectData);\n }\n\n /**\n * Crée une instance de POI et la récupère si nécessaire.\n * \n * @param {Object} poiData - Les données nécessaires pour initialiser le POI.\n * @returns {Promise<Poi>} Une promesse qui résout l'objet POI créé.\n * @throws {Error} Si une erreur se produit lors de la création du POI.\n */\n async poi(poiData = {}) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour créer un POI dans ce projet\", 403);\n }\n return super.poi(poiData);\n }\n\n /**\n * Crée une instance d'événement et la récupère si nécessaire.\n * \n * @param {Object} eventData - Les données nécessaires pour initialiser l'événement.\n * @returns {Promise<Event>} Une promesse qui résout l'objet Événement créé.\n * @throws {Error} Si une erreur se produit lors de la création de l'événement.\n */\n async event(eventData = {}) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour créer un événement dans ce projet\", 403);\n }\n return super.event(eventData);\n }\n\n /**\n * Crée une instance de badge et la récupère si nécessaire.\n * \n * @param {Object} badgeData - Les données nécessaires pour initialiser le badge.\n * @returns {Promise<Badge>} Une promesse qui résout l'objet Badge créé.\n * @throws {Error} Si une erreur se produit lors de la création du badge.\n */\n async badge(badgeData = {}) {\n if(!this.isAdmin()){\n throw new ApiError(\"Vous n'avez pas les droits pour créer un badge dans ce projet\", 403);\n }\n return super.badge(badgeData);\n }\n\n /**\n * Crée une instance de news et la récupère si nécessaire.\n * \n * @param {Object} newsData - Les données nécessaires pour initialiser la news.\n * @returns {Promise<News>} Une promesse qui résout l'objet News créé.\n * @throws {Error} Si une erreur se produit lors de la création de la news.\n */\n async news(newsData = {}) {\n // TODO: qui peut créer une news sur le projet ?\n return super.news(newsData);\n }\n\n /**\n * ───────────────────────────────\n * Lien utilisateur ↔ projet\n * (rejoindre, valider, quitter, devenir admin)\n * ───────────────────────────────\n */\n\n /**\n * Envoie une demande pour rejoindre le projet en tant que contributeur.\n * L'action est soumise à validation par un administrateur du projet.\n *\n * @returns {Promise<Object>} - Résultat de la requête d'adhésion.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si le projet ne supporte pas l'action.\n */\n async requestToJoin(){\n return super.requestToJoin();\n }\n\n /**\n * Envoie une demande pour devenir administrateur du projet.\n * L'action est soumise à validation par un administrateur existant.\n *\n * @returns {Promise<Object>} - Résultat de la requête d'administration.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si le projet ne supporte pas l'action.\n */\n async requestToJoinAdmin(){\n return super.requestToJoinAdmin();\n }\n\n /**\n * Accepte une invitation à rejoindre le projet.\n * Cette action valide un lien en attente avec l'option `isInviting`.\n *\n * @returns {Promise<Object>} - Résultat de la validation du lien.\n * @throws {ApiError} - Si aucune invitation n'est en attente ou si le projet ne supporte pas l'action.\n */\n async acceptInvitation(){\n return super.acceptInvitation();\n }\n\n /**\n * Quitte le projet, que ce soit en tant que contributeur ou administrateur.\n * Cette action supprime le lien entre l'utilisateur et le projet.\n *\n * @returns {Promise<Object>} - Résultat de la déconnexion.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou non contributeur.\n */\n async leave() {\n return super.leave();\n }\n\n /**\n * Suivre un projet.\n * Cette action permet à l'utilisateur de suivre le projet.\n * \n * @returns {Promise<Object>} - Résultat de l'action de suivi.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité ne supporte pas l'action.\n */\n async follow() {\n return super.follow();\n }\n\n /**\n * Se désabonne d'un projet.\n * \n * @returns {Promise<Object>} - Résultat de la désinscription.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité n'est pas enregistrée.\n */\n async unfollow() {\n return super.unfollow();\n }\n\n}\n","import { ApiError } from \"../error.js\";\nimport BaseEntity from \"./BaseEntity.js\";\nimport { UserMixin } from \"../mixin/UserMixin.js\";\n\n// User.js\nexport class User extends BaseEntity {\n\n static entityType = \"citoyens\";\n\n static entityTag = \"User\";\n\n static SCHEMA_CONSTANTS = [\n \"UPDATE_BLOCK_DESCRIPTION\",\n \"UPDATE_BLOCK_INFO\",\n \"UPDATE_BLOCK_SOCIAL\",\n \"UPDATE_BLOCK_LOCALITY\",\n \"UPDATE_BLOCK_SLUG\",\n \"PROFIL_IMAGE\"\n ];\n\n static UPDATE_BLOCKS = new Map([\n [\"UPDATE_BLOCK_DESCRIPTION\", \"updateDescription\"],\n [\"UPDATE_BLOCK_SOCIAL\", \"updateSocial\"],\n [\"UPDATE_BLOCK_LOCALITY\", \"updateLocality\"],\n [\"UPDATE_BLOCK_INFO\", \"updateInfo\"],\n [\"UPDATE_BLOCK_SLUG\", \"updateSlug\"],\n [\"PROFIL_IMAGE\", \"updateImageProfil\"]\n ]);\n\n defaultFields = {\n typeElement: this.getEntityType(), \n };\n \n removeFields = [\n \"typeElement\",\n ];\n \n transforms = {\n github: (val, full) => full?.socialNetwork?.github,\n gitlab: (val, full) => full?.socialNetwork?.gitlab,\n facebook: (val, full) => full?.socialNetwork?.facebook,\n twitter: (val, full) => full?.socialNetwork?.twitter,\n instagram: (val, full) => full?.socialNetwork?.instagram,\n diaspora: (val, full) => full?.socialNetwork?.diaspora,\n mastodon: (val, full) => full?.socialNetwork?.mastodon,\n telegram: (val, full) => full?.socialNetwork?.telegram,\n signal: (val, full) => full?.socialNetwork?.signal\n };\n \n /**\n * Crée une instance de User.\n *\n * @param {ApiClient} apiClient - Le client API connecté.\n * @param {Object} data - Données initiales (peuvent inclure `id`, `slug`, etc.).\n * @param {string} [data.id] - ID de l'utilisateur.\n * @param {string} [data.slug] - Slug de l'utilisateur.\n * @param {Object} deps - Dépendances injectées.\n * @param {function|object} deps.EndpointApi - Classe ou instance de EndpointApi.\n * @param {function} deps.Organization - Classe Organization.\n * @param {function} deps.Project - Classe Project.\n * @param {function} deps.Event - Classe Events.\n * @param {function} deps.Poi - Classe Poi.\n * @param {function} deps.Badge - Classe Badge.\n * @param {function} deps.News - Classe News.\n *\n * @throws {ApiError} - Si des dépendances nécessaires sont manquantes ou invalides.\n */\n\n constructor(parent, data = {}, deps = {}) {\n if(!deps.EndpointApi){\n throw new ApiError(\"EndpointApi class must be injected to avoid circular dependency.\");\n }\n if (!data?.id && !data?.slug) {\n throw new ApiError(\"Vous devez fournir un id ou un slug pour créer un User.\");\n }\n\n if (!deps.Organization) throw new ApiError(\"Organization class must be injected.\");\n if (!deps.Project) throw new ApiError(\"Project class must be injected.\");\n if (!deps.Event) throw new ApiError(\"Event class must be injected.\");\n if (!deps.Poi) throw new ApiError(\"Poi class must be injected.\");\n if (!deps.Badge) throw new ApiError(\"Badge class must be injected.\");\n if (!deps.News) throw new ApiError(\"News class must be injected.\");\n \n super(parent, data, deps);\n }\n\n get slug() {\n return this._draftData.slug || null;\n }\n \n get isMe() {\n return this.isConnected && this.userId === this.id;\n }\n\n get parentIsMe() {\n return super.isMe;\n }\n\n get isActingUser() {\n return this.parentIsMe && !this.isMe;\n }\n\n /**\n * Récupère le profil complet de l'utilisateur.\n * Si l'utilisateur est connecté, on appelle le endpoint ME_INFO_URL,\n * sinon, on peut imaginer appeler un endpoint public.\n *\n * @returns {Promise<Object>} Le profil complet.\n */\n async get() {\n return this.apiClient.safeCall(async () => {\n if (this.isMe) {\n const data = await this.endpointApi.meInfoUrl();\n this._setData(data);\n return data;\n } else {\n const data = await this._getPublicProfile();\n this._setData(data);\n return data;\n }\n });\n }\n\n /**\n * Changer le mot de passe : Permet de changer le mot de passe d'un utilisateur.\n * Constant : CHANGE_PASSWORD\n */\n async changePassword(data = {}) {\n return this.callIsMe(() => this.endpointApi.changePassword(data));\n }\n\n /**\n * Supprimer un compte : Permet de supprimer un compte utilisateur.\n * Constant : DELETE_ACCOUNT\n */\n async delete(data = {}) {\n return this.callIsMe(() => this.endpointApi.deleteAccount(data));\n }\n \n /**\n * Sauvegarde les modifications de l'utilisateur en appelant les endpoints correspondants.\n * Seul l'utilisateur connecté peut se modifier lui-même.\n *\n * @returns {Promise<Object>} - Données serveur mises à jour si applicable.\n * @throws {ApiError} - Si l'utilisateur n'est pas autorisé.\n */\n async save() {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour sauvegarder.\");\n }\n await super.save();\n }\n\n async _add() {\n throw new ApiError(\"Vous ne pouvez pas ajouter un utilisateur par ce moyen.\");\n }\n\n /**\n * Met à jour les blocs modifiés de l'utilisateur via les constantes de schéma définies.\n *\n * @param {Object} payload - Données courantes à comparer et envoyer.\n * @returns {Promise<boolean>} - Indique s'il y a eu une modification réelle.\n */\n async _update(payload){\n if (!this._calledFromSave) {\n throw new Error(\"utilisation invalide de _update, utilisez save\");\n }\n\n if(payload.id){\n delete payload.id;\n }\n\n let hasChanged = false;\n\n // Sinon, on fait les updates en blocs\n for (const [constant, methodName] of User.UPDATE_BLOCKS) {\n const blockData = this._extractChangedFieldsFromSchema(\n this.apiClient,\n constant,\n { ...payload, ...this.defaultFields},\n () => this.initialDraftData,\n this.removeFields\n );\n if (blockData && Object.keys(blockData).length > 0) {\n await this[methodName](blockData);\n hasChanged = true;\n }\n }\n \n return hasChanged;\n }\n\n static fromServerData(data, parent, deps) {\n const instance = new User(parent.apiClient, data, deps);\n if (typeof data === \"object\" || Object.keys(data).length > 0) {\n instance._setData(data);\n }\n return instance;\n }\n\n /**\n * Mettre à jour les paramètres utilisateur : Mise à jour des paramètres spécifiques d'un utilisateur.\n * Constant : UPDATE_SETTINGS\n * @param {Object} data - Données à mettre à jour.\n * @param {\"birthDate\"|\"email\"|\"locality\"|\"phone\"|\"directory\"} data.type - Type de paramètre à mettre à jour.\n * @param {\"private\"|\"public\"|\"mask\"} data.value - Nouvelle valeur du paramètre.\n * @returns {Promise<void>} - Résultat de la mise à jour.\n */\n async updateSettings(data = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour mettre à jour les paramètres.\");\n }\n await super.updateSettings(data);\n await this.refresh();\n }\n\n /**\n * Mettre à jour la description d'un élément : Permet de mettre à jour la description courte et complète d'un élément.\n * Constant : UPDATE_BLOCK_DESCRIPTION\n */\n async updateDescription(data = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour mettre à jour la description.\");\n }\n return super.updateDescription(data);\n }\n \n /**\n * Mettre à jour les informations d'un élément : Permet de mettre à jour les informations générales d'un élément (nom, contacts, etc.).\n * Constant : UPDATE_BLOCK_INFO\n */\n async updateInfo(data = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour mettre à jour les informations.\");\n }\n return super.updateInfo(data);\n }\n \n /**\n * Mettre à jour les réseaux sociaux d'un élément : Permet de mettre à jour les liens vers les réseaux sociaux d'un élément.\n * Constant : UPDATE_BLOCK_SOCIAL\n */\n async updateSocial(data = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour mettre à jour les réseaux sociaux.\");\n }\n return super.updateSocial(data);\n }\n \n /**\n * Mettre à jour les localités d'un élément : Permet de mettre à jour l'adresse et les informations géographiques d'un élément.\n * Constant : UPDATE_BLOCK_LOCALITY\n */\n async updateLocality(data = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour mettre à jour la localité.\");\n }\n return super.updateLocality(data);\n }\n \n /**\n * Mettre à jour le slug d'un élément : Permet de mettre à jour le slug pour une URL simplifiée.\n * Constant : UPDATE_BLOCK_SLUG\n */\n async updateSlug({ slug }) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour mettre à jour le slug.\");\n }\n return super.updateSlug({ slug });\n }\n\n /**\n * Mettre à jour l'image de profil : Permet de mettre à jour l'image de profil d'un utilisateur ou d'une entité.\n * Constant : PROFIL_IMAGE\n */\n async updateImageProfil({ profil_avatar: image }) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour mettre à jour l'image de profil.\");\n }\n return super.updateImageProfil({ profil_avatar: image });\n }\n \n /**\n * Récupérer les organisations d'un utilisateur : Récupère la liste des organisations auxquelles l'utilisateur appartient.\n * Constant : GET_ORGANIZATIONS_ADMIN | GET_ORGANIZATIONS_NO_ADMIN\n */\n async getOrganizations(data = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_ORGANIZATIONS_NO_ADMIN\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n delete finalData?.pathParams;\n\n const fetchFn = this.isMe\n ? () => this.callIsMe(() => this.endpointApi.getOrganizationsAdmin(finalData))\n : () => this.endpointApi.getOrganizationsNoAdmin(finalData);\n \n if (!this.isMe && !finalData.filters) {\n finalData.filters = {\n [`links.members.${this.id}`]: { \"$exists\": true },\n [`links.members.${this.id}.toBeValidated`]: { \"$exists\": false },\n [`links.members.${this.id}.isInviting`]: { \"$exists\": false }\n };\n }\n\n return fetchFn();\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupérer les projets d'un utilisateur : Récupère la liste des projets auxquels l'utilisateur contribue.\n * Constant : GET_PROJECTS_ADMIN | GET_PROJECTS_NO_ADMIN\n */\n async getProjects(data = {}) {\n return super.getProjects(data);\n }\n\n /**\n * Récupérer les POIs\n * Constant : GET_POIS_NO_ADMIN / GET_POIS_ADMIN\n */\n async getPois(data = {}) {\n return super.getPois(data);\n }\n\n /**\n * Récupérer les actualités : Récupère la liste des actualités liées à l'utilisateur.\n * Constant : GET_NEWS\n */\n async getNews(data = {}) {\n return super.getNews(data);\n }\n\n /**\n * Récupérer les amis administrables : Récupère les amis administrée par l’utilisateur.\n * Constant : GET_FRIENDS_ADMIN\n * question : qui peut voir la liste d'amis, seulement l'utilisateur connecté ? ou tous les utilisateurs connectés ?\n * actuellement, c'est tous les utilisateurs connectés\n */\n async getFriends(data = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_FRIENDS_ADMIN\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n\n delete finalData?.pathParams;\n \n if (!this.isMe){\n // is not me add id\n finalData.pathParams = { id: this.id };\n }\n\n return this.endpointApi.getFriendsAdmin(finalData);;\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupérer les suivis\n * Constant : GET_SUBSCRIPTIONS / GET_SUBSCRIPTIONS_ADMIN\n */\n async getSubscriptions(data = {}) {\n data.searchType = this._getDefaultFromEndpoint(\"GET_SUBSCRIPTIONS\", \"searchType\");\n // data.searchBy = \"ALL\";\n\n const paginator = this._createPaginatorEngine({\n initialData: data,\n finalizer: async (finalData) => {\n\n delete finalData?.pathParams;\n \n const fetchFn = this.isMe\n ? () => this.callIsMe(() => this.endpointApi.getSubscriptionsAdmin(finalData))\n : () => this.endpointApi.getSubscriptions(finalData);\n \n if (!this.isMe && !finalData.filters) {\n finalData.filters = {\n [`links.followers.${this.id}`]: { \"$exists\": true },\n };\n }\n\n return fetchFn();\n }\n });\n\n return paginator.next();\n }\n\n /**\n * Récupérer les abonnés\n * Constant : GET_SUBSCRIBERS\n */\n async getSubscribers(data = {}) {\n return super.getSubscribers(data);\n }\n\n /**\n * Obtenir la liste des événements\n * Constant : GET_EVENTS\n * TODO : il n'est pas fait encore pour GET_EVENTS_ADMIN / GET_EVENTS_NO_ADMIN comme les autres dans endpointApi\n */\n\n /**\n * Liste des badges créés par l'utilisateur\n * Constant : GET_BADGES\n */\n async getBadgesIssuer(data = {}) {\n return super.getBadgesIssuer(data);\n }\n\n /**\n * Liste des badges associés à l'utilisateur\n * \n * TODO : documenté le fonctionnement et sont utilisation avec un exemple\n */\n async getBadges(filter = {}) {\n /*\n \"badges\": {\n \"627df5663a0fae60e57f4a31\": {\n \"attenteRecepteur\": true,\n \"expiredOn\": false,\n \"isParcours\": \"false\",\n \"issuedOn\": \"2023-10-02T14:00:00.000Z\",\n \"name\": \"CODEV\",\n \"show\": \"true\",\n },\n },\n */\n\n const filteredBadges = await this.linkEntitiesFromServerData(\"badges\", filter);\n // voir si je les met dans objet { count, results }\n return filteredBadges;\n }\n\n /**\n * Récupérer la galerie de l'utilisateur\n * Constant : GET_GALLERY\n */\n async getGallery(data = {}) {\n return super.getGallery(data);\n }\n\n async user(userData) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur\");\n }\n if (!userData.id && !userData.slug) {\n throw new ApiError(\"Vous devez fournir un id ou un slug pour créer un User.\");\n }\n const user = new User(this, userData, this.deps);\n await user.get();\n return user;\n }\n\n /**\n * Crée une instance d'organisation et récupère son profil si nécessaire.\n *\n * @param {Object} organizationData - Les données nécessaires pour initialiser l'organisation.\n * @returns {Promise<Organization>} Une promesse qui résout l'objet Organisation créé.\n * @throws {Error} Si une erreur se produit lors de la création de l'organisation.\n */\n async organization(organizationData = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour créer une organisation.\");\n }\n return super.organization(organizationData);\n }\n\n /**\n * Crée une instance de projet et récupère son profil si nécessaire.\n *\n * @param {Object} projectData - Les données nécessaires pour initialiser le projet.\n * @returns {Promise<Project>} Une promesse qui résout l'objet Projet créé.\n * @throws {Error} Si une erreur se produit lors de la création du projet.\n */\n async project(projectData = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour créer un projet.\");\n }\n return super.project(projectData);\n }\n\n /**\n * Crée une instance de news et la récupère si nécessaire.\n * \n * @param {Object} newsData - Les données nécessaires pour initialiser la news.\n * @returns {Promise<News>} Une promesse qui résout l'objet News créé.\n * @throws {Error} Si une erreur se produit lors de la création de la news.\n */\n async news(newsData = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour créer une actualité.\");\n }\n return super.news(newsData);\n }\n\n /**\n * Crée une instance de POI et la récupère si nécessaire.\n * \n * @param {Object} poiData - Les données nécessaires pour initialiser le POI.\n * @returns {Promise<Poi>} Une promesse qui résout l'objet POI créé.\n * @throws {Error} Si une erreur se produit lors de la création du POI.\n */\n async poi(poiData = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour créer un POI.\");\n }\n return super.poi(poiData);\n }\n\n /**\n * Crée une instance d'événement et la récupère si nécessaire.\n * \n * @param {Object} eventData - Les données nécessaires pour initialiser l'événement.\n * @returns {Promise<Event>} Une promesse qui résout l'objet Événement créé.\n * @throws {Error} Si une erreur se produit lors de la création de l'événement.\n */\n async event(eventData = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour créer un événement.\");\n }\n return super.event(eventData);\n }\n\n /**\n * Crée une instance de badge et la récupère si nécessaire.\n * \n * @param {Object} badgeData - Les données nécessaires pour initialiser le badge.\n * @returns {Promise<Badge>} Une promesse qui résout l'objet Badge créé.\n * @throws {Error} Si une erreur se produit lors de la création du badge.\n */\n async badge(badgeData = {}) {\n if(!this.isMe){\n throw new ApiError(\"Vous devez être connecté et être l'utilisateur pour créer un badge.\");\n }\n return super.badge(badgeData);\n }\n\n /**\n * ───────────────────────────────\n * Lien utilisateur ↔ utilisateur (ami)\n * (demander, valider, se retirer)\n * ───────────────────────────────\n */\n\n /**\n * Envoie une demande d'amitié à cet utilisateur.\n * L'utilisateur ciblé devra valider la demande pour établir la relation.\n *\n * @returns {Promise<Object>} - Résultat de la requête.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'action est interdite.\n */\n async sendFriendRequest() {\n if (!this.isActingUser) {\n throw new ApiError(\"Vous devez être connecté pour envoyer une demande d'amis.\");\n }\n\n this._checkLinkableEntity();\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const { connectTypeConnect } = this._getLinkMeta();\n const userLink = this._getLinkFromConnectedUser();\n\n if (!userLink) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n connectType: connectTypeConnect\n };\n const retour = await this.endpointApi.connect(data);\n // TODO : reflechier au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n await this.userContext.refresh();\n return retour;\n }\n\n if (userLink.isInviting && userLink.invitorId === this.id) {\n return this.acceptFriendRequest();\n }\n\n if (userLink.isInviting && userLink.invitorId === this.userId) {\n throw new ApiError(\"Vous avez déjà envoyé une demande d'amis à cet utilisateur.\");\n }\n\n throw new ApiError(\"Vous êtes déjà connecté à cette entité.\");\n }\n\n /**\n * Accepte une demande d'amitié envoyée par cet utilisateur.\n * Cette action établit un lien entre les deux utilisateurs.\n *\n * @returns {Promise<Object>} - Résultat de la validation du lien.\n * @throws {ApiError} - Si aucune invitation n'est en attente ou si l'action est interdite.\n */\n async acceptFriendRequest() {\n if (!this.isActingUser) {\n throw new ApiError(\"Vous devez être connecté pour accepter une demande d'amitié.\");\n }\n\n this._checkLinkableEntity();\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const userLink = this._getLinkFromConnectedUser();\n\n if (userLink?.isInviting && userLink.invitorId === this.id) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n linkOption: \"isInviting\"\n };\n const retour = await this.endpointApi.linkValidate(data);\n // TODO : reflechier au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n await this.userContext.refresh();\n return retour;\n }\n\n throw new ApiError(\"Vous n'avez pas d'invitation à valider.\");\n }\n\n /**\n * Supprime la relation d'amitié avec cet utilisateur.\n * Cette action annule tout lien existant entre les deux profils.\n *\n * @returns {Promise<Object>} - Résultat de la suppression.\n * @throws {ApiError} - Si aucune relation n'existe.\n */\n async removeFriend() {\n if (!this.isActingUser) {\n throw new ApiError(\"Vous devez être connecté pour supprimer un ami.\");\n }\n\n this._checkLinkableEntity();\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const { connectTypeDisconnect } = this._getLinkMeta();\n const userLink = this._getLinkFromConnectedUser();\n\n if (!userLink) {\n throw new ApiError(\"Vous n'êtes pas connecté à cette entité.\");\n }\n\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n connectType: connectTypeDisconnect\n };\n const retour = await this.endpointApi.disconnect(data);\n // TODO : reflechier au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n await this.userContext.refresh();\n return retour;\n }\n \n\n requestToJoin() {\n throw new ApiError(\"l'utilisation de requestToJoin n'est pas autorisée sur un utilisateur.\");\n }\n\n requestToJoinAdmin() {\n throw new ApiError(\"l'utilisation de requestToJoinAdmin n'est pas autorisée sur un utilisateur.\");\n }\n\n acceptInvitation() {\n throw new ApiError(\"l'utilisation de acceptInvitation n'est pas autorisée sur un utilisateur.\");\n }\n\n leave() {\n throw new ApiError(\"l'utilisation de leave n'est pas autorisée sur un utilisateur.\");\n }\n\n /**\n * Suivre un utilisateur\n * Cette action permet à l'utilisateur connecté de suivre un autre utilisateur.\n * Elle nécessite que l'utilisateur soit connecté.\n * \n * @returns {Promise<Object>} - Résultat de la requête.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'action est interdite.\n */\n async follow() {\n if (!this.isActingUser) {\n throw new ApiError(\"Vous devez être connecté pour suivre un utilisateur.\");\n }\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const userLink = this.userContext?.serverData?.links?.[\"follows\"]?.[this.id] || null;\n\n if (!userLink) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id\n };\n const retour = await this.endpointApi.follow(data);\n // TODO : reflechier au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n await this.userContext.refresh();\n return retour;\n }\n\n throw new ApiError(\"Vous êtes déjà abonné à cet utilisateur.\");\n }\n\n /**\n * Se désabonner d'un utilisateur\n * Cette action permet à l'utilisateur connecté de se désabonner d'un autre utilisateur.\n * Elle nécessite que l'utilisateur soit connecté.\n * \n * @returns {Promise<Object>} - Résultat de la requête.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'action est interdite.\n */\n async unfollow() {\n if (!this.isActingUser) {\n throw new ApiError(\"Vous devez être connecté pour vous désabonner d'un utilisateur.\");\n }\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n\n const userLink = this.userContext?.serverData?.links?.[\"follows\"]?.[this.id] || null;\n\n if (userLink) {\n const data = {\n parentType: this.getEntityType(),\n parentId: this.id,\n connectType: \"followers\"\n };\n const retour = await this.endpointApi.disconnect(data);\n // TODO : reflechir au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh\n await this.userContext.refresh();\n return retour;\n }\n\n throw new ApiError(\"Vous n'êtes pas abonné à cet utilisateur.\");\n }\n\n /**\n * Vérifie si l'utilisateur connecté est ami avec cet utilisateur.\n * \n * @returns {boolean} - True si l'utilisateur connecté est ami, sinon false.\n * @throws {ApiError} - Si l'utilisateur n'est pas connecté.\n */\n isFriend() {\n if (!this.isActingUser) {\n throw new ApiError(\"Vous devez être connecté pour vérifier si vous êtes ami.\");\n }\n this._assertEntityType(\"citoyens\");\n const userLink = this._getLinkFromConnectedUser();\n return this._validateUserLink(userLink);\n }\n\n /**\n * Vérifie si l'utilisateur suit l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur suit l'entité, `false` sinon.\n * @throws {ApiError}\n */\n isFollower() {\n if (!this.isActingUser) {\n throw new ApiError(\"Vous devez être connecté pour vérifier si il vous suit.\");\n }\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n this._assertEntityType(\"citoyens\");\n return this._isLinked(\"followers\");\n }\n\n /**\n * Vérifie si l'utilisateur est abonné à l'entité.\n * \n * @returns {boolean} - `true` si l'utilisateur est abonné, `false` sinon.\n * @throws {ApiError}\n */\n isFollowing() {\n if (!this.isActingUser) {\n throw new ApiError(\"Vous devez être connecté pour vérifier si vous le suivez.\");\n }\n if (!this.id) {\n throw new ApiError(`${this.constructor.name} non enregistrée.`);\n }\n this._assertEntityType(\"citoyens\");\n return this._isLinked(\"follows\");\n }\n\n\n}\n\n// Incorporation des mixins dans User\nObject.assign(User.prototype, UserMixin);\n ","// eslint-disable-next-line no-unused-vars\nimport { ApiResponseError } from \"../error.js\";\n\n// UserMixin.js\nexport const UserMixin = {\n\n};\n ","const MongoID = {};\n\nMongoID._looksLikeObjectID = str => str.length === 24 && /^[0-9a-f]*$/.test(str);\n\nMongoID.ObjectID = class ObjectID {\n constructor (hexString) {\n //random-based impl of Mongo ObjectID\n if (hexString) {\n hexString = hexString.toLowerCase();\n if (!MongoID._looksLikeObjectID(hexString)) {\n throw new Error(\"Invalid hexadecimal string for creating an ObjectID\");\n }\n // meant to work with _.isEqual(), which relies on structural equality\n this._str = hexString;\n }\n }\n\n equals(other) {\n return other instanceof MongoID.ObjectID &&\n this.valueOf() === other.valueOf();\n }\n\n toString() {\n return `ObjectID(\"${this._str}\")`;\n }\n\n clone() {\n return new MongoID.ObjectID(this._str);\n }\n\n typeName() {\n return \"oid\";\n }\n\n getTimestamp() {\n return Number.parseInt(this._str.substr(0, 8), 16);\n }\n\n valueOf() {\n return this._str;\n }\n\n toJSONValue() {\n return this.valueOf();\n }\n\n toHexString() {\n return this.valueOf();\n }\n\n};\n\nexport default MongoID;","// Définitions communes extraites automatiquement\nconst common = {\"common1\":{\"type\":\"string\"},\"common2\":{\"format\":\"email\",\"type\":\"string\"},\"common3\":{\"type\":\"boolean\"},\"common4\":{\"format\":\"uri\",\"type\":\"string\"},\"common5\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\",\"type\":\"string\"},\"common6\":{\"additionalProperties\":false,\"properties\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\",\"type\":\"string\"}},\"required\":[\"id\"],\"type\":\"object\"},\"common7\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\",\"type\":\"string\"}},\"common8\":{\"additionalProperties\":false,\"properties\":{\"reason\":{\"default\":\"\",\"type\":\"string\"}},\"required\":[\"reason\"],\"type\":\"object\"},\"common9\":{\"reason\":{\"default\":\"\",\"type\":\"string\"}},\"common10\":{\"default\":\"\",\"type\":\"string\"},\"common11\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"common12\":{\"const\":\"citoyens\"},\"common13\":{\"properties\":{\"value\":{\"type\":\"boolean\"}}},\"common14\":{\"value\":{\"type\":\"boolean\"}},\"common15\":{\"enum\":[\"isOpenData\",\"isOpenEdition\",\"private\",\"feedback\"]},\"common16\":{\"const\":\"organizations\"},\"common17\":{\"const\":\"projects\"},\"common18\":{\"const\":\"events\"},\"common19\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\",\"events\"],\"type\":\"string\"},\"common20\":{},\"common21\":{\"else\":{\"properties\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"}}},\"if\":{\"properties\":{\"typeElement\":{\"const\":\"citoyens\"}}},\"then\":{\"properties\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\",\"type\":\"string\"}}}},\"common22\":{\"properties\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"}}},\"common23\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"}},\"common24\":{\"properties\":{\"typeElement\":{\"const\":\"citoyens\"}}},\"common25\":{\"typeElement\":{\"const\":\"citoyens\"}},\"common26\":{\"properties\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\",\"type\":\"string\"}}},\"common27\":{\"not\":{\"type\":\"null\"}},\"common28\":{\"type\":\"null\"},\"common29\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\",\"poi\",\"events\"],\"type\":\"string\"},\"common30\":{\"anyOf\":[{\"items\":{\"type\":\"string\"},\"type\":\"array\"},{\"enum\":[\"\"],\"type\":\"string\"}]},\"common31\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"common32\":{\"enum\":[\"\"],\"type\":\"string\"},\"common33\":{\"properties\":{\"name\":{\"not\":{\"type\":\"null\"}}},\"required\":[\"name\"]},\"common34\":{\"name\":{\"not\":{\"type\":\"null\"}}},\"common35\":{\"properties\":{\"url\":{\"not\":{\"type\":\"null\"}}},\"required\":[\"url\"]},\"common36\":{\"url\":{\"not\":{\"type\":\"null\"}}},\"common37\":{\"properties\":{\"tags\":{\"not\":{\"type\":\"null\"}}},\"required\":[\"tags\"]},\"common38\":{\"tags\":{\"not\":{\"type\":\"null\"}}},\"common39\":{\"properties\":{\"email\":{\"not\":{\"type\":\"null\"}}},\"required\":[\"email\"]},\"common40\":{\"email\":{\"not\":{\"type\":\"null\"}}},\"common41\":{\"format\":\"date\",\"type\":\"string\"},\"common42\":{\"const\":\"info\",\"default\":\"info\",\"type\":\"string\"},\"common43\":{\"$ref\":\"#/$defs/sharedFields/email\"},\"common44\":{\"$ref\":\"#/$defs/sharedFields/name\"},\"common45\":{\"$ref\":\"#/$defs/sharedFields/tags\"},\"common46\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\"],\"type\":\"string\"},\"common47\":{\"$ref\":\"#/$defs/sharedFields/url\"},\"common48\":{\"properties\":{\"avancement\":{\"not\":{\"type\":\"null\"}}},\"required\":[\"avancement\"]},\"common49\":{\"avancement\":{\"not\":{\"type\":\"null\"}}},\"common50\":{\"properties\":{\"parent\":{\"not\":{\"type\":\"null\"}}},\"required\":[\"parent\"]},\"common51\":{\"parent\":{\"not\":{\"type\":\"null\"}}},\"common52\":{\"additionalProperties\":false,\"patternProperties\":{\"^[a-fA-F0-9]{24}$\":{\"additionalProperties\":false,\"properties\":{\"name\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\",\"name\"],\"type\":\"object\"}},\"type\":\"object\"},\"common53\":{\"^[a-fA-F0-9]{24}$\":{\"additionalProperties\":false,\"properties\":{\"name\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\",\"name\"],\"type\":\"object\"}},\"common54\":{\"additionalProperties\":false,\"properties\":{\"name\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\",\"name\"],\"type\":\"object\"},\"common55\":{\"name\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"common56\":{\"properties\":{\"type\":{\"not\":{\"type\":\"null\"}}},\"required\":[\"type\"]},\"common57\":{\"type\":{\"not\":{\"type\":\"null\"}}},\"common58\":{\"additionalProperties\":false,\"patternProperties\":{\"^(?:[a-f0-9]{24}|@userId)$\":{\"additionalProperties\":false,\"properties\":{\"name\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\"],\"type\":\"object\"}},\"type\":\"object\"},\"common59\":{\"^(?:[a-f0-9]{24}|@userId)$\":{\"additionalProperties\":false,\"properties\":{\"name\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\"],\"type\":\"object\"}},\"common60\":{\"additionalProperties\":false,\"properties\":{\"name\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\"],\"type\":\"object\"},\"common61\":{\"enum\":[\"workshop\",\"competition\",\"concert\",\"contest\",\"conference\",\"debate\",\"exhibition\",\"festival\",\"crowdfunding\",\"fair\",\"course\",\"protest\",\"market\",\"film\",\"getTogether\",\"meeting\",\"spectacle\",\"internship\",\"stand\",\"others\"],\"type\":\"string\"},\"common62\":{\"enum\":[\"link\",\"tool\",\"machine\",\"software\",\"rh\",\"Resource material\",\"Financial Ressource\",\"ficheBlanche\",\"geoJson\",\"compostPickup\",\"video\",\"sharedLibrary\",\"recoveryCenter\",\"trash\",\"history\",\"something2See\",\"funPlace\",\"place\",\"artPiece\",\"streetArts\",\"openScene\",\"stand\",\"parking\",\"other\"],\"type\":\"string\"},\"common63\":{\"enum\":[\"poi\"],\"type\":\"string\"},\"common64\":{\"$ref\":\"#/$defs/socialField\"},\"common65\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\"],\"type\":\"string\"},\"common66\":{\"properties\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\"}}},\"common67\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\"}},\"common68\":{\"pattern\":\"^[a-f0-9]{24}$\"},\"common69\":{\"const\":\"\",\"type\":\"string\"},\"common70\":{\"additionalProperties\":false,\"properties\":{\"@type\":{\"const\":\"PostalAddress\",\"type\":\"string\"},\"addressCountry\":{\"type\":\"string\"},\"addressLocality\":{\"type\":\"string\"},\"codeInsee\":{\"type\":\"string\"},\"level1\":{\"type\":\"string\"},\"level1Name\":{\"type\":\"string\"},\"level3\":{\"minLength\":0,\"type\":\"string\"},\"level3Name\":{\"minLength\":0,\"type\":\"string\"},\"level4\":{\"minLength\":0,\"type\":\"string\"},\"level4Name\":{\"minLength\":0,\"type\":\"string\"},\"localityId\":{\"type\":\"string\"},\"postalCode\":{\"type\":\"string\"},\"streetAddress\":{\"type\":\"string\"}},\"required\":[\"@type\",\"addressCountry\",\"codeInsee\",\"addressLocality\",\"localityId\",\"level1\",\"level1Name\"],\"type\":\"object\"},\"common71\":{\"@type\":{\"const\":\"PostalAddress\",\"type\":\"string\"},\"addressCountry\":{\"type\":\"string\"},\"addressLocality\":{\"type\":\"string\"},\"codeInsee\":{\"type\":\"string\"},\"level1\":{\"type\":\"string\"},\"level1Name\":{\"type\":\"string\"},\"level3\":{\"minLength\":0,\"type\":\"string\"},\"level3Name\":{\"minLength\":0,\"type\":\"string\"},\"level4\":{\"minLength\":0,\"type\":\"string\"},\"level4Name\":{\"minLength\":0,\"type\":\"string\"},\"localityId\":{\"type\":\"string\"},\"postalCode\":{\"type\":\"string\"},\"streetAddress\":{\"type\":\"string\"}},\"common72\":{\"const\":\"PostalAddress\",\"type\":\"string\"},\"common73\":{\"minLength\":0,\"type\":\"string\"},\"common74\":{\"additionalProperties\":false,\"properties\":{\"@type\":{\"const\":\"GeoCoordinates\",\"type\":\"string\"},\"latitude\":{\"type\":[\"string\",\"number\"]},\"longitude\":{\"type\":[\"string\",\"number\"]}},\"required\":[\"latitude\",\"longitude\"],\"type\":\"object\"},\"common75\":{\"@type\":{\"const\":\"GeoCoordinates\",\"type\":\"string\"},\"latitude\":{\"type\":[\"string\",\"number\"]},\"longitude\":{\"type\":[\"string\",\"number\"]}},\"common76\":{\"const\":\"GeoCoordinates\",\"type\":\"string\"},\"common77\":{\"type\":[\"string\",\"number\"]},\"common78\":{\"additionalProperties\":true,\"properties\":{\"coordinates\":{\"items\":{\"type\":\"number\"},\"maxItems\":2,\"minItems\":2,\"type\":\"array\"},\"float\":{\"const\":true,\"default\":true,\"type\":\"boolean\"},\"type\":{\"const\":\"Point\",\"type\":\"string\"}},\"required\":[\"type\",\"coordinates\",\"float\"],\"type\":\"object\"},\"common79\":{\"coordinates\":{\"items\":{\"type\":\"number\"},\"maxItems\":2,\"minItems\":2,\"type\":\"array\"},\"float\":{\"const\":true,\"default\":true,\"type\":\"boolean\"},\"type\":{\"const\":\"Point\",\"type\":\"string\"}},\"common80\":{\"items\":{\"type\":\"number\"},\"maxItems\":2,\"minItems\":2,\"type\":\"array\"},\"common81\":{\"type\":\"number\"},\"common82\":{\"const\":true,\"default\":true,\"type\":\"boolean\"},\"common83\":{\"const\":\"Point\",\"type\":\"string\"},\"common84\":{\"properties\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}}},\"common85\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}},\"common86\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"},\"common87\":{\"maxLength\":100,\"minLength\":3,\"pattern\":\"^[a-zA-Z0-9]+$\",\"type\":\"string\"},\"common88\":{\"properties\":{\"type\":{\"const\":\"citoyens\"}}},\"common89\":{\"type\":{\"const\":\"citoyens\"}},\"common90\":{\"properties\":{\"ownerId\":{\"pattern\":\"^[a-f0-9]{24}$\"}}},\"common91\":{\"ownerId\":{\"pattern\":\"^[a-f0-9]{24}$\"}},\"common92\":{\"properties\":{\"folder\":{\"const\":\"citoyens\"}}},\"common93\":{\"folder\":{\"const\":\"citoyens\"}},\"common94\":{\"properties\":{\"ownerId\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}}},\"common95\":{\"ownerId\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}},\"common96\":{\"properties\":{\"parentId\":{\"pattern\":\"^[a-f0-9]{24}$\"}}},\"common97\":{\"parentId\":{\"pattern\":\"^[a-f0-9]{24}$\"}},\"common98\":{\"properties\":{\"parentType\":{\"const\":\"citoyens\"}}},\"common99\":{\"parentType\":{\"const\":\"citoyens\"}},\"common100\":{\"properties\":{\"parentId\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}}},\"common101\":{\"parentId\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}},\"common102\":{\"default\":true,\"type\":\"boolean\"},\"common103\":{\"default\":0,\"type\":\"integer\"},\"common104\":{\"required\":[\"text\"]},\"common105\":{\"required\":[\"mediaImg\"]},\"common106\":{\"required\":[\"mediaFile\"]},\"common107\":{\"additionalProperties\":false,\"properties\":{\"countFiles\":{\"type\":\"number\"},\"files\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"countFiles\",\"files\"],\"type\":\"object\"},\"common108\":{\"countFiles\":{\"type\":\"number\"},\"files\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"common109\":{\"additionalProperties\":false,\"properties\":{\"countImages\":{\"type\":\"number\"},\"images\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"countImages\",\"images\"],\"type\":\"object\"},\"common110\":{\"countImages\":{\"type\":\"number\"},\"images\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"common111\":{\"items\":{\"properties\":{\"count\":{\"minimum\":1,\"type\":\"integer\"},\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"slug\",\"type\",\"value\",\"count\"],\"type\":\"object\"},\"type\":\"array\"},\"common112\":{\"properties\":{\"count\":{\"minimum\":1,\"type\":\"integer\"},\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"slug\",\"type\",\"value\",\"count\"],\"type\":\"object\"},\"common113\":{\"count\":{\"minimum\":1,\"type\":\"integer\"},\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"common114\":{\"minimum\":1,\"type\":\"integer\"},\"common115\":{\"default\":\"public\",\"enum\":[\"public\",\"private\",\"restricted\"],\"type\":\"string\"},\"common116\":{\"const\":\"news\",\"default\":\"news\",\"type\":\"string\"},\"common117\":{\"additionalProperties\":false,\"else\":{\"properties\":{\"ownerId\":{\"pattern\":\"^[a-f0-9]{24}$\"}}},\"if\":{\"properties\":{\"folder\":{\"const\":\"citoyens\"}}},\"properties\":{\"folder\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\"],\"type\":\"string\"},\"ownerId\":{\"type\":\"string\"}},\"required\":[\"folder\",\"ownerId\"],\"then\":{\"properties\":{\"ownerId\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}}},\"type\":\"object\"},\"common118\":{\"folder\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\"],\"type\":\"string\"},\"ownerId\":{\"type\":\"string\"}},\"common119\":{\"additionalProperties\":false,\"properties\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"}},\"required\":[\"id\"],\"type\":\"object\"},\"common120\":{\"default\":false,\"type\":\"boolean\"},\"common121\":{\"properties\":{\"childId\":{\"pattern\":\"^[a-f0-9]{24}$\"}}},\"common122\":{\"childId\":{\"pattern\":\"^[a-f0-9]{24}$\"}},\"common123\":{\"properties\":{\"childType\":{\"const\":\"citoyens\"}}},\"common124\":{\"childType\":{\"const\":\"citoyens\"}},\"common125\":{\"const\":\"share\",\"default\":\"share\",\"type\":\"string\"},\"common126\":{\"properties\":{\"childId\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}}},\"common127\":{\"childId\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}},\"common128\":{\"additionalProperties\":false,\"properties\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"type\":{\"default\":\"news\",\"enum\":[\"news\"],\"type\":\"string\"}},\"required\":[\"type\",\"id\"],\"type\":\"object\"},\"common129\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"type\":{\"default\":\"news\",\"enum\":[\"news\"],\"type\":\"string\"}},\"common130\":{\"default\":\"news\",\"enum\":[\"news\"],\"type\":\"string\"},\"common131\":{\"items\":{\"additionalProperties\":false,\"properties\":{\"count\":{\"type\":\"number\"},\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"slug\",\"type\",\"value\",\"count\"],\"type\":\"object\"},\"type\":\"array\"},\"common132\":{\"additionalProperties\":false,\"properties\":{\"count\":{\"type\":\"number\"},\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"slug\",\"type\",\"value\",\"count\"],\"type\":\"object\"},\"common133\":{\"count\":{\"type\":\"number\"},\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"common134\":{\"enum\":[\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\",\"projects\",\"citoyens\",\"poi\"],\"type\":\"string\"},\"common135\":{\"const\":false,\"default\":false,\"type\":\"boolean\"},\"common136\":{\"const\":\"\",\"default\":\"\",\"type\":\"string\"},\"common137\":{\"default\":0,\"type\":\"number\"},\"common138\":{\"default\":30,\"type\":\"number\"},\"common139\":{\"additionalProperties\":false,\"patternProperties\":{\"^[^\\\\s]+$\":{\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"type\":{\"enum\":[\"cities\",\"level1\"],\"type\":\"string\"}},\"required\":[\"id\",\"type\"],\"type\":\"object\"}},\"type\":\"object\"},\"common140\":{\"^[^\\\\s]+$\":{\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"type\":{\"enum\":[\"cities\",\"level1\"],\"type\":\"string\"}},\"required\":[\"id\",\"type\"],\"type\":\"object\"}},\"common141\":{\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"type\":{\"enum\":[\"cities\",\"level1\"],\"type\":\"string\"}},\"required\":[\"id\",\"type\"],\"type\":\"object\"},\"common142\":{\"id\":{\"type\":\"string\"},\"type\":{\"enum\":[\"cities\",\"level1\"],\"type\":\"string\"}},\"common143\":{\"enum\":[\"cities\",\"level1\"],\"type\":\"string\"},\"common144\":{\"additionalProperties\":false,\"patternProperties\":{\"^[^\\\\s]+$\":{\"additionalProperties\":false,\"properties\":{\"indexMax\":{\"type\":\"number\"},\"indexMin\":{\"type\":\"number\"}},\"required\":[\"indexMin\",\"indexMax\"],\"type\":\"object\"}},\"type\":\"object\"},\"common145\":{\"^[^\\\\s]+$\":{\"additionalProperties\":false,\"properties\":{\"indexMax\":{\"type\":\"number\"},\"indexMin\":{\"type\":\"number\"}},\"required\":[\"indexMin\",\"indexMax\"],\"type\":\"object\"}},\"common146\":{\"additionalProperties\":false,\"properties\":{\"indexMax\":{\"type\":\"number\"},\"indexMin\":{\"type\":\"number\"}},\"required\":[\"indexMin\",\"indexMax\"],\"type\":\"object\"},\"common147\":{\"indexMax\":{\"type\":\"number\"},\"indexMin\":{\"type\":\"number\"}},\"common148\":{\"enum\":[\"ALL\"],\"type\":\"string\"},\"common149\":{\"default\":0,\"minimum\":0,\"type\":\"integer\"},\"common150\":{\"const\":[\"projects\"],\"default\":[\"projects\"],\"items\":{\"enum\":[\"projects\"],\"type\":\"string\"},\"type\":\"array\"},\"common151\":{\"enum\":[\"projects\"],\"type\":\"string\"},\"common152\":{\"$exists\":true},\"common153\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":true}},\"required\":[\"$exists\"],\"type\":\"object\"},\"common154\":{\"$exists\":{\"const\":true}},\"common155\":{\"const\":true},\"common156\":{\"additionalProperties\":false,\"else\":{\"properties\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\"}}},\"if\":{\"properties\":{\"type\":{\"const\":\"citoyens\"}}},\"properties\":{\"id\":{\"type\":\"string\"},\"type\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\"],\"type\":\"string\"}},\"required\":[\"type\",\"id\"],\"then\":{\"properties\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\"}}},\"type\":\"object\"},\"common157\":{\"id\":{\"type\":\"string\"},\"type\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\"],\"type\":\"string\"}},\"common158\":{\"const\":[\"poi\"],\"default\":[\"poi\"],\"items\":{\"enum\":[\"poi\"],\"type\":\"string\"},\"type\":\"array\"},\"common159\":{\"const\":[\"NGO\",\"Cooperative\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\"],\"default\":[\"NGO\",\"Cooperative\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\"],\"items\":{\"enum\":[\"NGO\",\"Cooperative\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\"],\"type\":\"string\"},\"type\":\"array\"},\"common160\":{\"enum\":[\"NGO\",\"Cooperative\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\"],\"type\":\"string\"},\"common161\":{\"$exists\":false},\"common162\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":false}},\"required\":[\"$exists\"],\"type\":\"object\"},\"common163\":{\"$exists\":{\"const\":false}},\"common164\":{\"const\":false},\"common165\":{\"default\":30,\"type\":\"integer\"},\"common166\":{\"const\":[\"citoyens\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"default\":[\"citoyens\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"items\":{\"enum\":[\"citoyens\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"type\":\"string\"},\"type\":\"array\"},\"common167\":{\"enum\":[\"citoyens\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"type\":\"string\"},\"common168\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"default\":false,\"type\":\"boolean\"}},\"required\":[\"$exists\"],\"type\":\"object\"},\"common169\":{\"$exists\":{\"default\":false,\"type\":\"boolean\"}},\"common170\":{\"additionalProperties\":false,\"properties\":{\"$in\":{\"items\":{\"type\":\"string\"},\"minItems\":1,\"type\":\"array\"}},\"required\":[\"$in\"],\"type\":\"object\"},\"common171\":{\"$in\":{\"items\":{\"type\":\"string\"},\"minItems\":1,\"type\":\"array\"}},\"common172\":{\"items\":{\"type\":\"string\"},\"minItems\":1,\"type\":\"array\"},\"common173\":{\"const\":[\"citoyens\"],\"default\":[\"citoyens\"],\"items\":{\"enum\":[\"citoyens\"],\"type\":\"string\"},\"type\":\"array\"},\"common174\":{\"enum\":[\"citoyens\"],\"type\":\"string\"},\"common175\":{\"const\":[\"citoyens\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\",\"projects\"],\"default\":[\"citoyens\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\",\"projects\"],\"items\":{\"enum\":[\"citoyens\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\",\"projects\"],\"type\":\"string\"},\"type\":\"array\"},\"common176\":{\"enum\":[\"citoyens\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\",\"projects\"],\"type\":\"string\"},\"common177\":{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.followers\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"}}},\"common178\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.followers\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"}},\"common179\":{\"pattern\":\"^(?!links\\\\.followers\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"},\"common180\":{\"^links\\\\.followers\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":true}},\"required\":[\"$exists\"],\"type\":\"object\"},\"^links\\\\.followers\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isInviting$\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":false}},\"required\":[\"$exists\"],\"type\":\"object\"},\"^links\\\\.followers\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.toBeValidated$\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":false}},\"required\":[\"$exists\"],\"type\":\"object\"}},\"common181\":{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.follows\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"}}},\"common182\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.follows\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"}},\"common183\":{\"pattern\":\"^(?!links\\\\.follows\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"},\"common184\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"organizations\",\"projects\"],\"type\":\"string\"},\"common185\":{\"const\":[\"badges\"],\"default\":[\"badges\"],\"items\":{\"enum\":[\"badges\"],\"type\":\"string\"},\"type\":\"array\"},\"common186\":{\"enum\":[\"badges\"],\"type\":\"string\"},\"common187\":{\"const\":[\"citoyens\",\"projects\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"default\":[\"citoyens\",\"projects\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"items\":{\"enum\":[\"citoyens\",\"projects\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"type\":\"string\"},\"type\":\"array\"},\"common188\":{\"enum\":[\"citoyens\",\"projects\",\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"type\":\"string\"},\"common189\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":true,\"type\":\"boolean\"}},\"required\":[\"$exists\"],\"type\":\"object\"},\"common190\":{\"$exists\":{\"const\":true,\"type\":\"boolean\"}},\"common191\":{\"const\":true,\"type\":\"boolean\"},\"common192\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":false,\"type\":\"boolean\"}},\"required\":[\"$exists\"],\"type\":\"object\"},\"common193\":{\"$exists\":{\"const\":false,\"type\":\"boolean\"}},\"common194\":{\"const\":false,\"type\":\"boolean\"},\"common195\":{\"badges\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.attenteEmetteur$\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":false,\"type\":\"boolean\"}},\"required\":[\"$exists\"],\"type\":\"object\"},\"badges\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.attenteRecepteur$\":{\"additionalProperties\":false,\"properties\":{\"$exists\":{\"const\":true,\"type\":\"boolean\"}},\"required\":[\"$exists\"],\"type\":\"object\"}},\"common196\":{\"indexMax\":30,\"indexMin\":0},\"common197\":{\"properties\":{\"parentType\":{\"const\":\"organizations\"}}},\"common198\":{\"parentType\":{\"const\":\"organizations\"}},\"common199\":{\"properties\":{\"parentType\":{\"const\":\"projects\"}}},\"common200\":{\"parentType\":{\"const\":\"projects\"}},\"common201\":{\"properties\":{\"parentType\":{\"const\":\"events\"}}},\"common202\":{\"parentType\":{\"const\":\"events\"}},\"common203\":{\"default\":\"@userId\",\"pattern\":\"^([a-f0-9]{24}|@\\\\w+)$\",\"type\":\"string\"},\"common204\":{\"const\":\"citoyens\",\"default\":\"citoyens\",\"enum\":[\"citoyens\"],\"type\":\"string\"},\"common205\":{\"enum\":[\"citoyens\",\"organizations\",\"projects\",\"events\"],\"type\":\"string\"},\"common206\":{\"const\":\"citoyens\",\"default\":\"citoyens\",\"type\":\"string\"},\"common207\":{\"const\":\"@userId\",\"default\":\"@userId\",\"pattern\":\"^(?:[a-f0-9]{24}|@userId)$\",\"type\":\"string\"},\"common208\":{\"default\":{\"isOpenData\":true,\"isOpenEdition\":true},\"properties\":{\"isOpenData\":{\"default\":true,\"type\":\"boolean\"},\"isOpenEdition\":{\"default\":true,\"type\":\"boolean\"}},\"required\":[\"isOpenData\",\"isOpenEdition\"],\"type\":\"object\"},\"common209\":{\"isOpenData\":true,\"isOpenEdition\":true},\"common210\":{\"isOpenData\":{\"default\":true,\"type\":\"boolean\"},\"isOpenEdition\":{\"default\":true,\"type\":\"boolean\"}},\"common211\":{\"additionalProperties\":false,\"default\":{\"@userId\":{\"type\":\"citoyens\"}},\"patternProperties\":{\"^(?:[a-f0-9]{24}|@userId)$\":{\"additionalProperties\":false,\"properties\":{\"name\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\"],\"type\":\"object\"}},\"type\":\"object\"},\"common212\":{\"@userId\":{\"type\":\"citoyens\"}},\"common213\":{\"type\":\"citoyens\"},\"common214\":{\"const\":\"poi\",\"default\":\"poi\",\"type\":\"string\"},\"common215\":{\"const\":\"events\",\"default\":\"events\",\"type\":\"string\"},\"common216\":{\"format\":\"date-time\",\"type\":\"string\"},\"common217\":{\"pattern\":\"^([01]\\\\d|2[0-3]):[0-5]\\\\d$\",\"type\":\"string\"},\"common218\":{\"type\":\"integer\"},\"common219\":{\"additionalProperties\":false,\"properties\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"type\":{\"const\":\"citoyens\",\"default\":\"citoyens\",\"type\":\"string\"}},\"required\":[\"type\",\"id\"],\"type\":\"object\"},\"common220\":{\"id\":{\"default\":\"@userId\",\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"type\":{\"const\":\"citoyens\",\"default\":\"citoyens\",\"type\":\"string\"}},\"common221\":{\"default\":\"@userId\",\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"common222\":{\"const\":\"badges\",\"default\":\"badges\",\"type\":\"string\"},\"common223\":{\"const\":\"badge\",\"default\":\"badge\",\"type\":\"string\"},\"common224\":{\"patternProperties\":{\"^[0-9a-f]{24}$\":{\"additionalProperties\":false,\"properties\":{\"isAdmin\":{\"default\":\"\",\"enum\":[\"\",\"admin\"],\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"roles\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"name\"],\"type\":\"object\"}},\"type\":\"object\"},\"common225\":{\"^[0-9a-f]{24}$\":{\"additionalProperties\":false,\"properties\":{\"isAdmin\":{\"default\":\"\",\"enum\":[\"\",\"admin\"],\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"roles\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"name\"],\"type\":\"object\"}},\"common226\":{\"additionalProperties\":false,\"properties\":{\"isAdmin\":{\"default\":\"\",\"enum\":[\"\",\"admin\"],\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"roles\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"name\"],\"type\":\"object\"},\"common227\":{\"isAdmin\":{\"default\":\"\",\"enum\":[\"\",\"admin\"],\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"roles\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"common228\":{\"default\":\"\",\"enum\":[\"\",\"admin\"],\"type\":\"string\"},\"common229\":{\"enum\":[\"projects\",\"organizations\"],\"type\":\"string\"},\"common230\":{\"items\":{\"enum\":[\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\",\"organizations\",\"projects\",\"events\",\"citoyens\",\"poi\"],\"type\":\"string\"},\"type\":\"array\"},\"common231\":{\"enum\":[\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\",\"organizations\",\"projects\",\"events\",\"citoyens\",\"poi\"],\"type\":\"string\"},\"common232\":{\"additionalProperties\":false,\"properties\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"type\":{\"default\":\"events\",\"type\":\"string\"}},\"required\":[\"id\",\"type\"],\"type\":\"object\"},\"common233\":{\"id\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"type\":{\"default\":\"events\",\"type\":\"string\"}},\"common234\":{\"default\":\"events\",\"type\":\"string\"},\"common235\":{\"items\":{\"properties\":{\"id\":{\"type\":\"string\"}},\"required\":[\"id\"],\"type\":\"object\"},\"type\":\"array\"},\"common236\":{\"properties\":{\"id\":{\"type\":\"string\"}},\"required\":[\"id\"],\"type\":\"object\"},\"common237\":{\"id\":{\"type\":\"string\"}},\"common238\":{\"additionalProperties\":false,\"properties\":{\"contextId\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"contextType\":{\"enum\":[\"projects\",\"organizations\"],\"type\":\"string\"},\"costumEditMode\":{\"default\":false,\"type\":\"boolean\"},\"costumSlug\":{\"type\":\"string\"},\"sourceKey\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"common239\":{\"contextId\":{\"pattern\":\"^[a-f0-9]{24}$\",\"type\":\"string\"},\"contextType\":{\"enum\":[\"projects\",\"organizations\"],\"type\":\"string\"},\"costumEditMode\":{\"default\":false,\"type\":\"boolean\"},\"costumSlug\":{\"type\":\"string\"},\"sourceKey\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}}};\n\n// Endpoints avec intégration des définitions communes\nexport default {\"endpoints\":[{\"auth\":\"none\",\"constant\":\"PERSON_REGISTER\",\"contentType\":\"application/x-www-form-urlencoded\",\"generateModule\":\"UserNoAuth\",\"method\":\"POST\",\"onlyAuthNone\":true,\"path\":\"/co2/person/register\",\"request\":{\"additionalProperties\":false,\"properties\":{\"app\":common.common1,\"email\":common.common2,\"isInvitation\":common.common3,\"mode\":common.common1,\"name\":common.common1,\"pendingUserId\":common.common1,\"pwd\":common.common1,\"username\":common.common1},\"required\":[\"name\",\"username\",\"email\",\"pwd\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"AUTHENTICATE_URL\",\"contentType\":\"application/json\",\"generateModule\":\"UserNoAuth\",\"method\":\"POST\",\"onlyAuthNone\":true,\"path\":\"/api/cocolight/authenticate\",\"postActions\":[{\"path\":\"accessToken\",\"type\":\"setToken\"},{\"path\":\"refreshToken\",\"type\":\"setRefreshToken\"},{\"event\":\"userLoggedIn\",\"path\":\"user\",\"type\":\"emitEvent\"}],\"request\":{\"additionalProperties\":false,\"properties\":{\"email\":common.common2,\"password\":common.common1},\"required\":[\"email\",\"password\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"REFRESH_TOKEN_URL\",\"contentType\":\"application/json\",\"method\":\"POST\",\"path\":\"/api/cocolight/refreshtoken\",\"request\":{\"additionalProperties\":false,\"properties\":{\"refreshToken\":common.common1},\"required\":[\"refreshToken\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ME_INFO_URL\",\"contentType\":\"application/json\",\"method\":\"POST\",\"path\":\"/api/cocolight/me\"},{\"auth\":\"none\",\"constant\":\"PASSWORD_RECOVERY\",\"contentType\":\"application/x-www-form-urlencoded\",\"generateModule\":\"UserNoAuth\",\"method\":\"POST\",\"onlyAuthNone\":true,\"path\":\"/co2/person/sendemail\",\"request\":{\"additionalProperties\":false,\"properties\":{\"email\":common.common2,\"type\":{\"const\":\"password\",\"default\":\"password\",\"type\":\"string\"}},\"required\":[\"email\",\"type\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"SERVER_EXCHANGE_TOKEN\",\"contentType\":\"application/json\",\"method\":\"POST\",\"path\":\"/api/cocolight/exchangetoken\",\"request\":{\"additionalProperties\":false,\"properties\":{\"serverUrl\":common.common4},\"required\":[\"serverUrl\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"CHANGE_PASSWORD\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/person/changepassword\",\"request\":{\"additionalProperties\":false,\"properties\":{\"mode\":{\"const\":\"changePassword\",\"default\":\"changePassword\",\"type\":\"string\"},\"newPassword\":common.common1,\"newPassword2\":common.common1,\"oldPassword\":common.common1,\"scope\":{\"default\":\"\",\"type\":[\"string\"]},\"userId\":common.common5},\"required\":[\"mode\",\"userId\",\"oldPassword\",\"newPassword\",\"newPassword2\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"DELETE_ACCOUNT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/delete/id/{id}/type/citoyens\",\"pathParams\":common.common6,\"postActions\":[{\"type\":\"resetSession\"},{\"event\":\"accountDeleted\",\"path\":null,\"type\":\"emitEvent\"}],\"request\":common.common8},{\"auth\":\"bearer\",\"constant\":\"UPDATE_SETTINGS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/updatesettings\",\"request\":{\"additionalProperties\":false,\"allOf\":[{\"else\":{\"properties\":{\"idEntity\":common.common11}},\"if\":{\"properties\":{\"typeEntity\":common.common12}},\"then\":{\"properties\":{\"idEntity\":common.common5}}},{\"if\":{\"properties\":{\"type\":{\"enum\":[\"birthDate\",\"email\",\"locality\",\"phone\",\"directory\"]},\"typeEntity\":common.common12}},\"then\":{\"properties\":{\"value\":{\"enum\":[\"private\",\"public\",\"mask\"],\"type\":\"string\"}}}},{\"if\":{\"properties\":{\"type\":{\"enum\":[\"activitypub\",\"isOpenData\"]},\"typeEntity\":common.common12}},\"then\":common.common13},{\"if\":{\"properties\":{\"type\":common.common15,\"typeEntity\":common.common16}},\"then\":common.common13},{\"if\":{\"properties\":{\"type\":common.common15,\"typeEntity\":common.common17}},\"then\":common.common13},{\"if\":{\"properties\":{\"type\":{\"enum\":[\"isOpenData\",\"isOpenEdition\",\"public\"]},\"typeEntity\":common.common18}},\"then\":common.common13}],\"properties\":{\"idEntity\":common.common1,\"type\":common.common1,\"typeEntity\":common.common19,\"value\":common.common20},\"required\":[\"type\",\"value\",\"typeEntity\",\"idEntity\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"UPDATE_BLOCK_DESCRIPTION\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/updateblock/\",\"request\":{\"additionalProperties\":false,\"allOf\":[common.common21,{\"anyOf\":[{\"properties\":{\"description\":common.common27},\"required\":[\"description\"]},{\"properties\":{\"shortDescription\":common.common27},\"required\":[\"shortDescription\"]}]}],\"properties\":{\"block\":{\"const\":\"descriptions\",\"default\":\"descriptions\",\"type\":\"string\"},\"descMentions\":common.common10,\"description\":common.common1,\"id\":common.common1,\"scope\":{\"default\":\"\",\"type\":[\"string\",\"null\"]},\"shortDescription\":common.common1,\"typeElement\":common.common29},\"required\":[\"block\",\"typeElement\",\"id\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"UPDATE_BLOCK_INFO\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/updateblock/\",\"request\":{\"$defs\":{\"sharedFields\":{\"email\":common.common2,\"name\":common.common1,\"tags\":common.common30,\"url\":common.common4}},\"allOf\":[{\"if\":common.common24,\"then\":{\"additionalProperties\":false,\"anyOf\":[common.common33,{\"properties\":{\"birthDate\":common.common27},\"required\":[\"birthDate\"]},{\"properties\":{\"fixe\":common.common27},\"required\":[\"fixe\"]},{\"properties\":{\"mobile\":common.common27},\"required\":[\"mobile\"]},common.common35,common.common37,common.common39],\"properties\":{\"birthDate\":common.common41,\"block\":common.common42,\"email\":common.common43,\"fixe\":common.common1,\"id\":common.common5,\"mobile\":common.common1,\"name\":common.common44,\"scope\":common.common10,\"tags\":common.common45,\"typeElement\":common.common46,\"url\":common.common47}}},{\"if\":{\"properties\":{\"typeElement\":common.common17}},\"then\":{\"additionalProperties\":false,\"anyOf\":[common.common33,common.common35,common.common37,common.common39,common.common48,common.common50],\"properties\":{\"avancement\":{\"enum\":[\"abandoned\",\"concept\",\"development\",\"production\",\"started\",\"testing\",\"idea\",\"mature\",\"qa\",\"finished\"],\"type\":\"string\"},\"block\":common.common42,\"email\":common.common43,\"id\":common.common1,\"name\":common.common44,\"parent\":common.common52,\"scope\":common.common10,\"tags\":common.common45,\"typeElement\":{\"default\":\"citoyens\",\"enum\":[\"projects\"],\"type\":\"string\"},\"url\":common.common47}}},{\"if\":{\"properties\":{\"typeElement\":common.common18}},\"then\":{\"additionalProperties\":false,\"anyOf\":[common.common33,common.common35,common.common37,common.common39,common.common48,common.common56,{\"properties\":{\"organizer\":common.common27},\"required\":[\"organizer\"]},common.common50],\"properties\":{\"block\":common.common42,\"email\":common.common43,\"id\":common.common1,\"name\":common.common44,\"organizer\":common.common58,\"parent\":common.common52,\"scope\":common.common10,\"tags\":common.common45,\"type\":common.common61,\"typeElement\":{\"default\":\"citoyens\",\"enum\":[\"events\"],\"type\":\"string\"},\"url\":common.common47}}},{\"if\":{\"properties\":{\"typeElement\":common.common16}},\"then\":{\"additionalProperties\":false,\"anyOf\":[common.common33,common.common35,common.common37,common.common39,common.common56],\"properties\":{\"block\":common.common42,\"email\":common.common43,\"id\":common.common1,\"name\":common.common44,\"scope\":common.common10,\"tags\":common.common45,\"type\":{\"enum\":[\"NGO\",\"Cooperative\",\"LocalBusiness\",\"GovernmentOrganizationautre\"],\"type\":\"string\"},\"typeElement\":{\"enum\":[\"organizations\"],\"type\":\"string\"},\"url\":common.common47}}},{\"if\":{\"properties\":{\"typeElement\":{\"const\":\"poi\"}}},\"then\":{\"additionalProperties\":false,\"anyOf\":[common.common33,common.common35,common.common37,common.common39,common.common56,{\"properties\":{\"urls\":common.common27},\"required\":[\"urls\"]}],\"properties\":{\"block\":common.common42,\"email\":common.common43,\"id\":common.common1,\"name\":common.common44,\"scope\":common.common10,\"tags\":common.common45,\"type\":common.common62,\"typeElement\":common.common63,\"url\":common.common47,\"urls\":common.common31}}}],\"properties\":{\"block\":common.common42,\"id\":common.common1,\"scope\":common.common10,\"typeElement\":common.common29},\"required\":[\"block\",\"typeElement\",\"id\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"UPDATE_BLOCK_SOCIAL\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/updateblock/\",\"request\":{\"$defs\":{\"socialField\":{\"anyOf\":[common.common32,common.common4]}},\"allOf\":[common.common21,{\"anyOf\":[{\"properties\":{\"gitlab\":common.common27},\"required\":[\"gitlab\"]},{\"properties\":{\"github\":common.common27},\"required\":[\"github\"]},{\"properties\":{\"twitter\":common.common27},\"required\":[\"twitter\"]},{\"properties\":{\"facebook\":common.common27},\"required\":[\"facebook\"]},{\"properties\":{\"instagram\":common.common27},\"required\":[\"instagram\"]},{\"properties\":{\"diaspora\":common.common27},\"required\":[\"diaspora\"]},{\"properties\":{\"mastodon\":common.common27},\"required\":[\"mastodon\"]},{\"properties\":{\"telegram\":common.common27},\"required\":[\"telegram\"]},{\"properties\":{\"signal\":common.common27},\"required\":[\"signal\"]}]}],\"properties\":{\"block\":{\"const\":\"network\",\"default\":\"network\",\"type\":\"string\"},\"diaspora\":common.common64,\"facebook\":common.common64,\"github\":common.common64,\"gitlab\":common.common64,\"id\":common.common1,\"instagram\":common.common64,\"mastodon\":common.common64,\"scope\":common.common10,\"signal\":common.common64,\"telegram\":common.common64,\"twitter\":common.common64,\"typeElement\":common.common65},\"required\":[\"block\",\"typeElement\",\"id\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"UPDATE_BLOCK_LOCALITY\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/updateblock/\",\"request\":{\"else\":common.common66,\"if\":common.common24,\"properties\":{\"address\":{\"oneOf\":[common.common69,common.common70]},\"block\":{\"const\":\"localities\",\"default\":\"localities\",\"type\":\"string\"},\"geo\":{\"oneOf\":[common.common69,common.common74]},\"geoPosition\":{\"oneOf\":[common.common69,common.common78]},\"id\":common.common1,\"scope\":common.common10,\"typeElement\":common.common29},\"required\":[\"block\",\"typeElement\",\"id\",\"address\"],\"then\":common.common84,\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"UPDATE_BLOCK_SLUG\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/updateblock/\",\"request\":{\"else\":common.common66,\"if\":common.common24,\"properties\":{\"block\":common.common42,\"id\":common.common1,\"scope\":common.common10,\"slug\":common.common87,\"typeElement\":common.common29},\"required\":[\"block\",\"typeElement\",\"id\",\"slug\"],\"then\":common.common84,\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"CHECK\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/slug/check\",\"request\":{\"additionalProperties\":false,\"else\":common.common66,\"if\":common.common88,\"properties\":{\"block\":common.common42,\"id\":common.common1,\"slug\":common.common87,\"type\":common.common19},\"required\":[\"block\",\"type\",\"id\",\"slug\"],\"then\":common.common84,\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"PROFIL_IMAGE\",\"contentType\":\"multipart/form-data\",\"method\":\"POST\",\"path\":\"/co2/document/upload-save/dir/communecter/folder/{folder}/ownerId/{ownerId}/input/profil_avatar/contentKey/profil/docType/image\",\"pathParams\":{\"additionalProperties\":false,\"else\":common.common90,\"if\":common.common92,\"properties\":{\"folder\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\",\"events\",\"poi\"],\"type\":\"string\"},\"ownerId\":common.common1},\"required\":[\"folder\",\"ownerId\"],\"then\":common.common94,\"type\":\"object\"},\"request\":{\"additionalProperties\":false,\"properties\":{\"profil_avatar\":common.common20},\"required\":[\"profil_avatar\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_ELEMENTS_ABOUT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/about/type/{type}/id/{id}/json/true\",\"pathParams\":{\"additionalProperties\":false,\"else\":common.common66,\"if\":common.common88,\"properties\":{\"id\":common.common1,\"type\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"projects\",\"organizations\",\"events\",\"poi\",\"badges\"],\"type\":\"string\"}},\"required\":[\"type\",\"id\"],\"then\":common.common84,\"type\":\"object\"},\"request\":{\"additionalProperties\":false,\"properties\":{\"tpl\":{\"const\":\"ficheInfoElement\",\"default\":\"ficheInfoElement\",\"type\":\"string\"}},\"required\":[\"tpl\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"MULTICONNECT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/link/multiconnect\",\"request\":{\"additionalProperties\":false,\"else\":common.common96,\"if\":common.common98,\"properties\":{\"listInvite\":{\"additionalProperties\":false,\"patternProperties\":{\"^(citoyens|projects|organizations)$\":{\"additionalProperties\":false,\"patternProperties\":{\"^[0-9a-fA-F]{24}$\":{\"additionalProperties\":false,\"properties\":{\"name\":common.common1},\"required\":[\"name\"],\"type\":\"object\"}},\"type\":\"object\"}},\"type\":\"object\"},\"parentId\":common.common1,\"parentType\":common.common65},\"required\":[\"parentId\",\"parentType\",\"listInvite\"],\"then\":common.common100,\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_NEWS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/news/co/get/type/{type}/id/{id}/isLive/{isLive}/json/true\",\"pathParams\":{\"additionalProperties\":false,\"else\":common.common66,\"if\":common.common88,\"properties\":{\"id\":common.common1,\"isLive\":common.common102,\"type\":common.common65},\"required\":[\"isLive\",\"type\",\"id\"],\"then\":common.common84,\"type\":\"object\"},\"request\":{\"additionalProperties\":false,\"properties\":{\"dateLimit\":common.common103,\"indexStep\":{\"default\":12,\"type\":\"integer\"},\"search\":{\"additionalProperties\":false,\"properties\":{\"name\":common.common10},\"required\":[\"name\"],\"type\":\"object\"}},\"required\":[\"dateLimit\",\"indexStep\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_NEWS_BY_ID\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/news/co/getbyids\",\"request\":{\"additionalProperties\":false,\"properties\":{\"ids\":{\"items\":common.common11,\"type\":\"array\"}},\"required\":[\"ids\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ADD_NEWS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/news/co/save\",\"request\":{\"additionalProperties\":false,\"anyOf\":[common.common104,common.common105,common.common106],\"else\":common.common96,\"if\":common.common98,\"properties\":{\"json\":common.common82,\"markdownActive\":common.common102,\"mediaFile\":common.common107,\"mediaImg\":common.common109,\"mentions\":common.common111,\"parentId\":common.common1,\"parentType\":common.common65,\"scope\":common.common115,\"tags\":common.common30,\"text\":common.common1,\"type\":common.common116},\"required\":[\"scope\",\"markdownActive\",\"parentId\",\"parentType\",\"type\",\"json\"],\"then\":common.common100,\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ADD_IMAGE_NEWS\",\"contentType\":\"multipart/form-data\",\"method\":\"POST\",\"path\":\"/co2/document/uploadSave/dir/communecter/folder/{folder}/ownerId/{ownerId}/input/newsImage/docType/image/contentKey/slider\",\"pathParams\":common.common117,\"request\":{\"additionalProperties\":false,\"properties\":{\"newsImage\":common.common20},\"required\":[\"newsImage\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ADD_FILE_NEWS\",\"contentType\":\"multipart/form-data\",\"method\":\"POST\",\"path\":\"/co2/document/uploadSave/dir/communecter/folder/{folder}/ownerId/{ownerId}}/input/newsFile/docType/file\",\"pathParams\":common.common117,\"request\":{\"additionalProperties\":false,\"properties\":{\"newsFile\":common.common20},\"required\":[\"newsFile\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"DELETE_NEWS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/news/co/delete/id/{id}\",\"pathParams\":common.common119,\"request\":{\"additionalProperties\":false,\"properties\":{\"isLive\":common.common120},\"required\":[\"isLive\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"UPDATE_NEWS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/news/co/update\",\"request\":{\"additionalProperties\":false,\"anyOf\":[common.common104,common.common105,common.common106],\"else\":common.common96,\"if\":common.common98,\"properties\":{\"idNews\":common.common11,\"markdownActive\":common.common102,\"mediaFile\":common.common107,\"mediaImg\":common.common109,\"mentions\":common.common111,\"parentId\":common.common1,\"parentType\":common.common65,\"scope\":common.common115,\"tags\":common.common30,\"text\":common.common1,\"type\":common.common116},\"required\":[\"idNews\",\"scope\",\"markdownActive\",\"parentId\",\"parentType\",\"type\"],\"then\":common.common100,\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"SHARE_NEWS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/news/co/share\",\"request\":{\"additionalProperties\":false,\"else\":common.common121,\"if\":common.common123,\"properties\":{\"childId\":common.common11,\"childType\":common.common65,\"comment\":common.common1,\"connectType\":common.common125,\"parentId\":common.common11,\"parentType\":common.common116},\"required\":[\"parentId\",\"parentType\",\"childId\",\"childType\",\"connectType\"],\"then\":common.common126,\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_COMMENTS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/comment/index/type/{type}/id/{id}/json/true\",\"pathParams\":common.common128},{\"auth\":\"bearer\",\"constant\":\"ADD_COMMENTS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/comment/save\",\"request\":{\"additionalProperties\":false,\"properties\":{\"argval\":common.common10,\"contextId\":common.common11,\"contextType\":common.common130,\"mentions\":common.common131,\"parentCommentId\":common.common11,\"path\":common.common10,\"text\":common.common1},\"required\":[\"text\",\"contextId\",\"contextType\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"DELETE_COMMENTS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/comment/delete/id/{id}\",\"pathParams\":common.common119},{\"auth\":\"bearer\",\"constant\":\"UPDATE_COMMENTS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/comment/update\",\"request\":{\"additionalProperties\":false,\"properties\":{\"id\":common.common11,\"params\":{\"properties\":{\"mentions\":common.common131,\"text\":common.common1},\"required\":[\"text\"],\"type\":\"object\"}},\"required\":[\"id\",\"params\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"SEARCH_TAGS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/api/tags/search?q={q}\",\"pathParams\":{\"additionalProperties\":false,\"properties\":{\"q\":common.common1},\"required\":[\"q\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"SHOW_VOTE\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/action/list/type/{type}/id/{id}/actionType/vote/json/true\",\"pathParams\":common.common128},{\"auth\":\"none\",\"constant\":\"GLOBAL_AUTOCOMPLETE\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":{\"default\":[\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\",\"projects\",\"citoyens\",\"poi\"],\"items\":common.common134,\"type\":\"array\"},\"fediverse\":common.common135,\"filters\":common.common136,\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common139,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchTags\":common.common31,\"searchType\":{\"items\":common.common134,\"type\":\"array\"}},\"required\":[\"name\",\"searchType\",\"countType\",\"indexMin\",\"indexStep\",\"initType\",\"count\",\"notSourceKey\",\"filters\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"CITY_AUTOCOMPLETE\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"indexMax\":{\"minimum\":5,\"type\":\"integer\"},\"indexMin\":{\"minimum\":0,\"type\":\"integer\"},\"locality\":common.common136,\"name\":common.common1,\"searchBy\":{\"const\":\"ALL\",\"default\":\"ALL\",\"type\":\"string\"},\"searchType\":{\"const\":[\"cities\"],\"default\":[\"cities\"],\"items\":{\"enum\":[\"cities\"],\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"name\",\"locality\",\"searchType\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"CITY_AUTOCOMPLETE_BY_COUNTRY\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/city/autocompletemultiscope\",\"request\":{\"additionalProperties\":false,\"properties\":{\"countryCode\":{\"default\":\"FR\",\"type\":\"string\"},\"formInMap\":common.common120,\"scopeValue\":common.common1,\"type\":{\"enum\":[\"locality\"],\"type\":\"string\"}},\"required\":[\"type\",\"countryCode\",\"scopeValue\",\"formInMap\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"SUGGESTION_INPUT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"indexMax\":{\"default\":20,\"minimum\":20,\"type\":\"integer\"},\"indexMin\":common.common149,\"name\":common.common1,\"searchType\":{\"items\":{\"enum\":[\"organizations\",\"projects\",\"poi\"],\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"name\",\"searchType\",\"indexMin\",\"indexMax\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_PROJECTS_NO_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common150,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"default\":{\"$or\":{\"links.contributors.@userId\":common.common152,\"parent.@userId\":common.common152},\"links.contributors.@userId\":common.common152},\"patternProperties\":{\"^links\\\\.contributors\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common153},\"properties\":{\"$or\":{\"additionalProperties\":false,\"maxProperties\":2,\"minProperties\":2,\"patternProperties\":{\"^links\\\\.contributors\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common153,\"^parent\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common153},\"type\":\"object\"}},\"required\":[\"$or\"],\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common150},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_PROJECTS_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocompleteadmin/type/{type}/id/{id}/canSee/true\",\"pathParams\":common.common156,\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common150,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"default\":{\"$or\":{\"links.contributors.@{pathParams.id}\":common.common152,\"parent.@{pathParams.id}\":common.common152},\"links.contributors.@{pathParams.id}\":common.common152},\"patternProperties\":{\"^links\\\\.contributors\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153},\"properties\":{\"$or\":{\"additionalProperties\":false,\"maxProperties\":2,\"minProperties\":2,\"patternProperties\":{\"^links\\\\.contributors\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153,\"^parent\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153},\"type\":\"object\"}},\"required\":[\"$or\"],\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common150},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_POIS_NO_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common158,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"default\":{\"parent.@userId\":common.common152},\"patternProperties\":{\"^parent\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common153},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common158},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_POIS_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocompleteadmin/type/{type}/id/{id}/canSee/true\",\"pathParams\":common.common156,\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common158,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"default\":{\"parent.@{pathParams.id}\":common.common152},\"patternProperties\":{\"^parent\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common158},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_ORGANIZATIONS_NO_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common159,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"default\":{\"links.members.@userId\":common.common152,\"links.members.@userId.isInviting\":common.common161,\"links.members.@userId.toBeValidated\":common.common161},\"patternProperties\":{\"^links\\\\.members\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common153,\"^links\\\\.members\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.isInviting$\":common.common162,\"^links\\\\.members\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.toBeValidated$\":common.common162},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common149,\"indexStep\":common.common165,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common159},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_ORGANIZATIONS_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocompleteadmin/type/{type}/id/{id}/canSee/true\",\"pathParams\":{\"additionalProperties\":false,\"else\":common.common66,\"if\":common.common88,\"properties\":{\"id\":common.common1,\"type\":{\"default\":\"citoyens\",\"enum\":[\"citoyens\",\"organizations\"],\"type\":\"string\"}},\"required\":[\"type\",\"id\"],\"then\":common.common84,\"type\":\"object\"},\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common159,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"default\":{\"links.members.@{pathParams.id}\":common.common152,\"links.members.@{pathParams.id}.isInviting\":common.common161,\"links.members.@{pathParams.id}.toBeValidated\":common.common161},\"patternProperties\":{\"^links\\\\.members\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153,\"^links\\\\.members\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isInviting$\":common.common162,\"^links\\\\.members\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.toBeValidated$\":common.common162},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common149,\"indexStep\":common.common165,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common159},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_MEMBERS_NO_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common166,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@\\\\w+)$)\"}}},{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.toBeValidated$)\"}}}],\"patternProperties\":{\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common153,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.isAdmin$\":common.common153,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.isAdminPending$\":common.common153,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.isInviting$\":common.common168,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.roles$\":common.common170,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.toBeValidated$\":common.common162},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common166},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_MEMBERS_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocompleteadmin/type/organizations/id/{id}/canSee/true\",\"pathParams\":common.common119,\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common166,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"}}}],\"default\":{\"links.memberOf.@{pathParams.id}\":common.common152,\"links.memberOf.@{pathParams.id}.isInviting\":common.common161,\"links.memberOf.@{pathParams.id}.toBeValidated\":common.common161},\"patternProperties\":{\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isAdmin$\":common.common153,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isAdminPending$\":common.common153,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isInviting$\":common.common168,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.roles$\":common.common170,\"^links\\\\.memberOf\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.toBeValidated$\":common.common168},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common166},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_FRIENDS_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocompleteadmin/type/citoyens/id/{id}/canSee/true\",\"pathParams\":common.common6,\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common173,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.friends\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"}}}],\"default\":{\"links.friends.@{pathParams.id}\":common.common152,\"links.friends.@{pathParams.id}.isInviting\":common.common161,\"links.friends.@{pathParams.id}.toBeValidated\":common.common161},\"patternProperties\":{\"^links\\\\.friends\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153,\"^links\\\\.friends\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isInviting$\":common.common168,\"^links\\\\.friends\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.toBeValidated$\":common.common168},\"type\":\"object\"},\"indexMin\":common.common149,\"indexStep\":common.common165,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"searchType\":common.common173},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_SUBSCRIPTIONS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common175,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[common.common177],\"default\":{\"links.followers.@userId\":common.common152,\"links.followers.@{userId}.isInviting\":common.common161,\"links.followers.@{userId}.toBeValidated\":common.common161},\"patternProperties\":common.common180,\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common175},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_SUBSCRIPTIONS_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocompleteadmin/type/citoyens/id/{id}/canSee/true\",\"pathParams\":common.common6,\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common175,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[common.common177],\"default\":{\"links.followers.@{pathParams.id}\":common.common152,\"links.followers.@{pathParams.id}.isInviting\":common.common161,\"links.followers.@{pathParams.id}.toBeValidated\":common.common161},\"patternProperties\":common.common180,\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common175},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_SUBSCRIBERS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common173,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[common.common181],\"default\":{\"links.follows.@userId\":common.common152,\"links.follows.@{userId}.isInviting\":common.common161,\"links.follows.@{userId}.toBeValidated\":common.common161},\"patternProperties\":{\"^links\\\\.follows\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153,\"^links\\\\.follows\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isInviting$\":common.common162,\"^links\\\\.follows\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.toBeValidated$\":common.common162},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common173},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_SUBSCRIBERS_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocompleteadmin/type/{type}/id/{id}/canSee/true\",\"pathParams\":{\"additionalProperties\":false,\"allOf\":[{\"else\":common.common66,\"if\":common.common88,\"then\":common.common84}],\"properties\":{\"id\":common.common1,\"type\":common.common184},\"required\":[\"type\",\"id\"],\"type\":\"object\"},\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common173,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[common.common181],\"default\":{\"links.follows.@{pathParams.id}\":common.common152},\"maxProperties\":1,\"minProperties\":1,\"patternProperties\":{\"^links\\\\.follows\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153},\"type\":\"object\"},\"indexMin\":common.common149,\"indexStep\":common.common165,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"searchType\":common.common173},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_CONTRIBUTORS_NO_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common166,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.projects\\\\.(?:[a-f0-9]{24}|@\\\\w+)$)\"}}},{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.projects\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.toBeValidated$)\"}}}],\"patternProperties\":{\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common153,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.isAdmin$\":common.common153,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.isAdminPending$\":common.common153,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.isInviting$\":common.common168,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.roles$\":common.common170,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.toBeValidated$\":common.common162},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common166},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_CONTRIBUTORS_ADMIN\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocompleteadmin/type/projects/id/{id}/canSee/true\",\"pathParams\":common.common119,\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common166,\"fediverse\":common.common135,\"filters\":{\"additionalProperties\":false,\"allOf\":[{\"not\":{\"propertyNames\":{\"pattern\":\"^(?!links\\\\.projects\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$)\"}}}],\"default\":{\"links.projects.@{pathParams.id}\":common.common152,\"links.projects.@{pathParams.id}.isInviting\":common.common161,\"links.projects.@{pathParams.id}.toBeValidated\":common.common161},\"patternProperties\":{\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))$\":common.common153,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isAdmin$\":common.common153,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isAdminPending$\":common.common153,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.isInviting$\":common.common168,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.roles$\":common.common170,\"^links\\\\.projects\\\\.(?:[a-f0-9]{24}|@(?:\\\\{[^}]+\\\\}|[A-Za-z0-9_]+(?:\\\\.[A-Za-z0-9_]+)?))\\\\.toBeValidated$\":common.common168},\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common166},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_BADGES\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common185,\"fediverse\":common.common135,\"filters\":{\"properties\":{\"$or\":{\"additionalProperties\":false,\"minProperties\":1,\"patternProperties\":{\"^issuer\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common153},\"type\":\"object\"},\"isParcours\":common.common3,\"preferences.private\":common.common135},\"required\":[\"preferences.private\"],\"type\":\"object\"},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":common.common144,\"searchBy\":common.common148,\"searchType\":common.common185},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"filters\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_BADGES_FILTERS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common82,\"countType\":common.common187,\"fediverse\":common.common135,\"fields\":common.common185,\"filters\":{\"oneOf\":[{\"additionalProperties\":false,\"maxProperties\":1,\"minProperties\":1,\"patternProperties\":{\"badges\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common189}},{\"additionalProperties\":false,\"maxProperties\":3,\"minProperties\":3,\"patternProperties\":{\"badges\\\\.(?:[a-f0-9]{24}|@\\\\w+)$\":common.common189,\"badges\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.attenteEmetteur$\":common.common192,\"badges\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.attenteRecepteur$\":common.common192}},{\"additionalProperties\":false,\"maxProperties\":2,\"minProperties\":2,\"patternProperties\":common.common195},{\"additionalProperties\":false,\"maxProperties\":1,\"minProperties\":1,\"properties\":{\"$or\":{\"additionalProperties\":false,\"maxProperties\":2,\"minProperties\":2,\"patternProperties\":common.common195,\"type\":\"object\"}},\"required\":[\"$or\"]},{\"additionalProperties\":false,\"maxProperties\":1,\"minProperties\":1,\"patternProperties\":{\"badges\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.revoke$\":common.common191}},{\"additionalProperties\":false,\"maxProperties\":1,\"minProperties\":1,\"patternProperties\":{\"badges\\\\.(?:[a-f0-9]{24}|@\\\\w+)\\\\.attenteEmetteur$\":common.common189}}],\"type\":\"object\"},\"indexMin\":common.common149,\"indexStep\":common.common165,\"initType\":common.common136,\"locality\":common.common136,\"name\":common.common1,\"notSourceKey\":common.common82,\"ranges\":{\"additionalProperties\":false,\"default\":{\"Cooperative\":common.common196,\"GovernmentOrganization\":common.common196,\"Group\":common.common196,\"LocalBusiness\":common.common196,\"NGO\":common.common196,\"citoyens\":common.common196,\"projects\":common.common196},\"maxProperties\":7,\"minProperties\":7,\"patternProperties\":{\"^[a-zA-Z][a-zA-Z0-9]*$\":common.common146},\"type\":\"object\"},\"searchType\":common.common187},\"required\":[\"searchType\",\"indexMin\",\"initType\",\"count\",\"countType\",\"indexStep\",\"notSourceKey\",\"locality\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"CONNECT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/link/connect\",\"request\":{\"additionalProperties\":false,\"allOf\":[{\"if\":common.common98,\"then\":{\"properties\":{\"connectType\":{\"const\":\"friend\",\"default\":\"friend\"}}}},{\"if\":common.common197,\"then\":{\"properties\":{\"connectType\":{\"enum\":[\"admin\",\"member\"]}}}},{\"if\":common.common199,\"then\":{\"properties\":{\"connectType\":{\"enum\":[\"admin\",\"contributor\"]}}}},{\"if\":common.common201,\"then\":{\"properties\":{\"connectType\":{\"default\":\"attendee\",\"enum\":[\"attendee\",\"connect\"]}}}}],\"properties\":{\"childId\":common.common203,\"childType\":common.common204,\"connectType\":{\"enum\":[\"admin\",\"member\",\"contributor\",\"attendee\",\"friend\",\"connect\"],\"type\":\"string\"},\"parentId\":common.common11,\"parentType\":common.common205},\"required\":[\"childId\",\"childType\",\"parentType\",\"parentId\",\"connectType\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"DISCONNECT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/link/disconnect\",\"request\":{\"additionalProperties\":false,\"allOf\":[{\"if\":common.common98,\"then\":{\"properties\":{\"connectType\":{\"default\":\"friends\",\"enum\":[\"friends\",\"followers\"]}}}},{\"if\":common.common197,\"then\":{\"properties\":{\"connectType\":{\"default\":\"members\",\"enum\":[\"members\",\"followers\"]}}}},{\"if\":common.common199,\"then\":{\"properties\":{\"connectType\":{\"default\":\"contributors\",\"enum\":[\"contributors\",\"followers\"]}}}},{\"if\":common.common201,\"then\":{\"properties\":{\"connectType\":{\"default\":\"attendees\",\"enum\":[\"attendees\",\"followers\"]}}}}],\"properties\":{\"childId\":common.common203,\"childType\":common.common204,\"connectType\":{\"enum\":[\"members\",\"contributors\",\"attendees\",\"friends\",\"followers\"],\"type\":\"string\"},\"parentId\":common.common11,\"parentType\":common.common205},\"required\":[\"childId\",\"childType\",\"parentType\",\"parentId\",\"connectType\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_ELEMENTS_KEY\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/slug/getinfo/key/{slug}\",\"pathParams\":{\"additionalProperties\":false,\"properties\":{\"slug\":{\"pattern\":\"^([a-zA-Z0-9-_]+)$\",\"type\":\"string\"}},\"required\":[\"slug\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_FAVORIS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/app/config/type/citoyens/id/{id}/json/true\",\"pathParams\":common.common6},{\"auth\":\"bearer\",\"constant\":\"DELETE_FAVORIS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/updatepathvalue?index={index}\",\"pathParams\":{\"properties\":{\"index\":common.common81},\"type\":\"object\"},\"request\":{\"additionalProperties\":false,\"properties\":{\"collection\":common.common206,\"id\":common.common207,\"path\":{\"const\":\"preferences.search.@{pathParams.index}\",\"default\":\"preferences.search.@{pathParams.index}\",\"type\":\"string\"},\"pull\":{\"const\":\"preferences.search\",\"type\":\"string\"},\"value\":common.common136},\"required\":[\"id\",\"collection\",\"path\",\"pull\",\"value\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ADD_FAVORIS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/updatepathvalue\",\"request\":{\"additionalProperties\":false,\"properties\":{\"arrayForm\":common.common191,\"collection\":common.common206,\"id\":common.common207,\"path\":{\"const\":\"preferences.search\",\"default\":\"preferences.search\",\"type\":\"string\"},\"value\":{\"additionalProperties\":false,\"properties\":{\"description\":common.common1,\"locality\":{\"patternProperties\":{\"^[a-f0-9]{24}$\":{\"additionalProperties\":false,\"properties\":common.common55,\"required\":[\"name\",\"type\"]}},\"type\":\"object\"},\"name\":common.common1,\"tags\":common.common31,\"url\":common.common1},\"required\":[\"url\",\"name\"],\"type\":\"object\"}},\"required\":[\"id\",\"collection\",\"path\",\"arrayForm\",\"value\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ADD_ORGANIZATION\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/save\",\"request\":{\"additionalProperties\":false,\"properties\":{\"address\":common.common70,\"collection\":{\"const\":\"organizations\",\"default\":\"organizations\",\"type\":\"string\"},\"email\":common.common2,\"geo\":common.common74,\"geoPosition\":common.common78,\"id\":common.common11,\"key\":{\"const\":\"organization\",\"default\":\"organization\",\"type\":\"string\"},\"name\":{\"minLength\":3,\"type\":\"string\"},\"preferences\":common.common208,\"role\":{\"enum\":[\"admin\",\"member\"],\"type\":\"string\"},\"scope\":common.common136,\"shortDescription\":common.common1,\"tags\":common.common31,\"type\":{\"enum\":[\"NGO\",\"LocalBusiness\",\"Group\",\"GovernmentOrganization\",\"Cooperative\"],\"type\":\"string\"},\"url\":common.common4},\"required\":[\"id\",\"collection\",\"key\",\"name\",\"type\",\"role\",\"scope\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ADD_PROJECT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/save\",\"request\":{\"additionalProperties\":false,\"properties\":{\"address\":common.common70,\"collection\":{\"const\":\"projects\",\"default\":\"projects\",\"type\":\"string\"},\"geo\":common.common74,\"geoPosition\":common.common78,\"id\":common.common11,\"key\":{\"const\":\"project\",\"default\":\"project\",\"type\":\"string\"},\"name\":common.common1,\"parent\":common.common211,\"preferences\":{\"default\":{\"crowdfunding\":true,\"isOpenData\":false,\"isOpenEdition\":false},\"properties\":{\"crowdfunding\":common.common102,\"isOpenData\":common.common120,\"isOpenEdition\":common.common120},\"required\":[\"isOpenData\",\"isOpenEdition\"],\"type\":\"object\"},\"public\":common.common102,\"scope\":common.common136,\"shortDescription\":common.common1,\"tags\":common.common31,\"url\":common.common4},\"required\":[\"id\",\"collection\",\"key\",\"parent\",\"name\",\"public\",\"scope\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ADD_POI\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/save\",\"request\":{\"additionalProperties\":false,\"properties\":{\"address\":common.common70,\"collection\":common.common214,\"description\":common.common1,\"geo\":common.common74,\"geoPosition\":common.common78,\"id\":common.common11,\"key\":common.common214,\"name\":common.common1,\"parent\":common.common211,\"scope\":common.common136,\"tags\":common.common31,\"type\":common.common62,\"urls\":common.common31},\"required\":[\"id\",\"collection\",\"key\",\"parent\",\"type\",\"name\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ADD_EVENT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/save\",\"request\":{\"additionalProperties\":false,\"else\":{\"required\":[\"openingHours\"]},\"if\":{\"properties\":{\"recurrency\":common.common164}},\"properties\":{\"address\":common.common70,\"collection\":common.common215,\"email\":common.common2,\"endDate\":common.common216,\"geo\":common.common74,\"geoPosition\":common.common78,\"id\":common.common11,\"key\":{\"const\":\"event\",\"default\":\"event\",\"type\":\"string\"},\"name\":{\"minLength\":2,\"type\":\"string\"},\"openingHours\":{\"default\":[\"\",\"\",\"\",\"\",\"\",\"\",\"\"],\"items\":{\"anyOf\":[common.common69,{\"additionalProperties\":false,\"properties\":{\"dayOfWeek\":{\"enum\":[\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\",\"Su\"],\"type\":\"string\"},\"hours\":{\"default\":[],\"items\":{\"additionalProperties\":false,\"properties\":{\"closes\":common.common217,\"opens\":common.common217},\"required\":[\"opens\",\"closes\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"dayOfWeek\",\"hours\"],\"type\":\"object\"}]},\"maxItems\":7,\"minItems\":7,\"type\":\"array\"},\"organizer\":common.common211,\"parent\":common.common58,\"preferences\":{\"default\":{\"isOpenData\":false,\"isOpenEdition\":false},\"properties\":{\"isOpenData\":common.common120,\"isOpenEdition\":common.common120},\"required\":[\"isOpenData\",\"isOpenEdition\"],\"type\":\"object\"},\"public\":common.common102,\"recurrency\":common.common120,\"scope\":common.common136,\"shortDescription\":{\"format\":\"textarea\",\"type\":\"string\"},\"startDate\":common.common216,\"tags\":common.common31,\"timeZone\":common.common1,\"type\":common.common61,\"url\":common.common4},\"required\":[\"id\",\"collection\",\"key\",\"organizer\",\"type\",\"name\",\"scope\"],\"startBeforeEnd\":true,\"then\":{\"required\":[\"startDate\",\"endDate\"]},\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"DELETE_POI\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/delete/type/poi/id/{id}\",\"pathParams\":common.common119,\"request\":common.common8},{\"auth\":\"bearer\",\"constant\":\"DELETE_EVENT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/delete/type/events/id/{id}/\",\"pathParams\":common.common119,\"request\":common.common8},{\"auth\":\"bearer\",\"constant\":\"DELETE_ELEMENT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/delete/type/{type}/id/{id}\",\"pathParams\":{\"additionalProperties\":false,\"properties\":{\"id\":common.common11,\"type\":common.common1},\"required\":[\"type\",\"id\"],\"type\":\"object\"},\"request\":common.common8},{\"auth\":\"bearer\",\"constant\":\"ADD_IMAGE_ELEMENT\",\"contentType\":\"multipart/form-data\",\"method\":\"POST\",\"path\":\"/co2/document/upload-save/dir/communecter/folder/{folder}/ownerId/{ownerId}/input/qqfile/docType/image/contentKey/profil\",\"pathParams\":{\"additionalProperties\":false,\"properties\":{\"folder\":{\"enum\":[\"badges\",\"events\"],\"type\":\"string\"},\"ownerId\":common.common11},\"required\":[\"folder\",\"ownerId\"],\"type\":\"object\"},\"request\":{\"additionalProperties\":false,\"properties\":{\"qqfile\":common.common20,\"qqfilename\":common.common1,\"qqtotalfilesize\":common.common218,\"qquuid\":common.common11},\"required\":[\"qquuid\",\"qqfilename\",\"qqtotalfilesize\",\"qqfile\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"LINK_VALIDATE\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/link/validate\",\"request\":{\"additionalProperties\":false,\"properties\":{\"childId\":common.common5,\"childType\":common.common46,\"linkOption\":{\"enum\":[\"isInviting\",\"toBeValidated\",\"isAdminPending\"],\"type\":\"string\"},\"parentId\":common.common11,\"parentType\":common.common205},\"required\":[\"childId\",\"childType\",\"parentType\",\"parentId\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"SEARCH_MEMBER_AUTOCOMPLETE\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/searchmemberautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"search\":common.common1,\"searchMode\":{\"default\":\"personOnly\",\"enum\":[\"personOnly\",\"organizationOnly\",\"mixte\"],\"type\":\"string\"}},\"required\":[\"search\",\"searchMode\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_NOTIFICATIONS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/notification/getnotifications/type/{type}/id/{id}\",\"pathParams\":common.common219,\"request\":{\"additionalProperties\":false,\"properties\":{\"indexMin\":common.common103},\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"GET_NOTIFICATIONS_COUNT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/notification/getnotifications/type/{type}/id/{id}\",\"pathParams\":common.common219,\"request\":{\"additionalProperties\":false,\"properties\":{\"refreshTimestamp\":common.common218},\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"NOTIFICATION_UPDATE\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/notification/update\",\"request\":{\"additionalProperties\":false,\"properties\":{\"action\":{\"enum\":[\"seen\",\"read\"],\"type\":\"string\"},\"all\":common.common82},\"required\":[\"action\",\"all\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"REMOVE_ALL_NOTIFICATIONS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/notification/removeall\"},{\"auth\":\"bearer\",\"constant\":\"MARK_NOTIFICATION_AS_READ\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/notification/marknotificationasread\",\"request\":common.common119},{\"auth\":\"none\",\"constant\":\"ACTIVITYPUB_SEARCH\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"GET\",\"params\":[common.common20],\"path\":\"/api/activitypub/search?address={address}\",\"pathParams\":{\"additionalProperties\":false,\"properties\":{\"address\":common.common1},\"required\":[\"address\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ACTIVITYPUB_LINK\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/api/activitypub/link\",\"request\":{\"additionalProperties\":false,\"properties\":{\"action\":{\"enum\":[\"undo_follow\",\"accept_invitation\",\"reject_invitation\",\"undo_accept\",\"undo_request_follow\",\"follow\",\"remove_follow\",\"accept_follower\",\"reject_follower\",\"remove_follower\",\"remove_invitation\"],\"type\":\"string\"},\"actor\":{\"additionalProperties\":false,\"properties\":{\"id\":common.common1,\"name\":common.common1,\"type\":{\"enum\":[\"person\"],\"type\":\"string\"}},\"required\":[\"id\",\"type\",\"name\"],\"type\":\"object\"},\"payload\":common.common4},\"required\":[\"action\",\"payload\",\"actor\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"ACTIVITYPUB_GET_COMMUNITY\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/api/activitypub/getcommunity/userId/${userId}/type/${type}/actor/person\",\"pathParams\":{\"additionalProperties\":false,\"properties\":{\"type\":{\"enum\":[\"follows\",\"followers\"],\"type\":\"string\"},\"userId\":common.common11},\"required\":[\"userId\",\"type\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_BADGE\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/app/page/type/badges/id/{id}/json/true\",\"pathParams\":common.common119},{\"auth\":\"none\",\"constant\":\"GET_EMETTEUR_BADGES\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/app/badge/json/true\"},{\"auth\":\"bearer\",\"constant\":\"ADD_BADGES\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/element/save\",\"request\":{\"additionalProperties\":false,\"properties\":{\"collection\":common.common222,\"criteria\":{\"additionalProperties\":false,\"properties\":{\"narrative\":common.common1},\"required\":[\"narrative\"],\"type\":\"object\"},\"description\":common.common1,\"id\":common.common11,\"isParcours\":common.common120,\"issuer\":{\"additionalProperties\":false,\"patternProperties\":{\"^(?:[a-f0-9]{24}|@userId)$\":{\"additionalProperties\":false,\"properties\":{\"name\":common.common1,\"type\":{\"enum\":[\"citoyens\",\"organizations\",\"projects\"],\"type\":\"string\"}},\"required\":[\"type\"],\"type\":\"object\"}},\"type\":\"object\"},\"key\":common.common223,\"name\":common.common1,\"parent\":{\"additionalProperties\":false,\"patternProperties\":{\"^[a-f0-9]{24}$\":{\"additionalProperties\":false,\"properties\":{\"name\":common.common1,\"type\":common.common222},\"required\":[\"type\"],\"type\":\"object\"}},\"type\":\"object\"},\"preferences\":common.common208,\"public\":common.common102,\"scope\":common.common136,\"tags\":common.common31},\"required\":[\"id\",\"collection\",\"key\",\"name\",\"public\",\"scope\",\"issuer\",\"criteria\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"ASSIGN_BADGES\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/badges/assign\",\"request\":{\"additionalProperties\":false,\"properties\":{\"award\":{\"patternProperties\":{\"^[0-9a-f]{24}$\":common.common54},\"type\":\"object\"},\"badgeId\":common.common11,\"collection\":common.common222,\"evidences\":{\"items\":{\"additionalProperties\":false,\"properties\":{\"narative\":common.common1,\"url\":common.common4},\"required\":[\"narative\"],\"type\":\"object\"},\"type\":\"array\"},\"key\":common.common223,\"narative\":common.common1,\"scope\":common.common136},\"required\":[\"key\",\"collection\",\"badgeId\",\"award\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_EVENTS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/search/agenda\",\"request\":{\"additionalProperties\":false,\"properties\":{\"count\":common.common120,\"countType\":{\"const\":[\"events\"],\"default\":[\"events\"],\"type\":\"array\"},\"endDateUTC\":common.common216,\"fediverse\":common.common120,\"indexMin\":common.common103,\"indexStep\":{\"default\":100,\"type\":\"integer\"},\"locality\":{\"patternProperties\":{\"^[^\\\\s]+$\":{\"type\":\"object\"}},\"type\":\"object\"},\"name\":common.common1,\"searchType\":{\"const\":[\"events\"],\"default\":[\"events\"],\"items\":common.common1,\"type\":\"array\"},\"startDate\":common.common81,\"startDateUTC\":common.common216,\"type\":common.common61},\"required\":[\"searchType\",\"indexMin\",\"indexStep\",\"startDate\",\"startDateUTC\",\"fediverse\"],\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"SHARE_EVENTS\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/news/co/share\",\"request\":{\"additionalProperties\":false,\"else\":common.common121,\"if\":common.common123,\"properties\":{\"childId\":common.common11,\"childType\":common.common65,\"comment\":common.common1,\"connectType\":common.common125,\"parentId\":common.common11,\"parentType\":common.common215},\"required\":[\"parentId\",\"childId\",\"childType\",\"connectType\",\"parentType\"],\"then\":common.common126,\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"INVITE_EVENT\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/link/multiconnect\",\"request\":{\"additionalProperties\":false,\"else\":common.common96,\"if\":common.common98,\"properties\":{\"listInvite\":{\"additionalProperties\":false,\"minProperties\":1,\"properties\":{\"citoyens\":common.common224,\"invites\":{\"patternProperties\":{\"^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$\":{\"additionalProperties\":false,\"properties\":{\"email\":common.common2,\"isAdmin\":common.common228,\"msg\":common.common1,\"name\":common.common1,\"roles\":common.common31},\"required\":[\"name\",\"email\"],\"type\":\"object\"}},\"type\":\"object\"},\"organizations\":common.common224,\"projects\":common.common224},\"type\":\"object\"},\"parentId\":common.common1,\"parentType\":common.common65},\"required\":[\"parentId\",\"parentType\",\"listInvite\"],\"then\":common.common100,\"type\":\"object\"}},{\"auth\":\"bearer\",\"constant\":\"FOLLOW\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/link/follow\",\"request\":{\"additionalProperties\":false,\"properties\":{\"childId\":common.common203,\"childType\":common.common204,\"parentId\":common.common11,\"parentType\":common.common205},\"required\":[\"childId\",\"childType\",\"parentType\",\"parentId\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_COSTUM_JSON\",\"contentType\":\"application/x-www-form-urlencoded\",\"method\":\"POST\",\"path\":\"/co2/cms/getcostumjson?slug={slug}\",\"pathParams\":{\"slug\":common.common1}},{\"auth\":\"none\",\"constant\":\"GLOBAL_AUTOCOMPLETE_COSTUM\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"globalautocomplete\",\"method\":\"POST\",\"path\":\"/co2/search/globalautocomplete\",\"request\":{\"additionalProperties\":false,\"properties\":{\"contextId\":common.common11,\"contextType\":common.common229,\"costumEditMode\":common.common120,\"costumSlug\":common.common1,\"count\":common.common82,\"countType\":common.common230,\"fediverse\":common.common120,\"fields\":common.common31,\"filters\":{\"default\":\"\",\"oneOf\":[{\"additionalProperties\":true,\"type\":\"object\"},common.common69]},\"indexMax\":common.common81,\"indexMin\":common.common137,\"indexStep\":common.common138,\"initType\":common.common136,\"locality\":common.common139,\"mapUsed\":common.common191,\"name\":common.common1,\"notSourceKey\":common.common191,\"options\":{\"additionalProperties\":true,\"properties\":{\"tags\":{\"additionalProperties\":true,\"properties\":{\"verb\":common.common1},\"type\":\"object\"}},\"type\":\"object\"},\"ranges\":common.common144,\"searchBy\":common.common148,\"searchTags\":common.common31,\"searchType\":common.common230,\"sortBy\":{\"additionalProperties\":{\"enum\":[1,-1],\"type\":\"integer\"},\"type\":\"object\"},\"sourceKey\":common.common31},\"required\":[\"searchType\",\"countType\",\"indexMin\",\"indexStep\",\"initType\",\"count\",\"fediverse\",\"costumSlug\",\"costumEditMode\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"COSTUM_EVENT_REQUEST_ACTORS\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"costumEventRequestActors\",\"method\":\"POST\",\"path\":\"/costum/coevent/get_events/request/actors/id/{id}/type/{type}\",\"pathParams\":common.common232,\"request\":{\"additionalProperties\":false,\"properties\":{\"contextId\":common.common11,\"contextType\":common.common229,\"costumEditMode\":common.common120,\"costumSlug\":common.common1,\"parent_only\":common.common3,\"sourceKey\":common.common31,\"types\":{\"items\":{\"enum\":[\"organizer\",\"links.attendees\",\"creator\",\"links.creator\",\"links.organizer\",\"organizerName\",\"animator\"],\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"COSTUM_EVENT_REQUEST_SUBEVENTS\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"costumEventRequestSubevents\",\"method\":\"POST\",\"path\":\"/costum/coevent/get_events/request/subevents/id/{id}/type/{type}\",\"pathParams\":common.common232,\"request\":{\"additionalProperties\":false,\"allOf\":[{\"if\":{\"properties\":{\"date\":common.common1},\"required\":[\"date\"]},\"then\":{\"required\":[\"timezone\"]}}],\"properties\":{\"contextId\":common.common11,\"contextType\":common.common229,\"costumEditMode\":common.common120,\"costumSlug\":common.common1,\"date\":{\"oneOf\":[common.common1,{\"properties\":{\"between\":{\"properties\":{\"end\":common.common41,\"start\":common.common41},\"required\":[\"start\",\"end\"],\"type\":\"object\"}},\"required\":[\"between\"],\"type\":\"object\"}]},\"fromToday\":common.common3,\"regions\":common.common235,\"sourceKey\":common.common31,\"tags\":common.common31,\"timezone\":common.common1,\"type\":common.common1},\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"COSTUM_EVENT_REQUEST_ELEMENT_EVENT\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"costumEventRequestElementEvent\",\"method\":\"POST\",\"path\":\"/costum/coevent/get_events/request/element_event/id/{id}/type/{type}\",\"pathParams\":common.common232,\"request\":common.common238},{\"auth\":\"none\",\"constant\":\"COSTUM_EVENT_REQUEST_CATEGORIES\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"costumEventRequestCategories\",\"method\":\"POST\",\"path\":\"/costum/coevent/get_events/request/categories/id/{id}/type/{type}\",\"pathParams\":common.common232,\"request\":common.common238},{\"auth\":\"none\",\"constant\":\"COSTUM_EVENT_REQUEST_DATES\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"costumEventRequestDates\",\"method\":\"POST\",\"path\":\"/costum/coevent/get_events/request/dates/id/{id}/type/{type}\",\"pathParams\":common.common232,\"request\":{\"additionalProperties\":false,\"properties\":{\"contextId\":common.common11,\"contextType\":common.common229,\"costumEditMode\":common.common120,\"costumSlug\":common.common1,\"regions\":common.common235,\"sourceKey\":common.common31,\"tags\":common.common31,\"type\":common.common1},\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"COSTUM_EVENT_REQUEST_EVENT\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"costumEventRequestEvent\",\"method\":\"POST\",\"path\":\"/costum/coevent/get_events/request/event/id/{id}/type/{type}\",\"pathParams\":common.common232,\"request\":common.common238},{\"auth\":\"none\",\"constant\":\"COSTUM_EVENT_REQUEST_LINK_TL_TO_EVENT\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"costumEventRequestLinkTlToEvent\",\"method\":\"POST\",\"path\":\"/costum/coevent/get_events/request/link_tl_to_event/id/{id}/type/{type}\",\"pathParams\":common.common232,\"request\":{\"additionalProperties\":false,\"properties\":{\"contextId\":common.common11,\"contextType\":common.common229,\"costumEditMode\":common.common120,\"costumSlug\":common.common1,\"event\":common.common1,\"sourceKey\":common.common31,\"tl\":common.common1},\"required\":[\"tl\",\"event\"],\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"COSTUM_EVENT_REQUEST_LOAD_CONTEXT_TAG\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"costumEventRequestLoadContextTag\",\"method\":\"POST\",\"path\":\"/costum/coevent/get_events/request/load_context_tag/id/{id}/type/{type}\",\"pathParams\":common.common232,\"request\":{\"additionalProperties\":false,\"properties\":{\"contextId\":common.common11,\"contextType\":common.common229,\"costumEditMode\":common.common120,\"costumSlug\":common.common1,\"event\":common.common11,\"search\":common.common1,\"sourceKey\":common.common31},\"type\":\"object\"}},{\"auth\":\"none\",\"constant\":\"GET_GALLERY\",\"contentType\":\"application/x-www-form-urlencoded\",\"functionCocostum\":\"\",\"method\":\"POST\",\"path\":\"/co2/gallery/index/type/{type}/id/{id}/docType/{docType}/tpl/json\",\"pathParams\":{\"additionalProperties\":false,\"else\":common.common66,\"if\":common.common88,\"properties\":{\"docType\":{\"default\":\"image\",\"enum\":[\"image\",\"file\",\"bookmarks\"],\"type\":\"string\"},\"id\":common.common1,\"type\":common.common184},\"required\":[\"id\",\"type\",\"docType\"],\"then\":common.common84,\"type\":\"object\"},\"request\":{\"additionalProperties\":false,\"properties\":{\"contentKey\":common.common1,\"folderId\":common.common1},\"type\":\"object\"}}]};\n","// src/utils/TokenStorage.js\n\nexport class TokenStorageStrategy {\n getAccessToken() {\n throw new Error(\"getAccessToken() doit être implémenté\");\n }\n \n // eslint-disable-next-line no-unused-vars\n setAccessToken(token) {\n throw new Error(\"setAccessToken() doit être implémenté\");\n }\n \n getRefreshToken() {\n throw new Error(\"getRefreshToken() doit être implémenté\");\n }\n \n // eslint-disable-next-line no-unused-vars\n setRefreshToken(token) {\n throw new Error(\"setRefreshToken() doit être implémenté\");\n }\n \n clear() {\n throw new Error(\"clear() doit être implémenté\");\n }\n}\n \nexport class MemoryStorageStrategy extends TokenStorageStrategy {\n constructor() {\n super();\n this._accessToken = null;\n this._refreshToken = null;\n }\n \n getAccessToken() {\n return this._accessToken;\n }\n \n setAccessToken(token) {\n this._accessToken = token;\n }\n \n getRefreshToken() {\n return this._refreshToken;\n }\n \n setRefreshToken(token) {\n this._refreshToken = token;\n }\n \n clear() {\n this._accessToken = null;\n this._refreshToken = null;\n }\n}\n \nexport class LocalStorageStrategy extends TokenStorageStrategy {\n constructor(prefix = \"cocolight\") {\n super();\n this.prefix = prefix;\n }\n \n getAccessToken() {\n return typeof localStorage !== \"undefined\"\n ? localStorage.getItem(`${this.prefix}_accessToken`)\n : null;\n }\n \n setAccessToken(token) {\n if (typeof localStorage !== \"undefined\") {\n localStorage.setItem(`${this.prefix}_accessToken`, token);\n }\n }\n \n getRefreshToken() {\n return typeof localStorage !== \"undefined\"\n ? localStorage.getItem(`${this.prefix}_refreshToken`)\n : null;\n }\n \n setRefreshToken(token) {\n if (typeof localStorage !== \"undefined\") {\n localStorage.setItem(`${this.prefix}_refreshToken`, token);\n }\n }\n \n clear() {\n if (typeof localStorage !== \"undefined\") {\n localStorage.removeItem(`${this.prefix}_accessToken`);\n localStorage.removeItem(`${this.prefix}_refreshToken`);\n }\n }\n}\n ","// MultiServerTokenStorageStrategy.js\nimport { TokenStorageStrategy } from \"./TokenStorage.js\";\n\nexport class MultiServerTokenStorageStrategy extends TokenStorageStrategy {\n constructor() {\n super();\n this._currentBaseURL = null;\n }\n\n use(baseURL) {\n if (!baseURL) throw new Error(\"baseURL est requis\");\n this._currentBaseURL = baseURL.replace(/\\/+$/, \"\");\n }\n\n _ensureContext() {\n if (!this._currentBaseURL) throw new Error(\"baseURL non défini. Appelez use(baseURL)\");\n }\n\n getServers() {\n throw new Error(\"getServers() doit être implémenté\");\n }\n\n exportAll() {\n throw new Error(\"exportAll() doit être implémenté\");\n }\n}\n\n// Mémoire\nexport class MultiServerMemoryStorageStrategy extends MultiServerTokenStorageStrategy {\n constructor() {\n super();\n this._storage = new Map();\n }\n \n getAccessToken() {\n this._ensureContext();\n return this._storage.get(this._currentBaseURL)?.accessToken || null;\n }\n \n setAccessToken(token) {\n this._ensureContext();\n const current = this._storage.get(this._currentBaseURL) || {};\n this._storage.set(this._currentBaseURL, { ...current, accessToken: token });\n }\n \n getRefreshToken() {\n this._ensureContext();\n return this._storage.get(this._currentBaseURL)?.refreshToken || null;\n }\n \n setRefreshToken(token) {\n this._ensureContext();\n const current = this._storage.get(this._currentBaseURL) || {};\n this._storage.set(this._currentBaseURL, { ...current, refreshToken: token });\n }\n \n clear() {\n this._ensureContext();\n this._storage.delete(this._currentBaseURL);\n }\n \n getServers() {\n return [...this._storage.keys()];\n }\n \n exportAll() {\n return Object.fromEntries(this._storage.entries());\n }\n}\n \n// Navigateur (localStorage)\nexport class MultiServerLocalStorageStrategy extends MultiServerTokenStorageStrategy {\n constructor(prefix = \"cocolight\") {\n super();\n this.prefix = prefix;\n }\n \n _key(baseURL) {\n return `${this.prefix}_tokens_${baseURL}`;\n }\n \n _getData() {\n this._ensureContext();\n const raw = localStorage.getItem(this._key(this._currentBaseURL));\n return raw ? JSON.parse(raw) : {};\n }\n \n _setData(data) {\n localStorage.setItem(this._key(this._currentBaseURL), JSON.stringify(data));\n }\n \n getAccessToken() {\n return this._getData().accessToken || null;\n }\n \n setAccessToken(token) {\n const data = this._getData();\n data.accessToken = token;\n this._setData(data);\n }\n \n getRefreshToken() {\n return this._getData().refreshToken || null;\n }\n \n setRefreshToken(token) {\n const data = this._getData();\n data.refreshToken = token;\n this._setData(data);\n }\n \n clear() {\n localStorage.removeItem(this._key(this._currentBaseURL));\n }\n \n getServers() {\n const keys = Object.keys(localStorage);\n return keys\n .filter(k => k.startsWith(`${this.prefix}_tokens_`))\n .map(k => k.replace(`${this.prefix}_tokens_`, \"\"));\n }\n \n exportAll() {\n const result = {};\n for (const baseURL of this.getServers()) {\n const raw = localStorage.getItem(this._key(baseURL));\n if (raw) result[baseURL] = JSON.parse(raw);\n }\n return result;\n }\n}","import { EventEmitter } from \"events\";\n\nimport { AggregateAjvError } from \"@segment/ajv-human-errors\";\nimport Ajv from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport axios from \"axios\";\nimport axiosRetry from \"axios-retry\";\nimport EJSON from \"ejson\";\nimport { jwtDecode } from \"jwt-decode\";\nimport pino from \"pino\";\n\nimport MongoID from \"./EJSONType.js\";\nimport endpointsJson from \"./endpoints.module.js\";\nimport { ApiClientError, ApiResponseError, ApiValidationError, CircuitBreakerError } from \"./error.js\";\nimport { MultiServerTokenStorageStrategy } from \"./utils/MultiServerTokenStorageStrategy.js\";\nimport { MemoryStorageStrategy } from \"./utils/TokenStorage.js\";\n\n\nEJSON.addType(\"oid\", value => {\n return new MongoID.ObjectID(value);\n});\n\n/**\n * Client générique pour consommer une API REST avec validation AJV, gestion des tokens,\n * circuit breaker, retry automatique, et support offline.\n *\n * @extends EventEmitter\n *\n * @fires ApiClient#retryAttempt\n * @fires ApiClient#queuedOffline\n * @fires ApiClient#circuitBreakerOpen\n * @fires ApiClient#circuitBreakerReset\n * @fires ApiClient#refreshSuccess\n * @fires ApiClient#refreshFailed\n * @fires ApiClient#sessionReset\n * @fires ApiClient#validationError\n * @fires ApiClient#offlineModeChanged\n * @fires ApiClient#userLoggedIn\n */\nexport default class ApiClient extends EventEmitter {\n /**\n * @param {Object} options\n * @param {string} options.baseURL\n * @param {string} [options.accessToken]\n * @param {string} [options.refreshToken]\n * @param {string} [options.refreshUrl=/api/cocolight/refreshtoken]\n * @param {Array} [options.endpoints=endpointsJson.endpoints]\n * @param {number} [options.timeout=30000]\n * @param {boolean} [options.debug=false]\n * @param {number} [options.maxRetries=0] - Nombre de tentatives auto (axios-retry)\n * @param {number} [options.circuitBreakerThreshold=5] - Nb d'erreurs avant de bloquer\n * @param {number} [options.circuitBreakerResetTime=60000] - Ms avant de reset le breaker\n * @param {boolean} [options.fromJSONValue=true] - Si true, les données sont transformées en EJSON\n * @param {TokenStorageStrategy} [options.tokenStorageStrategy=null] - Stratégie de stockage des tokens\n */\n constructor({\n baseURL,\n accessToken,\n refreshToken,\n refreshUrl = \"/api/cocolight/refreshtoken\",\n endpoints = endpointsJson.endpoints,\n timeout = 30000,\n debug = false,\n maxRetries = 0,\n circuitBreakerThreshold = 5,\n circuitBreakerResetTime = 60000,\n fromJSONValue = true,\n tokenStorageStrategy = null\n } = {}) {\n super(); // EventEmitter\n\n if (!baseURL) {\n throw new ApiClientError(\"Le paramètre \\\"baseURL\\\" est obligatoire.\", 500);\n }\n\n this.__entityTag = \"ApiClient\";\n \n this._baseURL = baseURL;\n this._refreshUrl = refreshUrl;\n this._endpoints = endpoints;\n this._debug = debug;\n let _userId = null;\n this._offlineClientManager = null;\n\n // Active la transformation des données en EJSON globalement\n this._fromJSONValue = fromJSONValue;\n\n Object.defineProperty(this, \"userId\", {\n get: () => _userId,\n set: () => {\n throw new Error(\"Modification directe de userId non autorisée.\");\n },\n enumerable: true\n });\n\n this._setUserId = (id) => {\n _userId = id;\n this._logger.debug(`[ApiClient] userId set: ${id}`);\n };\n\n // AJV\n this._ajv = new Ajv({ strict: false, useDefaults: true, allErrors: true, verbose: true });\n addFormats(this._ajv);\n\n this._ajv.addFormat(\"textarea\", true);\n\n this._ajv.addKeyword({\n keyword: \"startBeforeEnd\",\n type: \"object\",\n errors: true,\n validate: this._startBeforeEndValidate\n });\n\n // Pino logger\n this._logger = pino({\n transport: {\n target: \"pino-pretty\",\n options: { colorize: true }\n },\n level: debug ? \"debug\" : \"info\"\n });\n\n // Création instance Axios\n this._client = axios.create({\n baseURL,\n timeout\n });\n\n // axios-retry : pour retenter en cas de soucis réseau ou code 5xx\n if (maxRetries > 0) {\n axiosRetry(this._client, {\n retries: maxRetries,\n retryDelay: axiosRetry.exponentialDelay,\n retryCondition: (error) => {\n // Retry sur erreurs 5xx ou erreurs réseau\n return axiosRetry.isNetworkError(error) || axiosRetry.isRetryableError(error);\n },\n onRetry: (retryCount, error, requestConfig) => {\n this._logger.warn(`[Retry] Tentative #${retryCount} pour ${requestConfig?.url}`);\n this.emit(\"retryAttempt\", { retryCount, url: requestConfig?.url });\n }\n });\n this._logger.info(`[ApiClient] Retry activé : ${maxRetries} max`);\n }\n\n // Circuit breaker (simplifié)\n this._breakerThreshold = circuitBreakerThreshold;\n this._breakerResetTime = circuitBreakerResetTime;\n this._breakerErrorCount = 0;\n this._breakerOpen = false;\n this._lastBreakerOpenTime = null;\n\n this._accessToken = null;\n this._refreshToken = null;\n\n if (tokenStorageStrategy instanceof MultiServerTokenStorageStrategy) {\n tokenStorageStrategy.use(this._baseURL);\n }\n \n this._tokenStorage = tokenStorageStrategy || new MemoryStorageStrategy();\n\n if (\n typeof this._tokenStorage?.getAccessToken !== \"function\" ||\n typeof this._tokenStorage?.setAccessToken !== \"function\" ||\n typeof this._tokenStorage?.getRefreshToken !== \"function\" ||\n typeof this._tokenStorage?.setRefreshToken !== \"function\" ||\n typeof this._tokenStorage?.clear !== \"function\"\n ) {\n throw new Error(\"[ApiClient] La stratégie de stockage des tokens n’est pas valide. Elle doit implémenter les méthodes requises.\");\n }\n \n // Applique un token initial s'il est fourni\n if(refreshToken){\n this.setRefreshToken(refreshToken);\n }\n\n if (accessToken) {\n this.setToken(accessToken);\n }\n\n const initialAccessToken = this._tokenStorage.getAccessToken();\n if (initialAccessToken) {\n this.setToken(initialAccessToken);\n }\n\n const initialRefreshToken = this._tokenStorage.getRefreshToken();\n if (initialRefreshToken) {\n this.setRefreshToken(initialRefreshToken);\n }\n \n\n // Intercepteur 401 -> refresh\n this._client.interceptors.response.use(\n response => response,\n async error => {\n const originalRequest = error.config;\n\n // Si la requête est déjà réessayée, abandonne\n if (originalRequest._retry) {\n this._logger.error(\"[ApiClient] Requête déjà retentée, échec définitif.\");\n throw error;\n }\n\n if (error.response && error.response.status === 401 && this._refreshToken) {\n originalRequest._retry = true;\n\n try {\n this._logger.info(\"[ApiClient] Tentative de refresh du token...\");\n const refreshed = await this._refreshAccessToken();\n\n if (refreshed) {\n this._logger.info(\"[ApiClient] Token rafraîchi avec succès.\");\n\n // 🔑 Mise à jour EXPLICITE du header Authorization dans la requête originale\n originalRequest.headers[\"Authorization\"] = \"Bearer \" + this.getToken();\n\n this._logger.info(\"[ApiClient] Retente la requête originale avec le nouveau token.\");\n return this._client.request(originalRequest);\n } else {\n this.resetSession();\n throw new ApiClientError(\"Impossible de rafraîchir le token.\", 401);\n }\n } catch (err) {\n this.resetSession();\n throw new ApiClientError(\"Erreur lors du rafraîchissement du token.\", 401, err);\n }\n }\n\n throw error;\n }\n );\n\n }\n\n /**\n * Sets the access token for the API client and updates the authorization header.\n *\n * @param {string} token - The access token to be set.\n */\n setToken(token) {\n this._accessToken = token;\n this._tokenStorage.setAccessToken(token);\n this._client.defaults.headers.common[\"Authorization\"] = \"Bearer \" + token;\n // Extrait l'id depuis le token et le stocke si disponible\n const userId = this._getIdFromToken(token);\n if (userId) {\n this._setUserId(userId);\n this._logger.debug(`[ApiClient] userId extrait et défini : ${userId}`);\n }\n this._logger.debug(`[ApiClient] setToken: ${token}`);\n }\n\n /**\n * Retrieves the current access token.\n *\n * @returns {string} The access token.\n */\n getToken() {\n return this._accessToken;\n }\n\n /**\n * Sets the refresh token for the API client.\n *\n * @param {string} refreshToken - The refresh token to be set.\n */\n setRefreshToken(token) {\n this._refreshToken = token;\n this._tokenStorage.setRefreshToken(token);\n if(this.userId === null){\n // Extrait l'id depuis le token et le stocke si disponible\n const userId = this._getIdFromToken(token);\n if (userId) {\n this._setUserId(userId);\n this._logger.debug(`[ApiClient] userId extrait depuis refreshToken : ${userId}`);\n }\n }\n this._logger.debug(`[ApiClient] setRefreshToken: ${token}`);\n }\n\n /**\n * Retrieves the current refresh token.\n *\n * @returns {string} The refresh token.\n */\n getRefreshToken() {\n return this._refreshToken;\n }\n\n /**\n * Indique si le client est connecté.\n * On considère que le client est connecté si un token d'accès (_accessToken) est défini.\n *\n * @returns {boolean} True si connecté, false sinon.\n */\n get isConnected() {\n return !!this._accessToken;\n }\n\n /**\n * Extrait l'identifiant depuis un JWT.\n *\n * @param {string} token - Le token JWT (accessToken ou refreshToken).\n * @returns {string|null} L'identifiant extrait ou null si non trouvé.\n */\n _getIdFromToken(token) {\n if (!token) return null;\n try {\n // Décodage du token grâce à jwt-decode\n const payload = jwtDecode(token);\n // L'identifiant peut être dans \"id\" ou \"userId\"\n this._logger.debug(\"[ApiClient] Payload décodé :\", payload);\n return payload.id || payload.userId || null;\n } catch (err) {\n this._logger.error(\"[ApiClient] Erreur lors du décodage du token :\", err);\n return null;\n }\n }\n\n /**\n * Méthode simplifiée de refresh (en JSON). \n * Emet un event refreshSuccess si ça marche\n */\n async _refreshAccessToken() {\n if (!this._refreshToken) return false;\n\n const refreshClient = axios.create({\n baseURL: this._baseURL,\n timeout: 10000, // ajuster si nécessaire\n headers: { \"Content-Type\": \"application/json\" }\n });\n\n try {\n const response = await refreshClient.post(this._refreshUrl, {\n refreshToken: this._refreshToken\n });\n if (response.data && response.data.token) {\n this.setToken(response.data.token);\n if (response.data.refreshToken) {\n this.setRefreshToken(response.data.refreshToken);\n }\n this.emit(\"refreshSuccess\", response.data);\n return true;\n }\n return false;\n } catch (err) {\n // Si on a une erreur, on reset la session\n this.emit(\"refreshFailed\", { error: err.message });\n this.resetSession();\n this._logger.error(`[ApiClient] Refresh Error : ${err.message}`);\n return false;\n }\n }\n\n /**\n * checkCircuitBreaker : vérifie si on peut appeler l'API ou non\n * si le breaker est \\\"open\\\", on regarde si on peut \\\"reset\\\" \n */\n _checkCircuitBreaker() {\n if (!this._breakerOpen) return true;\n const now = Date.now();\n if (now - this._lastBreakerOpenTime > this._breakerResetTime) {\n // On reset\n this._breakerOpen = false;\n this._breakerErrorCount = 0;\n this._logger.warn(\"[ApiClient] Circuit breaker réinitialisé\");\n this.emit(\"circuitBreakerReset\");\n return true;\n }\n return false;\n }\n\n /**\n * updateCircuitBreaker : incremente le compteur d'erreurs \n * si on dépasse le threshold, on \\\"open\\\" le breaker.\n */\n _updateCircuitBreakerError() {\n this._breakerErrorCount += 1;\n this._logger.warn(`[ApiClient] Erreur #${this._breakerErrorCount} sur ${this._breakerThreshold}`);\n if (this._breakerErrorCount >= this._breakerThreshold) {\n this._breakerOpen = true;\n this._lastBreakerOpenTime = Date.now();\n this._logger.error(\"[ApiClient] Circuit breaker ACTIVÉ - L'API est considérée indisponible\");\n this.emit(\"circuitBreakerOpen\", { timestamp: this._lastBreakerOpenTime });\n }\n }\n\n /**\n * resetCircuitBreaker : en cas de succès on reset le compteur\n */\n _resetCircuitBreakerSuccess() {\n this._breakerErrorCount = 0;\n if (this._breakerOpen) {\n this._breakerOpen = false;\n this._logger.warn(\"[ApiClient] Circuit breaker refermé suite à un succès\");\n }\n }\n\n static stripNullsInPlace(obj) {\n // Si l'objet semble être un \"fichier uploadé\", c'est-à-dire qu'il possède une propriété \"value\" qui est un stream, on le laisse intact.\n if (obj && typeof obj === \"object\" && obj.value && typeof obj.value.pipe === \"function\") {\n return obj;\n }\n \n if (Array.isArray(obj)) {\n for (let i = obj.length - 1; i >= 0; i--) {\n if (obj[i] === null || obj[i] === undefined) {\n obj.splice(i, 1);\n } else if (typeof obj[i] === \"object\") {\n ApiClient.stripNullsInPlace(obj[i]);\n }\n }\n } else if (obj && typeof obj === \"object\") {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n if (obj[key] === null || obj[key] === undefined) {\n delete obj[key];\n } else if (typeof obj[key] === \"object\") {\n ApiClient.stripNullsInPlace(obj[key]);\n }\n }\n }\n }\n return obj;\n }\n\n _resolveSpecialValuesInPlace(obj, pathParams = {}) {\n const aliasMap = {\n userId: () => this.userId,\n accessToken: () => this._accessToken,\n refreshToken: () => this._refreshToken,\n baseURL: () => this._baseURL,\n pathParams: (subPath) => {\n // Si la valeur existe dans pathParams, on la retourne\n const value = this._getValueByPath(pathParams, subPath);\n return value !== undefined && value !== null ? value : undefined;\n }\n };\n \n // Expression régulière qui capture les alias sous forme délimitée @{...} ou simple @...\n const regex = /@(?:\\{([^}]+)\\}|([\\w.]+))/g;\n\n const resolveString = (str) => {\n if (typeof str !== \"string\") return str;\n return str.replace(regex, (_, delimitedAlias, plainAlias) => {\n // Si alias délimité, on traite toute la chaîne à l'intérieur des accolades.\n if (delimitedAlias) {\n // On s'attend à une forme comme \"pathParams.id.autre\"\n if (delimitedAlias.startsWith(\"pathParams.\")) {\n const subPath = delimitedAlias.substring(\"pathParams.\".length);\n const value = aliasMap.pathParams(subPath);\n return value !== undefined && value !== null ? value : `@{${delimitedAlias}}`;\n } else {\n // Pour d'autres alias délimités, on cherche directement dans aliasMap\n const fn = aliasMap[delimitedAlias];\n if (typeof fn === \"function\") {\n const value = fn();\n return value !== undefined && value !== null ? value : `@{${delimitedAlias}}`;\n }\n return `@{${delimitedAlias}}`;\n }\n } else if (plainAlias) {\n // Traitement de l'alias simple, potentiellement avec des segments\n // Vérifier s'il commence par \"pathParams.\"\n if (plainAlias.startsWith(\"pathParams.\")) {\n // Extrait la partie après \"pathParams.\" et sépare le premier segment et le reste.\n const match = plainAlias.match(/^pathParams\\.([^.]+)(.*)$/);\n if (match) {\n const subKey = match[1]; // ex: \"id\"\n const remainder = match[2]; // ex: \"\" ou \".autrechose\"\n // Si le reste est vide, ou s'il ne doit pas être remplacé (on remplace toujours le premier segment uniquement)\n const value = aliasMap.pathParams(subKey);\n return value !== undefined && value !== null ? value + remainder : `@${plainAlias}`;\n }\n return `@${plainAlias}`;\n } else {\n // Pour tout autre alias simple sans point ou autre\n const fn = aliasMap[plainAlias];\n if (typeof fn === \"function\") {\n const value = fn();\n return value !== undefined && value !== null ? value : `@${plainAlias}`;\n }\n return `@${plainAlias}`;\n }\n }\n return str;\n });\n };\n\n \n // Vérifie si l'objet est un binaire (par exemple un flux ou un Buffer)\n const isBinary = (input) => {\n return input && typeof input === \"object\" &&\n (typeof input.pipe === \"function\" || (typeof Buffer !== \"undefined\" && input instanceof Buffer));\n };\n \n // Vérifie si l'objet est un \"plain object\"\n const isPlainObject = (input) => {\n return Object.prototype.toString.call(input) === \"[object Object]\";\n };\n \n const internal = (input) => {\n // Si c'est un binaire, ne rien modifier\n if (isBinary(input)) {\n return input;\n }\n // Si c'est un tableau, on traite chaque élément\n if (Array.isArray(input)) {\n return input.map(internal);\n }\n // Si c'est un plain object, on crée un nouvel objet avec remplacement dans les clés et valeurs\n if (isPlainObject(input)) {\n const result = {};\n for (const [key, value] of Object.entries(input)) {\n const resolvedKey = resolveString(key);\n result[resolvedKey] = internal(value);\n }\n return result;\n }\n // Si c'est une string, on applique le remplacement\n if (typeof input === \"string\") {\n return resolveString(input);\n }\n // Sinon (nombre, booléen, etc.), on retourne la valeur telle quelle\n return input;\n };\n \n return internal(obj);\n }\n \n\n _cleanSchemaLeftoverAlias(obj) {\n // Expression régulière qui détecte n'importe quel alias du type \"@quelqueChose\"\n const aliasRegex = /@\\w+/;\n \n if (Array.isArray(obj)) {\n return obj.map(item => this._cleanSchemaLeftoverAlias(item));\n } else if (obj && typeof obj === \"object\") {\n const newObj = {};\n for (const key of Object.keys(obj)) {\n const val = obj[key];\n \n // Si le nom de la clé contient un alias (exemple : \"@userId\", \"@anything\"), on ne la copie pas\n if (aliasRegex.test(key)) {\n continue;\n }\n \n // Si la propriété s'appelle \"default\"\n if (key === \"default\") {\n // Si la valeur est une chaîne et qu'elle contient un alias, on ne la copie pas\n if (typeof val === \"string\" && aliasRegex.test(val)) {\n continue;\n }\n // Si la valeur est un objet, on le nettoie récursivement\n if (val && typeof val === \"object\") {\n const cleanedDefault = this._cleanSchemaLeftoverAlias(val);\n // On ajoute seulement si l'objet nettoyé n'est pas vide\n if (Object.keys(cleanedDefault).length > 0) {\n newObj[key] = cleanedDefault;\n }\n continue;\n }\n }\n \n // Si la valeur est une chaîne contenant un alias, on ne la copie pas\n if (typeof val === \"string\" && aliasRegex.test(val)) {\n continue;\n }\n \n // Sinon, on nettoie récursivement la valeur\n newObj[key] = this._cleanSchemaLeftoverAlias(val);\n }\n return newObj;\n }\n return obj;\n }\n \n /**\n * Safely calls an asynchronous function and handles any errors that occur.\n * Logs the error message using the instance's logger before re-throwing the error.\n *\n * @param {Function} fn - The asynchronous function to be called.\n * @param {...any} args - The arguments to pass to the function.\n * @returns {Promise<any>} The result of the asynchronous function.\n * @throws {Error} Re-throws any error that occurs during the function execution.\n */\n async safeCall(fn, ...args) {\n try {\n return await fn(...args);\n } catch (error) {\n this._logger.error(`[ApiClient.safeCall] Erreur: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Calls an API endpoint with the specified parameters.\n *\n * @param {string} constant - The constant representing the endpoint to call.\n * @param {Object} [data={}] - The data to send with the request.\n * @param {boolean|function} [transformResponseData=true] - Whether to transform the response data or a function to transform it.\n * @param {boolean} [validateResponseSchema=true] - Whether to validate the response schema.\n * @returns {Promise<Object>} The response from the API.\n * @throws {CircuitBreakerError} If the circuit breaker is activated.\n * @throws {ApiClientError} If the endpoint is not found, token is required but not provided, or validation fails.\n */\n async callEndpoint(constant, data = {}, transformResponseData = true, validateResponseSchema = true) {\n\n const endpoint = this._endpoints.find((ep) => ep.constant === constant);\n if (!endpoint) {\n throw new ApiClientError(`Endpoint introuvable : ${constant}`, 404);\n }\n \n const {\n path,\n method,\n contentType,\n auth,\n pathParams: pathSchema,\n request: requestSchema,\n responses\n } = endpoint;\n \n const lowerMethod = (method || \"GET\").toLowerCase();\n const realContentType = contentType || \"application/json\";\n const headers = { \"Content-Type\": realContentType };\n \n // Auth headers\n if (this._accessToken) {\n if (auth === \"bearer\") {\n headers[\"Authorization\"] = `Bearer ${this._accessToken}`;\n } else if (!auth || auth === \"none\") {\n if (!headers[\"Authorization\"]) {\n headers[\"Authorization\"] = `Bearer ${this._accessToken}`;\n }\n }\n } else if (auth === \"bearer\") {\n throw new ApiClientError(`Token requis pour l'endpoint sécurisé : ${constant}`, 401);\n }\n \n // === 1. PathParams ===\n let resolvedPath = path;\n let resolvedParams = {};\n if (pathSchema) {\n\n // Si auth est \"none\" et que userId n'est pas défini, on nettoie le schéma\n let schemaToCompile = pathSchema;\n if (auth === \"none\" && this.userId === null) {\n schemaToCompile = this._cleanSchemaLeftoverAlias(pathSchema);\n }\n\n const pathParams = data.pathParams || {};\n const validatePathParams = this._ajv.compile(schemaToCompile);\n const valid = validatePathParams(pathParams);\n \n if (!valid) {\n const errorMessages = this._ajvErrorHuman(validatePathParams.errors);\n this.emit(\"validationError\", { stage: \"pathParams\", errors: validatePathParams.errors });\n throw new ApiValidationError(`callEndpoint: ${constant} - Path parameter validation failed.`, 400, errorMessages, validatePathParams.errors);\n }\n \n resolvedParams = this._resolveSpecialValuesInPlace(pathParams);\n \n resolvedPath = resolvedPath.replace(/\\{(\\w+)\\}/g, (_, key) => {\n const val = resolvedParams[key];\n if (val !== undefined) return encodeURIComponent(val);\n throw new ApiClientError(`Path param manquant ou non résolu : {${key}}`, 400);\n });\n }\n \n // === 2. Validation données (request schema) ===\n if (requestSchema) {\n // Si auth est \"none\" et que userId n'est pas défini, on nettoie le schéma\n let schemaToCompile = requestSchema;\n if (auth === \"none\" && this.userId === null) {\n schemaToCompile = this._cleanSchemaLeftoverAlias(requestSchema);\n }\n\n const dataForValidation = { ...data };\n delete dataForValidation.pathParams;\n const cleanedData = ApiClient.stripNullsInPlace(dataForValidation);\n \n const validateRequest = this._ajv.compile(schemaToCompile);\n const valid = validateRequest(cleanedData);\n if (!valid) {\n const errorMessages = validateRequest.errors ? this._ajvErrorHuman(validateRequest.errors) : [];\n this.emit(\"validationError\", { stage: \"request\", errors: validateRequest.errors });\n throw new ApiValidationError(`callEndpoint: ${constant} - Request validation failed.`, 400, errorMessages , validateRequest.errors);\n }\n\n data = this._resolveSpecialValuesInPlace(cleanedData, resolvedParams);\n }\n \n // === 3. ENQUEUE SI OFFLINE (après validations, avant le breaker)\n if (this._offlineClientManager?.isOffline()) {\n if (typeof this._offlineClientManager._enqueueOfflineAction === \"function\") {\n this._logger.warn(`[ApiClient] Mode dégradé : mise en file de ${constant}`);\n await this._offlineClientManager._enqueueOfflineAction({\n constant,\n data,\n options: { transformResponseData, validateResponseSchema }\n });\n\n this._logger.info(`[ApiClient] Requête ${constant} mise en file (offline mode)`);\n\n this.emit(\"queuedOffline\", {\n constant,\n reason: \"offlineMode\",\n data\n });\n\n return { data: null, offline: true };\n } else {\n this._logger.warn(\"[ApiClient] Mode dégradé actif mais offlineManager non initialisé correctement\");\n throw new ApiClientError(\"Mode hors-ligne actif, mais gestionnaire offline non disponible.\", 503);\n }\n }\n\n // === 4. Circuit Breaker\n if (!this._checkCircuitBreaker()) {\n if (\n this._offlineClientManager?.isOffline?.() === false && // pas déjà en mode offline\n typeof this._offlineClientManager._enqueueOfflineAction === \"function\"\n ) {\n this._logger.warn(`[ApiClient] Circuit breaker actif → mise en file de ${constant}`);\n await this._offlineClientManager._enqueueOfflineAction({\n constant,\n data,\n options: { transformResponseData, validateResponseSchema }\n });\n\n this._logger.info(`[ApiClient] Requête ${constant} mise en file (circuit breaker)`);\n\n this.emit(\"queuedOffline\", {\n constant,\n reason: \"circuitBreaker\",\n data\n });\n\n return { data: null, breaker: true };\n }\n\n throw new CircuitBreakerError(\"Le circuit breaker est activé, impossible d'appeler l'API\");\n }\n\n // === 5. Payload ===\n let payload;\n if (realContentType === \"application/json\" || realContentType === \"multipart/form-data\") {\n payload = data;\n } else if (realContentType === \"application/x-www-form-urlencoded\") {\n payload = ApiClient.toURLSearchParams(data);\n }\n \n this._logger.debug(`[ApiClient] callEndpoint: ${constant} -> ${resolvedPath}, method=${lowerMethod}`);\n\n try {\n const response = await this._client.request({\n url: resolvedPath,\n method: lowerMethod,\n headers,\n [lowerMethod === \"get\" ? \"params\" : \"data\"]: payload\n });\n \n if (validateResponseSchema) {\n const status = response.status.toString();\n const schema = responses?.[status];\n if (schema) {\n const validateResponse = this._ajv.compile(schema);\n const valid = validateResponse(response.data);\n if (!valid) {\n const errorMessages = this._ajvErrorHuman(validateResponse.errors);\n this.emit(\"validationError\", { stage: \"response\", errors: validateResponse.errors });\n throw new ApiValidationError(\"Response validation failed.\", status, errorMessages, validateResponse.errors);\n }\n }\n }\n \n this._resetCircuitBreakerSuccess();\n \n if (typeof transformResponseData === \"function\") {\n response.data = transformResponseData(response.data);\n } else if (transformResponseData === true) {\n response.data = this._transformData(response.data);\n }\n \n // postActions éventuelles\n if (Array.isArray(endpoint.postActions)) {\n endpoint.postActions.forEach(action => {\n const value = action.path ? this._getValueByPath(response.data, action.path) : null;\n \n switch (action.type) {\n case \"setToken\":\n this.setToken(value);\n break;\n \n case \"setRefreshToken\":\n this.setRefreshToken(value);\n break;\n \n // case \"setUserId\":\n // this._setUserId(value);\n // break;\n \n case \"resetSession\":\n this.resetSession();\n break;\n \n case \"emitEvent\":\n if (action.event) {\n this.emit(action.event, value);\n this._logger.debug(`[ApiClient] Event émis : ${action.event}`, value);\n }\n break;\n \n case \"callMethod\":\n if (typeof this[action.method] === \"function\") {\n this[action.method]();\n this._logger.debug(`[ApiClient] Méthode appelée : ${action.method}`);\n } else {\n this._logger.warn(`[ApiClient] Méthode inconnue : ${action.method}`);\n }\n break;\n \n default:\n this._logger.warn(`[ApiClient] Action inconnue : ${action.type}`);\n }\n });\n }\n \n \n return response;\n } catch (error) {\n this._updateCircuitBreakerError();\n this._logger.error(`[ApiClient] Erreur lors de l'appel de ${constant}: ${error.message}`);\n if(error instanceof ApiValidationError) {\n throw error;\n } else {\n throw new ApiClientError(\n `Erreur lors de l'appel de l'API : ${error.message}`,\n error.response ? error.response.status : 500,\n error.response ? error.response.data : null\n );\n }\n\n }\n }\n \n /**\n * Converts AJV (Another JSON Schema Validator) errors into human-readable messages.\n *\n * @param {Array} errors - An array of AJV validation error objects.\n * @returns {Array<string>} An array of human-readable error messages extracted from the AJV errors.\n */\n _ajvErrorHuman(errors){\n try {\n const errorsMessages = new AggregateAjvError(errors);\n const messages = errorsMessages.errors.map(({ message }) => message);\n return messages;\n } catch (e) {\n this._logger.error(\"[ApiClient] _ajvErrorHuman\", e);\n return errors.map(({ message }) => message);\n }\n }\n\n /**\n * Checks the API response for errors and throws an `ApiResponseError` if any are found.\n *\n * This method examines the `response.data` object to determine if it contains\n * error information. It handles both standard and nested error cases:\n * \n * - Standard case: If `data.result` is a boolean and is `false`, an error is thrown.\n * - Nested case: If `data.resultErrors` exists and contains a `result` property\n * that is a boolean and is `false`, an error is thrown.\n *\n * If no errors are found, the original `response` is returned.\n *\n * @param {Object} response - The API response object to check.\n * @param {Object} response.data - The data payload of the response.\n * @param {number} response.status - The HTTP status code of the response.\n * @throws {ApiResponseError} If an error is detected in the response data.\n * @returns {Object} The original `response` object if no errors are found.\n */\n checkAndThrowApiResponseError(response) {\n const data = response.data;\n if (!data || typeof data !== \"object\") {\n return response;\n }\n \n // Cas standard : vérifie si data.result vaut false\n if (typeof data.result === \"boolean\" && data.result === false) {\n throw new ApiResponseError(\n data.msg || \"Erreur inconnue\",\n response.status,\n data\n );\n }\n \n // Cas imbriqué : vérifie si data.resultErrors existe et contient une erreur\n if (data.resultErrors && typeof data.resultErrors === \"object\") {\n if (typeof data.resultErrors.result === \"boolean\" && data.resultErrors.result === false) {\n throw new ApiResponseError(\n data.resultErrors.msg || \"Erreur inconnue\",\n response.status,\n data\n );\n }\n }\n \n return response;\n }\n \n /**\n * Réinitialise complètement la session de l'utilisateur :\n * - Token d'accès\n * - Token de rafraîchissement\n * - userId\n * - En-têtes Axios\n */\n resetSession() {\n this.setToken(null);\n this.setRefreshToken(null);\n this._setUserId(null);\n this._tokenStorage.clear();\n\n // Suppression des en-têtes\n delete this._client.defaults.headers.common[\"Authorization\"];\n\n this._logger.info(\"[ApiClient] Session utilisateur réinitialisée.\");\n this.emit(\"sessionReset\");\n }\n\n /**\n * Retrieves the value from an object based on a dot-separated path.\n *\n * @param {Object} obj - The object from which to retrieve the value.\n * @param {string} path - The dot-separated path string indicating the value to retrieve.\n * @returns {*} - The value found at the specified path, or undefined if the path is invalid.\n */\n _getValueByPath(obj, path) {\n if (!path) return undefined;\n const keys = path.split(\".\");\n return keys.reduce((acc, key) => acc && acc[key], obj);\n }\n \n // Conversions\n\n /**\n * Converts an object to URL search parameters.\n *\n * @param {Object} obj - The object to be converted to URL search parameters.\n * @param {Object} [options={}] - Optional settings for the conversion.\n * @returns {URLSearchParams} The URL search parameters generated from the object.\n */\n static toURLSearchParams(obj, options = {}) {\n return this._buildParams(obj, new URLSearchParams(), options);\n }\n\n /**\n * Builds parameters for an API request from a given object.\n *\n * @param {Object} obj - The object to be converted into parameters.\n * @param {FormData|URLSearchParams} paramsInstance - The instance to which the parameters will be appended.\n * @param {Object} [options={}] - Optional settings.\n * @param {boolean} [options.dots=false] - Whether to use dots in the parameter keys.\n * @param {boolean} [options.indexes=false] - Whether to include array indexes in the parameter keys.\n * @param {boolean} [options.metaTokens=true] - Whether to include meta tokens in the parameter keys.\n * @throws {TypeError} If the provided obj is not an object or is null.\n * @returns {FormData|URLSearchParams} The instance with the appended parameters.\n */\n static _buildParams(obj, paramsInstance, options = {}) {\n if (typeof obj !== \"object\" || obj === null) {\n throw new TypeError(\"La donnée doit être un objet non nul.\");\n }\n\n const { dots = false, indexes = false, metaTokens = true } = options;\n const stack = [];\n\n function isVisitable(thing) {\n return Object.prototype.toString.call(thing) === \"[object Object]\" || Array.isArray(thing);\n }\n\n function removeBrackets(key) {\n return key.endsWith(\"[]\") ? key.slice(0, -2) : key;\n }\n\n function renderKey(path, key, useDots = false) {\n if (!path) return key;\n return path.concat(key).map((token, i) => {\n token = removeBrackets(token);\n return !useDots && i ? `[${token}]` : token;\n }).join(useDots ? \".\" : \"\");\n }\n\n function convertValue(value) {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return value.toISOString();\n if (\n value instanceof Blob ||\n value instanceof File ||\n value instanceof ArrayBuffer ||\n ArrayBuffer.isView(value)\n ) {\n return value;\n }\n return value;\n }\n\n function defaultVisitor(value, key, path) {\n if (value && typeof value === \"object\") {\n if (key.endsWith(\"{}\")) {\n key = metaTokens ? key : key.slice(0, -2);\n paramsInstance.append(renderKey(path, key, dots), JSON.stringify(value));\n return false;\n }\n\n if ((Array.isArray(value) && !value.some(isVisitable)) || key.endsWith(\"[]\")) {\n key = removeBrackets(key);\n value.forEach((el, index) => {\n if (el !== undefined && el !== null) {\n // const fieldKey = indexes ? renderKey([key], index, dots) : `${key}[]`;\n const fieldKey = indexes\n ? renderKey(path.concat(key), index, dots)\n : `${renderKey(path, key, dots)}[]`;\n paramsInstance.append(fieldKey, convertValue(el));\n }\n });\n return false;\n }\n }\n\n if (isVisitable(value)) return true;\n paramsInstance.append(renderKey(path, key, dots), convertValue(value));\n return false;\n }\n\n function build(value, path = []) {\n if (value === undefined || value === null || stack.includes(value)) return;\n stack.push(value);\n\n Object.entries(value).forEach(([k, el]) => {\n if (el !== undefined && defaultVisitor(el, k.trim(), path)) {\n build(el, path.concat(removeBrackets(k)));\n }\n });\n\n stack.pop();\n }\n\n build(obj);\n return paramsInstance;\n }\n\n\n /**\n * Transforms the given data based on its structure.\n * \n * This method normalizes various structures of data into a consistent format.\n * It handles different types of data including objects, arrays, and specific\n * nested structures like `resultGoods`, `resultErrors`, `results`, `news`, \n * `notif`, `citoyens`, `organizations`, `cities`, `newComment`, `map`, and `object`.\n * \n * @param {Object|Array} data - The data to be transformed.\n * @returns {Object|Array} - The transformed data.\n * \n * @private\n */\n _transformData(data) {\n if (data && typeof data === \"object\") {\n if (data.resultGoods?.msg) {\n data = this._normalizeJsonData({ msg: data.resultGoods.msg, ...data });\n } else if (data.resultErrors?.msg) {\n data = this._normalizeJsonData({ msg: data.resultErrors.msg, ...data });\n } else if (data.results && typeof data.results === \"object\" && !Array.isArray(data.results)) {\n data.results = Object.keys(data.results).map((key) => {\n return this._normalizeJsonData({ id: key, ...data.results[key] });\n });\n } else if (Array.isArray(data.results) && data.results.length > 0) {\n data.results = data.results.map((item) => this._normalizeJsonData(item));\n } else if (data.news && Array.isArray(data.news) && data.news.length === 0) {\n data = data.news;\n } else if (data.news && typeof data.news === \"object\" && !Array.isArray(data.news)) {\n data = Object.keys(data.news).map((key) => {\n return this._normalizeJsonData({ id: key, ...data.news[key] });\n });\n } else if (data.notif && typeof data.notif === \"object\" && !Array.isArray(data.notif)) {\n data.notif = Object.keys(data.notif).map((key) => {\n return this._normalizeJsonData({ id: key, ...data.notif[key] });\n });\n } else if (\n data.citoyens && typeof data.citoyens === \"object\" && !Array.isArray(data.citoyens) &&\n data.organizations && typeof data.organizations === \"object\" && !Array.isArray(data.organizations)\n ) {\n data = [\n ...Object.keys(data.citoyens).map(key => this._normalizeJsonData({ id: key, ...data.citoyens[key] })),\n ...Object.keys(data.organizations).map(key => this._normalizeJsonData({ id: key, ...data.organizations[key] }))\n ];\n } else if (\n data.citoyens && typeof data.citoyens === \"object\" && !Array.isArray(data.citoyens)\n ) {\n data = Object.keys(data.citoyens).map(key => this._normalizeJsonData({ id: key, ...data.citoyens[key] }));\n } else if (data.cities && typeof data.cities === \"object\" && !Array.isArray(data.cities)) {\n data = Object.keys(data.cities).map(key => this._normalizeJsonData({ id: key, ...data.cities[key] }));\n } else if (data.cities && Array.isArray(data.cities) && data.cities.length === 0) {\n data = data.cities;\n } else if (data.newComment && typeof data.newComment === \"object\") {\n data.newComment = this._normalizeJsonData({ ...data.newComment });\n } else if (Array.isArray(data)) {\n data = data.map((item) => this._normalizeJsonData(item));\n } else if (data.map && typeof data.map === \"object\") {\n data.map = this._normalizeJsonData(data.map);\n } else if (data.object && typeof data.object === \"object\") {\n data.object = this._normalizeJsonData(data.object);\n } else if (typeof data === \"object\" && Object.keys(data).length > 0) {\n // Vérifie si toutes les clés sont des IDs mongo\n const allMongoIds = Object.keys(data).every((key) => /^[0-9a-fA-F]{24}$/.test(key));\n if (allMongoIds) {\n data = Object.keys(data).map((key) => ({\n id: key,\n ...this._normalizeJsonData(data[key])\n }));\n } else {\n data = this._normalizeJsonData(data);\n }\n }\n }\n return data;\n }\n \n\n /**\n * Normalizes JSON data by transforming specific fields and ensuring URLs are complete.\n *\n * @param {Object} item - The JSON object to be normalized.\n * @returns {Object} - The normalized JSON object.\n *\n * The function performs the following transformations:\n * - Normalizes the ID field if it matches a specific pattern.\n * - Converts date fields from seconds to milliseconds.\n * - Ensures URLs in specific fields are complete.\n * - Filters and normalizes nested objects and arrays.\n * - Removes the `timeAgo` field if it exists.\n * - Converts the object to EJSON format if necessary.\n */\n _normalizeJsonData(item) {\n if (!item || typeof item !== \"object\") {\n return item;\n }\n \n // Application des normalisations récursives\n item = this._normalizeRecursively(item);\n\n // item = this._normalizeIdRecursively(item);\n // item = this._normalizeDatesRecursively(item);\n // item = this._normalizeImagesRecursively(item);\n\n // if(item?.preferences){\n // item.preferences = this._normalizeBooleansRecursively(item.preferences);\n // }\n\n if (item?.mediaImg?.images && Array.isArray(item.mediaImg.images) && item.mediaImg.images.length > 0) {\n item.mediaImg.countImages = item.mediaImg.images.length;\n }\n \n if (item?.mediaFile?.files && Array.isArray(item.mediaFile.files) && item.mediaFile.files.length > 0) {\n item.mediaFile.countFiles = item.mediaFile.files.length;\n }\n\n if (\n item?.src?.changes &&\n typeof item.src.changes === \"object\" &&\n Object.keys(item.src.changes).length > 0\n ) {\n Object.keys(item.src.changes).forEach((key) => {\n if (item.src.changes[key]) {\n item.src.changes[key] = this._ensureFullURL(item.src.changes[key]);\n }\n });\n }\n \n if (item?.openingHours && Array.isArray(item.openingHours) && item.openingHours.length > 0) {\n item.openingHours = item.openingHours.filter(\n (day) => day.dayOfWeek && day.hours && day.hours[0] && day.hours[0].opens\n );\n }\n \n if (item.replies && typeof item.replies === \"object\" && Object.keys(item.replies).length > 0) {\n item.replies = Object.keys(item.replies).map((key) => {\n return this._normalizeJsonData({ id: key, ...item.replies[key] });\n });\n }\n \n if (\n item?.author &&\n typeof item.author === \"object\" &&\n Object.keys(item.author).length > 0\n ) {\n // Si author contient déjà une propriété attendue (ici \"profilThumbImageUrl\"),\n // on considère qu'il est déjà aplatit.\n if (!(\"profilThumbImageUrl\" in item.author)) {\n // Sinon, on considère que author est un mapping et on prend le premier sous-objet.\n const firstKey = Object.keys(item.author)[0];\n // On remplace author par le contenu du sous-objet\n item.author = { ...item.author[firstKey] };\n }\n }\n \n // Supprime timeAgo\n if (item?.timeAgo) {\n delete item.timeAgo;\n }\n \n // Convertit en EJSON si besoin\n return this._fromJSONValue ? EJSON.fromJSONValue(item) : item;\n }\n \n\n /**\n * Ensures that the given image path is a full URL. If the image path is already a full URL\n * (i.e., it starts with \"http://\" or \"https://\"), it is returned as is. Otherwise, the image path\n * is concatenated with the base URL of the ApiClient instance.\n *\n * @param {string} imagePath - The image path to ensure as a full URL.\n * @returns {string} - The full URL of the image path.\n */\n _ensureFullURL(imagePath) {\n if (!imagePath) return imagePath;\n imagePath = imagePath.trim();\n if (!imagePath || /^https?:\\/\\//i.test(imagePath)) {\n return imagePath;\n }\n \n let separator = \"/\";\n if (this._baseURL.endsWith(\"/\") && imagePath.startsWith(\"/\")) {\n separator = \"\";\n } else if (!this._baseURL.endsWith(\"/\") && !imagePath.startsWith(\"/\")) {\n separator = \"/\";\n } else {\n separator = \"\";\n }\n \n return `${this._baseURL}${separator}${imagePath}`;\n }\n\n /**\n * Parcourt récursivement un objet pour normaliser les champs de date.\n * Pour chaque clé présente dans dateFields, si la valeur est un nombre ou un objet\n * contenant une propriété sec (nombre), la transforme en { $date: valeurEnMs }.\n *\n * @param {Object} obj - L’objet à normaliser.\n * @returns {Object} L’objet normalisé.\n */\n // _normalizeDatesRecursively(obj) {\n // if (obj === null || typeof obj !== \"object\") return obj;\n\n // // Si c'est un tableau, on traite chaque élément récursivement.\n // if (Array.isArray(obj)) {\n // return obj.map(item => this._normalizeDatesRecursively(item));\n // }\n\n // Object.keys(obj).forEach((key) => {\n // if (this._dateFields.includes(key)) {\n // if (obj[key] && typeof obj[key] === \"object\" && obj[key].sec && typeof obj[key].sec === \"number\") {\n // obj[key] = { $date: obj[key].sec * 1000 };\n // } else if (typeof obj[key] === \"number\") {\n // obj[key] = { $date: obj[key] * 1000 };\n // }\n // }\n // if (obj[key] && typeof obj[key] === \"object\") {\n // this._normalizeDatesRecursively(obj[key]);\n // }\n // });\n // return obj;\n // }\n\n /**\n * Parcourt récursivement un objet pour normaliser les chemins d'images.\n * Pour chaque propriété correspondant à un champ d'image (dans imageFields),\n * vérifie et convertit le chemin en URL complète à l’aide de _ensureFullURL.\n * Les cas particuliers (comme mediaImg.images ou mediaFile.files) sont également gérés.\n *\n * @param {Object} obj - L’objet à normaliser.\n * @returns {Object} L’objet normalisé.\n */\n // _normalizeImagesRecursively(obj) {\n // if (obj === null || typeof obj !== \"object\") return obj;\n\n // // Si c'est un tableau, on traite chaque élément récursivement.\n // if (Array.isArray(obj)) {\n // return obj.map(item => this._normalizeImagesRecursively(item));\n // }\n\n // Object.keys(obj).forEach((key) => {\n // if (this._imageFields.includes(key) && typeof obj[key] === \"string\" && obj[key].trim() !== \"\") {\n // obj[key] = this._ensureFullURL(obj[key]);\n // }\n\n // // Cas particulier pour content.image\n // if (key === \"content\" && obj[key]?.image) {\n // obj[key].image = this._ensureFullURL(obj[key].image);\n // }\n\n // if (obj[key] && typeof obj[key] === \"object\") {\n // this._normalizeImagesRecursively(obj[key]);\n // }\n // });\n // return obj;\n // }\n\n /**\n * Parcourt récursivement un objet ou un tableau pour normaliser les identifiants (ID).\n * Si un objet possède une propriété \"_id\" ou \"id\" contenant un sous-objet \"$id\" valide,\n * l'ID est normalisé et la propriété _id est convertie au format EJSON attendu.\n *\n * @param {Object|Array} obj - L'objet ou le tableau à normaliser.\n * @returns {Object|Array} L'objet ou le tableau normalisé.\n */\n // _normalizeIdRecursively(obj) {\n // if (obj === null || typeof obj !== \"object\") return obj;\n\n // // Si c'est un tableau, on traite chaque élément récursivement.\n // if (Array.isArray(obj)) {\n // return obj.map(item => this._normalizeIdRecursively(item));\n // }\n\n // // Vérifier et normaliser l'ID dans l'objet\n // if (obj._id && obj._id.$id && /^[0-9a-fA-F]{24}$/.test(obj._id.$id)) {\n // obj.id = obj._id.$id;\n // obj._id = { $type: \"oid\", $value: obj._id.$id };\n // }\n // if (obj.id && obj.id.$id && /^[0-9a-fA-F]{24}$/.test(obj.id.$id)) {\n // obj._id = { $type: \"oid\", $value: obj.id.$id };\n // obj.id = obj.id.$id;\n // }\n\n // // Appel récursif pour chaque propriété de l'objet\n // Object.keys(obj).forEach(key => {\n // if (obj[key] && typeof obj[key] === \"object\") {\n // obj[key] = this._normalizeIdRecursively(obj[key]);\n // }\n // });\n\n // return obj;\n // }\n\n /**\n * Normalise récursivement les valeurs booléennes.\n * Si une valeur est une chaîne \"true\" ou \"false\", elle est convertie en booléen.\n *\n * @param {any} data - L'objet, le tableau ou la valeur à normaliser.\n * @returns {any} La donnée normalisée.\n */\n // _normalizeBooleansRecursively(data) {\n // if (typeof data === \"string\") {\n // if (data === \"true\") return true;\n // if (data === \"false\") return false;\n // return data;\n // }\n // if (Array.isArray(data)) {\n // return data.map(item => this._normalizeBooleansRecursively(item));\n // }\n // if (data !== null && typeof data === \"object\") {\n // Object.keys(data).forEach(key => {\n // data[key] = this._normalizeBooleansRecursively(data[key]);\n // });\n // }\n // return data;\n // }\n\n /**\n * Transforme une chaîne \"true\" ou \"false\" en booléen.\n *\n * @param {string} str - La chaîne à normaliser.\n * @returns {boolean|string} La valeur booléenne ou la chaîne originale.\n */\n _normalizeString(str) {\n if (str === \"true\") return true;\n if (str === \"false\") return false;\n return str;\n }\n\n /**\n * Normalise les identifiants dans un objet.\n * Si l'objet possède une propriété \"_id\" ou \"id\" contenant un sous-objet \"$id\" valide,\n * il met à jour l'objet en assignant la valeur de l'ID et en formattant _id en EJSON.\n *\n * @param {Object} obj - L'objet à normaliser.\n * @returns {Object} L'objet avec l'ID normalisé.\n */\n _normalizeId(obj) {\n if (obj._id && obj._id.$id && /^[0-9a-fA-F]{24}$/.test(obj._id.$id)) {\n obj.id = obj._id.$id;\n obj._id = { $type: \"oid\", $value: obj._id.$id };\n }\n if (obj.id && obj.id.$id && /^[0-9a-fA-F]{24}$/.test(obj.id.$id)) {\n obj._id = { $type: \"oid\", $value: obj.id.$id };\n obj.id = obj.id.$id;\n }\n return obj;\n }\n\n /**\n * Normalise une valeur de date.\n * Si la valeur est un objet contenant \"sec\" (nombre) ou un nombre,\n * elle est convertie en { $date: valeurEnMs }.\n *\n * @param {any} value - La valeur à normaliser.\n * @returns {any} La valeur normalisée.\n */\n _normalizeDate(value) {\n if (value && typeof value === \"object\" && typeof value.sec === \"number\") {\n return { $date: value.sec * 1000 };\n } else if (typeof value === \"number\") {\n return { $date: value * 1000 };\n }\n return value;\n }\n\n /**\n * Normalise une URL d'image.\n * Si la valeur est une chaîne non vide, retourne l'URL complète via _ensureFullURL.\n *\n * @param {any} value - La valeur à normaliser.\n * @returns {any} La valeur normalisée.\n */\n _normalizeImage(value) {\n if (typeof value === \"string\" && value.trim() !== \"\") {\n return this._ensureFullURL(value);\n }\n return value;\n }\n\n /**\n * Liste des champs d'image à normaliser.\n */\n _imageFields = [\n \"profilImageUrl\",\n \"profilThumbImageUrl\",\n \"profilMediumImageUrl\",\n \"profilMarkerImageUrl\",\n \"profilBannerUrl\",\n \"profilRealBannerUrl\",\n \"imagePath\",\n \"imageThumbPath\",\n \"docPath\",\n \"imageThumb\",\n \"imageMediumPath\"\n ];\n\n /**\n * Liste des champs de date à normaliser.\n */\n _dateFields = [\"modified\", \"created\", \"updated\", \"birthDate\", \"lastLoginDate\", \"startDate\", \"endDate\", \"date\", \"issuedOn\"];\n\n /**\n * Normalise récursivement un objet, un tableau ou une valeur simple.\n * Cette fonction réalise en une seule passe les opérations suivantes :\n * - Conversion des chaînes \"true\"/\"false\" en booléens.\n * - Normalisation des dates (pour les champs spécifiés).\n * - Normalisation des images (pour les champs spécifiés).\n * - Transformation récursive des objets et tableaux.\n * - Normalisation des identifiants.\n *\n * @param {any} data - La donnée à normaliser.\n * @returns {any} La donnée normalisée.\n */\n _normalizeRecursively(data) {\n // Cas de base pour les chaînes\n if (typeof data === \"string\") {\n return this._normalizeString(data);\n }\n\n // Traitement des tableaux\n if (Array.isArray(data)) {\n return data.map(item => this._normalizeRecursively(item));\n }\n\n // Traitement des objets non nuls\n if (data !== null && typeof data === \"object\") {\n // On crée une copie de l'objet pour éviter les effets de bord.\n const normalizedData = {};\n\n Object.keys(data).forEach(key => {\n // Appliquer récursivement la normalisation sur la valeur.\n let value = this._normalizeRecursively(data[key]);\n\n // Si la clé correspond à un champ de date, on applique la normalisation de date.\n if (this._dateFields.includes(key)) {\n value = this._normalizeDate(value);\n }\n\n // Si la clé correspond à un champ d'image, on applique la normalisation d'image.\n if (this._imageFields.includes(key)) {\n value = this._normalizeImage(value);\n }\n\n // Cas particulier : si la clé est \"content\" et qu'elle possède une propriété \"image\".\n if (key === \"content\" && value && typeof value === \"object\" && value.image) {\n value.image = this._normalizeImage(value.image);\n }\n\n normalizedData[key] = value;\n });\n\n // Normalisation des identifiants après traitement de l'objet.\n return this._normalizeId(normalizedData);\n }\n\n // Pour les autres types (nombres, booléens déjà, etc.), on renvoie la donnée inchangée.\n return data;\n }\n\n _startBeforeEndValidate = (schema, data) => {\n if (!data.startDate || !data.endDate) return true;\n \n const isValid = new Date(data.startDate) < new Date(data.endDate);\n if (!isValid) {\n this._startBeforeEndValidate.errors = [\n {\n instancePath: \"/startDate\", // ou \".\" si tu veux le chemin actuel\n schemaPath: \"#/startBeforeEnd\",\n keyword: \"startBeforeEnd\",\n params: {},\n message: \"startDate must be before endDate\"\n }\n ];\n }\n return isValid;\n };\n \n\n getRequestSchema(constant) {\n const endpoint = this._endpoints.find(e => e.constant === constant);\n return endpoint?.request || null;\n }\n\n getPathSchema(constant) {\n return this._endpoints.find(e => e.constant === constant)?.pathParams || null;\n }\n\n /**\n * Permet d'écouter facilement un ensemble d'événements importants émis par l'ApiClient.\n *\n * @param {Object} handlers - Un objet avec des fonctions à appeler selon l'événement.\n * @param {Function} [handlers.retryAttempt] - Lors d'une tentative de retry axios.\n * @param {Function} [handlers.queuedOffline] - Lorsqu'une requête est mise en file.\n * @param {Function} [handlers.circuitBreakerOpen] - Quand le breaker s'ouvre.\n * @param {Function} [handlers.circuitBreakerReset] - Quand le breaker se referme.\n * @param {Function} [handlers.refreshSuccess] - Quand le token est rafraîchi.\n * @param {Function} [handlers.refreshFailed] - Quand le refresh échoue.\n * @param {Function} [handlers.sessionReset] - Quand la session est réinitialisée.\n * @param {Function} [handlers.validationError] - Quand une validation échoue.\n * @param {Function} [handlers.offlineModeChanged] - Quand le mode offline change.\n * @param {Function} [handlers.userLoggedIn] - Quand un utilisateur se connecte.\n */\n onEvent(handlers = {}) {\n const availableEvents = [\n \"retryAttempt\",\n \"queuedOffline\",\n \"circuitBreakerOpen\",\n \"circuitBreakerReset\",\n \"refreshSuccess\",\n \"refreshFailed\",\n \"sessionReset\",\n \"validationError\",\n \"offlineModeChanged\",\n \"userLoggedIn\"\n ];\n\n for (const eventName of availableEvents) {\n if (typeof handlers[eventName] === \"function\") {\n this.on(eventName, handlers[eventName]);\n }\n }\n }\n\n /**\n * Retourne la liste des noms d'événements personnalisés déclarés dans les endpoints.\n * Utile pour introspection ou documentation.\n *\n * @returns {string[]} Liste des événements émis dynamiquement via postActions.\n */\n getDeclaredEvents() {\n const events = new Set();\n for (const endpoint of this._endpoints) {\n if (Array.isArray(endpoint.postActions)) {\n for (const action of endpoint.postActions) {\n if (action.type === \"emitEvent\" && action.event) {\n events.add(action.event);\n }\n }\n }\n }\n return Array.from(events);\n }\n\n}\n/**\n * @event ApiClient#retryAttempt\n * @type {Object}\n * @property {number} retryCount - Le numéro de tentative.\n * @property {string} url - L'URL de la requête ayant échoué.\n\n * @event ApiClient#queuedOffline\n * @type {Object}\n * @property {string} constant - Le nom de l'endpoint.\n * @property {Object} data - Les données envoyées.\n * @property {\"offlineMode\"|\"circuitBreaker\"} reason - La raison de la mise en file.\n\n * @event ApiClient#circuitBreakerOpen\n * @type {Object}\n * @property {number} timestamp - Date (ms) à laquelle le breaker s'est ouvert.\n\n * @event ApiClient#circuitBreakerReset\n * @type {void}\n\n * @event ApiClient#refreshSuccess\n * @type {Object}\n * @property {string} token - Le nouveau token d'accès.\n * @property {string} [refreshToken] - Le nouveau refreshToken (optionnel).\n\n * @event ApiClient#refreshFailed\n * @type {Object}\n * @property {string} error - Le message d’erreur de refresh.\n\n * @event ApiClient#sessionReset\n * @type {void}\n\n * @event ApiClient#validationError\n * @type {Object}\n * @property {\"pathParams\"|\"request\"|\"response\"} stage - Étape de validation échouée.\n * @property {Array<Object>} errors - Erreurs AJV brutes.\n\n * @event ApiClient#offlineModeChanged\n * @type {boolean} - true si le client est offline, false sinon.\n * \n * @event ApiClient#userLoggedIn\n * @param {Object} user - Les données utilisateur extraites de la réponse.\n */\n ","// UserApi.js\nimport ApiClient from \"../ApiClient.js\";\nimport { ApiError, ApiResponseError } from \"../error.js\";\nimport { Badge } from \"./Badge.js\";\nimport EndpointApi from \"./EndpointApi.js\";\nimport { Event } from \"./Event.js\";\nimport { News } from \"./News.js\";\nimport { Organization } from \"./Organization.js\";\nimport { Poi } from \"./Poi.js\";\nimport { Project } from \"./Project.js\";\nimport { User } from \"./User.js\";\n\nexport class UserApi {\n\n constructor(clientOrOptions) {\n if (clientOrOptions instanceof ApiClient) {\n this.client = clientOrOptions;\n } else {\n // Injection de dépendance : ApiClient est créé à partir des options\n this.client = new ApiClient(clientOrOptions);\n // si l'option \"tokenStorageStrategy\" est définie, on l'utilise pour créer une instance de ApiClient\n }\n \n this.loggedUser = null;\n }\n\n get isConnected() {\n return this.client.isConnected;\n }\n get userId() {\n return this.client.userId;\n }\n \n // Méthode d'authentification : récupère les données utilisateur depuis un endpoint\n async login(email, password) {\n return this.client.safeCall(async () => {\n // Appel à un endpoint d'authentification\n const response = await this.client.callEndpoint(\"AUTHENTICATE_URL\", { email, password });\n // Création d'une instance de LoggedInUser à partir des données reçues\n this.loggedUser = new User(this.client, response.data.user, { EndpointApi, Organization, Project, Event, Poi, Badge, News });\n return this.loggedUser;\n });\n }\n\n async meIsconnected() {\n if(!this.client.isConnected || !this.client.userId) {\n throw new ApiError(\"User not connected\", 401);\n }\n this.client._logger.info(\"UserApi\", \"meIsconnected\", this.client.userId);\n this.loggedUser = new User(this.client, { id: this.client.userId }, { EndpointApi, Organization, Project, Event, Poi, Badge, News });\n return this.loggedUser;\n }\n\n\n async register({\n name,\n username,\n email,\n pwd,\n } = {}) {\n return this.client.safeCall(async () => {\n const response = await this.client.callEndpoint(\"PERSON_REGISTER\", { name, username, email, pwd });\n if(response?.data?.result === false) {\n throw new ApiResponseError(response.data.msg, response.status, response.data);\n }\n return response.data;\n });\n }\n\n\n async recoverPassword(email) {\n return this.client.safeCall(async () => {\n const response = await this.client.callEndpoint(\"PASSWORD_RECOVERY\", { email });\n if(response?.data?.result === false) {\n throw new ApiResponseError(response.data.msg, response.status, response.data);\n }\n return response.data;\n });\n }\n\n}","// Api.js\nimport { Badge } from \"./api/Badge.js\";\nimport EndpointApi from \"./api/EndpointApi.js\";\nimport { createFromCollection, registerEntity } from \"./api/EntityRegistry.js\";\nimport { Event } from \"./api/Event.js\";\nimport { News } from \"./api/News.js\";\nimport { Organization } from \"./api/Organization.js\";\nimport { Poi } from \"./api/Poi.js\";\nimport { Project } from \"./api/Project.js\";\nimport { User } from \"./api/User.js\";\nimport { UserApi } from \"./api/UserApi.js\";\nimport { ApiAuthenticationError, ApiClientError, ApiError, ApiResponseError } from \"./error.js\";\n\nregisterEntity(\"User\", User);\nregisterEntity(\"Organization\", Organization);\nregisterEntity(\"Project\", Project);\nregisterEntity(\"Event\", Event);\nregisterEntity(\"Poi\", Poi);\nregisterEntity(\"Badge\", Badge);\nregisterEntity(\"EndpointApi\", EndpointApi);\nregisterEntity(\"UserApi\", UserApi);\nregisterEntity(\"News\", News);\n\nexport default class Api {\n /**\n * Authentifie l'utilisateur et retourne une instance d'Api.\n *\n * @param {string} email - L'adresse email.\n * @param {string} password - Le mot de passe.\n * @param {function|object} options - Options pour l'ApiClient (baseURL, debug, etc.) ou une instance d'ApiClient.\n * @returns {Promise<Api>}\n */\n static async userLogin(email, password, options) {\n const userApi = Api.userApi(options);\n return await Api.userApiLogin(userApi, email, password);\n }\n\n /**\n * Creates an instance of the UserApi class with the provided options.\n *\n * @param @param {function|object} options - Options for the ApiClient (baseURL, debug, etc.) or an instance of ApiClient.\n * @returns {UserApi} An instance of the UserApi class.\n * @throws {Error} Throws an error if the UserApi instance cannot be created.\n */\n static userApi(options) {\n try {\n const userApi = new UserApi(options);\n return userApi;\n } catch (error) {\n console.error(\"[Api.userApi] Erreur lors de la création d'un objet utilisateur :\", error.message);\n throw error;\n }\n }\n \n /**\n * Logs in a user using the provided userApi instance, email, and password.\n *\n * @param {Object} userApi - The API instance used for user authentication.\n * @param {string} email - The email address of the user.\n * @param {string} password - The password of the user.\n * @returns {Promise<Api>} A promise that resolves to an instance of the Api class\n * initialized with the logged-in user and the API client.\n * @throws {ApiAuthenticationError} If the login fails due to authentication issues.\n * @throws {Error} If an unexpected error occurs during the login process.\n */\n static async userApiLogin(userApi, email, password) {\n try {\n\n if (!userApi) {\n throw new ApiError(\"userApi is not defined\");\n }\n if(!userApi.client) {\n throw new ApiError(\"userApi.client is not defined\");\n }\n\n if(userApi.client.isConnected) {\n // Si l'utilisateur est déjà connecté, on le récupère\n // et on ne fait pas de login\n const loggedUser = await userApi.meIsconnected();\n return new Api(loggedUser, userApi.client);\n } else {\n if (!email || !password) {\n throw new ApiError(\"email and password are required\");\n }\n const loggedUser = await userApi.login(email, password);\n return new Api(loggedUser, userApi.client);\n }\n\n } catch (error) {\n if(error instanceof ApiClientError) {\n if(error?.details?.error) {\n throw new ApiAuthenticationError(error.details.error, error.status, error.details);\n }\n }\n throw error;\n }\n }\n \n /**\n * Construit une instance d'Api.\n *\n * @param {User|null} loggedUser - L'utilisateur connecté ou null.\n * @param {ApiClient} client - L'instance d'ApiClient.\n */\n constructor(loggedUser, client) {\n this._loggedUser = loggedUser;\n this._client = client;\n }\n\n /**\n * Retourne l'utilisateur connecté.\n *\n * @returns {Promise<User>} L'utilisateur connecté.\n * @throws {ApiAuthenticationError} Si l'utilisateur n'est pas authentifié.\n */\n async me() {\n if (!this._loggedUser) {\n throw new ApiAuthenticationError(\"Accès refusé : utilisateur non authentifié.\");\n }\n await this._loggedUser.get();\n return this._loggedUser;\n }\n\n /**\n * Crée une instance User pour un utilisateur donné (autre que le connecté).\n *\n * @param {Object} userData - Les données de l'utilisateur public.\n * @returns {Promise<User>} Une promesse qui résout l'instance User.\n * @throws {Error} Si une erreur se produit lors de la création de l'utilisateur.\n */\n async user(userData) {\n try {\n if (!userData.id && !userData.slug) {\n return new User(this._client, userData, { EndpointApi, Organization, Project, Event, Poi, Badge, News });\n } else {\n const user = new User(this._client, userData, { EndpointApi, Organization, Project, Event, Poi, Badge, News });\n await user.get();\n return user;\n }\n } catch (error) {\n console.error(\"[Api.user] Erreur lors de la création d'un objet utilisateur public :\", error.message);\n throw error;\n }\n }\n\n\n /**\n * Creates an Organization object and optionally retrieves its profile.\n *\n * @param {Object} organizationData - The data required to initialize the Organization object.\n * @returns {Promise<Organization>} A promise that resolves to the created Organization object.\n * @throws {Error} Throws an error if the organization creation or profile retrieval fails.\n */\n async organization(organizationData) {\n try {\n const organization = new Organization(this._client, organizationData, { EndpointApi, User, Project, Event, Poi, Badge, News });\n if (!organizationData.id && !organizationData.slug) {\n throw new Error(\"Vous devez fournir un id ou un slug pour créer une instance Organization.\");\n }\n await organization.get();\n return organization;\n } catch (error) {\n console.error(\"[Api.organization] Erreur lors de la création d'un objet organisation :\", error.message);\n throw error;\n }\n }\n\n /**\n * Creates a new Project instance and optionally retrieves its profile.\n *\n * @param {Object} projectData - The data used to initialize the Project instance.\n * @returns {Promise<Project>} A promise that resolves to the created Project instance.\n * @throws {Error} If an error occurs during project creation or profile retrieval.\n */\n async project(projectData) {\n try {\n const project = new Project(this._client, projectData, { EndpointApi, User, Organization, Event, Poi, Badge, News });\n if (!projectData.id && !projectData.slug) {\n throw new Error(\"Vous devez fournir un id ou un slug pour créer une instance Project.\");\n }\n await project.get();\n return project;\n } catch (error) {\n console.error(\"[Api.project] Erreur lors de la création d'un objet projet :\", error.message);\n throw error;\n }\n }\n\n async event(eventData) {\n try {\n const event = new Event(this._client, eventData, { EndpointApi, User, Organization, Project, Poi, Badge, News });\n if (!eventData.id && !eventData.slug) {\n throw new Error(\"Vous devez fournir un id ou un slug pour créer une instance Event.\");\n }\n await event.get();\n return event;\n } catch (error) {\n console.error(\"[Api.event] Erreur lors de la création d'un objet événement :\", error.message);\n throw error;\n }\n }\n\n async entitySlug(slug) {\n if (slug) {\n try {\n const data = await this.endpointApi.getElementsKey({\n pathParams:{\n slug: slug\n }\n });\n if(data?.contextId && data?.contextType) {\n const entity = createFromCollection(data?.contextType, this._client, { id: data?.contextId });\n await entity.get();\n return entity;\n } else {\n throw new ApiResponseError(`Le slug ${slug} n'est pas valide`, 200, data);\n }\n } catch (error) {\n if(error instanceof ApiResponseError) {\n throw new ApiResponseError(`Impossible de récupérer l'identifiant pour le slug ${slug}`, error.status, error.responseData);\n } else {\n throw error;\n }\n }\n }\n }\n\n /**\n * Retourne l'instance d'ApiClient.\n *\n * @returns {ApiClient}\n */\n get client() {\n return this._client;\n }\n\n /**\n * Retourne l'instance d'EndpointApi.\n * \n * @returns {EndpointApi}\n */\n get endpointApi() {\n return new EndpointApi(this._client);\n }\n\n logout () {\n this.loggedUser = null;\n this._client.resetSession();\n this._client._logger.info(\"UserApi: User logged out\");\n }\n \n}\n","// OfflineQueueStorageStrategy.js\n\nexport class OfflineQueueStorageStrategy {\n async loadQueue() {\n throw new Error(\"loadQueue() doit être implémenté\");\n }\n \n // eslint-disable-next-line no-unused-vars\n async saveQueue(queue) {\n throw new Error(\"saveQueue(queue) doit être implémenté\");\n }\n}\n \nexport class MemoryOfflineStorage extends OfflineQueueStorageStrategy {\n constructor() {\n super();\n this._queue = [];\n }\n \n async loadQueue() {\n return this._queue;\n }\n \n async saveQueue(queue) {\n this._queue = [...queue];\n }\n}\n \nexport class LocalStorageOfflineStorage extends OfflineQueueStorageStrategy {\n constructor(key = \"cocolight-api-offline-queue\") {\n super();\n this.key = key;\n }\n \n async loadQueue() {\n try {\n const raw = localStorage.getItem(this.key);\n return raw ? JSON.parse(raw) : [];\n } catch {\n return [];\n }\n }\n \n async saveQueue(queue) {\n try {\n localStorage.setItem(this.key, JSON.stringify(queue));\n } catch (e) {\n console.warn(\"[Offline] Échec du stockage localStorage\", e);\n }\n }\n}\n","// OfflineClientManager.js\nimport ApiClient from \"../ApiClient.js\";\nimport { createDefaultOfflineStrategy } from \"./createDefaultOfflineStrategy.js\";\n\nexport class OfflineClientManager {\n /**\n * Initialise un gestionnaire de mode offline pour un ApiClient donné.\n * \n * @param {ApiClient} apiClient - Instance du client principal.\n */\n constructor(apiClient) {\n if(!apiClient || !(apiClient instanceof ApiClient)) {\n throw new Error(\"[OfflineClientManager] apiClient doit être une instance de ApiClient\");\n }\n this._clients = new Map();\n this._client = apiClient;\n }\n\n /**\n * Attache le gestionnaire offline à une instance ApiClient.\n * Configure la file d'attente offline, le monitoring réseau, et le ping serveur.\n *\n * @param {ApiClient} apiClient - L'instance du client à enrichir.\n * @param {Object} options\n * @param {Object} [options.offlineStorageStrategy] - Stratégie de stockage offline.\n * @param {boolean} [options.disableOfflineMonitoring] - Si true, désactive le monitoring réseau.\n */\n static async attachTo(apiClient, options = {}) {\n apiClient._offlineClientManager = new OfflineClientManager(apiClient);\n const strategy = await createDefaultOfflineStrategy(options?.offlineStorageStrategy || \"auto\");\n await apiClient._offlineClientManager._initOfflineQueue(strategy);\n if (!options?.disableOfflineMonitoring) {\n apiClient._offlineClientManager.startOfflineMonitoring(options);\n }\n }\n\n /**\n * Retourne un ApiClient configuré avec les bons tokens/baseURL pour rejouer une action offline.\n * Met en cache l'instance pour éviter les recréations.\n *\n * @param {Object} meta - Métadonnées contenant baseURL et tokens.\n * @returns {Promise<ApiClient>}\n */\n async getClient(meta) {\n const key = `${meta.baseURL}|${meta.accessToken}`;\n if (this._clients.has(key)) return this._clients.get(key);\n\n const client = new ApiClient({\n baseURL: meta.baseURL,\n accessToken: meta.accessToken,\n refreshToken: meta.refreshToken,\n debug: this._client._debug,\n });\n\n this._clients.set(key, client);\n return client;\n }\n\n /**\n * Rejoue une action unique depuis la file offline.\n * \n * @param {Object} action - Objet contenant constant, data, options et meta.\n * @returns {Promise<any>}\n */\n async replayAction(action) {\n const client = await this.getClient(action.meta);\n try {\n \n const result = await client.callEndpoint(\n action.constant,\n action.data,\n action.options?.transformResponseData ?? true,\n action.options?.validateResponseSchema ?? true\n );\n this._client._logger.info(`[OfflineReplay] Succès ${action.constant} sur ${action.meta.baseURL}`);\n return result;\n } catch (err) {\n this._client._logger.error(`[OfflineReplay] Échec ${action.constant}`, err.message);\n throw err;\n }\n }\n\n /**\n * Démarre la surveillance de l'état réseau.\n * Basé sur navigator.onLine + un ping serveur régulier.\n *\n * @param {Object} [options]\n * @param {number} [options.interval=30000] - Intervalle de vérification en ms.\n * @param {boolean} [options.disableOfflineMonitoring=false] - Pour désactiver.\n */\n startOfflineMonitoring({ interval = 30000, disableOfflineMonitoring = false } = {}) {\n if (disableOfflineMonitoring || this._monitoringStarted) return;\n \n this._monitoringStarted = true;\n this._offlineMode = typeof window !== \"undefined\" && typeof navigator !== \"undefined\" && !navigator.onLine;\n \n if (typeof window !== \"undefined\") {\n window.addEventListener(\"online\", () => this.setOfflineMode(false));\n window.addEventListener(\"offline\", () => this.setOfflineMode(true));\n }\n \n this._pingInterval = setInterval(async () => {\n const wasOffline = this._offlineMode;\n try {\n await this._client._client.head(\"/api/cocolight/infoserver\", { timeout: 5000 }); // ✅ utilise la fonction injectée\n if (wasOffline) this.setOfflineMode(false);\n \n // eslint-disable-next-line no-unused-vars\n } catch (err) {\n this._client._logger.error(\"[OfflineMonitor] ping() échoué → passage en offline\");\n this.setOfflineMode(true);\n }\n }, interval);\n }\n\n /**\n * Change l'état offline et émet un événement si l'état change.\n * Déclenche la relecture de la file si on revient online.\n *\n * @param {boolean} isOffline\n */\n setOfflineMode(isOffline) {\n if (this._offlineMode === isOffline) return;\n this._offlineMode = isOffline;\n if (typeof this._emit === \"function\") {\n this._client.emit(\"offlineModeChanged\", isOffline);\n }\n this._client._logger.info(`[ApiClient] Mode offline : ${isOffline} (set depuis monitoring)`);\n\n if (!isOffline && typeof this._replayOfflineQueue === \"function\") {\n this._replayOfflineQueue();\n }\n }\n\n /**\n * Indique si le client est actuellement en mode offline.\n *\n * @returns {boolean}\n */\n isOffline() {\n return !!this._offlineMode;\n }\n\n /**\n * Met une action API dans la file offline.\n *\n * @param {Object} params\n * @param {string} params.constant - Le nom de l'endpoint.\n * @param {Object} params.data - Données à envoyer.\n * @param {Object} [params.options] - Options de transformation/validation.\n */\n async _enqueueOfflineAction({ constant, data, options = {} }) {\n const hasToken = this._client.getToken() || this._client.getRefreshToken();\n const endpoint = this._client._endpoints.find(e => e.constant === constant);\n const authPolicy = endpoint?.authPolicy || (endpoint?.auth === \"none\" ? \"none\" : \"required\");\n if (authPolicy === \"required\" && !hasToken) {\n this._client._logger.warn(`[Offline] Action ignorée : token requis mais absent (${constant})`);\n return;\n }\n\n const action = {\n constant,\n data,\n options,\n meta: {\n baseURL: this._client._baseURL,\n accessToken: this._client.getToken(),\n refreshToken: this._client.getRefreshToken(),\n timestamp: Date.now()\n }\n };\n\n this._offlineQueue.push(action);\n await this._offlineQueueStorage.saveQueue(this._offlineQueue);\n this._client._logger.info(`[Offline] Action mise en file : ${constant}`);\n }\n\n /**\n * Rejoue toutes les actions offline.\n * Ré-insère celles qui échouent dans la file.\n */\n async _replayOfflineQueue() {\n const queueCopy = [...this._offlineQueue];\n this._offlineQueue = [];\n await this._offlineQueueStorage.saveQueue([]);\n\n for (const action of queueCopy) {\n const endpoint = this._client._endpoints.find(e => e.constant === action.constant);\n const authPolicy = endpoint?.authPolicy || (endpoint?.auth === \"none\" ? \"none\" : \"required\");\n const hasToken = action.meta.accessToken || action.meta.refreshToken;\n\n if (authPolicy === \"required\" && !hasToken) {\n this._client._logger.warn(`[Offline] Rejetée : token requis manquant (${action.constant})`);\n continue;\n }\n\n try {\n await this.replayAction(action);\n \n } catch (e) {\n this._client._logger.error(\"[Offline] Relecture échouée :\", e.message);\n this._offlineQueue.push(action); // requeue si erreur\n }\n }\n\n await this._offlineQueueStorage.saveQueue(this._offlineQueue);\n }\n\n /**\n * Initialise la stratégie de stockage offline et charge la file d’attente.\n *\n * @param {OfflineQueueStorageStrategy} storageStrategy\n */\n async _initOfflineQueue(storageStrategy) {\n this._offlineQueueStorage = storageStrategy;\n this._offlineQueue = await storageStrategy.loadQueue();\n }\n}\n\nexport default OfflineClientManager;\n","import { LocalStorageOfflineStorage, MemoryOfflineStorage } from \"./OfflineQueueStorageStrategy.js\";\n\nexport async function createDefaultOfflineStrategy(offlineStorageStrategy = \"auto\") {\n if (offlineStorageStrategy === \"memory\") {\n return new MemoryOfflineStorage();\n }\n if (offlineStorageStrategy === \"localStorage\") {\n if (typeof window !== \"undefined\" && window.localStorage) {\n return new LocalStorageOfflineStorage();\n } else {\n throw new Error(\"localStorage is not available in this environment.\");\n }\n }\n if (offlineStorageStrategy === \"file\") {\n if (typeof window !== \"undefined\" && window.localStorage) {\n throw new Error(\"file storage is not available in this environment.\");\n }\n const { FileOfflineStorage } = await import(\"./FileOfflineStorageStrategy.node.js\");\n return new FileOfflineStorage();\n }\n if (offlineStorageStrategy === \"auto\") {\n if (typeof window !== \"undefined\" && window.localStorage) {\n return new LocalStorageOfflineStorage();\n } else {\n const { FileOfflineStorage } = await import(\"./FileOfflineStorageStrategy.node.js\");\n return new FileOfflineStorage();\n }\n }\n}","import { fromEntityJSON } from \"./api/EntityRegistry.js\";\nimport Api from \"./Api.js\";\nimport ApiClient from \"./ApiClient.js\";\nimport * as error from \"./error.js\";\nimport { createDefaultMultiServerTokenStorageStrategy } from \"./utils/createDefaultMultiServerTokenStorageStrategy.js\";\nimport { createDefaultTokenStorageStrategy } from \"./utils/createDefaultTokenStorageStrategy.js\";\nimport { MultiServerTokenStorageStrategy } from \"./utils/MultiServerTokenStorageStrategy.js\";\nimport OfflineClientManager from \"./utils/OfflineClientManager.js\";\nimport * as reactive from \"./utils/reactive.js\";\nimport { TokenStorageStrategy } from \"./utils/TokenStorage.js\";\n\nexport default {\n ApiClient,\n Api,\n error,\n\n // Accès aux primitives réactives via .reactive\n reactive,\n\n // Accès direct à chaque primitive (reactive, effect, watch...) en racine\n ...reactive,\n\n tokenStorageStrategy: {\n createDefaultTokenStorageStrategy,\n TokenStorageStrategy,\n createDefaultMultiServerTokenStorageStrategy,\n MultiServerTokenStorageStrategy\n },\n helper: {\n fromEntityJSON\n },\n\n OfflineClientManager\n};\n","import { LocalStorageStrategy, MemoryStorageStrategy } from \"./TokenStorage.js\";\n\n/**\n * Crée une stratégie de stockage de jetons par défaut en fonction de l'option fournie.\n *\n * @param {string} [tokenStorageStrategy=\"auto\"] - La stratégie de stockage de jetons souhaitée.\n * Les valeurs possibles sont :\n * - \"memory\" : Utilise une stratégie de stockage en mémoire.\n * - \"localStorage\" : Utilise le localStorage du navigateur (si disponible).\n * - \"file\" : Utilise une stratégie de stockage basée sur des fichiers (non disponible dans les environnements navigateur).\n * - \"auto\" : Sélectionne automatiquement la meilleure stratégie de stockage disponible.\n *\n * @returns {Promise<Object>} Une promesse qui se résout avec une instance de la stratégie de stockage sélectionnée.\n *\n * @throws {Error} Lève une erreur si la stratégie sélectionnée n'est pas disponible dans l'environnement actuel.\n */\nexport async function createDefaultTokenStorageStrategy(tokenStorageStrategy = \"auto\") {\n if (tokenStorageStrategy === \"memory\") {\n return new MemoryStorageStrategy();\n }\n if (tokenStorageStrategy === \"localStorage\") {\n if (typeof window !== \"undefined\" && window.localStorage) {\n return new LocalStorageStrategy();\n } else {\n throw new Error(\"localStorage is not available in this environment.\");\n }\n }\n if (tokenStorageStrategy === \"file\") {\n if (typeof window !== \"undefined\" && window.localStorage) {\n throw new Error(\"file storage is not available in this environment.\");\n }\n const { FileStorageStrategy } = await import(\"./FileStorageStrategy.node.js\");\n return new FileStorageStrategy();\n }\n if (tokenStorageStrategy === \"auto\") {\n if (typeof window !== \"undefined\" && window.localStorage) {\n return new LocalStorageStrategy();\n } else {\n const { FileStorageStrategy } = await import(\"./FileStorageStrategy.node.js\");\n return new FileStorageStrategy();\n }\n }\n}","import {\n MultiServerMemoryStorageStrategy,\n MultiServerLocalStorageStrategy,\n} from \"./MultiServerTokenStorageStrategy.js\";\n \n/**\n * Crée une stratégie de stockage de tokens multi-serveurs adaptée à l’environnement.\n *\n * @param {string} [strategyType=\"auto\"] - Type de stockage souhaité :\n * - \"memory\" : en mémoire (non persistant)\n * - \"localStorage\" : navigateur uniquement\n * - \"file\" : Node.js uniquement\n * - \"auto\" : choisit automatiquement selon l’environnement\n * @returns {Promise<MultiServerTokenStorageStrategy>}\n */\nexport async function createDefaultMultiServerTokenStorageStrategy(strategyType = \"auto\") {\n if (strategyType === \"memory\") {\n return new MultiServerMemoryStorageStrategy();\n }\n \n if (strategyType === \"localStorage\") {\n if (typeof window !== \"undefined\" && window.localStorage) {\n return new MultiServerLocalStorageStrategy();\n } else {\n throw new Error(\"localStorage n’est pas disponible dans cet environnement.\");\n }\n }\n \n if (strategyType === \"file\") {\n if (typeof window !== \"undefined\" && window.localStorage) {\n throw new Error(\"Le stockage fichier n’est pas disponible côté navigateur.\");\n }\n const { MultiServerFileStorageStrategy } = await import(\"./MultiServerFileStorageStrategy.node.js\");\n return new MultiServerFileStorageStrategy();\n }\n \n // stratégie \"auto\"\n if (typeof window !== \"undefined\" && window.localStorage) {\n return new MultiServerLocalStorageStrategy();\n } else {\n const { MultiServerFileStorageStrategy } = await import(\"./MultiServerFileStorageStrategy.node.js\");\n return new MultiServerFileStorageStrategy();\n }\n}\n ","// utils/stream-utils.node.js\nexport async function bufferToReadable(buffer) {\n const { Readable } = await import(\"stream\");\n return Readable.from(buffer);\n}\n \nexport async function createPassThrough() {\n const { PassThrough } = await import(\"stream\");\n return new PassThrough();\n}","import fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { MultiServerTokenStorageStrategy } from \"./MultiServerTokenStorageStrategy.js\";\n\nexport class MultiServerFileStorageStrategy extends MultiServerTokenStorageStrategy {\n constructor(filename = \"tokens.json\", dir = path.join(os.homedir(), \".config\", \"cocolight\")) {\n super();\n this.filePath = path.join(dir, filename);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n }\n\n _readFile() {\n if (!fs.existsSync(this.filePath)) return {};\n try {\n return JSON.parse(fs.readFileSync(this.filePath, \"utf8\"));\n } catch {\n return {};\n }\n }\n\n _writeFile(data) {\n fs.writeFileSync(this.filePath, JSON.stringify(data, null, 2), \"utf8\");\n }\n\n getAccessToken() {\n this._ensureContext();\n return this._readFile()[this._currentBaseURL]?.accessToken || null;\n }\n\n setAccessToken(token) {\n this._ensureContext();\n const all = this._readFile();\n all[this._currentBaseURL] = { ...(all[this._currentBaseURL] || {}), accessToken: token };\n this._writeFile(all);\n }\n\n getRefreshToken() {\n this._ensureContext();\n return this._readFile()[this._currentBaseURL]?.refreshToken || null;\n }\n\n setRefreshToken(token) {\n this._ensureContext();\n const all = this._readFile();\n all[this._currentBaseURL] = { ...(all[this._currentBaseURL] || {}), refreshToken: token };\n this._writeFile(all);\n }\n\n clear() {\n this._ensureContext();\n const all = this._readFile();\n delete all[this._currentBaseURL];\n this._writeFile(all);\n }\n\n getServers() {\n return Object.keys(this._readFile());\n }\n\n exportAll() {\n return this._readFile();\n }\n}\n","// src/utils/FileStorageStrategy.node.js\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { TokenStorageStrategy } from \"./TokenStorage.js\";\n\nexport class FileStorageStrategy extends TokenStorageStrategy {\n constructor(filename = \"tokens.json\", dir = path.join(os.homedir(), \".config\", \"cocolight\")) {\n super();\n this.dir = dir;\n this.filePath = path.join(dir, filename);\n this._ensureDirectoryExists();\n }\n\n _ensureDirectoryExists() {\n if (!fs.existsSync(this.dir)) {\n fs.mkdirSync(this.dir, { recursive: true });\n }\n }\n\n _readFile() {\n if (!fs.existsSync(this.filePath)) return {};\n try {\n return JSON.parse(fs.readFileSync(this.filePath, \"utf8\"));\n \n } catch (e) {\n console.error(\"Error reading token file:\", e);\n return {};\n }\n }\n\n _writeFile(data) {\n fs.writeFileSync(this.filePath, JSON.stringify(data, null, 2), \"utf8\");\n }\n\n getAccessToken() {\n return this._readFile().accessToken || null;\n }\n\n setAccessToken(token) {\n const data = this._readFile();\n data.accessToken = token;\n this._writeFile(data);\n }\n\n getRefreshToken() {\n return this._readFile().refreshToken || null;\n }\n\n setRefreshToken(token) {\n const data = this._readFile();\n data.refreshToken = token;\n this._writeFile(data);\n }\n\n clear() {\n this._writeFile({});\n }\n}\n","// src/utils/FileOfflineStorage.node.js\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { OfflineQueueStorageStrategy } from \"./OfflineQueueStorageStrategy.js\";\n\nexport class FileOfflineStorage extends OfflineQueueStorageStrategy {\n constructor(filename = \"offline-queue.json\", dir = path.join(os.homedir(), \".config\", \"cocolight\")) {\n super();\n this.dir = dir;\n this.filePath = path.join(dir, filename);\n this._ensureDirectoryExists();\n }\n\n _ensureDirectoryExists() {\n if (!fs.existsSync(this.dir)) {\n fs.mkdirSync(this.dir, { recursive: true });\n }\n }\n _readFile() {\n if (!fs.existsSync(this.filePath)) return [];\n try {\n const json = JSON.parse(fs.readFileSync(this.filePath, \"utf8\"));\n return json;\n } catch (e) {\n console.error(\"Erreur lecture offline queue :\", e);\n return [];\n }\n }\n\n _writeFile(queue) {\n try {\n fs.writeFileSync(this.filePath, JSON.stringify(queue, null, 2), \"utf8\");\n } catch (e) {\n console.warn(\"[OfflineQueue] Erreur d'écriture:\", e);\n }\n }\n\n async loadQueue() {\n return this._readFile();\n }\n\n async saveQueue(queue) {\n this._writeFile(queue);\n }\n}\n"],"names":["EntityRegistry","Map","registerEntity","tag","EntityClass","set","createFromCollection","collection","parent","data","_collectionMap","citoyens","entityTag","meta","_buildMeta","remove","organizations","projects","events","poi","news","badges","get","deps","EndpointApi","User","Organization","Project","entityClass","_buildCustomMeta","entry","console","warn","options","allDeps","Event","Poi","Badge","News","forEach","dep","ApiError","Error","constructor","message","status","details","super","this","name","ApiClientError","ApiValidationError","messages","CircuitBreakerError","ApiResponseError","responseData","ApiAuthenticationError","effectStack","computedCache","WeakMap","signalRegistry","batchDepth","pendingEffects","Set","effect","fn","wrapper","push","pop","createSignal","initialValue","value","subscribers","currentEffect","length","add","newValue","subscribe","delete","__isSignal","isSignal","obj","_wrapReactive","path","Array","isArray","arr","Proxy","target","prop","isNaN","val","isReactive","reactive","concat","Reflect","_wrapArray","__isReactive","signalMap","proxy","receiver","has","signal","toRaw","deleteProperty","getSignals","effects","from","clear","result","key","callback","signals","getter","oldValue","fromBuffer","pkg","BaseEntity","_draftData","_initialDraftData","_serverData","_calledFromSave","_syncReactiveDraft","static","config","__entityTag","getEntityTag","apiClient","userContext","endpointApi","draft","initial","_buildDraftAndProxy","defaultFields","serverData","constant","SCHEMA_CONSTANTS","transforms","removeFields","replace","id","slug","_id","newId","isConnected","userId","draftData","initialDraftData","isMe","getEntityType","entityType","hasChanges","_serialize","_toRawDeep","refresh","save","payload","_add","_resetInitialDraftData","_update","hasChanged","fromServerData","instance","_setData","newData","forceInitialDraftReset","_logger","info","Object","assign","clientDraft","mergedData","previousDraft","structuredClone","_updateDraftPreservingUserChanges","keys","current","undefined","raw","map","item","toJSON","parentMeta","type","__isSerializedEntity","JSON","parse","EJSON","stringify","_removeUnserializables","e","error","seen","WeakSet","__raw","el","clean","_revive","fromJSONValue","fromJSON","json","call","safeCall","async","response","callEndpoint","checkAndThrowApiResponseError","callNoConnected","callIsConnected","param","callIsMe","_validateImage","imageInput","_validateUploadInput","allowedMimeTypes","expectedType","_validateFile","fileInput","input","isNode","window","process","mimeType","output","File","includes","Blob","ext","split","fileName","Date","now","Buffer","isBuffer","fileTypeResult","mime","filename","_createReadStreamFromBuffer","readable","_read","previewChunks","tee","_passThrough","resultStream","MAX_BYTES","bytesRead","on","chunk","pipe","Promise","resolve","setTimeout","previewBuffer","buffer","stream","_bufferToReadable","bufferToReadable","then","streamUtils_node","createPassThrough","_omitProps","propsToRemove","_pickProps","_hasAtLeastOne","some","_createFilteredProxy","list","filter","n","_isDeleted","args","_newId","ObjectID","toString","_createDraftProxy","server","allowedFields","_","transformer","throwOnError","field","ownKeys","getOwnPropertyDescriptor","enumerable","configurable","_extractWritableFields","schema","ctx","defs","visited","$id","$defs","definitions","fields","$ref","refKey","resolved","allOf","s","if","condition","properties","matches","expected","const","else","entries","def","readOnly","constants","combinedSchema","sch","getRequestSchema","defKey","defVal","allowed","indexOf","k","rawDraft","fromEntries","v","reactiveServer","_extractChangedFieldsFromSchema","getInitialDraft","changed","initialDraft","_extractAllValidFieldsFromSchema","updated","_resolveId","getElementsKey","pathParams","contextId","contextType","_getPublicProfile","getElementsAbout","_getEntityMeta","selfClass","selfTag","commonDeps","_linkEntity","entityData","_linkEntityById","entityId","entity","skipGet","_linkEntities","results","flatMap","d","linkEntitiesFromServerData","filters","mapFn","isTruthy","isFalsy","every","actual","err","RegExp","test","toLowerCase","getTime","_entityInstanceData","selfKey","fetchKeys","entityBySlug","_buildLinkFilters","linkType","isAdmin","isAdminPending","isInviting","toBeValidated","roles","TypeError","$exists","$in","_getLinkMeta","connectTypeConnect","connectTypeDisconnect","_checkLinkableEntity","_getLinkFromConnectedUser","links","_submitLinkRequest","userLink","parentType","parentId","connectType","retour","connect","_acceptLinkRequest","_submitLinkRequestAdmin","linkOption","linkValidate","_leaveLinkRequest","disconnect","updateSettings","idEntity","typeEntity","updateDescription","typeElement","updateBlockDescription","updateInfo","updateBlockInfo","updateSocial","updateBlockSocial","updateLocality","updateBlockLocality","updateSlug","check","updateBlockSlug","updateImageProfil","profil_avatar","image","folder","ownerId","profilImage","organization","organizationData","project","projectData","poiData","event","eventData","badge","badgeData","newsData","getOrganizations","searchType","_getDefaultFromEndpoint","_createPaginatorEngine","initialData","finalizer","finalData","getOrganizationsAdmin","getOrganizationsNoAdmin","next","getProjects","$or","getProjectsAdmin","getProjectsNoAdmin","getPois","getPoisAdmin","getPoisNoAdmin","getSubscribers","getBadgesIssuer","getBadges","getNews","arrayObjet","rawList","getGallery","docType","requestToJoin","requestToJoinAdmin","acceptInvitation","leave","follow","unfollow","_checkAccess","action","_validateUserLink","_assertEntityType","types","expectedTypes","join","_isLinked","isAuthor","creator","isAuthorOrAdmin","isMember","isContributor","isAttendee","isFollower","isFollowing","getCostumJson","_generateRanges","indexStep","previousRanges","ranges","previous","indexMax","indexMin","_normalizeCount","count","spam","total","values","reduce","acc","endpoint","_endpoints","find","ep","request","default","Entity","state","cursor","index","history","sizes","hasStep","getPage","isNext","countType","searchBy","hasNext","hasPrev","pageIndex","pageNumber","prev","lastPageSize","Math","max","_withCostumContext","baseFinalizer","costumSlug","sourceKey","searchCostum","globalAutocompleteCostum","costumEventRequestActors","wrappedFinalizer","costumEventRequestSubevents","costumEventRequestDates","costumEventRequestElementEvent","costumEventRequestCategories","costumEventRequestEvent","costumEventRequestLinkTlToEvent","costumEventRequestLoadContextTag","methodName","ADD_BLOCKS","blockData","UPDATE_BLOCKS","getEvents","personRegister","authenticateUrl","refreshTokenUrl","meInfoUrl","passwordRecovery","serverExchangeToken","changePassword","deleteAccount","multiconnect","getNewsById","addNews","addImageNews","addFileNews","deleteNews","updateNews","shareNews","getComments","addComments","deleteComments","updateComments","searchTags","showVote","globalAutocomplete","cityAutocomplete","cityAutocompleteByCountry","suggestionInput","getMembersNoAdmin","getMembersAdmin","getFriendsAdmin","getSubscriptions","getSubscriptionsAdmin","getSubscribersAdmin","getContributorsNoAdmin","getContributorsAdmin","getBadgesFilters","getFavoris","deleteFavoris","addFavoris","addOrganization","addProject","addPoi","addEvent","deletePoi","deleteEvent","deleteElement","addImageElement","searchMemberAutocomplete","getNotifications","getNotificationsCount","notificationUpdate","removeAllNotifications","markNotificationAsRead","activitypubSearch","activitypubLink","activitypubGetCommunity","getBadge","getEmetteurBadges","addBadges","assignBadges","shareEvents","inviteEvent","organizer","scope","mentions","m","parseInt","mediaImg","images","img","Boolean","countImages","mediaFile","files","f","countFiles","newsArray","ids","text","object","idNews","addMention","userInstance","user","mention","addImage","newsImage","dataImage","addFile","file","newsFile","dataFile","github","full","socialNetwork","gitlab","facebook","twitter","instagram","diaspora","mastodon","telegram","getMembers","getContributors","parentIsMe","isActingUser","fetchFn","getFriends","userData","sendFriendRequest","invitorId","acceptFriendRequest","removeFriend","isFriend","prototype","MongoID","str","hexString","_looksLikeObjectID","_str","equals","other","valueOf","clone","typeName","getTimestamp","Number","substr","toJSONValue","toHexString","common","common1","common2","format","common3","common4","common5","pattern","common6","additionalProperties","required","common8","reason","common10","common11","common12","common13","common15","enum","common16","common17","common18","common19","common20","common21","common24","common27","not","common29","common30","anyOf","items","common31","common32","common33","common35","url","common37","tags","common39","email","common41","common42","common43","common44","common45","common46","common47","common48","avancement","common50","common52","patternProperties","common54","common55","common56","common58","common61","common62","common63","common64","common65","common66","common69","common70","addressCountry","addressLocality","codeInsee","level1","level1Name","level3","minLength","level3Name","level4","level4Name","localityId","postalCode","streetAddress","common74","latitude","longitude","common78","coordinates","maxItems","minItems","float","common81","common82","common84","common87","maxLength","common88","common90","common92","common94","common96","common98","common100","common102","common103","common104","common105","common106","common107","common109","common111","minimum","common115","common116","common117","common119","common120","common121","childId","common123","childType","common125","common126","common128","common130","common131","common134","common135","common136","common137","common138","common139","common144","common146","common148","common149","common150","common152","common153","common156","common158","common159","common161","common162","common164","common165","common166","common168","common170","common173","common175","common177","propertyNames","common180","common181","common184","common185","common187","common189","common191","common192","common195","common196","common197","common199","common201","common203","common204","common205","common206","common207","common208","isOpenData","isOpenEdition","common211","common214","common215","common216","common217","common218","common219","common222","common223","common224","common228","common229","common230","common232","common235","common238","costumEditMode","endpointsJson","auth","contentType","generateModule","method","onlyAuthNone","app","isInvitation","mode","pendingUserId","pwd","username","postActions","password","refreshToken","serverUrl","newPassword","newPassword2","oldPassword","description","shortDescription","block","descMentions","sharedFields","birthDate","fixe","mobile","urls","socialField","address","oneOf","geo","geoPosition","tpl","listInvite","isLive","dateLimit","search","markdownActive","comment","argval","parentCommentId","params","q","fediverse","initType","locality","notSourceKey","countryCode","formInMap","scopeValue","maxProperties","minProperties","isParcours","Cooperative","GovernmentOrganization","Group","LocalBusiness","NGO","pull","arrayForm","preferences","role","crowdfunding","public","recurrency","endDate","openingHours","dayOfWeek","hours","closes","opens","startDate","timeZone","startBeforeEnd","qqfile","qqfilename","qqtotalfilesize","qquuid","searchMode","refreshTimestamp","all","actor","criteria","narrative","issuer","award","badgeId","evidences","narative","endDateUTC","startDateUTC","invites","msg","functionCocostum","mapUsed","verb","sortBy","parent_only","date","between","end","start","fromToday","regions","timezone","tl","contentKey","folderId","TokenStorageStrategy","getAccessToken","setAccessToken","token","getRefreshToken","setRefreshToken","MemoryStorageStrategy","_accessToken","_refreshToken","LocalStorageStrategy","prefix","localStorage","getItem","setItem","removeItem","MultiServerTokenStorageStrategy","_currentBaseURL","use","baseURL","_ensureContext","getServers","exportAll","MultiServerMemoryStorageStrategy","_storage","accessToken","MultiServerLocalStorageStrategy","_key","_getData","startsWith","addType","ApiClient","EventEmitter","refreshUrl","endpoints","timeout","debug","maxRetries","circuitBreakerThreshold","circuitBreakerResetTime","tokenStorageStrategy","_baseURL","_refreshUrl","_debug","_userId","_offlineClientManager","_fromJSONValue","defineProperty","_setUserId","_ajv","Ajv","strict","useDefaults","allErrors","verbose","addFormats","addFormat","addKeyword","keyword","errors","validate","_startBeforeEndValidate","pino","transport","colorize","level","_client","axios","create","axiosRetry","retries","retryDelay","exponentialDelay","retryCondition","isNetworkError","isRetryableError","onRetry","retryCount","requestConfig","emit","_breakerThreshold","_breakerResetTime","_breakerErrorCount","_breakerOpen","_lastBreakerOpenTime","_tokenStorage","setToken","initialAccessToken","initialRefreshToken","interceptors","originalRequest","_retry","_refreshAccessToken","headers","getToken","resetSession","defaults","_getIdFromToken","jwtDecode","refreshClient","post","_checkCircuitBreaker","_updateCircuitBreakerError","timestamp","_resetCircuitBreakerSuccess","stripNullsInPlace","i","splice","hasOwnProperty","_resolveSpecialValuesInPlace","aliasMap","subPath","_getValueByPath","regex","resolveString","delimitedAlias","plainAlias","substring","match","subKey","remainder","internal","isBinary","isPlainObject","_cleanSchemaLeftoverAlias","aliasRegex","newObj","cleanedDefault","transformResponseData","validateResponseSchema","pathSchema","requestSchema","responses","lowerMethod","realContentType","resolvedPath","resolvedParams","schemaToCompile","validatePathParams","compile","errorMessages","_ajvErrorHuman","stage","encodeURIComponent","dataForValidation","cleanedData","validateRequest","isOffline","_enqueueOfflineAction","offline","breaker","toURLSearchParams","validateResponse","_transformData","errorsMessages","AggregateAjvError","resultErrors","_buildParams","URLSearchParams","paramsInstance","dots","indexes","metaTokens","stack","isVisitable","thing","removeBrackets","endsWith","slice","renderKey","useDots","convertValue","toISOString","ArrayBuffer","isView","build","append","fieldKey","defaultVisitor","trim","resultGoods","_normalizeJsonData","notif","cities","newComment","allMongoIds","_normalizeRecursively","src","changes","_ensureFullURL","day","replies","author","firstKey","timeAgo","imagePath","separator","_normalizeString","_normalizeId","$type","$value","_normalizeDate","sec","$date","_normalizeImage","_imageFields","_dateFields","normalizedData","isValid","instancePath","schemaPath","getPathSchema","onEvent","handlers","availableEvents","eventName","getDeclaredEvents","UserApi","clientOrOptions","client","loggedUser","login","meIsconnected","register","recoverPassword","Api","userLogin","userApi","userApiLogin","_loggedUser","me","entitySlug","logout","OfflineQueueStorageStrategy","loadQueue","saveQueue","queue","MemoryOfflineStorage","_queue","LocalStorageOfflineStorage","OfflineClientManager","_clients","attachTo","strategy","offlineStorageStrategy","FileOfflineStorage","FileOfflineStorageStrategy_node","createDefaultOfflineStrategy","_initOfflineQueue","disableOfflineMonitoring","startOfflineMonitoring","getClient","replayAction","interval","_monitoringStarted","_offlineMode","navigator","onLine","addEventListener","setOfflineMode","_pingInterval","setInterval","wasOffline","head","_emit","_replayOfflineQueue","hasToken","authPolicy","_offlineQueue","_offlineQueueStorage","queueCopy","storageStrategy","createDefaultTokenStorageStrategy","FileStorageStrategy","FileStorageStrategy_node","createDefaultMultiServerTokenStorageStrategy","strategyType","MultiServerFileStorageStrategy","MultiServerFileStorageStrategy_node","helper","fromEntityJSON","Readable","import","PassThrough","dir","os","homedir","filePath","fs","existsSync","mkdirSync","recursive","_readFile","readFileSync","_writeFile","writeFileSync","_ensureDirectoryExists"],"mappings":"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"}
|