@communecter/cocolight-api-client 1.0.195 → 1.0.196

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@communecter/cocolight-api-client",
3
- "version": "1.0.195",
3
+ "version": "1.0.196",
4
4
  "description": "Client Axios simplifié pour l'API cocolight",
5
5
  "repository": {
6
6
  "type": "git",
@@ -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, 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, 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, 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";
3
3
  /**
4
4
  * Classe EndpointApi générée automatiquement depuis endpoints-copie.json
5
5
  */
@@ -630,6 +630,16 @@ export declare class EndpointApi {
630
630
  * @throws {Error} - En cas d'erreur inattendue.
631
631
  */
632
632
  connect(data: ConnectData): Promise<any>;
633
+ /**
634
+ * Définir les rôles d'un lien : Remplace INTÉGRALEMENT les rôles d'un lien existant (ou en pose un premier), des deux côtés : `links.<connectType>.<childId>.roles` sur le contexte et `links.<memberOf|projects|events>.<contextId>.roles` sur l'enfant. Malgré le nom du chemin legacy (Link::removeRole, citizenToolKit/models/Link.php:866-917), ce n'est PAS un retrait sélectif : `roles` non vide → `$set` du tableau envoyé ; `roles` vide ou absent → `$unset` (tous les rôles effacés). L'appelant envoie donc la liste COMPLÈTE voulue. Réservé aux admins du contexte au sens d'Authorisation::isElementAdmin — lien admin, admin du parent (ou de l'organisateur d'un événement), super-admin, admin du costum transmis (sinon {result:false, msg:"You are not admin of the Organization : <id>"}, HTTP 200). Le lien doit EXISTER : le backend Node refuse sinon ({result:false, msg:"The actor (<id> / <type>) is not linked to this element"}), le legacy l'écrirait (BUG-L-267).
635
+ * Constant : LINK_SET_ROLES
636
+ * @param data - Données envoyées à l'API
637
+ * @returns Les données de réponse.
638
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
639
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
640
+ * @throws {Error} - En cas d'erreur inattendue.
641
+ */
642
+ linkSetRoles(data: LinkSetRolesData): Promise<any>;
633
643
  /**
634
644
  * Générer un lien d'invitation partageable : Génère une URL d'invitation partageable /co2/link/connect/ref/<ref> vers un élément (organizations/projects/events). Tout citoyen connecté qui suit le lien rejoint l'élément IMMÉDIATEMENT (member, ou admin si isAdmin). L'appelant doit être ADMIN de la cible (ou super-admin). ⚠ Durcissements vs legacy : whitelist stricte des champs (pas de mass-assignment du body), ref cryptographique (le legacy dérivait uniqid()). Deux appels (isAdmin=true / false) alimentent costum.invitationLink / costum.invitationLinkAsMember côté UI.
635
645
  * Constant : CREATE_INVITATION_LINK
@@ -1048,6 +1058,15 @@ export declare class EndpointApi {
1048
1058
  * @throws {Error} - En cas d'erreur inattendue.
1049
1059
  */
1050
1060
  costumEventRequestLoadContextTag(data: CostumEventRequestLoadContextTagData): Promise<any>;
1061
+ /**
1062
+ * PDF imprimable de l'agenda d'un costum : Édition imprimable (PDF binaire, application/pdf) de l'agenda d'un costum : sous-événements de l'entité PORTEUSE du costum (id/type de l'entité, pas d'un événement), triés par date d'occurrence. Port de costum/controllers/actions/coevent/pdf/GetPdfAction.php. Tout paramètre GET non réservé (id, type, costum_slug, startDate, vue, rest, tab) filtre les sous-événements sur le champ top-level du même nom, en `$in` insensible à la casse sur une liste séparée par des virgules — d'où `additionalProperties` ouvert : les facettes propres à un site (ex. territoires/publics/thèmes de parent62) n'ont pas à être nommées ici.
1063
+ * Constant : AGENDA_GET_PDF
1064
+ * @param data - Données envoyées à l'API
1065
+ * @returns Les données de réponse.
1066
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
1067
+ * @throws {Error} - En cas d'erreur inattendue.
1068
+ */
1069
+ agendaGetPdf(data: AgendaGetPdfData): Promise<any>;
1051
1070
  /**
1052
1071
  * Récupération de la galerie : Renvoie soit la liste d’albums associés à une entité, soit les images d’un album spécifique.
1053
1072
  * Constant : GET_GALLERY
@@ -2928,6 +2928,49 @@ export interface ConnectData {
2928
2928
  * Type de connexion
2929
2929
  */
2930
2930
  connectType: "admin" | "member" | "contributor" | "attendee" | "friend" | "connect";
2931
+ /**
2932
+ * Rôles à poser sur le lien (`links.<connectType>.<childId>.roles`, des deux côtés). Lu par ConnectAction ($_POST["roles"]) : fusionné AVANT les rôles déjà portés par le lien côté enfant (array_merge), puis écrit par Link::connect. Effectif à la CRÉATION d'un lien, et lors d'une promotion admin (connectType=admin sur un membre non admin : rôles fusionnés puis écrits). Sur un lien déjà établi du même statut, Link::connectParentToChild répond « already member » avant toute écriture — pour modifier les rôles d'un lien établi, utiliser LINK_SET_ROLES.
2933
+ */
2934
+ roles?: string[];
2935
+ /**
2936
+ * Contexte costum de l'action : slug du SITE appelant (l'entité porteuse du costum), jamais le slug du moteur (« costumize »). Injecté automatiquement par le client (ApiClient.setSiteCostum / setCostumScope). Le legacy le lit dans $_POST — CommunecterController::costumCacheParams réchauffe alors le cache costum AVANT l'action, ce qui brande l'e-mail émis (domaine des liens, titre, logo, expéditeur) et stampe source.key sur le job cron.
2937
+ */
2938
+ costumSlug?: string;
2939
+ /**
2940
+ * Contexte costum : _id de l'entité porteuse du costum (contextId). Facultatif, complète costumSlug.
2941
+ */
2942
+ costumId?: string;
2943
+ /**
2944
+ * Contexte costum : collection de l'entité porteuse (organizations | projects | events | citoyens). Facultatif, complète costumSlug.
2945
+ */
2946
+ costumType?: string;
2947
+ [k: string]: unknown;
2948
+ }
2949
+ export interface LinkSetRolesData {
2950
+ /**
2951
+ * ID de l'entité porteuse du lien (organisation, projet, événement)
2952
+ */
2953
+ contextId: string;
2954
+ /**
2955
+ * Type de l'entité porteuse
2956
+ */
2957
+ contextType: "organizations" | "projects" | "events";
2958
+ /**
2959
+ * ID du membre / contributeur / participant
2960
+ */
2961
+ childId: string;
2962
+ /**
2963
+ * Type du membre
2964
+ */
2965
+ childType: "citoyens" | "organizations";
2966
+ /**
2967
+ * Clé du lien côté contexte
2968
+ */
2969
+ connectType: "members" | "contributors" | "attendees";
2970
+ /**
2971
+ * Liste COMPLÈTE des rôles voulus. Vide → efface tous les rôles du lien ($unset). Valeurs écrites telles quelles (pas de trim côté legacy pour un tableau).
2972
+ */
2973
+ roles?: string[];
2931
2974
  /**
2932
2975
  * Contexte costum de l'action : slug du SITE appelant (l'entité porteuse du costum), jamais le slug du moteur (« costumize »). Injecté automatiquement par le client (ApiClient.setSiteCostum / setCostumScope). Le legacy le lit dans $_POST — CommunecterController::costumCacheParams réchauffe alors le cache costum AVANT l'action, ce qui brande l'e-mail émis (domaine des liens, titre, logo, expéditeur) et stampe source.key sur le job cron.
2933
2976
  */
@@ -5621,6 +5664,29 @@ export interface CostumEventRequestLoadContextTagData {
5621
5664
  };
5622
5665
  [k: string]: unknown;
5623
5666
  }
5667
+ export interface AgendaGetPdfData {
5668
+ /**
5669
+ * ID de l'entité porteuse du costum
5670
+ */
5671
+ id: string;
5672
+ /**
5673
+ * Collection de l'entité porteuse
5674
+ */
5675
+ type: "organizations" | "projects" | "events" | "citoyens";
5676
+ /**
5677
+ * Slug du costum (réchauffe le cache costum legacy avant le rendu)
5678
+ */
5679
+ costum_slug: string;
5680
+ /**
5681
+ * Borne basse temporelle (interprétée par strtotime côté legacy, ex. 2026-10-01) : startDate >= cette date.
5682
+ */
5683
+ startDate?: string;
5684
+ /**
5685
+ * Tags séparés par des virgules. ⚠️ Passe par le filtre GET générique : sémantique OU (`$in`, insensible à la casse), pas ET — le filtre ET (`$all`) du legacy n'est lu que dans un corps JSON, absent en GET.
5686
+ */
5687
+ tags?: string;
5688
+ [k: string]: unknown;
5689
+ }
5624
5690
  export interface GetGalleryData {
5625
5691
  /**
5626
5692
  * Clé de contenu pour correspondre à l'album ou aux images
@@ -9,7 +9,7 @@ export declare class Event extends BaseEntity<EventItemNormalized> {
9
9
  /** Bloc de création où injecter les champs costum (CostumScope). */
10
10
  static COSTUM_ADD_CONSTANT: string;
11
11
  static SCHEMA_CONSTANTS: string[];
12
- static ADD_BLOCKS: Map<"PROFIL_IMAGE" | "ADD_EVENT", "updateImageProfil" | "addEvent">;
12
+ static ADD_BLOCKS: Map<"ADD_EVENT" | "PROFIL_IMAGE", "addEvent" | "updateImageProfil">;
13
13
  static UPDATE_BLOCKS: Map<"UPDATE_BLOCK_SLUG" | "PROFIL_IMAGE", "updateImageProfil" | "updateSlug">;
14
14
  defaultFields: Record<string, any>;
15
15
  removeFields: string[];
@@ -95,8 +95,8 @@ export declare class Organization extends BaseEntity<OrganizationItemNormalized>
95
95
  readonly updateMethod: "updateVideo";
96
96
  readonly schemaConstant: "VIRTUAL_ORG_BASE_FIELDS";
97
97
  }>;
98
- static ADD_BLOCKS: Map<"UPDATE_BLOCK_SOCIAL" | "PROFIL_IMAGE" | "ADD_ORGANIZATION", "updateImageProfil" | "updateSocial" | "addOrganization">;
99
- static UPDATE_BLOCKS: Map<"UPDATE_BLOCK_DESCRIPTION" | "UPDATE_BLOCK_INFO" | "UPDATE_BLOCK_SOCIAL" | "UPDATE_BLOCK_LOCALITY" | "UPDATE_BLOCK_SLUG" | "PROFIL_IMAGE", "updateImageProfil" | "updateDescription" | "updateSocial" | "updateLocality" | "updateInfo" | "updateSlug">;
98
+ static ADD_BLOCKS: Map<"PROFIL_IMAGE" | "UPDATE_BLOCK_SOCIAL" | "ADD_ORGANIZATION", "updateImageProfil" | "updateSocial" | "addOrganization">;
99
+ 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">;
100
100
  defaultFields: Record<string, any>;
101
101
  removeFields: string[];
102
102
  transforms: Record<string, (val: any, full: any) => any>;
@@ -8,7 +8,7 @@ export declare class Poi extends BaseEntity<PoiItemNormalized> {
8
8
  static COSTUM_ADD_CONSTANT: string;
9
9
  static SCHEMA_CONSTANTS: string[];
10
10
  static ADD_BLOCKS: Map<"PROFIL_IMAGE" | "ADD_POI", "updateImageProfil" | "addPoi">;
11
- static UPDATE_BLOCKS: Map<"UPDATE_BLOCK_DESCRIPTION" | "UPDATE_BLOCK_INFO" | "UPDATE_BLOCK_LOCALITY" | "UPDATE_BLOCK_SLUG" | "PROFIL_IMAGE", "updateImageProfil" | "updateDescription" | "updateLocality" | "updateInfo" | "updateSlug">;
11
+ static UPDATE_BLOCKS: Map<"UPDATE_BLOCK_SLUG" | "PROFIL_IMAGE" | "UPDATE_BLOCK_DESCRIPTION" | "UPDATE_BLOCK_INFO" | "UPDATE_BLOCK_LOCALITY", "updateImageProfil" | "updateSlug" | "updateDescription" | "updateLocality" | "updateInfo">;
12
12
  defaultFields: Record<string, any>;
13
13
  removeFields: string[];
14
14
  transforms: Record<string, (val: any, full?: any) => any>;
@@ -12,8 +12,8 @@ export declare class Project extends BaseEntity<ProjectItemNormalized> {
12
12
  /** Bloc de création où injecter les champs costum (CostumScope). */
13
13
  static COSTUM_ADD_CONSTANT: string;
14
14
  static SCHEMA_CONSTANTS: string[];
15
- static ADD_BLOCKS: Map<"PROFIL_IMAGE" | "ADD_PROJECT", "addProject" | "updateImageProfil">;
16
- static UPDATE_BLOCKS: Map<"UPDATE_BLOCK_DESCRIPTION" | "UPDATE_BLOCK_INFO" | "UPDATE_BLOCK_SOCIAL" | "UPDATE_BLOCK_LOCALITY" | "UPDATE_BLOCK_SLUG" | "PROFIL_IMAGE", "updateImageProfil" | "updateDescription" | "updateSocial" | "updateLocality" | "updateInfo" | "updateSlug">;
15
+ static ADD_BLOCKS: Map<"PROFIL_IMAGE" | "ADD_PROJECT", "updateImageProfil" | "addProject">;
16
+ 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">;
17
17
  defaultFields: Record<string, any>;
18
18
  removeFields: string[];
19
19
  transforms: ProjectTransforms;
@@ -14,7 +14,7 @@ export declare class User extends BaseEntity<UserItemNormalized> {
14
14
  static entityType: "citoyens";
15
15
  static entityTag: string;
16
16
  static SCHEMA_CONSTANTS: string[];
17
- static UPDATE_BLOCKS: Map<"UPDATE_BLOCK_DESCRIPTION" | "UPDATE_BLOCK_INFO" | "UPDATE_BLOCK_SOCIAL" | "UPDATE_BLOCK_LOCALITY" | "UPDATE_BLOCK_SLUG" | "PROFIL_IMAGE", "updateImageProfil" | "updateDescription" | "updateSocial" | "updateLocality" | "updateInfo" | "updateSlug">;
17
+ 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
18
  defaultFields: Record<string, any>;
19
19
  removeFields: string[];
20
20
  transforms: Record<string, (val: any, full: any) => any>;
@@ -742,6 +742,9 @@ export declare class User extends BaseEntity<UserItemNormalized> {
742
742
  *
743
743
  * @param {Object} [options] - Options de la méthode
744
744
  * @param {boolean} [options.admin=false] - Si true, utilise "admin" comme connectType au lieu du type par défaut (connectTypeConnect)
745
+ * @param {string[]} [options.roles] - Rôles à poser sur le lien CRÉÉ (transmis à `CONNECT`, écrits des deux
746
+ * côtés). Omis ou vide → corps inchangé. Ne sert qu'à la création : pour corriger les rôles d'un lien
747
+ * déjà établi, utiliser {@link User.setRoles}.
745
748
  * @returns {Promise<unknown>} La réponse de l'API après création de la demande
746
749
  * @throws {ApiError} Si l'utilisateur n'est pas connecté, pas admin, ou si le parent n'est pas défini
747
750
  * @throws {ApiError} Si l'utilisateur est déjà en attente de validation
@@ -757,10 +760,14 @@ export declare class User extends BaseEntity<UserItemNormalized> {
757
760
  *
758
761
  * // Avec le type admin explicite
759
762
  * await user.sendRequestToJoinParent({ admin: true });
763
+ *
764
+ * // Avec des rôles posés dès l'invitation
765
+ * await user.sendRequestToJoinParent({ roles: ["Coordonnatrice parentalité Arrageois"] });
760
766
  * ```
761
767
  */
762
- sendRequestToJoinParent({ admin }?: {
763
- admin: boolean;
768
+ sendRequestToJoinParent({ admin, roles }?: {
769
+ admin?: boolean;
770
+ roles?: string[];
764
771
  }): Promise<unknown>;
765
772
  /**
766
773
  * Valide une demande de membre en attente de validation.
@@ -845,6 +852,35 @@ export declare class User extends BaseEntity<UserItemNormalized> {
845
852
  * ```
846
853
  */
847
854
  promoteToAdmin(): Promise<unknown>;
855
+ /**
856
+ * Définit les rôles de cet utilisateur sur son lien avec l'entité parente (`LINK_SET_ROLES`).
857
+ *
858
+ * ⚠️ REMPLACEMENT INTÉGRAL, pas un ajout/retrait : le tableau envoyé devient la liste des rôles du lien,
859
+ * des deux côtés (contexte et citoyen). Pour ajouter un rôle, envoyer les rôles actuels + le nouveau ;
860
+ * pour en retirer un, les rôles actuels privés de celui-ci. **`setRoles([])` efface TOUS les rôles**
861
+ * (`$unset` côté backend).
862
+ *
863
+ * Réservé aux admins de l'entité parente (organisation, projet ou événement). Le lien doit exister.
864
+ * Le backend répond HTTP 200 avec `{result:false}` en cas de refus : l'erreur est levée en `ApiResponseError`.
865
+ * Le contexte costum du PARENT est transmis (droit d'admin du costum, comme les autres actions de lien).
866
+ *
867
+ * @param roles - Liste COMPLÈTE des rôles voulus (vide = tout effacer).
868
+ * @returns La réponse de l'API (`{result, msg, memberOfid, memberid, roles}`).
869
+ * @throws {ApiError} Si le parent n'est pas défini, si l'appelant n'en est pas admin, ou si l'utilisateur
870
+ * n'a aucun lien avec le parent.
871
+ * @throws {ApiResponseError} Si le backend refuse (ex. non admin côté serveur).
872
+ *
873
+ * @example
874
+ * ```typescript
875
+ * const org = await me.organization({ slug: "parent62" });
876
+ * const { results } = await org.getMembers();
877
+ * const membre = results[0];
878
+ * // Source fiable des rôles actuels : le lien côté ORGANISATION (links.members.<id>.roles).
879
+ * const actuels = org.serverData.links?.members?.[membre.id!]?.roles ?? [];
880
+ * await membre.setRoles([...actuels, "Coordonnatrice parentalité Arrageois"]);
881
+ * ```
882
+ */
883
+ setRoles(roles: string[]): Promise<unknown>;
848
884
  /**
849
885
  * Rétrograde un admin au statut de membre ordinaire.
850
886
  *
@@ -63,6 +63,28 @@ interface FieldDef {
63
63
  /** Valeur FORCÉE par le costum — cf. collectValuePresets. */
64
64
  value?: unknown;
65
65
  }
66
+ /** Clé de base d'une collection telle que la déclare un `typeObj` — cf. `findCostumBaseNode`. */
67
+ export interface CostumBaseNode {
68
+ /** Clé `typeObj` retenue (ex. `organizations`, `event`). */
69
+ typeKey: string;
70
+ /** Le nœud déclare-t-il des champs (`beforeBuild.properties`) ? Sinon : variante de base VIDE. */
71
+ hasForm: boolean;
72
+ add: boolean;
73
+ createLabel: string | null;
74
+ }
75
+ /**
76
+ * Trouve la CLÉ DE BASE d'une collection dans le `typeObj` d'un costum — le formulaire que le site
77
+ * applique quand on « ajoute une organisation » sans rien préciser, même quand ce nœud ne déclare AUCUN
78
+ * champ (ex. federationDesCae : `organizations: {add:true}` à côté du sous-type `organizationsTls`).
79
+ *
80
+ * Une base est une clé de `BASE_TYPEKEYS[collection]` dont le nœud est un objet SANS `sameAs`, ou avec un
81
+ * `sameAs` RÉFLEXIF (`event: {sameAs:"event"}` — parent62, institutBleu, navigator) : ce `sameAs` ne
82
+ * rattache le nœud à rien d'autre que lui-même. Deux clés sœurs (`organization` ET `organizations`) : on
83
+ * préfère celle qui porte un formulaire, sinon la première dans l'ordre du `typeObj` — en pratique
84
+ * `costum/co/resolved` n'en livre qu'une (le dernier déclaré gagne à la fusion moteur ⊕ overlay).
85
+ * Null si le costum ne déclare pas de clé de base pour cette collection.
86
+ */
87
+ export declare function findCostumBaseNode(data: CostumJsonData, collection: string): CostumBaseNode | null;
66
88
  /**
67
89
  * Digère `getcostumjson` → `CostumRuntimeContext` pour UNE collection (null si le costum ne couvre pas
68
90
  * cette collection). `meta` = identité de l'élément porteur (costumId/costumType, résolue par slug/getinfo).
@@ -86,6 +108,12 @@ export declare function listCostumFormNodes(data: CostumJsonData): Array<{
86
108
  createLabel: string | null;
87
109
  discriminator?: string;
88
110
  }>;
111
+ /**
112
+ * `opts.typeKey` : ne digère que cette clé `typeObj` (énumération par sous-type).
113
+ * `opts.allowFormless` (avec `typeKey`) : digère AUSSI ce nœud s'il ne déclare aucun champ — sert à la
114
+ * variante de BASE vide (cf. `findCostumBaseNode`) : schéma vide, `fields` vide, mais `presetValue` et
115
+ * `hide` PROPRES du nœud conservés. Sans cette option, un nœud sans formulaire est ignoré (inchangé).
116
+ */
89
117
  export declare function digestCostumJson(data: CostumJsonData, collection: Collection, meta: {
90
118
  costumId: string;
91
119
  costumType: string;
@@ -93,5 +121,6 @@ export declare function digestCostumJson(data: CostumJsonData, collection: Colle
93
121
  baseFieldNames?: string[];
94
122
  }, opts?: {
95
123
  typeKey?: string;
124
+ allowFormless?: boolean;
96
125
  }): DigestedCostum | null;
97
126
  export {};
@@ -1,5 +1,9 @@
1
1
  import type { CostumExtensionModule, CostumExtensionField, KnownCostumSlug, Collection } from "./types.js";
2
2
  import type { BaseEntity } from "../api/BaseEntity.js";
3
+ import type { Event } from "../api/Event.js";
4
+ import type { Organization } from "../api/Organization.js";
5
+ import type { Poi } from "../api/Poi.js";
6
+ import type { Project } from "../api/Project.js";
3
7
  /** Active/désactive FORCE-LIVE (cf. `COSTUM_FORCE_LIVE`). */
4
8
  export declare function setCostumForceLive(actif: boolean): void;
5
9
  /** État courant de FORCE-LIVE. */
@@ -83,6 +87,33 @@ export interface CostumFormDescriptor {
83
87
  /** Valeur de `type` estampillée au save qui distingue le sous-type (= presetValue.type, sinon typeKey). */
84
88
  discriminator?: string;
85
89
  }
90
+ /** Collections couvertes par les fabriques du scope (poi/organization/project/event). Identité entityType↔collection. */
91
+ type ScopeCollection = "poi" | "organizations" | "projects" | "events";
92
+ /** Entité rendue par chaque fabrique — même correspondance que `EntityTypeMap` (BaseEntity), qui n'est pas
93
+ * exporté : `create` étant public, son type de retour doit être nommable dans les `.d.ts`. */
94
+ type ScopeEntityMap = {
95
+ poi: Poi;
96
+ organizations: Organization;
97
+ projects: Project;
98
+ events: Event;
99
+ };
100
+ /**
101
+ * Options de création sous un costum (`CostumScope.create` et ses raccourcis). Jamais envoyées au serveur.
102
+ */
103
+ export interface CostumCreateOptions {
104
+ /**
105
+ * Sous-type CIBLÉ : clé `typeObj` du costum (ex. `"organizationsTls"` pour le formulaire « Créer votre
106
+ * CAE »). Ses presets et champs s'appliquent, quel que soit `data.type`. Sans lui, un sous-type ne
107
+ * s'applique que si `data.type` est son discriminant ; sinon c'est la clé de base de la collection.
108
+ * Inconnu du costum → repli silencieux sur cette règle (trace `debug`).
109
+ */
110
+ subType?: string;
111
+ }
112
+ /** Options de `CostumScope.contextFor` : celles de la création, plus le mode de sélection. */
113
+ export interface CostumContextOptions extends CostumCreateOptions {
114
+ /** Sélectionner comme une CRÉATION (défaut = clé de base) plutôt que comme une lecture (défaut historique). */
115
+ create?: boolean;
116
+ }
86
117
  /**
87
118
  * Scope costum : fabrique des entités liées à un costum. Réutilise le `user` (parent, deps, auth)
88
119
  * et n'altère jamais l'état partagé — chaque entité reçoit son propre `_costumCtx`.
@@ -98,14 +129,38 @@ export declare class CostumScope {
98
129
  * Construit le `CostumRuntimeContext` pour une collection (null si non couverte). `type` (optionnel) = le
99
130
  * sous-type voulu (= `presetValue.type` de la variante) : sélectionne l'overlay de CE sous-type, sinon la
100
131
  * racine=union. Indispensable au CREATE d'un sous-type précis (bon `type`/presets/champs — cf. P0 write-safety).
132
+ *
133
+ * `opts` (optionnel) : `subType` cible un sous-type par sa clé `typeObj` (prime sur `type`) ; `create`
134
+ * sélectionne comme une création (défaut = clé de base du costum). Sans `opts` : sélection de LECTURE,
135
+ * inchangée (revive/édition).
136
+ */
137
+ contextFor(collection: Collection, type?: string | null, opts?: CostumContextOptions): CostumRuntimeContext | null;
138
+ /**
139
+ * Crée une entité de `collection` sous ce costum (presets appliqués, surchargeables par `data`).
140
+ *
141
+ * Formulaire costum appliqué (presets + champs) — dans l'ordre :
142
+ * 1. `opts.subType` : le sous-type CIBLÉ par sa clé `typeObj` (ex. `"organizationsTls"`) ;
143
+ * 2. `data.type` : le sous-type dont c'est le discriminant (ex. `poi({ type: "article" })`) ;
144
+ * 3. sinon la CLÉ DE BASE de la collection si le costum en déclare une (ex. `organizations`), MÊME SANS
145
+ * champ : un sous-type n'est jamais appliqué par défaut ; sans clé de base, comportement historique.
146
+ * Un `subType` inconnu retombe sur 2→3 (trace `debug`, aucune exception). `opts` n'est JAMAIS envoyé au
147
+ * serveur. La whitelist d'écriture reste l'union racine ∪ variante (byte-safe).
148
+ *
149
+ * const cae = await tl.organization({ name }, { subType: "organizationsTls" }); // formulaire « CAE »
150
+ * const org = await tl.organization({ name }); // formulaire de base
151
+ */
152
+ create<T extends ScopeCollection>(collection: T, data?: Record<string, unknown>, opts?: CostumCreateOptions): Promise<ScopeEntityMap[T]>;
153
+ /**
154
+ * Trace (`debug`) un `subType` que ce scope ne sait pas cibler pour `collection` : collection non couverte,
155
+ * ou variantes dont aucune ne porte cette clé `typeObj`. Une collection à formulaire UNIQUE n'a pas de
156
+ * variantes à comparer : rien n'est tracé (la racine EST ce formulaire). Le repli lui-même est fait par
157
+ * `pickCostumOverlay` ; ceci ne fait que le rendre visible.
101
158
  */
102
- contextFor(collection: Collection, type?: string | null): CostumRuntimeContext | null;
103
- /** Crée une entité de `collection` sous ce costum (presets appliqués, surchargeables par `data`). */
104
- private create;
105
- poi(data?: Record<string, unknown>): Promise<import("../index.js").Poi>;
106
- organization(data?: Record<string, unknown>): Promise<import("../index.js").Organization>;
107
- project(data?: Record<string, unknown>): Promise<import("../index.js").Project>;
108
- event(data?: Record<string, unknown>): Promise<import("../index.js").Event>;
159
+ private traceUnknownSubType;
160
+ poi(data?: Record<string, unknown>, opts?: CostumCreateOptions): Promise<Poi>;
161
+ organization(data?: Record<string, unknown>, opts?: CostumCreateOptions): Promise<Organization>;
162
+ project(data?: Record<string, unknown>, opts?: CostumCreateOptions): Promise<Project>;
163
+ event(data?: Record<string, unknown>, opts?: CostumCreateOptions): Promise<Event>;
109
164
  /**
110
165
  * Poste une news sous CE costum, sur le mur de `target` : `source.key` = costum du scope (le SITE,
111
166
  * comme poi/org — cf. `News::prepData`), `parent` = `target`. News n'est PAS une collection « élément »
@@ -159,3 +214,4 @@ export declare function resolveCostumScope(user: BaseEntity, slug: KnownCostumSl
159
214
  * No-op si le costum ne résout pas / ne couvre pas la collection (l'entité reste en scope d'identité).
160
215
  */
161
216
  export declare function loadCostumContext(user: BaseEntity, slug: string, collection: Collection): Promise<CostumRuntimeContext | null>;
217
+ export {};
@@ -0,0 +1,22 @@
1
+ /**
2
+ * UN COSTUM PEUT ÉLARGIR UN CHAMP NATIF, JAMAIS LE RESTREINDRE.
3
+ *
4
+ * Un costum legacy redéclare des champs que le contrat connaît déjà (`type`, `tags`, `openingHours`,
5
+ * `telephone`…). Son schéma ne vient pas du stockage mais du WIDGET déclaré (digest live, `inferType`)
6
+ * ou d'un préremplissage (`presetProps`, typé chaîne). Il sert à ÉLARGIR un champ contraint — les
7
+ * types d'événement d'institutBleu sont tous hors de l'énumération native, et la production en vit.
8
+ * Mais posé À LA PLACE du schéma natif, il refusait aussi la forme native. Mesuré le 2026-10-01 sur les
9
+ * 21 costums résolus des sites de site-json : 111 champs natifs redéclarés, dont 8 RESTREINTS — horaires
10
+ * en liste refusés (CAE, navigator, relief : création impossible dès qu'on les saisit), téléphone en
11
+ * objet legacy refusé, mots-clés préremplis refusés en liste — pour 27 élargissements légitimes.
12
+ *
13
+ * Règle : pour un champ défini des deux côtés, la requête accepte le natif OU le costum (`anyOf`).
14
+ * Elle est monotone — tout ce qui passait passe encore — et une valeur que les deux refusent reste
15
+ * refusée. Appliquée aux DEUX points de fusion : la création (`ApiClient.callEndpoint`, enveloppe
16
+ * costum) et la modification (`BaseEntity._saveCostumViaElementSave`), qui faisaient l'inverse l'une
17
+ * de l'autre (le costum primait à la création, le natif à la modification).
18
+ */
19
+ /** Schéma d'un champ défini par le contrat (`natif`) ET par le costum : natif OU costum. */
20
+ export declare function widenSchema(natif: unknown, costum: unknown): unknown;
21
+ /** `widenSchema` clé par clé : chaque propriété du costum élargit celle du natif, les autres restent. */
22
+ export declare function widenProperties(natives: Record<string, unknown>, costum: Record<string, unknown>): Record<string, unknown>;