@communecter/cocolight-api-client 1.0.4 → 1.0.6

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.
@@ -1 +0,0 @@
1
- (()=>{"use strict";var e={d:(t,r)=>{for(var i in r)e.o(r,i)&&!e.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:r[i]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{default:()=>m});const r=require("events"),i=require("ajv"),s=require("ajv-formats"),o=require("axios"),n=require("axios-retry"),p=require("ejson"),a=require("pino"),d={_looksLikeObjectID:e=>24===e.length&&/^[0-9a-f]*$/.test(e),ObjectID:class{constructor(e){if(e){if(e=e.toLowerCase(),!d._looksLikeObjectID(e))throw new Error("Invalid hexadecimal string for creating an ObjectID");this._str=e}}equals(e){return e instanceof d.ObjectID&&this.valueOf()===e.valueOf()}toString(){return`ObjectID("${this._str}")`}clone(){return new d.ObjectID(this._str)}typeName(){return"oid"}getTimestamp(){return Number.parseInt(this._str.substr(0,8),16)}valueOf(){return this._str}toJSONValue(){return this.valueOf()}toHexString(){return this.valueOf()}}},l=d,c=[{name:"Enregistrement d'un utilisateur",path:"/co2/person/register",constant:"PERSON_REGISTER",method:"POST",auth:"none",description:"Permet d’enregistrer un nouvel utilisateur avec ses informations personnelles.",contentType:"application/x-www-form-urlencoded",request:{type:"object",description:"Permet d’enregistrer un nouvel utilisateur avec ses informations personnelles.",properties:{name:{type:"string",description:"Nom complet de l'utilisateur"},username:{type:"string",description:"Pseudo ou identifiant unique"},email:{type:"string",format:"email",description:"Adresse email de l'utilisateur"},pwd:{type:"string",description:"Mot de passe"},app:{type:"string",description:"Nom de l'application"},pendingUserId:{type:"string",description:"ID d’un utilisateur en attente (facultatif)"},mode:{type:"string",description:"Mode d’enregistrement"},isInvitation:{type:"boolean",description:"Indique s’il s’agit d’une invitation (facultatif)"}},required:["name","username","email","pwd"],additionalProperties:!1},responses:{200:{oneOf:[{description:"Réponse en cas de succès lors de la création d'un utilisateur",type:"object",properties:{result:{type:"boolean",const:!0},msg:{type:"string"},id:{type:"string"},person:{type:"object",properties:{name:{type:"string"},username:{type:"string"},pwd:{type:"string"},email:{type:"string",format:"email"},_id:{type:"string"}},required:["name","username","pwd","email","_id"]}},required:["result","msg","id","person"],additionalProperties:!1},{description:"Réponse en cas d'erreur lors de la création d'un utilisateur",type:"object",properties:{result:{type:"boolean",const:!1},msg:{type:"string"}},required:["result","msg"],additionalProperties:!1}]}}},{name:"Authentification",path:"/api/cocolight/authenticate",constant:"AUTHENTICATE_URL",method:"POST",auth:"none",description:"Permet de se connecter en utilisant une adresse email et un mot de passe.",contentType:"application/json",postActions:[{type:"setToken",path:"accessToken"},{type:"setRefreshToken",path:"refreshToken"},{type:"setUserId",path:"user.id"},{type:"emitEvent",event:"userLoggedIn",payloadPath:"user"}],request:{type:"object",description:"Permet de se connecter en utilisant une adresse email et un mot de passe.",properties:{email:{type:"string",format:"email",description:"Adresse email de l'utilisateur"},password:{type:"string",description:"Mot de passe de l'utilisateur"}},required:["email","password"],additionalProperties:!1},responses:{200:{type:"object",description:"Objet data renvoyé après une authentification réussie.",properties:{user:{type:"object",properties:{id:{type:"string",description:"Identifiant unique de l'utilisateur"},username:{type:"string",description:"Pseudo ou nom d'utilisateur"},email:{type:"string",format:"email",description:"Adresse email de l'utilisateur"},roles:{type:"object",properties:{betaTester:{type:"boolean"},standalonePageAccess:{type:"boolean"},superAdmin:{type:"boolean"}}},timezone:{type:"string",description:"Fuseau horaire de l'utilisateur"},lastLoginDate:{type:"integer",description:"Timestamp Unix du dernier login"},profilImageUrl:{anyOf:[{type:"string",format:"uri"},{type:"string",enum:[""]}],description:"URL de l'image de profil utilisateur, ou chaîne vide"}},required:["id","username","email","roles"],additionalProperties:!1},accessToken:{type:"string",description:"Token JWT d'accès"},refreshToken:{type:"string",description:"Token JWT pour rafraîchir l'access token"},status:{type:"integer",description:"Code de statut personnalisé renvoyé par l'API"}},required:["user","accessToken","refreshToken","status"],additionalProperties:!1},401:{type:"object",description:"Erreur d'authentification (identifiants incorrects)",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Rafraîchir un token",path:"/api/cocolight/refreshtoken",constant:"REFRESH_TOKEN_URL",method:"POST",auth:"none",description:"Permet de rafraîchir un token d'accès expiré en utilisant un token de rafraîchissement.",contentType:"application/json",request:{type:"object",description:"Permet de rafraîchir un token d'accès expiré en utilisant un token de rafraîchissement.",properties:{refreshToken:{type:"string",description:"Token de rafraîchissement"}},required:["refreshToken"],additionalProperties:!1},responses:{200:{type:"object",description:"Objet data renvoyé après un rafraîchissement réussi.",properties:{token:{type:"string",description:"Token JWT d'accès"},refreshToken:{type:"string",description:"Token JWT pour rafraîchir l'access token"}},required:["token","refreshToken"],additionalProperties:!1},401:{type:"object",description:"Erreur de rafraîchissement (token invalide ou expiré)",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Récupérer les informations utilisateur",path:"/api/cocolight/me",constant:"ME_INFO_URL",method:"POST",auth:"bearer",description:"Récupère les informations du profil utilisateur pour un token donné.",contentType:"application/json",responses:{200:{type:"object",description:"Schéma JSON pour les informations détaillées d'un utilisateur.",properties:{_id:{type:"object",properties:{$id:{type:"string"}},required:["$id"],additionalProperties:!1},username:{type:"string"},email:{type:"string",format:"email"},name:{type:"string"},slug:{type:"string"},collection:{type:"string"},modified:{type:"object",properties:{sec:{type:"integer"},usec:{type:"integer"}},required:["sec","usec"],additionalProperties:!1},roles:{type:"object",properties:{betaTester:{type:"boolean"},standalonePageAccess:{type:"boolean"},superAdmin:{type:"boolean"}}},preferences:{type:"object",properties:{privateFields:{type:"array",items:{type:"string"}},publicFields:{type:"array",items:{type:"string"}},isOpenData:{type:"boolean"},badge:{type:"boolean"},sendMail:{oneOf:[{type:"object",properties:{source:{type:"array",items:{}}},required:["source"],additionalProperties:!1},{type:"boolean",const:!1}]},activitypub:{type:"boolean"},activitypubStarterClosed:{type:"boolean"},notifications:{type:"array",items:{}}},required:["isOpenData","sendMail","publicFields","privateFields"]},language:{type:"string"},profilImageUrl:{type:"string"},profilMarkerImageUrl:{type:"string",format:"uri-reference"},profilMediumImageUrl:{type:"string",format:"uri-reference"},profilThumbImageUrl:{type:"string",format:"uri-reference"},profilBannerUrl:{type:"string",format:"uri-reference"},profilRealBannerUrl:{type:"string",format:"uri-reference"},shortDescription:{type:"string"},description:{type:"string"},tags:{type:"array",items:{type:"string"}},birthDate:{type:"object",properties:{sec:{type:"integer"},usec:{type:"integer"}},required:["sec","usec"],additionalProperties:!1}},required:["_id","name","email","username","roles","collection","preferences","slug"]},401:{type:"object",description:"Erreur d'authentification (token invalide ou expiré)",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Récupération de mot de passe",path:"/co2/person/sendemail",constant:"PASSWORD_RECOVERY",method:"POST",auth:"none",description:"Envoie un email pour récupérer le mot de passe.",contentType:"application/x-www-form-urlencoded",request:{type:"object",properties:{email:{type:"string",format:"email",description:"Adresse email de l'utilisateur"},type:{type:"string",description:"Type d'email envoyé",const:"password",default:"password"}},required:["email","type"],additionalProperties:!1},responses:{200:{oneOf:[{description:"Erreur: email non trouvé dans la base",type:"object",properties:{result:{type:"boolean",const:!1},errId:{type:"string",const:"UNKNOWN_ACCOUNT_ID"},msg:{type:"string"}},required:["result","errId","msg"],additionalProperties:!1},{description:"Succès: email de récupération envoyé",type:"object",properties:{result:{type:"boolean",const:!0},msg:{type:"string"}},required:["result","msg"],additionalProperties:!1}]}}},{name:"Échange de token avec un autre serveur",path:"/api/cocolight/exchangetoken",constant:"SERVER_EXCHANGE_TOKEN",method:"POST",auth:"bearer",description:"Permet de se connecter à un autre serveur Communecter en échangeant un token.",contentType:"application/json",request:{type:"object",properties:{serverUrl:{type:"string",description:"URL du serveur distant"}},required:["serverUrl"],additionalProperties:!1},responses:{200:{type:"object",description:"Objet data renvoyé après une authentification réussie.",properties:{user:{type:"object",properties:{id:{type:"string",description:"Identifiant unique de l'utilisateur"},username:{type:"string",description:"Pseudo ou nom d'utilisateur"},email:{type:"string",format:"email",description:"Adresse email de l'utilisateur"},roles:{type:"object",properties:{betaTester:{type:"boolean"},standalonePageAccess:{type:"boolean"},superAdmin:{type:"boolean"}}},timezone:{type:"string",description:"Fuseau horaire de l'utilisateur"},lastLoginDate:{type:"integer",description:"Timestamp Unix du dernier login"},profilImageUrl:{type:"string",format:"uri",description:"URL de l'image de profil utilisateur"}},required:["id","username","email","roles"],additionalProperties:!1},accessToken:{type:"string",description:"Token JWT d'accès"},refreshToken:{type:"string",description:"Token JWT pour rafraîchir l'access token"},status:{type:"integer",description:"Code de statut personnalisé renvoyé par l'API"}},required:["user","accessToken","refreshToken","status"],additionalProperties:!1},401:{type:"object",description:"Erreur d'authentification (token invalide ou expiré)",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Changer le mot de passe",path:"/co2/person/changepassword",constant:"CHANGE_PASSWORD",method:"POST",auth:"bearer",description:"Permet de changer le mot de passe d'un utilisateur.",contentType:"application/x-www-form-urlencoded",request:{type:"object",properties:{mode:{type:"string",description:"Mode ou contexte du changement",const:"changePassword",default:"changePassword"},userId:{type:"string",description:"Identifiant de l'utilisateur",default:"@userId"},oldPassword:{type:"string",description:"Ancien mot de passe"},newPassword:{type:"string",description:"Nouveau mot de passe"},newPassword2:{type:"string",description:"Confirmation du nouveau mot de passe"},scope:{type:["string"],description:"Périmètre concerné",default:""}},required:["mode","userId","oldPassword","newPassword","newPassword2"],additionalProperties:!1},responses:{200:{oneOf:[{description:"Réponse en cas de succès lors du changement de mot de passe",type:"object",properties:{result:{type:"boolean",const:!0},msg:{type:"string"}},required:["result","msg"],additionalProperties:!1},{description:"Réponse en cas d'erreur lors du changement de mot de passe",type:"object",properties:{result:{type:"boolean",const:!1},msg:{type:"string"}},required:["result","msg"],additionalProperties:!1}]},401:{type:"object",description:"Erreur d'authentification (token invalide ou expiré)",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Supprimer un compte",path:"/co2/element/delete/id/{id}/type/citoyens",constant:"DELETE_ACCOUNT",method:"POST",auth:"bearer",description:"Permet de supprimer un compte utilisateur.",contentType:"application/x-www-form-urlencoded",postActions:[{type:"resetSession"},{type:"emitEvent",event:"accountDeleted",path:null}],pathParams:{type:"object",properties:{id:{type:"string",description:"Identifiant de l'utilisateur à supprimer",default:"@userId"}},required:["id"],additionalProperties:!1},request:{type:"object",properties:{reason:{type:"string",description:"Raison de la suppression",default:""}},required:["reason"],additionalProperties:!1},responses:{200:{type:"object",description:"Réponse après la suppression du compte",properties:{result:{type:"boolean",const:!0},msg:{type:"string"}},required:["result","msg"],additionalProperties:!1},401:{type:"object",description:"Erreur d'authentification (token invalide ou expiré)",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Mettre à jour les paramètres utilisateur",path:"/co2/element/updatesettings",constant:"UPDATE_SETTINGS",method:"POST",auth:"bearer",description:"Mise à jour des paramètres spécifiques d'un utilisateur.",contentType:"application/x-www-form-urlencoded",request:{type:"object",properties:{type:{type:"string"},value:{},typeEntity:{type:"string",default:"citoyens"},idEntity:{type:"string"}},required:["type","value","typeEntity","idEntity"],additionalProperties:!1,allOf:[{if:{properties:{typeEntity:{const:"citoyens"}}},then:{properties:{idEntity:{type:"string",default:"@userId"}}}},{if:{properties:{typeEntity:{const:"citoyens"},type:{enum:["birthDate","email","locality","phone","directory"]}}},then:{properties:{value:{type:"string",enum:["private","public","mask"]}}}},{if:{properties:{typeEntity:{const:"citoyens"},type:{enum:["activitypub","isOpenData"]}}},then:{properties:{value:{type:"boolean"}}}},{if:{properties:{typeEntity:{not:{const:"citoyens"}},type:{enum:["isOpenData","isOpenEdition","private","feedback"]}}},then:{properties:{value:{type:"boolean"}}}}]},responses:{200:{type:"object",description:"Réponse après la mise à jour des paramètres",properties:{result:{type:"boolean",const:!0},msg:{type:"string"}},required:["result","msg"],additionalProperties:!1},401:{type:"object",description:"Erreur d'authentification (token invalide ou expiré)",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Mettre à jour la description d'un élément",path:"/co2/element/updateblock/",constant:"UPDATE_BLOCK_DESCRIPTION",constantCocolight:"UPDATE_BLOCK",method:"POST",auth:"bearer",description:"Permet de mettre à jour la description courte et complète d'un élément.",contentType:"application/x-www-form-urlencoded",request:{type:"object",properties:{block:{type:"string",const:"descriptions",default:"descriptions",description:"Nom du bloc à mettre à jour (doit être 'descriptions')"},typeElement:{type:"string",default:"citoyens",enum:["citoyens","projects","organizations"],description:"Type d'élément (citoyens, projects, organizations)"},id:{type:"string",description:"ID de l'élément concerné"},scope:{type:["string","null"],default:"",description:"Périmètre de mise à jour",$comment:"Non utilisé dans l'application Cocolight"},descMentions:{type:"string",description:"Mentions dans la description",default:"",$comment:"Non utilisé dans l'application Cocolight"},shortDescription:{type:"string",description:"Courte description"},description:{type:"string",description:"Description complète"}},required:["block","typeElement","id"],additionalProperties:!1,allOf:[{if:{properties:{typeElement:{const:"citoyens"}}},then:{properties:{id:{type:"string",default:"@userId"}}}},{anyOf:[{required:["description"],properties:{description:{not:{type:"null"}}}},{required:["shortDescription"],properties:{shortDescription:{not:{type:"null"}}}}]}]},responses:{200:{type:"object",description:"Réponse après la mise à jour de la description",properties:{result:{type:"boolean",const:!0},resultGoods:{type:"object",properties:{result:{type:"boolean",const:!0},msg:{type:"string"},values:{type:"object",properties:{shortDescription:{type:["string","null"]},description:{type:["string","null"]}},additionalProperties:!0}},required:["result","msg"],additionalProperties:!0}},required:["result","resultGoods"],additionalProperties:!1},401:{type:"object",description:"Erreur d'authentification (token invalide ou expiré)",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Mettre à jour les informations d'un élément",path:"/co2/element/updateblock/",constant:"UPDATE_BLOCK_INFO",constantCocolight:"UPDATE_BLOCK",method:"POST",auth:"bearer",description:"Permet de mettre à jour les informations générales d'un élément (nom, contacts, etc.).",contentType:"application/x-www-form-urlencoded",request:{type:"object",properties:{block:{type:"string",const:"info",default:"info",description:"Nom du bloc à mettre à jour (doit être 'info')"},typeElement:{type:"string",default:"citoyens",enum:["citoyens","projects","organizations"],description:"Type d'élément (citoyens, projects, organizations)"},id:{type:"string",description:"ID de l'élément concerné"},scope:{type:"string",default:"",description:"Périmètre de mise à jour"}},required:["block","typeElement","id"],$defs:{sharedFields:{name:{type:"string",description:"Nom de l'entité"},url:{type:"string",format:"uri",description:"Lien vers le site ou la page publique"},email:{type:"string",format:"email",description:"Adresse email"},tags:{anyOf:[{type:"array",items:{type:"string"}},{type:"string",enum:[""]}],description:'Tags : "" pour effacer tous les tags, ou tableau de mots-clés.'}}},allOf:[{if:{properties:{typeElement:{const:"citoyens"}}},then:{properties:{block:{type:"string",const:"info",default:"info",description:"Nom du bloc à mettre à jour (doit être 'info')"},typeElement:{type:"string",default:"citoyens",enum:["citoyens","projects","organizations"],description:"Type d'élément (citoyens, projects, organizations)"},scope:{type:"string",default:"",description:"Périmètre de mise à jour"},id:{type:"string",description:"ID de l'élément concerné",default:"@userId"},name:{$ref:"#/$defs/sharedFields/name"},email:{$ref:"#/$defs/sharedFields/email"},url:{$ref:"#/$defs/sharedFields/url"},tags:{$ref:"#/$defs/sharedFields/tags"},birthDate:{type:"string",format:"date",description:"Date de naissance"},fixe:{type:"string",description:"Téléphone fixe"},mobile:{type:"string",description:"Téléphone mobile"}},anyOf:[{required:["name"],properties:{name:{not:{type:"null"}}}},{required:["birthDate"],properties:{birthDate:{not:{type:"null"}}}},{required:["fixe"],properties:{fixe:{not:{type:"null"}}}},{required:["mobile"],properties:{mobile:{not:{type:"null"}}}},{required:["url"],properties:{url:{not:{type:"null"}}}},{required:["tags"],properties:{tags:{not:{type:"null"}}}},{required:["email"],properties:{email:{not:{type:"null"}}}}],additionalProperties:!1}},{if:{properties:{typeElement:{const:"projects"}}},then:{properties:{block:{type:"string",const:"info",default:"info",description:"Nom du bloc à mettre à jour (doit être 'info')"},typeElement:{type:"string",default:"citoyens",enum:["citoyens","projects","organizations"],description:"Type d'élément (citoyens, projects, organizations)"},id:{type:"string",description:"ID de l'élément concerné"},scope:{type:"string",default:"",description:"Périmètre de mise à jour"},name:{$ref:"#/$defs/sharedFields/name"},email:{$ref:"#/$defs/sharedFields/email"},url:{$ref:"#/$defs/sharedFields/url"},tags:{$ref:"#/$defs/sharedFields/tags"},avancement:{type:"string",enum:["abandoned","concept","development","production","started","testing","idea","mature","qa","finished"],description:"État d'avancement du projet"},parent:{type:"object",patternProperties:{"^[a-fA-F0-9]{24}$":{type:"object",properties:{type:{type:"string",description:"Type d'entité parent"},name:{type:"string",description:"Nom de l'entité parent"}},required:["type","name"],additionalProperties:!1}},additionalProperties:!1,description:"Objet contenant les entités parentes (clé = ID). null signifie que les parents ne sont pas modifiés."}},anyOf:[{required:["name"],properties:{name:{not:{type:"null"}}}},{required:["url"],properties:{url:{not:{type:"null"}}}},{required:["tags"],properties:{tags:{not:{type:"null"}}}},{required:["email"],properties:{email:{not:{type:"null"}}}},{required:["avancement"],properties:{avancement:{not:{type:"null"}}}},{required:["parent"],properties:{parent:{not:{type:"null"}}}}],additionalProperties:!1}},{if:{properties:{typeElement:{const:"organizations"}}},then:{properties:{block:{type:"string",const:"info",default:"info",description:"Nom du bloc à mettre à jour (doit être 'info')"},typeElement:{type:"string",default:"citoyens",enum:["citoyens","projects","organizations"],description:"Type d'élément (citoyens, projects, organizations)"},id:{type:"string",description:"ID de l'élément concerné"},scope:{type:"string",default:"",description:"Périmètre de mise à jour"},name:{$ref:"#/$defs/sharedFields/name"},email:{$ref:"#/$defs/sharedFields/email"},url:{$ref:"#/$defs/sharedFields/url"},tags:{$ref:"#/$defs/sharedFields/tags"},type:{type:"string",enum:["NGO","Cooperative","LocalBusiness","GovernmentOrganizationautre"],description:"Type d'organisation (ex. association, entreprise)"}},anyOf:[{required:["name"],properties:{name:{not:{type:"null"}}}},{required:["url"],properties:{url:{not:{type:"null"}}}},{required:["tags"],properties:{tags:{not:{type:"null"}}}},{required:["email"],properties:{email:{not:{type:"null"}}}},{required:["type"],properties:{type:{not:{type:"null"}}}}],additionalProperties:!1}}]},responses:{200:{oneOf:[{type:"object",properties:{result:{type:"boolean",const:!0},resultGoods:{type:"object",properties:{result:{type:"boolean",const:!0},msg:{type:"string"},values:{type:"object",description:"Contient les champs mis à jour",additionalProperties:!0,$comment:"Ce schéma n'est pas encore complet"}},required:["result","msg"],additionalProperties:!0}},required:["result","resultGoods"],additionalProperties:!1},{type:"object",properties:{resultErrors:{type:"object",properties:{result:{type:"boolean",const:!1},msg:{type:"string",description:"Message d'erreur"}},required:["result","msg"],additionalProperties:!0}},required:["resultErrors"],additionalProperties:!1}]},401:{type:"object",description:"Erreur d'authentification (token invalide ou expiré)",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Mettre à jour les réseaux sociaux d'un élément",path:"/co2/element/updateblock/",constant:"UPDATE_BLOCK_SOCIAL",constantCocolight:"UPDATE_BLOCK",method:"POST",auth:"bearer",description:"Permet de mettre à jour les liens vers les réseaux sociaux d'un élément.",contentType:"application/x-www-form-urlencoded",request:{type:"object",properties:{block:{type:"string",const:"network",default:"network",description:"Nom du bloc à mettre à jour (doit être 'network')"},typeElement:{type:"string",default:"citoyens",enum:["citoyens","projects","organizations"],description:"Type d'élément (citoyens, projects, organizations)"},id:{type:"string",description:"ID de l'élément concerné"},scope:{type:"string",default:"",description:"Périmètre de mise à jour"},gitlab:{$ref:"#/$defs/socialField",description:"Compte Gitlab"},github:{$ref:"#/$defs/socialField",description:"Compte Github"},twitter:{$ref:"#/$defs/socialField",description:"Compte Twitter"},facebook:{$ref:"#/$defs/socialField",description:"Compte Facebook"},instagram:{$ref:"#/$defs/socialField",description:"Compte Instagram"},diaspora:{$ref:"#/$defs/socialField",description:"Compte Diaspora"},mastodon:{$ref:"#/$defs/socialField",description:"Compte Mastodon"},telegram:{$ref:"#/$defs/socialField",description:"Compte Telegram"},signal:{$ref:"#/$defs/socialField",description:"Compte Signal"}},required:["block","typeElement","id"],$defs:{socialField:{anyOf:[{type:"string",enum:[""],description:"Vide pour effacer le champ"},{type:"string",format:"uri",description:"URL du profil sur le réseau social"}]}},allOf:[{if:{properties:{typeElement:{const:"citoyens"}}},then:{properties:{id:{type:"string",default:"@userId"}}}},{anyOf:[{required:["gitlab"],properties:{gitlab:{not:{type:"null"}}}},{required:["github"],properties:{github:{not:{type:"null"}}}},{required:["twitter"],properties:{twitter:{not:{type:"null"}}}},{required:["facebook"],properties:{facebook:{not:{type:"null"}}}},{required:["instagram"],properties:{instagram:{not:{type:"null"}}}},{required:["diaspora"],properties:{diaspora:{not:{type:"null"}}}},{required:["mastodon"],properties:{mastodon:{not:{type:"null"}}}},{required:["telegram"],properties:{telegram:{not:{type:"null"}}}},{required:["signal"],properties:{signal:{not:{type:"null"}}}}]}]},responses:{200:{oneOf:[{type:"object",properties:{result:{type:"boolean",const:!0},resultGoods:{type:"object",properties:{result:{type:"boolean",const:!0},msg:{type:"string"},values:{type:"object",description:"Contient les champs mis à jour",additionalProperties:!0,$comment:"Ce schéma n'est pas encore complet"}},required:["result","msg"],additionalProperties:!0}},required:["result","resultGoods"],additionalProperties:!1},{type:"object",properties:{resultErrors:{type:"object",properties:{result:{type:"boolean",const:!1},msg:{type:"string",description:"Message d'erreur"}},required:["result","msg"],additionalProperties:!0}},required:["resultErrors"],additionalProperties:!1}]},401:{type:"object",description:"Erreur d'authentification (token invalide ou expiré)",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Mettre à jour les localités d'un élément",path:"/co2/element/updateblock/",constant:"UPDATE_BLOCK_LOCALITY",constantCocolight:"UPDATE_BLOCK",method:"POST",auth:"bearer",description:"Permet de mettre à jour l'adresse et les informations géographiques d'un élément.",contentType:"application/x-www-form-urlencoded",request:{type:"object",properties:{block:{type:"string",const:"localities",default:"localities",description:"Nom du bloc à mettre à jour (doit être 'localities')"},typeElement:{type:"string",default:"citoyens",enum:["citoyens","projects","organizations"],description:"Type d'élément"},id:{type:"string",description:"ID de l'élément concerné"},scope:{type:"string",default:"",description:"Périmètre de mise à jour"},geo:{type:"object",description:"Coordonnées géographiques",properties:{"@type":{type:"string",const:"GeoCoordinates"},latitude:{type:["string","number"]},longitude:{type:["string","number"]}},required:["latitude","longitude"],additionalProperties:!1},geoPosition:{type:"object",description:"Position géographique GeoJSON",properties:{type:{type:"string",const:"Point",description:"Type GeoJSON (doit être 'Point')"},coordinates:{type:"array",items:{type:"number"},minItems:2,maxItems:2,description:"Tableau contenant [longitude, latitude]"},float:{type:"boolean",const:!0,default:!0,description:"Indicateur pour forcer la conversion en float côté serveur"}},required:["type","coordinates","float"],additionalProperties:!0},address:{type:"object",properties:{"@type":{type:"string",const:"PostalAddress"},addressCountry:{type:"string"},codeInsee:{type:"string"},addressLocality:{type:"string"},localityId:{type:"string"},level1:{type:"string"},level1Name:{type:"string"},level3:{type:"string",description:"ID du département. Peut être vide pour les pays étrangers.",minLength:0},level3Name:{type:"string",description:"Nom du département. Peut être vide pour les pays étrangers.",minLength:0},level4:{type:"string",description:"ID de la commune. Peut être vide pour les pays étrangers.",minLength:0},level4Name:{type:"string",description:"Nom de la commune. Peut être vide pour les pays étrangers.",minLength:0},postalCode:{type:"string"},streetAddress:{type:"string"}},required:["@type","addressCountry","codeInsee","addressLocality","localityId","level1","level1Name"],additionalProperties:!1,$comment:"Certains champs comme level3/level4 peuvent être vides selon le pays (ex : Maurice)"}},required:["block","typeElement","id","address"],allOf:[{if:{properties:{typeElement:{const:"citoyens"}}},then:{properties:{id:{type:"string",default:"@userId"}}}}]},responses:{200:{oneOf:[{type:"object",properties:{result:{type:"boolean",const:!0},resultGoods:{type:"object",properties:{result:{type:"boolean",const:!0},msg:{type:"string"},values:{type:"object",description:"Contient les champs mis à jour",additionalProperties:!0,$comment:"Ce schéma n'est pas encore complet"}},required:["result","msg"],additionalProperties:!0}},required:["result","resultGoods"],additionalProperties:!1},{type:"object",properties:{resultErrors:{type:"object",properties:{result:{type:"boolean",const:!1},msg:{type:"string",description:"Message d'erreur"}},required:["result","msg"],additionalProperties:!0}},required:["resultErrors"],additionalProperties:!1}]},401:{type:"object",description:"Erreur d'authentification (token invalide ou expiré)",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Mettre à jour le slug d'un élément",path:"/co2/element/updateblock/",constant:"UPDATE_BLOCK_SLUG",constantCocolight:"UPDATE_BLOCK",method:"POST",auth:"bearer",description:"Permet de mettre à jour le slug pour une URL simplifiée.",contentType:"application/x-www-form-urlencoded",request:{type:"object",properties:{block:{type:"string",const:"info",default:"info",description:"Nom du bloc à mettre à jour (doit être 'info')"},typeElement:{type:"string",default:"citoyens",enum:["citoyens","projects","organizations"],description:"Type d'élément (citoyens, projects, organizations)"},id:{type:"string",description:"ID de l'élément concerné"},scope:{type:"string",default:"",$comment:"Non utilisé dans l'application Cocolight"},slug:{type:"string",description:"Slug simplifié pour URL",pattern:"^[a-zA-Z0-9]+$",minLength:3,maxLength:100}},required:["block","typeElement","id","slug"],allOf:[{if:{properties:{typeElement:{const:"citoyens"}}},then:{properties:{id:{type:"string",default:"@userId"}}}}]},responses:{200:{description:"Réponse après la mise à jour de l'élément",oneOf:[{type:"object",properties:{result:{type:"boolean",const:!0},resultGoods:{type:"object",properties:{result:{type:"boolean",const:!0},msg:{type:"string"},values:{type:"object",description:"Contient les champs mis à jour",additionalProperties:!0,properties:{slug:{type:"string"}}}},required:["result","msg"],additionalProperties:!0}},required:["result","resultGoods"],additionalProperties:!1},{type:"object",properties:{resultErrors:{type:"object",properties:{result:{type:"boolean",const:!1},msg:{type:"string",description:"Message d'erreur"}},required:["result","msg"],additionalProperties:!0}},required:["resultErrors"],additionalProperties:!1}]},401:{type:"object",description:"Erreur d'authentification (token invalide ou expiré)",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Vérifier l'état d'une URL",path:"/co2/slug/check",constant:"CHECK",method:"POST",auth:"bearer",description:"Vérifie si une URL (slug) est valide ou disponible.",contentType:"application/x-www-form-urlencoded",request:{type:"object",properties:{block:{type:"string",const:"info",default:"info",description:"Nom du bloc"},id:{type:"string",description:"ID de l'élément"},type:{type:"string",enum:["citoyens","projects","organizations"],default:"citoyens",description:"Type d'élément"},slug:{type:"string",description:"Slug à vérifier",pattern:"^[a-zA-Z0-9]+$",minLength:3,maxLength:100}},required:["block","type","id","slug"],allOf:[{if:{properties:{type:{const:"citoyens"}}},then:{properties:{id:{type:"string",default:"@userId"}}}}],additionalProperties:!1},responses:{200:{oneOf:[{description:"Slug valide ou disponible",type:"object",properties:{result:{type:"boolean",const:!0},domaineName:{type:"string"}},required:["result","domaineName"],additionalProperties:!1},{description:"Slug non valide ou non disponible",type:"object",properties:{result:{type:"boolean",const:!1},domaineName:{type:"string"}},required:["result","domaineName"],additionalProperties:!1}]},401:{type:"object",description:"Erreur d'authentification (token invalide ou expiré)",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Mettre à jour l'image de profil",path:"/co2/document/upload-save/dir/communecter/folder/{folder}/ownerId/{ownerId}/input/profil_avatar/contentKey/profil/docType/image",method:"POST",constant:"PROFIL_IMAGE",constantCocolight:["PROFIL_IMAGE","UPDATE_PDP"],auth:"bearer",description:"Permet de mettre à jour l'image de profil d'un utilisateur ou d'une entité.",contentType:"multipart/form-data",pathParams:{type:"object",properties:{folder:{type:"string",enum:["citoyens","projects","organizations"],default:"citoyens",description:"Type d'entité"},ownerId:{type:"string",description:"ID de l'utilisateur ou de l'entité"}},required:["folder","ownerId"],allOf:[{if:{properties:{folder:{const:"citoyens"}}},then:{properties:{ownerId:{default:"@userId"}}}}],additionalProperties:!1},request:{type:"object",properties:{profil_avatar:{$comment:"Ce champ est un fichier binaire non validé par AJV",description:"Fichier image de profil au format binaire"}},required:["profil_avatar"],additionalProperties:!1},responses:{200:{description:"Réponse après l'enregistrement de l'image de profil",oneOf:[{type:"object",properties:{resultUpload:{type:"boolean",const:!0},success:{type:"boolean",const:!0},name:{type:"string",description:"Nom du fichier enregistré"},docPath:{type:"string",description:"Chemin du fichier sur le serveur"},size:{type:"integer",description:"Taille du fichier en octets"},result:{type:"boolean",const:!0},msg:{type:"string",description:"Message de confirmation"},id:{type:"object",properties:{$id:{type:"string",description:"ID du document enregistré"}},required:["$id"],additionalProperties:!1},src:{type:"object",description:"Informations sur les images générées",properties:{result:{type:"boolean",const:!0},msg:{type:"string"},changes:{type:"object",properties:{profilImageUrl:{type:"string",format:"uri-reference"},profilMediumImageUrl:{type:"string",format:"uri-reference"},profilThumbImageUrl:{type:"string",format:"uri-reference"},profilMarkerImageUrl:{type:"string",format:"uri-reference"}},required:["profilImageUrl","profilMediumImageUrl","profilThumbImageUrl","profilMarkerImageUrl"],additionalProperties:!1}},required:["result","msg","changes"],additionalProperties:!1},survey:{type:["boolean","null"],description:"Peut être à false ou null selon les cas"}},required:["resultUpload","success","name","docPath","size","result","msg","id","src"],additionalProperties:!1},{type:"object",description:"Réponse en cas d'échec de l'upload",properties:{result:{type:"boolean",const:!1},msg:{type:"string"}},required:["result","msg"],additionalProperties:!1}]},401:{description:"Erreur d'authentification (token invalide ou expiré)",type:"object",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Obtenir les éléments liés",path:"/co2/element/about/type/{type}/id/{id}/json/true",constant:"GET_ELEMENTS_ABOUT",method:"POST",auth:"none",description:"Récupère les informations détaillées d'un élément et de ses éléments liés.",contentType:"application/x-www-form-urlencoded",pathParams:{type:"object",properties:{type:{type:"string",enum:["citoyens","projects","organizations"],default:"citoyens",description:"Type d'entité"},id:{type:"string",description:"ID de l'utilisateur ou de l'entité"}},required:["type","id"],allOf:[{if:{properties:{type:{const:"citoyens"}}},then:{properties:{id:{default:"@userId"}}}}],additionalProperties:!1},request:{type:"object",properties:{tpl:{type:"string",default:"ficheInfoElement",const:"ficheInfoElement",description:"Template utilisé (ex: ficheInfoElement)"}},required:["tpl"],additionalProperties:!1},responses:{200:{oneOf:[{type:"object",description:"Schéma JSON pour les informations détaillées d'un utilisateur.",properties:{_id:{type:"object",properties:{$id:{type:"string"}},required:["$id"],additionalProperties:!1},username:{type:"string"},email:{type:"string",format:"email"},name:{type:"string"},slug:{type:"string"},collection:{type:"string",enum:["citoyens"]},modified:{type:"object",properties:{sec:{type:"integer"},usec:{type:"integer"}},required:["sec","usec"],additionalProperties:!1},roles:{type:"object",properties:{betaTester:{type:"boolean"},standalonePageAccess:{type:"boolean"},superAdmin:{type:"boolean"}}},preferences:{type:"object",properties:{privateFields:{type:"array",items:{type:"string"}},publicFields:{type:"array",items:{type:"string"}},isOpenData:{type:"boolean"},badge:{type:"boolean"},sendMail:{oneOf:[{type:"object",properties:{source:{type:"array",items:{}}},required:["source"],additionalProperties:!1},{type:"boolean",const:!1}]},activitypub:{type:"boolean"},activitypubStarterClosed:{type:"boolean"},notifications:{type:"array",items:{}}},required:["isOpenData","sendMail","publicFields","privateFields"]},language:{type:"string"},profilImageUrl:{anyOf:[{type:"string",enum:[""]},{type:"string",format:"uri-reference"}]},profilMarkerImageUrl:{anyOf:[{type:"string",enum:[""]},{type:"string",format:"uri-reference"}]},profilMediumImageUrl:{anyOf:[{type:"string",enum:[""]},{type:"string",format:"uri-reference"}]},profilThumbImageUrl:{anyOf:[{type:"string",enum:[""]},{type:"string",format:"uri-reference"}]},profilBannerUrl:{anyOf:[{type:"string",enum:[""]},{type:"string",format:"uri-reference"}]},profilRealBannerUrl:{anyOf:[{type:"string",enum:[""]},{type:"string",format:"uri-reference"}]},shortDescription:{type:"string"},description:{type:"string"},tags:{type:"array",items:{type:"string"}},birthDate:{type:"object",properties:{sec:{type:"integer"},usec:{type:"integer"}},required:["sec","usec"],additionalProperties:!1}},required:["_id","name","username","roles","collection","preferences","slug"]},{description:"Schéma JSON pour les informations détaillées d'un projet",type:"object",properties:{_id:{type:"object",properties:{$id:{type:"string"}},required:["$id"],additionalProperties:!1},collection:{type:"string",enum:["projects"]},created:{type:"integer"},creator:{type:"string"},modified:{type:"object",properties:{sec:{type:"integer"},usec:{type:"integer"}},required:["sec","usec"],additionalProperties:!1},name:{type:"string"},parent:{type:"object",patternProperties:{"^[0-9a-fA-F]{24}$":{type:"object",properties:{type:{type:"string"},name:{type:"string"},_id:{type:"object",properties:{$id:{type:"string"}},required:["$id"],additionalProperties:!1},slug:{type:"string"},profilThumbImageUrl:{type:"string"}},required:["type","name"],additionalProperties:!0}},additionalProperties:!1},preferences:{type:"object",properties:{isOpenData:{anyOf:[{type:"boolean"},{type:"string",enum:["true","false"]}]},isOpenEdition:{anyOf:[{type:"boolean"},{type:"string",enum:["true","false"]}]},crowdfunding:{anyOf:[{type:"boolean"},{type:"string",enum:["true","false"]}]},private:{anyOf:[{type:"boolean"},{type:"string",enum:["true","false"]}]}},required:["isOpenData","isOpenEdition"]},slug:{type:"string"},updated:{type:"integer"},links:{type:"object",$comment:"Ce schéma n'est pas encore complet"},profilImageUrl:{anyOf:[{type:"string",enum:[""]},{type:"string",format:"uri-reference"}]},profilThumbImageUrl:{anyOf:[{type:"string",enum:[""]},{type:"string",format:"uri-reference"}]},profilMarkerImageUrl:{anyOf:[{type:"string",enum:[""]},{type:"string",format:"uri-reference"}]},profilMediumImageUrl:{anyOf:[{type:"string",enum:[""]},{type:"string",format:"uri-reference"}]},typeSig:{type:"string"},type:{type:"string"}},required:["_id","collection","created","creator","modified","name","parent","preferences","slug","typeSig","type","updated"]},{description:"Schéma JSON pour les informations détaillées d'une organisation",type:"object",properties:{_id:{type:"object",properties:{$id:{type:"string"}},required:["$id"],additionalProperties:!1},collection:{type:"string",enum:["organizations"]},created:{type:"integer"},creator:{type:"string"},modified:{type:"object",properties:{sec:{type:"integer"},usec:{type:"integer"}},required:["sec","usec"],additionalProperties:!1},name:{type:"string"},preferences:{type:"object",properties:{isOpenData:{anyOf:[{type:"boolean"},{type:"string",enum:["true","false"]}]},isOpenEdition:{anyOf:[{type:"boolean"},{type:"string",enum:["true","false"]}]}},required:["isOpenData","isOpenEdition"]},slug:{type:"string"},type:{type:"string"},updated:{type:"integer"},links:{type:"object",$comment:"Ce schéma n'est pas encore complet"},profilImageUrl:{anyOf:[{type:"string",enum:[""]},{type:"string",format:"uri-reference"}],description:"URL de l'image de profil (vide ou URI)."},profilThumbImageUrl:{anyOf:[{type:"string",enum:[""]},{type:"string",format:"uri-reference"}],description:"URL de l'image miniature (vide ou URI)."},profilMarkerImageUrl:{anyOf:[{type:"string",enum:[""]},{type:"string",format:"uri-reference"}],description:"URL de l'image pour le marqueur (vide ou URI)."},profilMediumImageUrl:{anyOf:[{type:"string",enum:[""]},{type:"string",format:"uri-reference"}],description:"URL de l'image de taille moyenne (vide ou URI)."}},required:["_id","collection","modified","name","preferences","slug","type","updated"]}]},401:{description:"Erreur d'authentification (token invalide ou expiré)",type:"object",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Gérer des connexions multiples",path:"/co2/link/multiconnect",constant:"MULTICONNECT",method:"POST",auth:"bearer",description:"Permet d’inviter ou de connecter plusieurs utilisateurs en même temps à une entité.",contentType:"application/x-www-form-urlencoded",request:{type:"object",properties:{parentId:{type:"string",description:"ID de l'entité parente"},parentType:{type:"string",enum:["citoyens","projects","organizations"],default:"citoyens",description:"Type de l'entité parente"},listInvite:{type:"object",description:"Liste des citoyens invités",patternProperties:{"^(citoyens|projects|organizations)$":{type:"object",patternProperties:{"^[0-9a-fA-F]{24}$":{type:"object",properties:{name:{type:"string",description:"Nom de l'invité"}},required:["name"],additionalProperties:!1}},additionalProperties:!1}},additionalProperties:!1}},required:["parentId","parentType","listInvite"],allOf:[{if:{properties:{parentType:{const:"citoyens"}}},then:{properties:{parentId:{type:"string",default:"@userId"}}}}],additionalProperties:!1},responses:{200:{oneOf:[{type:"object",properties:{citoyens:{type:"array",items:{oneOf:[{type:"object",properties:{result:{type:"boolean",const:!0},msg:{type:"string"},newElement:{type:"object",properties:{_id:{type:"object",properties:{$id:{type:"string"}},required:["$id"],additionalProperties:!1},name:{type:"string"},profilThumbImageUrl:{type:"string"},id:{type:"string"},isInviting:{type:"boolean"}},required:["_id","name","profilThumbImageUrl","id","isInviting"],additionalProperties:!0},newElementType:{type:"string",const:"citoyens"}},required:["result","msg","newElement","newElementType"]},{type:"object",properties:{result:{type:"boolean",const:!1},msg:{type:"string"}},required:["result","msg"],additionalProperties:!1}]}}},required:["citoyens"],additionalProperties:!1}]},401:{description:"Erreur d'authentification (token invalide ou expiré)",type:"object",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Récupérer les actualités",path:"/news/co/get/type/{type}/id/{id}/isLive/{isLive}/json/{json}",constant:"GET_NEWS",constantCocolight:"GET_NEWS",method:"POST",auth:"none",description:"Récupère la liste d’actualités selon plusieurs critères.",contentType:"application/x-www-form-urlencoded",pathParams:{type:"object",properties:{isLive:{type:"boolean",default:!0,description:"Indique si l'actualité est en direct"},type:{type:"string",enum:["citoyens","projects","organizations"],default:"citoyens",description:"Type d'actualité (ex: 'citoyens', 'projects', 'organizations')"},id:{type:"string",description:"ID de l'élément (ex: ID d'un utilisateur, d'un projet ou d'une organisation)"},json:{type:"boolean",default:!0,description:"Indique si la réponse doit être au format JSON"}},required:["isLive","type","id","json"],allOf:[{if:{properties:{type:{const:"citoyens"}}},then:{properties:{id:{default:"@userId"}}}}],additionalProperties:!1},request:{type:"object",properties:{dateLimit:{type:"integer",default:0,description:"Limite de date timestamp ou 0"},search:{type:"object",properties:{name:{type:"string",default:"",description:"Nom ou terme recherché"}},required:["name"],additionalProperties:!1},indexStep:{type:"integer",default:12,description:"Nombre de résultats par page"}},required:["dateLimit","indexStep"],additionalProperties:!1},responses:{200:{$defs:{NewsSchema:{type:"object",properties:{_id:{type:"object",properties:{$id:{type:"string"}},required:["$id"],additionalProperties:!1},type:{type:"string",const:"news"},text:{type:"string"},author:{$ref:"#/$defs/user"},date:{$ref:"#/$defs/dateObject"},collection:{type:"string",const:"news"},sharedBy:{type:"array",items:{$ref:"#/$defs/sharedUser"}},target:{$ref:"#/$defs/user"},created:{$ref:"#/$defs/dateObject"},markdownActive:{type:"boolean"},scope:{type:"object",properties:{type:{type:"string"}},required:["type"],additionalProperties:!0},updated:{$ref:"#/$defs/dateObject"},comment:{type:["string","null"]},typeSig:{type:"string",const:"news"},lastAuthorShare:{$ref:"#/$defs/sharedUser"},media:{type:"object",description:"Optionnel. Contient les informations de média associées à la news.",additionalProperties:!0},mediaImg:{type:"object",description:"Optionnel. Contient les images associées à la news.",additionalProperties:!0},mentions:{type:"array",description:"Optionnel. Liste des personnes mentionnées.",items:{type:"object",properties:{id:{type:"string"},name:{type:"string"},slug:{type:"string"},avatar:{type:"string"},type:{type:"string"},value:{type:"string"},count:{type:"string"}},required:["id","name","slug","avatar","type","value","count"],additionalProperties:!0}},tags:{type:"array",description:"Optionnel. Liste de tags associés à la news.",items:{type:"string"}},vote:{type:"object",description:"Optionnel. Votes associés à la news.",additionalProperties:{type:"object",properties:{status:{type:"string"},date:{$ref:"#/$defs/dateObject"}},required:["status","date"],additionalProperties:!1}},voteCount:{type:"object",description:"Optionnel. Compteurs de votes.",additionalProperties:{type:"number"}}},required:["_id","type","text","author","date","collection","sharedBy","target","created","markdownActive","scope","updated","comment","typeSig","lastAuthorShare"],additionalProperties:!0},dateObject:{type:"object",properties:{sec:{type:"number"},usec:{type:"number"}},required:["sec","usec"],additionalProperties:!1},user:{type:"object",properties:{id:{type:"string"},name:{type:"string"},type:{type:"string"},profilThumbImageUrl:{type:"string",format:"uri-reference"},geo:{type:"object",properties:{"@type":{type:"string",const:"GeoCoordinates"},latitude:{type:"string"},longitude:{type:"string"}},required:["@type","latitude","longitude"],additionalProperties:!1}},required:["id","name","type"],additionalProperties:!0},sharedUser:{allOf:[{$ref:"#/$defs/user"},{type:"object",properties:{updated:{$ref:"#/$defs/dateObject"},comment:{type:["string","null"]}},required:["updated","comment"]}]}},oneOf:[{type:"object",description:"Réponse renvoyée lorsqu'aucune actualité n'est disponible",properties:{type:{type:"string",enum:["citoyens","projects","organizations"]},endStream:{type:"boolean",const:!0},news:{type:"array",minItems:0,maxItems:0},limitDate:{type:"boolean",const:!1}},required:["type","endStream","news","limitDate"]},{type:"object",description:"Réponse renvoyée lorsqu'une ou plusieurs actualités sont disponibles",properties:{type:{type:"string",enum:["citoyens","projects","organizations"]},endStream:{type:"boolean"},news:{type:"object",description:"Contient plusieurs objets news. Chaque clé est un identifiant dynamique (par exemple, un ObjectID Mongo) et chaque valeur doit respecter la structure définie par NewsCommonSchema.",patternProperties:{"^[a-f0-9]{24}$":{$ref:"#/$defs/NewsSchema"}},additionalProperties:!1},limitDate:{type:"object"}},required:["type","endStream","news","limitDate"]}]},401:{description:"Erreur d'authentification (token invalide ou expiré)",type:"object",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Récupérer des actualités par IDs",path:"/news/co/getbyids",constant:"GET_NEWS_BY_ID",method:"POST",auth:"none",description:"Récupère des actualités à partir d’une liste d’identifiants.",contentType:"application/x-www-form-urlencoded",request:{type:"object",properties:{ids:{type:"array",items:{type:"string"},description:"Liste des IDs d’actualités à récupérer"}},required:["ids"],additionalProperties:!1},responses:{200:{$defs:{NewsSchema:{type:"object",properties:{_id:{type:"object",properties:{$id:{type:"string"}},required:["$id"],additionalProperties:!1},type:{type:"string",const:"news"},text:{type:"string"},author:{$ref:"#/$defs/user"},date:{$ref:"#/$defs/dateObject"},collection:{type:"string",const:"news"},sharedBy:{type:"array",items:{$ref:"#/$defs/sharedUser"}},target:{$ref:"#/$defs/user"},created:{$ref:"#/$defs/dateObject"},markdownActive:{type:"boolean"},scope:{type:"object",properties:{type:{type:"string"}},required:["type"],additionalProperties:!0},updated:{$ref:"#/$defs/dateObject"},comment:{type:["string","null"]},typeSig:{type:"string",const:"news"},lastAuthorShare:{$ref:"#/$defs/sharedUser"},media:{type:"object",description:"Optionnel. Contient les informations de média associées à la news.",additionalProperties:!0},mediaImg:{type:"object",description:"Optionnel. Contient les images associées à la news.",additionalProperties:!0},mentions:{type:"array",description:"Optionnel. Liste des personnes mentionnées.",items:{type:"object",properties:{id:{type:"string"},name:{type:"string"},slug:{type:"string"},avatar:{type:"string"},type:{type:"string"},value:{type:"string"},count:{type:"string"}},required:["id","name","slug","avatar","type","value","count"],additionalProperties:!0}},tags:{type:"array",description:"Optionnel. Liste de tags associés à la news.",items:{type:"string"}},vote:{type:"object",description:"Optionnel. Votes associés à la news.",additionalProperties:{type:"object",properties:{status:{type:"string"},date:{$ref:"#/$defs/dateObject"}},required:["status","date"],additionalProperties:!1}},voteCount:{type:"object",description:"Optionnel. Compteurs de votes.",additionalProperties:{type:"number"}}},required:["_id","type","text","author","date","collection","sharedBy","target","created","markdownActive","scope","updated","comment","typeSig","lastAuthorShare"],additionalProperties:!0},dateObject:{type:"object",properties:{sec:{type:"number"},usec:{type:"number"}},required:["sec","usec"],additionalProperties:!1},user:{type:"object",properties:{id:{type:"string"},name:{type:"string"},type:{type:"string"},profilThumbImageUrl:{type:"string",format:"uri-reference"},geo:{type:"object",properties:{"@type":{type:"string",const:"GeoCoordinates"},latitude:{type:"string"},longitude:{type:"string"}},required:["@type","latitude","longitude"],additionalProperties:!1}},required:["id","name","type"],additionalProperties:!0},sharedUser:{allOf:[{$ref:"#/$defs/user"},{type:"object",properties:{updated:{$ref:"#/$defs/dateObject"},comment:{type:["string","null"]}},required:["updated","comment"]}]}},type:"array",items:{$ref:"#/$defs/NewsSchema"},description:"Liste d'actualités correspondant aux IDs fournis"}}},{name:"Ajouter une actualité",path:"/news/co/save",constant:"ADD_NEWS",method:"POST",auth:"bearer",description:"Ajoute une nouvelle actualité.",contentType:"application/x-www-form-urlencoded",request:{type:"object",properties:{text:{type:"string",description:"Contenu de l’actualité"},scope:{type:"string",description:"Portée de l'actualité (ex: public, privé...)",enum:["public","private","restricted"],default:"public"},markdownActive:{type:"boolean",default:!0,description:"Markdown activé (true/false)"},parentId:{type:"string",description:"ID de l'entité parente"},parentType:{type:"string",enum:["citoyens","projects","organizations"],default:"citoyens",description:"Type de l'entité parente"},type:{type:"string",const:"news",default:"news",description:"Type de l'objet, toujours 'news'."},json:{type:"boolean",const:!0,default:!0,description:"Indique que la réponse est au format JSON."},tags:{anyOf:[{type:"array",items:{type:"string"}},{type:"string",enum:[""]}],description:'Tags : "" pour effacer tous les tags, ou tableau de mots-clés.'},mediaImg:{type:"object",description:"Optionnel. Informations sur les images associées à la news.",properties:{countImages:{type:"number",description:"Nombre d'images."},images:{type:"array",description:"Liste des identifiants ou chemins d'images.",items:{type:"string"}}},required:["countImages","images"],additionalProperties:!1},mediaFile:{type:"object",description:"Optionnel. Informations sur les fichiers associés à la news.",properties:{countFiles:{type:"number",description:"Nombre de fichiers."},files:{type:"array",description:"Liste des identifiants ou chemins de fichiers.",items:{type:"string"}}},required:["countFiles","files"],additionalProperties:!1},mentions:{type:"object",description:"Liste des mentions sous forme d'objet avec des clés dynamiques représentant l'indice de la mention.",patternProperties:{"^[0-9]+$":{type:"object",properties:{id:{type:"string"},name:{type:"string"},slug:{type:"string"},type:{type:"string"},value:{type:"string"},count:{type:"number"}},required:["id","name","slug","type","value","count"],additionalProperties:!1}},additionalProperties:!1}},required:["scope","markdownActive","parentId","parentType","type","json"],anyOf:[{required:["text"]},{required:["mediaImg"]},{required:["mediaFile"]}],allOf:[{if:{properties:{parentType:{const:"citoyens"}}},then:{properties:{parentId:{type:"string",default:"@userId"}}}}],additionalProperties:!1},responses:{200:{$defs:{NewsSchema:{type:"object",properties:{_id:{type:"object",properties:{$id:{type:"string"}},required:["$id"],additionalProperties:!1},type:{type:"string",const:"news"},text:{type:"string"},author:{$ref:"#/$defs/user"},date:{$ref:"#/$defs/dateObject"},collection:{type:"string",const:"news"},sharedBy:{type:"array",items:{$ref:"#/$defs/sharedUser"}},target:{$ref:"#/$defs/user"},created:{$ref:"#/$defs/dateObject"},markdownActive:{type:"boolean"},scope:{type:"object",properties:{type:{type:"string"}},required:["type"],additionalProperties:!0},updated:{$ref:"#/$defs/dateObject"},comment:{type:["string","null"]},typeSig:{type:"string",const:"news"},lastAuthorShare:{$ref:"#/$defs/sharedUser"},media:{type:"object",description:"Optionnel. Contient les informations de média associées à la news.",additionalProperties:!0},mediaImg:{type:"object",description:"Optionnel. Contient les images associées à la news.",additionalProperties:!0},mentions:{type:"array",description:"Optionnel. Liste des personnes mentionnées.",items:{type:"object",properties:{id:{type:"string"},name:{type:"string"},slug:{type:"string"},avatar:{type:"string"},type:{type:"string"},value:{type:"string"},count:{type:"string"}},required:["id","name","slug","avatar","type","value","count"],additionalProperties:!0}},tags:{type:"array",description:"Optionnel. Liste de tags associés à la news.",items:{type:"string"}},vote:{type:"object",description:"Optionnel. Votes associés à la news.",additionalProperties:{type:"object",properties:{status:{type:"string"},date:{$ref:"#/$defs/dateObject"}},required:["status","date"],additionalProperties:!1}},voteCount:{type:"object",description:"Optionnel. Compteurs de votes.",additionalProperties:{type:"number"}}},required:["_id","type","text","author","date","collection","sharedBy","target","created","markdownActive","scope","updated","comment","typeSig","lastAuthorShare"],additionalProperties:!0},dateObject:{type:"object",properties:{sec:{type:"number"},usec:{type:"number"}},required:["sec","usec"],additionalProperties:!1},user:{type:"object",properties:{id:{type:"string"},name:{type:"string"},type:{type:"string"},profilThumbImageUrl:{type:"string",format:"uri-reference"},geo:{type:"object",properties:{"@type":{type:"string",const:"GeoCoordinates"},latitude:{type:"string"},longitude:{type:"string"}},required:["@type","latitude","longitude"],additionalProperties:!1}},required:["id","name"],additionalProperties:!0},sharedUser:{allOf:[{$ref:"#/$defs/user"},{type:"object",properties:{updated:{$ref:"#/$defs/dateObject"},comment:{type:["string","null"]}},required:["updated","comment"]}]}},oneOf:[{type:"object",properties:{result:{type:"boolean",const:!0},msg:{type:"string"},id:{type:"object",properties:{$id:{type:"string"}},required:["$id"],additionalProperties:!1},object:{$comment:"dans object.author il y a pas type il y a que typeSig",$ref:"#/$defs/NewsSchema"}},required:["result","msg","id","object"],additionalProperties:!1},{type:"object",properties:{result:{type:"boolean",const:!1},msg:{type:"string"}},required:["result","msg"],additionalProperties:!1}]},401:{description:"Erreur d'authentification (token invalide ou expiré)",type:"object",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Ajouter une image à une actualité",path:"/co2/document/uploadSave/dir/communecter/folder/{folder}/ownerId/{ownerId}/input/newsImage/docType/image/contentKey/slider",constant:"ADD_IMAGE_NEWS",constantCocolight:"ADD_IMAGE_NEWS",method:"POST",auth:"bearer",description:"Ajoute une images à une actualité.",contentType:"multipart/form-data",pathParams:{type:"object",properties:{folder:{type:"string",enum:["citoyens","projects","organizations"],default:"citoyens",description:"Type de l'entité parente (ex: 'citoyens', 'projects', 'organizations')"},ownerId:{type:"string",description:"ID de l'utilisateur ou de l'entité parente"}},required:["folder","ownerId"],allOf:[{if:{properties:{folder:{const:"citoyens"}}},then:{properties:{ownerId:{default:"@userId"}}}}],additionalProperties:!1},request:{type:"object",properties:{newsImage:{$comment:"Ce champ est un fichier binaire non validé par AJV",description:"Fichier image à télécharger"}},required:["newsImage"],additionalProperties:!1},responses:{200:{oneOf:[{type:"object",description:"Réponse en cas de succès de l'upload",properties:{resultUpload:{type:"boolean",const:!0,description:"Indique si le téléchargement a abouti."},success:{type:"boolean",const:!0,description:"Indique le succès de l'opération."},name:{type:"string",description:"Nom du document."},docPath:{type:"string",description:"Chemin d'accès au document."},size:{type:"number",description:"Taille du document en octets."},result:{type:"boolean",const:!0,description:"Résultat de l'opération."},msg:{type:"string",description:"Message de confirmation."},id:{type:"object",description:"Identifiant du document sous forme d'objet.",properties:{$id:{type:"string",description:"ID du document (généralement un ObjectID MongoDB)."}},required:["$id"],additionalProperties:!1}},required:["resultUpload","success","name","docPath","size","result","msg","id"]},{type:"object",description:"Réponse en cas d'échec de l'upload",properties:{result:{type:"boolean",const:!1},msg:{type:"string"}},required:["result","msg"],additionalProperties:!1}]},401:{description:"Erreur d'authentification (token invalide ou expiré)",type:"object",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Ajouter un fichier à une actualité",path:"/co2/document/uploadSave/dir/communecter/folder/{folder}/ownerId/{ownerId}}/input/newsFile/docType/file",constant:"ADD_FILE_NEWS",constantCocolight:"ADD_FILE_NEWS",method:"POST",auth:"bearer",description:"Ajoute un fichier à une actualité.",contentType:"multipart/form-data",pathParams:{type:"object",properties:{folder:{type:"string",enum:["citoyens","projects","organizations"],default:"citoyens",description:"Type de l'entité parente (ex: 'citoyens', 'projects', 'organizations')"},ownerId:{type:"string",description:"ID de l'utilisateur ou de l'entité parente"}},required:["folder","ownerId"],allOf:[{if:{properties:{folder:{const:"citoyens"}}},then:{properties:{ownerId:{default:"@userId"}}}}],additionalProperties:!1},request:{type:"object",properties:{newsFile:{$comment:"Ce champ est un fichier binaire non validé par AJV",description:"Fichier image à télécharger"}},required:["newsFile"],additionalProperties:!1},responses:{200:{oneOf:[{type:"object",description:"Réponse en cas de succès de l'upload",properties:{resultUpload:{type:"boolean",const:!0,description:"Indique si le téléchargement a abouti."},success:{type:"boolean",const:!0,description:"Indique le succès de l'opération."},name:{type:"string",description:"Nom du document."},docPath:{type:"string",description:"Chemin d'accès au document."},size:{type:"number",description:"Taille du document en octets."},result:{type:"boolean",const:!0,description:"Résultat de l'opération."},msg:{type:"string",description:"Message de confirmation"},id:{type:"object",description:"Identifiant du document sous forme d'objet.",properties:{$id:{type:"string",description:"ID du document (généralement un ObjectID MongoDB)."}},required:["$id"],additionalProperties:!1}},required:["resultUpload","success","name","docPath","size","result","msg","id"]},{type:"object",description:"Réponse en cas d'échec de l'upload",properties:{result:{type:"boolean",const:!1},msg:{type:"string"}},required:["result","msg"],additionalProperties:!1}]},401:{description:"Erreur d'authentification (token invalide ou expiré)",type:"object",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Supprimer une actualité",path:"/news/co/delete/id/{id}",constant:"DELETE_NEWS",constantCocolight:"DELETE_NEWS",method:"POST",auth:"bearer",description:"Supprime une actualité existante.",contentType:"application/x-www-form-urlencoded",pathParams:{type:"object",properties:{id:{type:"string",description:"ID de l'actualité à supprimer"}},required:["id"],additionalProperties:!1},request:{type:"object",properties:{isLive:{type:"boolean",default:!1}},required:["isLive"],additionalProperties:!1},responses:{200:{oneOf:[{type:"object",description:"Réponse en cas de succès de la suppression",properties:{result:{type:"boolean",const:!0},msg:{type:"string"},type:{type:"string",const:"news"},commentsDeleted:{type:"number",description:"Nombre de commentaires supprimés",$comment:"bizarre même si il y a des commentaires ce champs reste à 0"}},required:["result","msg","type","commentsDeleted"],additionalProperties:!1},{type:"object",description:"Réponse en cas d'échec de la suppression",properties:{result:{type:"boolean",const:!1},msg:{type:"string"}},required:["result","msg"]}]},401:{description:"Erreur d'authentification (token invalide ou expiré)",type:"object",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Mettre à jour une actualité",path:"/news/co/update",constant:"UPDATE_NEWS",method:"POST",auth:"bearer",description:"Met à jour le contenu d’une actualité existante.",contentType:"application/x-www-form-urlencoded",request:{type:"object",properties:{idNews:{type:"string",description:"ID de l'actualité à mettre à jour"},text:{type:"string",description:"Contenu de l’actualité"},scope:{type:"string",description:"Portée de l'actualité (ex: public, privé...)",enum:["public","private","restricted"],default:"public"},markdownActive:{type:"boolean",default:!0,description:"Markdown activé (true/false)"},parentId:{type:"string",description:"ID de l'entité parente"},parentType:{type:"string",enum:["citoyens","projects","organizations"],default:"citoyens",description:"Type de l'entité parente"},type:{type:"string",const:"news",default:"news",description:"Type de l'objet, toujours 'news'."},tags:{anyOf:[{type:"array",items:{type:"string"}},{type:"string",enum:[""]}],description:'Tags : "" pour effacer tous les tags, ou tableau de mots-clés.'},mediaImg:{type:"object",description:"Optionnel. Informations sur les images associées à la news.",properties:{countImages:{type:"number",description:"Nombre d'images."},images:{type:"array",description:"Liste des identifiants ou chemins d'images.",items:{type:"string"}}},required:["countImages","images"],additionalProperties:!1},mediaFile:{type:"object",description:"Optionnel. Informations sur les fichiers associés à la news.",properties:{countFiles:{type:"number",description:"Nombre de fichiers."},files:{type:"array",description:"Liste des identifiants ou chemins de fichiers.",items:{type:"string"}}},required:["countFiles","files"],additionalProperties:!1},mentions:{type:"object",description:"Liste des mentions sous forme d'objet avec des clés dynamiques représentant l'indice de la mention.",patternProperties:{"^[0-9]+$":{type:"object",properties:{id:{type:"string"},name:{type:"string"},slug:{type:"string"},type:{type:"string"},value:{type:"string"},count:{type:"number"}},required:["id","name","slug","type","value","count"],additionalProperties:!1}},additionalProperties:!1}},required:["idNews","scope","markdownActive","parentId","parentType","type"],anyOf:[{required:["text"]},{required:["mediaImg"]},{required:["mediaFile"]}],allOf:[{if:{properties:{parentType:{const:"citoyens"}}},then:{properties:{parentId:{type:"string",default:"@userId"}}}}],additionalProperties:!1},responses:{200:{$defs:{NewsSchema:{type:"object",properties:{_id:{type:"object",properties:{$id:{type:"string"}},required:["$id"],additionalProperties:!1},type:{type:"string",const:"news"},text:{type:"string"},author:{$ref:"#/$defs/user"},date:{$ref:"#/$defs/dateObject"},collection:{type:"string",const:"news"},sharedBy:{type:"array",items:{$ref:"#/$defs/sharedUser"}},target:{$ref:"#/$defs/user"},created:{$ref:"#/$defs/dateObject"},markdownActive:{type:"boolean"},scope:{type:"object",properties:{type:{type:"string"}},required:["type"],additionalProperties:!0},updated:{$ref:"#/$defs/dateObject"},comment:{type:["string","null"]},typeSig:{type:"string",const:"news"},lastAuthorShare:{$ref:"#/$defs/sharedUser"},media:{type:"object",description:"Optionnel. Contient les informations de média associées à la news.",additionalProperties:!0},mediaImg:{type:"object",description:"Optionnel. Contient les images associées à la news.",additionalProperties:!0},mentions:{type:"array",description:"Optionnel. Liste des personnes mentionnées.",items:{type:"object",properties:{id:{type:"string"},name:{type:"string"},slug:{type:"string"},avatar:{type:"string"},type:{type:"string"},value:{type:"string"},count:{type:"string"}},required:["id","name","slug","avatar","type","value","count"],additionalProperties:!0}},tags:{type:"array",description:"Optionnel. Liste de tags associés à la news.",items:{type:"string"}},vote:{type:"object",description:"Optionnel. Votes associés à la news.",additionalProperties:{type:"object",properties:{status:{type:"string"},date:{$ref:"#/$defs/dateObject"}},required:["status","date"],additionalProperties:!1}},voteCount:{type:"object",description:"Optionnel. Compteurs de votes.",additionalProperties:{type:"number"}}},required:["_id","type","text","author","date","collection","sharedBy","target","created","markdownActive","scope","updated","comment","typeSig","lastAuthorShare"],additionalProperties:!0},dateObject:{type:"object",properties:{sec:{type:"number"},usec:{type:"number"}},required:["sec","usec"],additionalProperties:!1},user:{type:"object",properties:{id:{type:"string"},name:{type:"string"},type:{type:"string"},profilThumbImageUrl:{type:"string",format:"uri-reference"},geo:{type:"object",properties:{"@type":{type:"string",const:"GeoCoordinates"},latitude:{type:"string"},longitude:{type:"string"}},required:["@type","latitude","longitude"],additionalProperties:!1}},required:["id","name"],additionalProperties:!0},sharedUser:{allOf:[{$ref:"#/$defs/user"},{type:"object",properties:{updated:{$ref:"#/$defs/dateObject"},comment:{type:["string","null"]}},required:["updated","comment"]}]}},oneOf:[{type:"object",properties:{result:{type:"boolean",const:!0},msg:{type:"string"},object:{$comment:"dans object.author il y a pas type il y a que typeSig",$ref:"#/$defs/NewsSchema"}},required:["result","msg","object"],additionalProperties:!1},{type:"object",properties:{result:{type:"boolean",const:!1},msg:{type:"string"}},required:["result","msg"],additionalProperties:!1}]},401:{description:"Erreur d'authentification (token invalide ou expiré)",type:"object",properties:{error:{type:"string",description:"Description de l'erreur"}},required:["error"],additionalProperties:!1}}},{name:"Partager une actualité",path:"/news/co/share",constant:"SHARE_NEWS",constantCocolight:"SHARE_NEWS",method:"POST",auth:"bearer",description:"Partage une actualité avec une entité ou un utilisateur.",contentType:"application/x-www-form-urlencoded",request:{type:"object",properties:{parentId:{type:"string",description:"ID de l'actualité à partager"},parentType:{type:"string",const:"news",default:"news",description:"Type de l'objet, toujours 'news'."},childId:{type:"string",description:"ID de l'entité partageante"},childType:{type:"string",enum:["citoyens","projects","organizations"],default:"citoyens",description:"Type de l'entité partageante"},connectType:{type:"string",const:"share",default:"share",description:"Type de connexion, toujours 'share'."},comment:{type:"string",description:"Commentaire de partage"}},required:["parentId","parentType","childId","childType","connectType"],additionalProperties:!1}}];class u extends Error{constructor(e,t,r){super(e),this.name="ApiClientError",this.status=t,this.details=r}}class y extends Error{constructor(e){super(e),this.name="CircuitBreakerError"}}p.addType("oid",(e=>new l.ObjectID(e)));class m extends r.EventEmitter{constructor({baseURL:e,accessToken:t,refreshToken:r,refreshUrl:p="/api/cocolight/refreshtoken",endpoints:d=c,timeout:l=3e4,debug:y=!1,maxRetries:m=0,circuitBreakerThreshold:g=5,circuitBreakerResetTime:f=6e4,fromJSONValue:h=!0}={}){if(super(),!e)throw new u('Le paramètre "baseURL" est obligatoire.',500);this._baseURL=e,this._refreshToken=r,this._refreshUrl=p,this._endpoints=d,this._debug=y;let b=null;this._fromJSONValue=h,Object.defineProperty(this,"userId",{get:()=>b,set:()=>{throw new Error("Modification directe de userId non autorisée.")},enumerable:!0}),this._setUserId=e=>{b=e,this._logger.debug(`[ApiClient] userId set: ${e}`)},this._ajv=new i({strict:!1,useDefaults:!0}),s(this._ajv),this._logger=a({transport:{target:"pino-pretty",options:{colorize:!0}},level:y?"debug":"info"}),this._client=o.create({baseURL:e,timeout:l}),m>0&&(n(this._client,{retries:m,retryDelay:n.exponentialDelay,retryCondition:e=>n.isNetworkError(e)||n.isRetryableError(e)}),this._logger.info(`[ApiClient] Retry activé : ${m} max`)),this._breakerThreshold=g,this._breakerResetTime=f,this._breakerErrorCount=0,this._breakerOpen=!1,this._lastBreakerOpenTime=null,t&&this.setToken(t),this._client.interceptors.response.use((e=>e),(async e=>{if(e.response&&401===e.response.status&&this._refreshToken)try{if(await this._refreshAccessToken())return this._client.request(e.config)}catch(e){throw new u(e.message,401,e)}throw e}))}setToken(e){this._accessToken=e,this._client.defaults.headers.common.Authorization="Bearer "+e,this._logger.debug(`[ApiClient] setToken: ${e}`)}getToken(){return this._accessToken}setRefreshToken(e){this._refreshToken=e,this._logger.debug(`[ApiClient] setRefreshToken: ${e}`)}getRefreshToken(){return this._refreshToken}async _refreshAccessToken(){if(!this._refreshToken)return!1;try{const e=await this._client.post(this._refreshUrl,{refreshToken:this._refreshToken},{headers:{"Content-Type":"application/json"}});return!(!e.data||!e.data.accessToken||(this.setToken(e.data.accessToken),e.data.refreshToken&&this.setRefreshToken(e.data.refreshToken),this.emit("refreshSuccess",e.data),0))}catch(e){return this._logger.error(`[ApiClient] Refresh Error : ${e.message}`),!1}}_checkCircuitBreaker(){return!this._breakerOpen||Date.now()-this._lastBreakerOpenTime>this._breakerResetTime&&(this._breakerOpen=!1,this._breakerErrorCount=0,this._logger.warn("[ApiClient] Circuit breaker réinitialisé"),!0)}_updateCircuitBreakerError(){this._breakerErrorCount+=1,this._logger.warn(`[ApiClient] Erreur #${this._breakerErrorCount} sur ${this._breakerThreshold}`),this._breakerErrorCount>=this._breakerThreshold&&(this._breakerOpen=!0,this._lastBreakerOpenTime=Date.now(),this._logger.error("[ApiClient] Circuit breaker ACTIVÉ - L'API est considérée indisponible"))}_resetCircuitBreakerSuccess(){this._breakerErrorCount=0,this._breakerOpen&&(this._breakerOpen=!1,this._logger.warn("[ApiClient] Circuit breaker refermé suite à un succès"))}static stripNullsInPlace(e){if(e&&"object"==typeof e&&e.value&&"function"==typeof e.value.pipe)return e;if(Array.isArray(e))for(let t=e.length-1;t>=0;t--)null===e[t]||void 0===e[t]?e.splice(t,1):"object"==typeof e[t]&&m.stripNullsInPlace(e[t]);else if(e&&"object"==typeof e)for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(null===e[t]||void 0===e[t]?delete e[t]:"object"==typeof e[t]&&m.stripNullsInPlace(e[t]));return e}_resolveSpecialValuesInPlace(e){if(e&&"object"==typeof e&&e.value&&"function"==typeof e.value.pipe)return e;const t={userId:()=>this.userId,accessToken:()=>this._accessToken,refreshToken:()=>this._refreshToken,baseURL:()=>this._baseURL};if("string"==typeof e&&e.startsWith("@")){const r=e.slice(1);return"function"==typeof t[r]?t[r]():e}if(Array.isArray(e))for(let t=0;t<e.length;t++)e[t]=this._resolveSpecialValuesInPlace(e[t]);else if(e&&"object"==typeof e)for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(e[t]=this._resolveSpecialValuesInPlace(e[t]));return e}async callEndpoint(e,t={},r=!0,i=!0){if(!this._checkCircuitBreaker())throw new y("Le circuit breaker est activé, impossible d'appeler l'API");const s=this._endpoints.find((t=>t.constant===e));if(!s)throw new u(`Endpoint introuvable : ${e}`,404);const{path:o,method:n,contentType:p,auth:a,pathParams:d,request:l,responses:c}=s,g=(n||"GET").toLowerCase(),f=p||"application/json",h={"Content-Type":f};if(this._accessToken)"bearer"===a?h.Authorization=`Bearer ${this._accessToken}`:a&&"none"!==a||h.Authorization||(h.Authorization=`Bearer ${this._accessToken}`);else if("bearer"===a)throw new u(`Token requis pour l'endpoint sécurisé : ${e}`,401);let b,j=o;if(d){const e=t.pathParams||{},r=this._ajv.compile(d);if(!r(e))throw this.emit("validationError",{stage:"pathParams",errors:r.errors}),new u("Path parameter validation failed.",400,r.errors);const i=this._resolveSpecialValuesInPlace(e);j=j.replace(/\{(\w+)\}/g,((e,t)=>{const r=i[t];if(void 0!==r)return encodeURIComponent(r);throw new u(`Path param manquant ou non résolu : {${t}}`,400)}))}if(l){const e={...t};delete e.pathParams;const r=m.stripNullsInPlace(e),i=this._ajv.compile(l);if(!i(r))throw this.emit("validationError",{stage:"request",errors:i.errors}),new u("Request validation failed.",400,i.errors);t=this._resolveSpecialValuesInPlace(r)}"application/json"===f||"multipart/form-data"===f?b=t:"application/x-www-form-urlencoded"===f&&(b=m.toURLSearchParams(t)),this._logger.debug(`[ApiClient] callEndpoint: ${e} -> ${j}, method=${g}`);try{const e=await this._client.request({url:j,method:g,headers:h,["get"===g?"params":"data"]:b});if(i){const t=e.status.toString(),r=c?.[t];if(r){const i=this._ajv.compile(r);if(!i(e.data))throw this.emit("validationError",{stage:"response",errors:i.errors}),new u("Response validation failed.",t,i.errors)}}return this._resetCircuitBreakerSuccess(),"function"==typeof r?e.data=r(e.data):!0===r&&(e.data=this._transformData(e.data)),Array.isArray(s.postActions)&&s.postActions.forEach((t=>{const r=t.path?this._getValueByPath(e.data,t.path):null;switch(t.type){case"setToken":this.setToken(r);break;case"setRefreshToken":this.setRefreshToken(r);break;case"setUserId":this._setUserId(r);break;case"resetSession":this.resetSession();break;case"emitEvent":t.event&&(this.emit(t.event,r),this._logger.debug(`[ApiClient] Event émis : ${t.event}`,r));break;case"callMethod":"function"==typeof this[t.method]?(this[t.method](),this._logger.debug(`[ApiClient] Méthode appelée : ${t.method}`)):this._logger.warn(`[ApiClient] Méthode inconnue : ${t.method}`);break;default:this._logger.warn(`[ApiClient] Action inconnue : ${t.type}`)}})),e}catch(e){throw this._updateCircuitBreakerError(),e}}resetSession(){this.setToken(null),this.setRefreshToken(null),this._setUserId(null),delete this._client.defaults.headers.common.Authorization,this._logger.info("[ApiClient] Session utilisateur réinitialisée."),this.emit("sessionReset")}_getValueByPath(e,t){if(t)return t.split(".").reduce(((e,t)=>e&&e[t]),e)}static toURLSearchParams(e,t={}){return this._buildParams(e,new URLSearchParams,t)}static _buildParams(e,t,r={}){if("object"!=typeof e||null===e)throw new TypeError("La donnée doit être un objet non nul.");const{dots:i=!1,indexes:s=!1,metaTokens:o=!0}=r,n=[];function p(e){return"[object Object]"===Object.prototype.toString.call(e)||Array.isArray(e)}function a(e){return e.endsWith("[]")?e.slice(0,-2):e}function d(e,t,r=!1){return e?e.concat(t).map(((e,t)=>(e=a(e),!r&&t?`[${e}]`:e))).join(r?".":""):t}function l(e){return null==e?"":e instanceof Date?e.toISOString():(e instanceof Blob||e instanceof File||e instanceof ArrayBuffer||ArrayBuffer.isView(e),e)}return function e(r,c=[]){null==r||n.includes(r)||(n.push(r),Object.entries(r).forEach((([r,n])=>{void 0!==n&&function(e,r,n){if(e&&"object"==typeof e){if(r.endsWith("{}"))return r=o?r:r.slice(0,-2),t.append(d(n,r,i),JSON.stringify(e)),!1;if(Array.isArray(e)&&!e.some(p)||r.endsWith("[]"))return r=a(r),e.forEach(((e,o)=>{if(null!=e){const p=s?d(n.concat(r),o,i):`${d(n,r,i)}[]`;t.append(p,l(e))}})),!1}return!!p(e)||(t.append(d(n,r,i),l(e)),!1)}(n,r.trim(),c)&&e(n,c.concat(a(r)))})),n.pop())}(e),t}_transformData(e){if(e&&"object"==typeof e)if(e.resultGoods?.msg)e=this._normalizeJsonData({msg:e.resultGoods.msg,...e});else if(e.resultErrors?.msg)e=this._normalizeJsonData({msg:e.resultErrors.msg,...e});else if(e.results&&"object"==typeof e.results&&!Array.isArray(e.results))e.results=Object.keys(e.results).map((t=>this._normalizeJsonData({id:t,...e.results[t]})));else if(Array.isArray(e.results))e.results=e.results.map((e=>this._normalizeJsonData(e)));else if(e.news&&Array.isArray(e.news)&&0===e.news.length)e=e.news;else if(e.news&&"object"==typeof e.news&&!Array.isArray(e.news))e=Object.keys(e.news).map((t=>this._normalizeJsonData({id:t,...e.news[t]})));else if(e.notif&&"object"==typeof e.notif&&!Array.isArray(e.notif))e.notif=Object.keys(e.notif).map((t=>this._normalizeJsonData({id:t,...e.notif[t]})));else if(e.citoyens&&"object"==typeof e.citoyens&&!Array.isArray(e.citoyens)&&e.organizations&&"object"==typeof e.organizations&&!Array.isArray(e.organizations))e=[...Object.keys(e.citoyens).map((t=>this._normalizeJsonData({id:t,...e.citoyens[t]}))),...Object.keys(e.organizations).map((t=>this._normalizeJsonData({id:t,...e.organizations[t]})))];else if(e.citoyens&&"object"==typeof e.citoyens&&!Array.isArray(e.citoyens))e=Object.keys(e.citoyens).map((t=>this._normalizeJsonData({id:t,...e.citoyens[t]})));else if(e.cities&&"object"==typeof e.cities&&!Array.isArray(e.cities))e=Object.keys(e.cities).map((t=>this._normalizeJsonData({id:t,...e.cities[t]})));else if(e.cities&&Array.isArray(e.cities)&&0===e.cities.length)e=e.cities;else if(e.newComment&&"object"==typeof e.newComment)e.newComment=this._normalizeJsonData({...e.newComment});else if(Array.isArray(e))e=e.map((e=>this._normalizeJsonData(e)));else if(e.map&&"object"==typeof e.map)e.map=this._normalizeJsonData(e.map);else if(e.object&&"object"==typeof e.object)e.object=this._normalizeJsonData(e.object);else if("object"==typeof e&&Object.keys(e).length>0){const t=Object.keys(e).every((e=>/^[0-9a-fA-F]{24}$/.test(e)));e=t?Object.keys(e).map((t=>({id:t,...this._normalizeJsonData(e[t])}))):this._normalizeJsonData(e)}return e}_normalizeJsonData(e){if(!e||"object"!=typeof e)return e;if(e=this._normalizeRecursively(e),e?.mediaImg?.images&&Array.isArray(e.mediaImg.images)&&e.mediaImg.images.length>0&&(e.mediaImg.countImages=e.mediaImg.images.length),e?.mediaFile?.files&&Array.isArray(e.mediaFile.files)&&e.mediaFile.files.length>0&&(e.mediaFile.countFiles=e.mediaFile.files.length),e?.src?.changes&&"object"==typeof e.src.changes&&Object.keys(e.src.changes).length>0&&Object.keys(e.src.changes).forEach((t=>{e.src.changes[t]&&(e.src.changes[t]=this._ensureFullURL(e.src.changes[t]))})),e?.openingHours&&Array.isArray(e.openingHours)&&e.openingHours.length>0&&(e.openingHours=e.openingHours.filter((e=>e.dayOfWeek&&e.hours&&e.hours[0]&&e.hours[0].opens))),e.replies&&"object"==typeof e.replies&&Object.keys(e.replies).length>0&&(e.replies=Object.keys(e.replies).map((t=>this._normalizeJsonData({id:t,...e.replies[t]})))),e?.author&&"object"==typeof e.author&&Object.keys(e.author).length>0&&!("profilThumbImageUrl"in e.author)){const t=Object.keys(e.author)[0];e.author={...e.author[t]}}return e?.timeAgo&&delete e.timeAgo,this._fromJSONValue?p.fromJSONValue(e):e}_ensureFullURL(e){if(!e)return e;if(!(e=e.trim())||/^https?:\/\//i.test(e))return e;let t="/";return t=this._baseURL.endsWith("/")&&e.startsWith("/")||this._baseURL.endsWith("/")||e.startsWith("/")?"":"/",`${this._baseURL}${t}${e}`}_normalizeDatesRecursively(e){return null===e||"object"!=typeof e?e:Array.isArray(e)?e.map((e=>this._normalizeDatesRecursively(e))):(Object.keys(e).forEach((t=>{this._dateFields.includes(t)&&(e[t]&&"object"==typeof e[t]&&e[t].sec&&"number"==typeof e[t].sec?e[t]={$date:1e3*e[t].sec}:"number"==typeof e[t]&&(e[t]={$date:1e3*e[t]})),e[t]&&"object"==typeof e[t]&&this._normalizeDatesRecursively(e[t])})),e)}_normalizeImagesRecursively(e){return null===e||"object"!=typeof e?e:Array.isArray(e)?e.map((e=>this._normalizeImagesRecursively(e))):(Object.keys(e).forEach((t=>{this._imageFields.includes(t)&&"string"==typeof e[t]&&""!==e[t].trim()&&(e[t]=this._ensureFullURL(e[t])),"content"===t&&e[t]?.image&&(e[t].image=this._ensureFullURL(e[t].image)),e[t]&&"object"==typeof e[t]&&this._normalizeImagesRecursively(e[t])})),e)}_normalizeIdRecursively(e){return null===e||"object"!=typeof e?e:Array.isArray(e)?e.map((e=>this._normalizeIdRecursively(e))):(e._id&&e._id.$id&&/^[0-9a-fA-F]{24}$/.test(e._id.$id)&&(e.id=e._id.$id,e._id={$type:"oid",$value:e._id.$id}),e.id&&e.id.$id&&/^[0-9a-fA-F]{24}$/.test(e.id.$id)&&(e._id={$type:"oid",$value:e.id.$id},e.id=e.id.$id),Object.keys(e).forEach((t=>{e[t]&&"object"==typeof e[t]&&(e[t]=this._normalizeIdRecursively(e[t]))})),e)}_normalizeBooleansRecursively(e){return"string"==typeof e?"true"===e||"false"!==e&&e:Array.isArray(e)?e.map((e=>this._normalizeBooleansRecursively(e))):(null!==e&&"object"==typeof e&&Object.keys(e).forEach((t=>{e[t]=this._normalizeBooleansRecursively(e[t])})),e)}_normalizeString(e){return"true"===e||"false"!==e&&e}_normalizeId(e){return e._id&&e._id.$id&&/^[0-9a-fA-F]{24}$/.test(e._id.$id)&&(e.id=e._id.$id,e._id={$type:"oid",$value:e._id.$id}),e.id&&e.id.$id&&/^[0-9a-fA-F]{24}$/.test(e.id.$id)&&(e._id={$type:"oid",$value:e.id.$id},e.id=e.id.$id),e}_normalizeDate(e){return e&&"object"==typeof e&&"number"==typeof e.sec?{$date:1e3*e.sec}:"number"==typeof e?{$date:1e3*e}:e}_normalizeImage(e){return"string"==typeof e&&""!==e.trim()?this._ensureFullURL(e):e}_imageFields=["profilImageUrl","profilThumbImageUrl","profilMediumImageUrl","profilMarkerImageUrl","profilBannerUrl","profilRealBannerUrl","imagePath","imageThumbPath","docPath"];_dateFields=["modified","created","updated","birthDate","lastLoginDate","startDate","endDate","date"];_normalizeRecursively(e){if("string"==typeof e)return this._normalizeString(e);if(Array.isArray(e))return e.map((e=>this._normalizeRecursively(e)));if(null!==e&&"object"==typeof e){const t={};return Object.keys(e).forEach((r=>{let i=this._normalizeRecursively(e[r]);this._dateFields.includes(r)&&(i=this._normalizeDate(i)),this._imageFields.includes(r)&&(i=this._normalizeImage(i)),"content"===r&&i&&"object"==typeof i&&i.image&&(i.image=this._normalizeImage(i.image)),t[r]=i})),this._normalizeId(t)}return e}}module.exports=t})();