@communecter/cocolight-api-client 1.0.196 → 1.0.198

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/1641.cocolight-api-client.browser.js +1 -1
  2. package/dist/1641.cocolight-api-client.cjs +1 -1
  3. package/dist/2379.cocolight-api-client.browser.js +1 -1
  4. package/dist/2379.cocolight-api-client.cjs +1 -1
  5. package/dist/3330.cocolight-api-client.browser.js +1 -1
  6. package/dist/3330.cocolight-api-client.cjs +1 -1
  7. package/dist/3464.cocolight-api-client.browser.js +1 -0
  8. package/dist/3464.cocolight-api-client.cjs +1 -0
  9. package/dist/4472.cocolight-api-client.browser.js +1 -1
  10. package/dist/4472.cocolight-api-client.cjs +1 -1
  11. package/dist/4686.cocolight-api-client.browser.js +1 -1
  12. package/dist/4686.cocolight-api-client.cjs +1 -1
  13. package/dist/601.cocolight-api-client.browser.js +1 -1
  14. package/dist/601.cocolight-api-client.cjs +1 -1
  15. package/dist/8264.cocolight-api-client.browser.js +1 -1
  16. package/dist/8264.cocolight-api-client.cjs +1 -1
  17. package/dist/8300.cocolight-api-client.browser.js +1 -1
  18. package/dist/8300.cocolight-api-client.cjs +1 -1
  19. package/dist/8894.cocolight-api-client.browser.js +1 -1
  20. package/dist/8894.cocolight-api-client.cjs +1 -1
  21. package/dist/cocolight-api-client.browser.js +1 -1
  22. package/dist/cocolight-api-client.cjs +1 -1
  23. package/dist/cocolight-api-client.vite.mjs.js +1 -1
  24. package/dist/cocolight-api-client.vite.mjs.js.map +1 -1
  25. package/package.json +1 -1
  26. package/types/api/Answer.d.ts +89 -0
  27. package/types/api/BaseEntity.d.ts +84 -1
  28. package/types/api/EndpointApi.d.ts +34 -4
  29. package/types/api/EndpointApi.types.d.ts +136 -8
  30. package/types/api/User.d.ts +25 -1
  31. package/types/api/UserApi.d.ts +16 -1
  32. package/types/api/serverDataType/Ampli.d.ts +121 -0
  33. package/types/costum/runtime.d.ts +2 -1
  34. package/types/costum/schemas/EcosystemeSanteReunion.d.ts +3 -0
  35. package/types/costum/types.d.ts +97 -51
  36. package/types/endpoints.module.d.ts +4002 -972
  37. package/types/index.d.ts +4 -1
  38. package/types/utils/ampliSlug.d.ts +31 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@communecter/cocolight-api-client",
3
- "version": "1.0.196",
3
+ "version": "1.0.198",
4
4
  "description": "Client Axios simplifié pour l'API cocolight",
5
5
  "repository": {
6
6
  "type": "git",
@@ -22,6 +22,45 @@ export interface AnswerChange {
22
22
  mutationType: "create" | "update" | "";
23
23
  changedFields: string[];
24
24
  }
25
+ /**
26
+ * Résultat d'un {@link Answer#addVote} — le backend BASCULE : re-poster le
27
+ * MÊME statut RETIRE la réaction au lieu d'en poser une seconde.
28
+ *
29
+ * Distinguer les deux cas se lit sur `inc` (`+1` ajout / `-1` retrait) ou, de
30
+ * façon non ambiguë, sur la présence de `removedVoteStatus` — `msg` ne sert à
31
+ * rien pour ça : il vaut `"Reaction succesfully saved"` à l'ajout mais la
32
+ * chaîne VIDE au retrait.
33
+ */
34
+ export interface AnswerVoteResult {
35
+ result: boolean;
36
+ userActionSaved?: boolean;
37
+ /** `+1` réaction posée, `-1` réaction retirée. */
38
+ inc?: number;
39
+ /** `""` au retrait, message traduit à l'ajout. */
40
+ msg?: string;
41
+ /** Présent UNIQUEMENT au retrait : le statut qui vient d'être enlevé. */
42
+ removedVoteStatus?: string;
43
+ user?: Record<string, unknown>;
44
+ element?: Record<string, unknown>;
45
+ [key: string]: unknown;
46
+ }
47
+ /**
48
+ * Résultat d'un {@link Answer#getVotes} — document projeté `{_id, vote, voteCount}`.
49
+ * Chaque entrée de `vote` est enrichie du profil du votant (`name`, `slug`,
50
+ * `profilThumbImageUrl`), ou vaut `null` si l'élément référencé est introuvable.
51
+ */
52
+ export interface AnswerVotesResult {
53
+ vote?: Record<string, {
54
+ status?: string;
55
+ date?: unknown;
56
+ name?: string;
57
+ slug?: string;
58
+ profilThumbImageUrl?: string;
59
+ [key: string]: unknown;
60
+ } | null>;
61
+ voteCount?: Record<string, number>;
62
+ [key: string]: unknown;
63
+ }
25
64
  /** Options de `Answer.generateProject()` — équivalent `costum.contextId`/`costum.contextType` legacy. */
26
65
  export interface GenerateProjectOptions {
27
66
  /** ID de l'entité parente (org/site porteur de l'appel). */
@@ -374,6 +413,56 @@ export declare class Answer extends BaseEntity<AnswerItemNormalized> {
374
413
  * await answer.delete();
375
414
  */
376
415
  delete(reason?: string): Promise<void>;
416
+ /**
417
+ * Ajoute OU retire une réaction sur cette réponse (`co2/action/addaction`,
418
+ * `collection: "answers"`).
419
+ *
420
+ * **Un seul appel pour les deux sens** : le backend bascule. Poster un statut
421
+ * que l'utilisateur n'a pas encore posé l'ajoute (`inc: +1`) ; re-poster le
422
+ * MÊME statut le retire (`inc: -1` + `removedVoteStatus`). Poster un statut
423
+ * DIFFÉRENT remplace le précédent. Il n'existe donc pas d'endpoint de
424
+ * suppression distinct — cf. {@link AnswerVoteResult}.
425
+ *
426
+ * Les compteurs vivent dans `serverData.voteCount` (map `statut → entier`) et
427
+ * le détail par utilisateur dans `serverData.vote` (map `userId → {status, date}`) ;
428
+ * ni l'un ni l'autre n'est renvoyé au serveur au save (`removeFields`).
429
+ * Cette instance n'est PAS resynchronisée : relire via {@link Answer#getVotes}.
430
+ *
431
+ * Droits : le serveur ne vérifie QUE la session (`AddActionAction`). N'importe quel utilisateur
432
+ * connecté peut réagir sur n'importe quelle réponse, y compris d'un formulaire auquel il n'a pas
433
+ * accès — c'est à l'appelant de n'offrir la réaction que là où elle a du sens.
434
+ *
435
+ * @param status - Statut de la réaction (`"like"`, `"love"`, `"sad"`…). Libre côté backend, mais
436
+ * non vide : il devient un nom de champ (`voteCount.<status>`), et un nom vide fait
437
+ * échouer l'écriture Mongo.
438
+ * @returns Réponse API, dont `inc` et `removedVoteStatus` disent le sens de la bascule.
439
+ * @throws {ApiError} 404 si la réponse n'a pas d'id (jamais sauvegardée) ; 400 statut vide.
440
+ *
441
+ * @example
442
+ * const res = await answer.addVote("like");
443
+ * const retiree = res.removedVoteStatus !== undefined; // true = réaction ENLEVÉE
444
+ */
445
+ addVote(status: string): Promise<AnswerVoteResult>;
446
+ /**
447
+ * Récupère les réactions posées sur cette réponse.
448
+ *
449
+ * Wrap de `SHOW_VOTE` avec auto-injection du `type` (`"answers"`) et de
450
+ * `this.id` dans `pathParams`. Le retour contient `vote` (réactions
451
+ * individuelles indexées par userId, enrichies du profil du votant) et
452
+ * `voteCount` (compteurs par statut).
453
+ *
454
+ * Endpoint PUBLIC : les réactions et le profil des votants se lisent sans session.
455
+ *
456
+ * @returns Réponse API : `{ _id, vote, voteCount }` ou variante d'erreur — ou `null` quand l'id ne
457
+ * désigne aucune réponse (le legacy renvoie le `findOne` tel quel).
458
+ * @throws {ApiError} 404 si la réponse n'a pas d'id (jamais sauvegardée).
459
+ *
460
+ * @example
461
+ * const votes = await answer.getVotes();
462
+ * votes?.voteCount?.like; // nombre de "like"
463
+ * votes?.vote?.[userId]?.status === "like"; // l'utilisateur a-t-il réagi ?
464
+ */
465
+ getVotes(): Promise<AnswerVotesResult | null>;
377
466
  /**
378
467
  * {@inheritDoc BaseEntity#deleteFile}
379
468
  *
@@ -1,6 +1,7 @@
1
1
  import type { UpdateSettingsData, UpdateBlockDescriptionData, UpdateBlockInfoData, UpdateBlockSocialData, UpdateBlockLocalityData, GetNewsData, GetGalleryData, GlobalAutocompleteCostumData, CostumEventRequestActorsData, CostumEventRequestSubeventsData, CostumEventRequestDatesData, CostumEventRequestElementEventData, CostumEventRequestCategoriesData, CostumEventRequestEventData, CostumEventRequestLinkTlToEventData, CostumEventRequestLoadContextTagData, GetOrganizationsAdminData, GetOrganizationsNoAdminData, GetProjectsAdminData, GetProjectsNoAdminData, GetPoisAdminData, GetPoisNoAdminData, GetSubscribersData, GetBadgesData, CoformAnswersSearchData, SearchMemberAutocompleteData, GetEventsData, SearchEventsCostumData, CostumFilterCoformData, CostumFilterCoformByPathData, GetCountriesData, SearchZonesData, ZoneGetShapeData, ZoneGetZonirisData, CoformAnswersByFormsData, FundingEnvelopeData, CoremuOperationData, UpdatePathValueData } from "./EndpointApi.types.js";
2
2
  import type { CostumRuntimeContext } from "../costum/runtime.js";
3
3
  import type { TransformsMap } from "../types/entities.js";
4
+ import type { AmpliParentType, CreateAmpliInput, CreateAmpliResult, RemoveAmpliResult } from "./serverDataType/Ampli.js";
4
5
  import type { CountryItem } from "./serverDataType/Country.js";
5
6
  import type { ToolEnrichmentInput, ToolEnrichmentResult, CommunListItem } from "./serverDataType/ToolsCatalog.js";
6
7
  import type { ZoneItemNormalized, ZoneShapeItem, ZonirisShapeItem } from "./serverDataType/Zone.js";
@@ -533,9 +534,22 @@ export declare class BaseEntity<TServerData = any> {
533
534
  *
534
535
  * L'univers des champs éditables = `_allowedFieldsCache` (union writable des SCHEMA_CONSTANTS + schéma costum,
535
536
  * calculée au build du draft) ∪ champs DATA costum déclarés (robuste si le cache est antérieur au costum).
537
+ *
538
+ * `opts.onlyKeys` (chemin HYBRIDE, cf. `User._update`) : restreint l'univers à CES clés — l'`element/save`
539
+ * ne porte alors que les champs costum, les blocs `updateblock` standards gardant les leurs. L'image
540
+ * (`profil_avatar`) suit la même règle : elle n'est traitée ici que si elle fait partie des clés demandées.
536
541
  * @returns true si au moins un champ a été envoyé (donc refresh ensuite).
537
542
  */
538
- protected _saveCostumViaElementSave(payload: Record<string, any>): Promise<boolean>;
543
+ protected _saveCostumViaElementSave(payload: Record<string, any>, opts?: {
544
+ onlyKeys?: Iterable<string>;
545
+ }): Promise<boolean>;
546
+ /**
547
+ * Clés WRITABLE d'une constante de schéma (contrat, ⊕ `VIRTUAL_SCHEMAS` de l'entité), évaluées pour
548
+ * `data` (les branches `if/then` sur `typeElement` sont résolues comme au build du draft). Sert au
549
+ * chemin hybride (`User._update`) à séparer ce que les blocs standards savent envoyer de ce qui ne
550
+ * peut partir que par `element/save`. Constante inconnue → `[]`.
551
+ */
552
+ protected _writableFieldsOf(constant: string, data?: Record<string, unknown>): string[];
539
553
  /** Recherche le schéma d'une propriété dans un schéma combiné `{ allOf: [...] }` (1er match). */
540
554
  private _lookupPropSchema;
541
555
  /**
@@ -2692,6 +2706,75 @@ export declare class BaseEntity<TServerData = any> {
2692
2706
  * costum peut être un projet). `formId` en argument positionnel. Retourne le tableau NU.
2693
2707
  */
2694
2708
  getCommunList(formId: string): Promise<CommunListItem[]>;
2709
+ /**
2710
+ * Contexte de l'élément PORTEUR du costum, tel que les deux actions ampli l'exigent.
2711
+ *
2712
+ * Volontairement PAS `_withCostumContext` : ces actions ne lisent ni `contextId` ni `sourceKey`,
2713
+ * elles nomment les mêmes valeurs `parentId`/`parentType`/`parentName`, et leur contrat est en
2714
+ * `additionalProperties:false` — les alias historiques injectés par le helper y seraient rejetés
2715
+ * par l'AJV du client avant même l'envoi.
2716
+ *
2717
+ * Lit `serverData` et non le brouillon : le serveur relit l'élément en base (`PHDB::findOne`),
2718
+ * un slug modifié mais non sauvegardé désignerait un costum qui n'existe pas.
2719
+ */
2720
+ protected _requireAmpliHost(): {
2721
+ id: string;
2722
+ type: AmpliParentType;
2723
+ slug: string;
2724
+ };
2725
+ /**
2726
+ * Crée un **ampli** sur cette entité : une entrée de `costum.ampli`, l'espace de propositions du
2727
+ * costum qu'elle porte.
2728
+ *
2729
+ * BEARER + gate admin serveur (`isInterfaceAdmin`). Porté par `BaseEntity` — comme
2730
+ * {@link saveToolEnrichment} — parce que l'hôte d'un costum peut être une organisation, un
2731
+ * projet, un citoyen ou un événement, et qu'un ampli n'est pas une entité mais une clé de costum.
2732
+ *
2733
+ * DEUX MODES, exclusifs, distingués par la présence de `coform` :
2734
+ * - sans `coform` (défaut) : le serveur crée le `Form` de dépôt et ses cinq questions, et renvoie
2735
+ * les chemins obtenus dans `ampli.path` ;
2736
+ * - avec `coform` : rattachement à un formulaire existant, `namePath` et `addressPath` exigés.
2737
+ *
2738
+ * ⚠ Le serveur dérive la CLÉ de l'entrée du `name` et **écrase** une entrée de même clé, sans
2739
+ * garde. Un appelant qui a déjà la liste des amplis doit tester la collision avec le helper `ampliSlug`.
2740
+ *
2741
+ * Le cache costum est réinitialisé côté serveur après écriture : `element/about` renvoie le nouvel
2742
+ * ampli immédiatement, sans `resetcache`.
2743
+ *
2744
+ * Exige `CreateAmpliAction` de modules/costum@3ef97ef28 ou postérieur (lecture de `source`, clé
2745
+ * `slugifyLikeJS`, réponse `{slug, ampli}`). Face à une version antérieure, l'action écrit tout le
2746
+ * parcours Co et répond sans `slug` : la méthode lève alors au lieu de rendre un résultat incomplet.
2747
+ *
2748
+ * @param input - Nom, description, mots-clés, et le formulaire en mode B.
2749
+ * @returns `{ result, slug, ampli, … }` — `slug` permet d'atteindre `/ampli/<slug>` sans recharger.
2750
+ * @throws {ApiError} 404 entité non enregistrée ; 400 slug manquant, hôte de type impossible,
2751
+ * nom inexploitable, ou mode B incomplet.
2752
+ * @throws {ApiResponseError} Refus métier du serveur (droits, paramètre manquant) — il arrive en
2753
+ * HTTP 200 `{result:false}`, que `checkAndThrowApiResponseError` convertit en exception —, ou
2754
+ * réponse sans `slug` (action legacy antérieure au patch).
2755
+ *
2756
+ * @example
2757
+ * const { slug } = await orga.createAmpli({ name: "Idées d'été", tags: ["proposition"] });
2758
+ * // → navigation vers `/ampli/idees-d-ete`
2759
+ */
2760
+ createAmpli(input: CreateAmpliInput): Promise<CreateAmpliResult>;
2761
+ /**
2762
+ * Supprime un ampli de `costum.ampli`, avec ses pages CMS et son bouton de menu s'il en a.
2763
+ *
2764
+ * ⚠ DEUX EFFETS DE BORD du legacy, non corrigés ici :
2765
+ * - le `Form` de dépôt et ses réponses **survivent** : un ampli créé en mode A puis supprimé
2766
+ * laisse son formulaire derrière lui ;
2767
+ * - l'action réécrit `costum.app` et le `buttonList` du menu à partir du costum **résolu en
2768
+ * cache** (`Costum::init`), pas du sous-document en base. Pour un costum dont la config vient
2769
+ * d'un fichier JSON, la suppression matérialise donc cette config dans le document de l'hôte.
2770
+ *
2771
+ * @param ampliId - La CLÉ de l'entrée, lue dans `costum.ampli` ou renvoyée par `createAmpli` — pas
2772
+ * un ObjectId, et jamais un slug recalculé depuis le nom : les entrées anciennes ont une clé
2773
+ * d'une autre forme (`idées-d'été`), que `ampliSlug` ne reproduit pas.
2774
+ * @throws {ApiError} 404 entité non enregistrée ; 400 slug manquant ou hôte de type impossible.
2775
+ * @throws {ApiResponseError} `Ampli not found`, `ampliId is required`, ou refus de droits.
2776
+ */
2777
+ removeAmpli(ampliId: string): Promise<RemoveAmpliResult>;
2695
2778
  /**
2696
2779
  * @param data
2697
2780
  * Paramètres de recherche (partiels — les valeurs manquantes sont complétées
@@ -1,5 +1,5 @@
1
1
  import type ApiClient from "../ApiClient.js";
2
- import type { DocumentListData, PersonRegisterData, AuthenticateUrlData, RefreshTokenUrlData, PasswordRecoveryData, PasswordResetData, ServerExchangeTokenData, ChangePasswordData, DeleteAccountData, UpdateSettingsData, UpdateBlockDescriptionData, UpdateBlockInfoData, UpdateBlockSocialData, UpdateBlockLocalityData, UpdateBlockSlugData, CheckData, ProfilImageData, ProfilBannerData, GetElementsAboutData, MulticonnectData, RelaunchInvitationData, ContactSendData, GetNewsData, GetNewsByIdData, AddNewsData, AddImageNewsData, AddFileNewsData, DeleteNewsData, UpdateNewsData, ShareNewsData, GetCommentsData, AddCommentsData, DeleteCommentsData, UpdateCommentsData, SearchTagsData, ShowVoteData, GlobalAutocompleteData, CityAutocompleteData, CityAutocompleteByCountryData, SuggestionInputData, GetProjectsNoAdminData, GetProjectsAdminData, GetPoisNoAdminData, GetPoisAdminData, GlobalAutocompleteAdminCostumData, GetOrganizationsNoAdminData, GetOrganizationsAdminData, GetUserEligiblePlacesData, GetMembersNoAdminData, GetMembersAdminData, GetFriendsAdminData, GetSubscriptionsData, GetSubscriptionsAdminData, GetSubscribersData, GetSubscribersAdminData, GetContributorsNoAdminData, GetContributorsAdminData, GetBadgesData, GetBadgesFiltersData, ConnectData, LinkSetRolesData, CreateInvitationLinkData, ConnectByRefData, DisconnectData, GetElementsKeyData, GetFavorisData, DeleteFavorisData, AddFavorisData, AddOrganizationData, AddProjectData, AddPoiData, AddEventData, DeleteElementData, AddImageElementData, LinkValidateData, SearchMemberAutocompleteData, GetNotificationsData, GetNotificationsCountData, NotificationUpdateData, MarkNotificationAsReadData, ActivitypubSearchData, ActivitypubLinkData, ActivitypubGetCommunityData, GetBadgeData, AddBadgesData, AssignBadgesData, GetEventsData, SearchEventsCostumData, ShareEventsData, InviteMembersData, FollowData, GetCostumJsonData, GlobalAutocompleteCostumData, NavigatorGettlData, NavigatorGetRessourceTlData, CostumEventRequestActorsData, CostumEventRequestSubeventsData, CostumEventRequestElementEventData, CostumEventRequestCategoriesData, CostumEventRequestDatesData, CostumEventRequestEventData, CostumEventRequestLinkTlToEventData, CostumEventRequestLoadContextTagData, AgendaGetPdfData, GetGalleryData, GetAttendeesNoAdminData, GetAttendeesAdminData, CoformAnswersSearchData, CoformAnswersByIdData, GetCoformByIdData, CoformUploadAnswerFileData, DeleteCoformAnswerFileData, CoformGetAnswerFilesData, GetCoformCatalogsData, SaveCoformAnswerData, GetCoformAnswerHistoryData, GetCoformMultievalDataData, GetCoformCommontableContributorsData, AddVoteData, AddReportAbuseData, UpdatePathValueData, DeleteDocumentByContextData, DeleteDocumentByIdData, DemoteAdminData, CostumFilterCoformData, CostumFilterCoformByPathData, GetCountriesData, SearchZonesData, CoformAnswersByFormsData, CostumToolsCatalogData, CostumToolUsersData, CostumCommunInfoData, CostumSaveToolEnrichmentData, CostumCommunListData, GenerateAnswerFromFormData, GenerateProjectFromAnswerData, GenerateMilestoneFromDepenseData, FundingEnvelopeData, CoremuOperationData, CoremuAddFinancerData, CoremuPayFinancerData, CoremuValidateFinancerPaymentData, CoremuDeleteFinancerData, CostumProjectActionRequestNewData, CostumProjectActionRequestSetStatusData, CostumProjectActionRequestSetDateData, CostumProjectActionRequestSetContributorsData, CostumProjectActionRequestCancelData, CostumProjectActionRequestArchiveData, LinkDiscourseAccountData, UnlinkDiscourseAccountData, DiscourseProfileData, DiscourseCheckEmailData, DiscourseDismissLinkData, LinkMediawikiAccountData, UnlinkMediawikiAccountData, GetMediawikiContributionsData, AddClassifiedData, PersonActivateData, PersonValidateInvitationData, ValidateInvitationByMailData, ImportPreviewData, ExportElementsData, ImportElementsData, GeocodageData, ValidateGroupData, SetSourceData, TransferSourceCheckData, TransferSourceApplyData, TransferSourceRollbackData, TransferSourceHistoryData, ModerateData, NewsModerateData, CommentModerateData, UploadDocumentData, ZoneGetShapeData, ZoneGetZonirisData, CostumListValuesData, CostumResolvedData, DirectoryProposalData, DirectoryProposalCountData, DirectoryProposalNewCounterData } from "./EndpointApi.types.js";
2
+ import type { DocumentListData, PersonRegisterData, AuthenticateUrlData, RefreshTokenUrlData, PasswordRecoveryData, PasswordResetData, ServerExchangeTokenData, ChangePasswordData, DeleteAccountData, UpdateSettingsData, UpdateBlockDescriptionData, UpdateBlockInfoData, UpdateBlockSocialData, UpdateBlockLocalityData, UpdateBlockSlugData, CheckData, ProfilImageData, ProfilBannerData, GetElementsAboutData, MulticonnectData, RelaunchInvitationData, ContactSendData, GetNewsData, GetNewsByIdData, AddNewsData, AddImageNewsData, AddFileNewsData, DeleteNewsData, UpdateNewsData, ShareNewsData, GetCommentsData, AddCommentsData, DeleteCommentsData, UpdateCommentsData, SearchTagsData, ShowVoteData, GlobalAutocompleteData, CityAutocompleteData, CityAutocompleteByCountryData, SuggestionInputData, GetProjectsNoAdminData, GetProjectsAdminData, GetPoisNoAdminData, GetPoisAdminData, GlobalAutocompleteAdminCostumData, GetOrganizationsNoAdminData, GetOrganizationsAdminData, GetUserEligiblePlacesData, GetMembersNoAdminData, GetMembersAdminData, GetFriendsAdminData, GetSubscriptionsData, GetSubscriptionsAdminData, GetSubscribersData, GetSubscribersAdminData, GetContributorsNoAdminData, GetContributorsAdminData, GetBadgesData, GetBadgesFiltersData, ConnectData, LinkSetRolesData, CreateInvitationLinkData, ConnectByRefData, DisconnectData, GetElementsKeyData, GetFavorisData, DeleteFavorisData, AddFavorisData, AddOrganizationData, SaveCitoyenData, AddProjectData, AddPoiData, AddEventData, DeleteElementData, AddImageElementData, LinkValidateData, SearchMemberAutocompleteData, GetNotificationsData, GetNotificationsCountData, NotificationUpdateData, MarkNotificationAsReadData, ActivitypubSearchData, ActivitypubLinkData, ActivitypubGetCommunityData, GetBadgeData, AddBadgesData, AssignBadgesData, GetEventsData, SearchEventsCostumData, ShareEventsData, InviteMembersData, FollowData, GetCostumJsonData, GlobalAutocompleteCostumData, NavigatorGettlData, NavigatorGetRessourceTlData, CostumEventRequestActorsData, CostumEventRequestSubeventsData, CostumEventRequestElementEventData, CostumEventRequestCategoriesData, CostumEventRequestDatesData, CostumEventRequestEventData, CostumEventRequestLinkTlToEventData, CostumEventRequestLoadContextTagData, AgendaGetPdfData, GetGalleryData, GetAttendeesNoAdminData, GetAttendeesAdminData, CoformAnswersSearchData, CoformAnswersByIdData, GetCoformByIdData, CoformUploadAnswerFileData, DeleteCoformAnswerFileData, CoformGetAnswerFilesData, GetCoformCatalogsData, SaveCoformAnswerData, GetCoformAnswerHistoryData, GetCoformMultievalDataData, GetCoformCommontableContributorsData, AddVoteData, AddReportAbuseData, UpdatePathValueData, DeleteDocumentByContextData, DeleteDocumentByIdData, DemoteAdminData, CostumFilterCoformData, CostumFilterCoformByPathData, GetCountriesData, SearchZonesData, CoformAnswersByFormsData, CostumToolsCatalogData, CostumToolUsersData, CostumCommunInfoData, CostumSaveToolEnrichmentData, CostumCommunListData, GenerateAnswerFromFormData, GenerateProjectFromAnswerData, GenerateMilestoneFromDepenseData, FundingEnvelopeData, CoremuOperationData, CoremuAddFinancerData, CoremuPayFinancerData, CoremuValidateFinancerPaymentData, CoremuDeleteFinancerData, CostumProjectActionRequestNewData, CostumProjectActionRequestSetStatusData, CostumProjectActionRequestSetDateData, CostumProjectActionRequestSetContributorsData, CostumProjectActionRequestCancelData, CostumProjectActionRequestArchiveData, LinkDiscourseAccountData, UnlinkDiscourseAccountData, DiscourseProfileData, DiscourseCheckEmailData, DiscourseDismissLinkData, LinkMediawikiAccountData, UnlinkMediawikiAccountData, GetMediawikiContributionsData, AddClassifiedData, PersonActivateData, PersonValidateInvitationData, ValidateInvitationByMailData, ImportPreviewData, ExportElementsData, ImportElementsData, GeocodageData, ValidateGroupData, SetSourceData, TransferSourceCheckData, TransferSourceApplyData, TransferSourceRollbackData, TransferSourceHistoryData, ModerateData, NewsModerateData, CommentModerateData, UploadDocumentData, ZoneGetShapeData, ZoneGetZonirisData, CostumListValuesData, CostumResolvedData, DirectoryProposalData, DirectoryProposalCountData, DirectoryProposalNewCounterData, CostumCreateAmpliData, CostumRemoveAmpliData } from "./EndpointApi.types.js";
3
3
  /**
4
4
  * Classe EndpointApi générée automatiquement depuis endpoints-copie.json
5
5
  */
@@ -57,7 +57,7 @@ export declare class EndpointApi {
57
57
  */
58
58
  documentList(data: DocumentListData): Promise<any>;
59
59
  /**
60
- * Enregistrement d'un utilisateur : Permet d’enregistrer un nouvel utilisateur avec ses informations personnelles.
60
+ * Enregistrement d'un utilisateur : Permet d’enregistrer un nouvel utilisateur avec ses informations personnelles. Accepte des champs supplémentaires validés côté serveur (règle costum citoyens, cf. $comment de la requête) et le mode `single_step_register` (compte actif d'emblée).
61
61
  * Constant : PERSON_REGISTER
62
62
  * @param data - Données envoyées à l'API
63
63
  * @returns Les données de réponse.
@@ -395,7 +395,7 @@ export declare class EndpointApi {
395
395
  */
396
396
  searchTags(data: SearchTagsData): Promise<any>;
397
397
  /**
398
- * Afficher les votes d'une actualité/commentaire : Récupère la liste des votes (like, love, etc.) sur une actualité/commentaire.
398
+ * Afficher les votes d'une actualité, d'un commentaire ou d'une réponse de formulaire : Récupère la liste des votes (like, love, etc.) sur une actualité, un commentaire ou une réponse de formulaire (coform).
399
399
  * Constant : SHOW_VOTE
400
400
  * @param data - Données envoyées à l'API
401
401
  * @returns Les données de réponse.
@@ -719,6 +719,16 @@ export declare class EndpointApi {
719
719
  * @throws {Error} - En cas d'erreur inattendue.
720
720
  */
721
721
  addOrganization(data: AddOrganizationData): Promise<any>;
722
+ /**
723
+ * Sauvegarder un citoyen (profil + champs costum) : Met à jour un citoyen EXISTANT via element/save (collection=citoyens) : le SEUL chemin legacy qui accepte les champs costum d'une personne (DataValidator::validate étend Person::$dataBinding avec typeObj person/persons/citoyens du costum posté). Droit : soi-même ou super-admin (jamais un admin de costum : Authorisation.php:271). JAMAIS de création : `id` est requis (la lib refuse User._add). Les champs sont écrits à la RACINE du citoyen. cf. cocolight-backend docs/33.
724
+ * Constant : SAVE_CITOYEN
725
+ * @param data - Données envoyées à l'API
726
+ * @returns Les données de réponse.
727
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
728
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
729
+ * @throws {Error} - En cas d'erreur inattendue.
730
+ */
731
+ saveCitoyen(data: SaveCitoyenData): Promise<any>;
722
732
  /**
723
733
  * Créer un projet : Crée un nouveau projet avec des informations de base et des options supplémentaires.
724
734
  * Constant : ADD_PROJECT
@@ -1201,7 +1211,7 @@ export declare class EndpointApi {
1201
1211
  */
1202
1212
  getCoformCommontableContributors(data: GetCoformCommontableContributorsData): Promise<any>;
1203
1213
  /**
1204
- * Voter sur un élément (commentaire ou news) : Permet de voter sur un commentaire ou une news en spécifiant un statut de vote
1214
+ * Voter sur un élément (commentaire, news ou réponse de formulaire) : Permet de voter sur un commentaire, une news ou une réponse de formulaire (coform) en spécifiant un statut de vote. Re-poster le MÊME statut retire le vote (bascule) : la réponse porte alors removedVoteStatus et inc:-1.
1205
1215
  * Constant : ADD_VOTE
1206
1216
  * @param data - Données envoyées à l'API
1207
1217
  * @returns Les données de réponse.
@@ -1816,5 +1826,25 @@ export declare class EndpointApi {
1816
1826
  * @throws {Error} - En cas d'erreur inattendue.
1817
1827
  */
1818
1828
  directoryProposalNewCounter(data: DirectoryProposalNewCounterData): Promise<any>;
1829
+ /**
1830
+ * Créer un ampli : Crée une entrée dans costum.ampli de l'élément porteur du costum. Avec source=site-json aucune page CMS, aucun bloc cms ni bouton de menu n'est écrit. Gate isInterfaceAdmin, résolu par costumSlug (refus en HTTP 200 result:false). Le cache costum est réinitialisé après écriture : element/about renvoie le nouvel ampli immédiatement.
1831
+ * Constant : COSTUM_CREATE_AMPLI
1832
+ * @param data - Données envoyées à l'API
1833
+ * @returns Les données de réponse.
1834
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
1835
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
1836
+ * @throws {Error} - En cas d'erreur inattendue.
1837
+ */
1838
+ costumCreateAmpli(data: CostumCreateAmpliData): Promise<any>;
1839
+ /**
1840
+ * Supprimer un ampli : Retire une entrée de costum.ampli, ses pages CMS et son bouton de menu s'il en a. Ne supprime NI le Form NI ses réponses. Gate isInterfaceAdmin (refus en HTTP 200 result:false).
1841
+ * Constant : COSTUM_REMOVE_AMPLI
1842
+ * @param data - Données envoyées à l'API
1843
+ * @returns Les données de réponse.
1844
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
1845
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
1846
+ * @throws {Error} - En cas d'erreur inattendue.
1847
+ */
1848
+ costumRemoveAmpli(data: CostumRemoveAmpliData): Promise<any>;
1819
1849
  }
1820
1850
  export default EndpointApi;
@@ -38,9 +38,9 @@ export interface PersonRegisterData {
38
38
  */
39
39
  pendingUserId?: string;
40
40
  /**
41
- * Mode d’enregistrement
41
+ * Mode d'inscription (Person::REGISTER_MODE_*). `normal` (défaut) : le compte est créé avec `roles.tobeactivated` et ne peut se connecter qu'après validation de l'e-mail. `single_step_register` : compte ACTIF immédiatement (pas de tobeactivated ; un username déjà pris est suffixé d'un nombre au lieu d'être refusé) ; le mail de confirmation d'adresse part quand même (variante « compte déjà actif »). Les autres modes legacy (two_steps_register, email, service, minimal) ne sont pas exposés.
42
42
  */
43
- mode?: string;
43
+ mode?: "normal" | "single_step_register";
44
44
  /**
45
45
  * Indique s’il s’agit d’une invitation (facultatif)
46
46
  */
@@ -1118,9 +1118,9 @@ export interface SearchTagsData {
1118
1118
  export interface ShowVoteData {
1119
1119
  pathParams?: {
1120
1120
  /**
1121
- * Type de l'élément
1121
+ * Type de l'élément (collection Mongo)
1122
1122
  */
1123
- type: "news" | "comments";
1123
+ type: "news" | "comments" | "answers";
1124
1124
  /**
1125
1125
  * ID de l'élément dont on veut récupérer les votes
1126
1126
  */
@@ -3436,6 +3436,48 @@ export interface AddOrganizationData {
3436
3436
  };
3437
3437
  [k: string]: unknown;
3438
3438
  }
3439
+ export interface SaveCitoyenData {
3440
+ /**
3441
+ * ID du citoyen (requis : mise à jour seule)
3442
+ */
3443
+ id: string;
3444
+ collection: "citoyens";
3445
+ key?: "person";
3446
+ name?: string;
3447
+ username?: string;
3448
+ email?: string;
3449
+ shortDescription?: string;
3450
+ description?: string;
3451
+ url?: string;
3452
+ tags?: "" | string[];
3453
+ birthDate?: string;
3454
+ mobile?: string;
3455
+ fixe?: string;
3456
+ telephone?: {
3457
+ [k: string]: unknown;
3458
+ };
3459
+ address?: {
3460
+ [k: string]: unknown;
3461
+ } | string;
3462
+ geo?: {
3463
+ [k: string]: unknown;
3464
+ };
3465
+ geoPosition?: {
3466
+ [k: string]: unknown;
3467
+ };
3468
+ /**
3469
+ * Type de professionnel (champ du modèle Person, cf. docs/33)
3470
+ */
3471
+ typepro?: string;
3472
+ /**
3473
+ * Précision quand typepro vaut « autres »
3474
+ */
3475
+ othersTypepro?: string;
3476
+ costumSlug?: string;
3477
+ costumId?: string;
3478
+ costumType?: string;
3479
+ [k: string]: unknown;
3480
+ }
3439
3481
  export interface AddProjectData {
3440
3482
  /**
3441
3483
  * ID
@@ -6203,20 +6245,20 @@ export interface GetCoformCommontableContributorsData {
6203
6245
  }
6204
6246
  export interface AddVoteData {
6205
6247
  /**
6206
- * ID de l'élément (commentaire ou news) sur lequel voter
6248
+ * ID de l'élément (commentaire, news ou réponse de formulaire) sur lequel voter
6207
6249
  */
6208
6250
  id: string;
6209
6251
  /**
6210
- * Type de collection concernée
6252
+ * Type de collection concernée. `answers` = réponse de formulaire coform (Action.php lit la collection sans liste blanche : seule l'action est restreinte).
6211
6253
  */
6212
- collection: "comments" | "news";
6254
+ collection: "comments" | "news" | "answers";
6213
6255
  /**
6214
6256
  * Type d'action à effectuer (vote)
6215
6257
  */
6216
6258
  action: "vote";
6217
6259
  details: {
6218
6260
  /**
6219
- * Statut du vote (ex: 'like', 'dislike', etc.)
6261
+ * Statut du vote (ex: 'like', 'dislike', etc.). Non vide : il devient un nom de champ (voteCount.<status>), un nom vide fait échouer l'écriture Mongo (legacy comme Node).
6220
6262
  */
6221
6263
  status: string;
6222
6264
  };
@@ -8123,3 +8165,89 @@ export interface DirectoryProposalNewCounterData {
8123
8165
  };
8124
8166
  [k: string]: unknown;
8125
8167
  }
8168
+ export interface CostumCreateAmpliData {
8169
+ /**
8170
+ * Origine de l'appel, matérialisée par AJV (useDefaults) : l'appelant n'a pas à la poser. Seules 'co' (interface Communecter) et 'site-json' sont acceptées serveur ; 'co' n'est PAS au contrat car elle génère les pages CMS du parcours Co.
8171
+ */
8172
+ source: "site-json";
8173
+ /**
8174
+ * Nom affiché. Le serveur en dérive la CLÉ de l'entrée (InflectorHelper::slugifyLikeJS : accents retirés, non-alphanumériques en tirets, minuscules). Un nom qui ne produit aucun slug exploitable ('' ou 'n-a') est refusé. ATTENTION : un slug déjà pris ÉCRASE l'entrée existante, aucune garde serveur.
8175
+ */
8176
+ name: string;
8177
+ /**
8178
+ * Markdown, stocké tel quel.
8179
+ */
8180
+ description?: string;
8181
+ /**
8182
+ * Sérialisé tags[]=a&tags[]=b, relu en tableau par PHP. Vides et doublons retirés côté serveur.
8183
+ */
8184
+ tags?: string[];
8185
+ /**
8186
+ * ObjectId de l'élément porteur du costum.
8187
+ */
8188
+ parentId: string;
8189
+ /**
8190
+ * Collection de l'élément porteur du costum.
8191
+ */
8192
+ parentType: "organizations" | "projects" | "citoyens" | "events";
8193
+ /**
8194
+ * Slug de l'élément porteur : préfixe des identifiants du formulaire généré en MODE A, et nom du parent du Form créé.
8195
+ */
8196
+ parentName: string;
8197
+ /**
8198
+ * Slug de l'élément porteur du costum. REQUIS pour le gate : isInterfaceAdmin() est appelé sans id ni type, il n'accepte qu'un super-admin ou un admin du costum RÉSOLU — et beforeAction → costumCacheParams() ne résout le costum que si $_POST[costumSlug] est présent. Sans lui, un admin de costum ordinaire reçoit « You don't have the right to access this feature ».
8199
+ */
8200
+ costumSlug: string;
8201
+ /**
8202
+ * MODE A : le serveur crée le Form et son sous-formulaire (titre, description, adresse, mots-clés, image) et renvoie les chemins obtenus. Exclusif de coform/*Path. Durci serveur par filter_var(FILTER_VALIDATE_BOOLEAN) : la chaîne 'false' du fil form-urlencoded est bien lue comme faux.
8203
+ */
8204
+ new?: boolean;
8205
+ /**
8206
+ * MODE B : ObjectId du Form existant à rattacher. Exige namePath et addressPath non vides.
8207
+ */
8208
+ coform?: string;
8209
+ /**
8210
+ * MODE B, requis : chemin <idSousFormulaire>.<idQuestion> (SANS le préfixe answers.) de la question titre.
8211
+ */
8212
+ namePath?: string;
8213
+ /**
8214
+ * MODE B : chemin de la question description.
8215
+ */
8216
+ descriptionPath?: string;
8217
+ /**
8218
+ * MODE B, requis : chemin de la question adresse.
8219
+ */
8220
+ addressPath?: string;
8221
+ /**
8222
+ * MODE B : chemin de la question mots-clés.
8223
+ */
8224
+ tagsPath?: string;
8225
+ /**
8226
+ * MODE B : chemin de la question image.
8227
+ */
8228
+ imagePath?: string;
8229
+ /**
8230
+ * MODE B : chemin du finder. Toujours '' en MODE A.
8231
+ */
8232
+ finderPath?: string;
8233
+ [k: string]: unknown;
8234
+ }
8235
+ export interface CostumRemoveAmpliData {
8236
+ /**
8237
+ * CLÉ de l'entrée dans costum.ampli, c'est-à-dire le slug renvoyé à la création (PAS un ObjectId).
8238
+ */
8239
+ ampliId: string;
8240
+ /**
8241
+ * ObjectId de l'élément porteur du costum.
8242
+ */
8243
+ parentId: string;
8244
+ /**
8245
+ * Collection de l'élément porteur du costum.
8246
+ */
8247
+ parentType: "organizations" | "projects" | "citoyens" | "events";
8248
+ /**
8249
+ * Slug de l'élément porteur. REQUIS, et pas décoratif : l'action appelle CacheHelper::getCostum($parentType, $parentId) alors que la signature est ($id, $type, $slug) — arguments inversés — et la résolution retombe en pratique sur $_POST[costumSlug]. L'interface Co l'envoie sans le savoir (ajaxPost l'injecte dans tout POST du module costum) ; un client externe doit le fournir explicitement. Inversion non corrigée : antérieure, et elle touche l'appelant Co.
8250
+ */
8251
+ costumSlug: string;
8252
+ [k: string]: unknown;
8253
+ }
@@ -13,6 +13,14 @@ type UserItemNormalized = import("./serverDataType/User.js").UserItemNormalized;
13
13
  export declare class User extends BaseEntity<UserItemNormalized> {
14
14
  static entityType: "citoyens";
15
15
  static entityTag: string;
16
+ /**
17
+ * UN SEUL chemin d'écriture pour les champs COSTUM d'un citoyen : `element/save` collection=citoyens
18
+ * (`SAVE_CITOYEN`, mise à jour seule) — le seul que le legacy fasse passer par `DataValidator::validate`
19
+ * avec le costum posté (`updateblock`/`updatefield` rejettent ou ignorent). Mise à jour UNIQUEMENT :
20
+ * `_add` reste 403, aucune création de citoyen par la lib (docs/33 backend §2). Lu par
21
+ * `_saveCostumViaElementSave` (appelée par `_update` en HYBRIDE, pas pour tout l'update).
22
+ */
23
+ static COSTUM_ADD_CONSTANT: string;
16
24
  static SCHEMA_CONSTANTS: string[];
17
25
  static UPDATE_BLOCKS: Map<"UPDATE_BLOCK_SLUG" | "PROFIL_IMAGE" | "UPDATE_BLOCK_DESCRIPTION" | "UPDATE_BLOCK_INFO" | "UPDATE_BLOCK_LOCALITY" | "UPDATE_BLOCK_SOCIAL", "updateImageProfil" | "updateSlug" | "updateDescription" | "updateLocality" | "updateInfo" | "updateSocial">;
18
26
  defaultFields: Record<string, any>;
@@ -128,7 +136,23 @@ export declare class User extends BaseEntity<UserItemNormalized> {
128
136
  save(): Promise<Record<string, any>>;
129
137
  _add: () => Promise<never>;
130
138
  /**
131
- * Met à jour les blocs modifiés de l'utilisateur via les constantes de schéma définies.
139
+ * Clés que SEUL le costum sait écrire : les champs déclarés par le contexte costum (`_costumCtx.schema.
140
+ * properties` ∪ `fields`) MOINS ceux qu'un bloc `updateblock` standard porte déjà (`UPDATE_BLOCKS`,
141
+ * évalués pour `typeElement:"citoyens"`). Un costum legacy redéclare volontiers `name`/`email`/`tags`
142
+ * (widget du form) : ces clés restent aux blocs standards, dont la sémantique est propre. Vide sans
143
+ * contexte costum à champs.
144
+ */
145
+ private _costumOnlyKeys;
146
+ /**
147
+ * Met à jour l'utilisateur — chemin HYBRIDE (docs/33 backend) :
148
+ * 1. les champs COSTUM modifiés (`_costumOnlyKeys`) partent en UN `element/save` collection=citoyens
149
+ * (`SAVE_CITOYEN`, enveloppe costum `isUpdate`, même règle d'effacement → `""` que
150
+ * `_saveCostumViaElementSave`, dont c'est l'appel filtré) ;
151
+ * 2. PUIS les blocs `updateblock` standards (description, social, locality, info, slug, image) portent
152
+ * les champs standards, en EXCLUANT les clés costum.
153
+ * Contrairement à `Organization`, l'update entier n'est PAS routé vers `element/save` : les blocs du
154
+ * citoyen (slug, locality, social, image) ont une sémantique propre. Sans contexte costum, comportement
155
+ * historique inchangé (blocs seuls).
132
156
  *
133
157
  * @param payload - Données courantes à comparer et envoyer.
134
158
  * @returns - Indique s'il y a eu une modification réelle.
@@ -47,10 +47,23 @@ export declare class UserApi {
47
47
  * @param params.costumSlug - (option) slug du costum de déploiement → estampille `source.key` du citoyen
48
48
  * côté backend (port Person::insert). `costumId`/`costumType` = entité porteuse (requis si le slug n'est
49
49
  * pas un doc `costum`, ex. un site porté par une org).
50
+ * @param params.fields - (option) champs SUPPLÉMENTAIRES du citoyen, envoyés À PLAT dans le body (le legacy
51
+ * lit `$_POST` à la racine, pas un sous-objet). La règle d'acceptation vit côté SERVEUR et n'est pas
52
+ * rejouée ici. L'inscription étant anonyme, c'est une LISTE BLANCHE : champs déclarés pour les personnes
53
+ * par le costum posté (`typeObj` citoyens/person/alias `sameAs:"person"`), ou champs du modèle créés pour
54
+ * les inscriptions costum (`typepro`, `othersTypepro`, `profession`…) ; valeur simple (scalaire ou liste de
55
+ * scalaires). Tout autre champ fait ÉCHOUER l'inscription (`{result:false, msg:"Contenu Invalide <clé> :
56
+ * Person"}` → `ApiResponseError`). Aucun schéma de champ
57
+ * n'est rejoué côté client (le contrat PERSON_REGISTER est `additionalProperties:true`) : le schéma digéré
58
+ * d'un champ costum (objet pour un finder/une adresse, date…) refuserait une valeur que le serveur
59
+ * accepte. Le serveur seul tranche. cf. cocolight-backend docs/33.
60
+ * @param params.mode - (option) `"normal"` (défaut legacy : compte à activer par e-mail) ou
61
+ * `"single_step_register"` : activation IMMÉDIATE (`roles.tobeactivated` retiré, `username` suffixé s'il
62
+ * est pris) — l'e-mail de validation part quand même (texte « déjà actif »).
50
63
  * @returns Réponse brute de l'API.
51
64
  * @throws {ApiResponseError} Si l'API retourne un échec (`result === false`).
52
65
  */
53
- register({ name, username, email, pwd, costumSlug, costumId, costumType }: {
66
+ register({ name, username, email, pwd, costumSlug, costumId, costumType, fields, mode }: {
54
67
  name: string;
55
68
  username: string;
56
69
  email: string;
@@ -58,6 +71,8 @@ export declare class UserApi {
58
71
  costumSlug?: string;
59
72
  costumId?: string;
60
73
  costumType?: string;
74
+ fields?: Record<string, unknown>;
75
+ mode?: "normal" | "single_step_register";
61
76
  }): Promise<any>;
62
77
  /**
63
78
  * Lance une procédure de récupération de mot de passe.