@communecter/cocolight-api-client 1.0.150 → 1.0.152

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.150",
3
+ "version": "1.0.152",
4
4
  "description": "Client Axios simplifié pour l'API cocolight",
5
5
  "repository": {
6
6
  "type": "git",
@@ -45,7 +45,8 @@
45
45
  "generate:module:publish": "node ./scripts/transform-json-module.publish.js",
46
46
  "generate:doc": "node ./scripts/generate-doc.js",
47
47
  "generate:reponses": "node ./scripts/generate-constant-response-200.js",
48
- "generate:methodeapi": "node ./scripts/generate-methode-api.js"
48
+ "generate:methodeapi": "node ./scripts/generate-methode-api.js",
49
+ "generate:costum": "node ./scripts/generate-costum-extensions.js"
49
50
  },
50
51
  "keywords": [
51
52
  "communecter",
@@ -48,6 +48,7 @@ import type {
48
48
  ProfilBannerData,
49
49
  SearchMemberAutocompleteData,
50
50
  GetEventsData,
51
+ SearchEventsCostumData,
51
52
  CostumFilterCoformData,
52
53
  CostumFilterCoformByPathData,
53
54
  GetCountriesData,
@@ -261,6 +262,18 @@ export type CostumContextFields = {
261
262
 
262
263
  export type WithCostumContext<T> = T & CostumContextFields;
263
264
 
265
+ /**
266
+ * Bornes d'agenda acceptant un `Date` (coercé en ISO par la méthode avant l'envoi — le fil reste
267
+ * `type:string`). Partagé par `searchEventsCostum` et `getEvents`.
268
+ */
269
+ type AgendaDateInputs = { startDateUTC?: Date | string; endDateUTC?: Date | string };
270
+ /** Entrée de `searchEventsCostum` : la request, mais les bornes acceptent un `Date`. */
271
+ export type SearchEventsCostumInput =
272
+ Omit<Partial<SearchEventsCostumData>, keyof AgendaDateInputs> & AgendaDateInputs;
273
+ /** Entrée de `getEvents` : la request, mais les bornes acceptent un `Date`. */
274
+ export type GetEventsInput =
275
+ Omit<Partial<GetEventsData>, keyof AgendaDateInputs> & AgendaDateInputs;
276
+
264
277
  /**
265
278
  * Une valeur distincte d'une thématique CoForm (retournée par `coformFilterByPath`).
266
279
  */
@@ -803,7 +816,11 @@ export class BaseEntity<TServerData = any> {
803
816
  const v = fullData[key];
804
817
  const isClear = v === null || v === "" || (Array.isArray(v) && v.length === 0);
805
818
  changed[key] = isClear ? "" : v; // clear → "" : survit à stripNulls, backend prepElementData → $unset
806
- props[key] = this._lookupPropSchema(combined, key) ?? (costumProps[key] as unknown) ?? {};
819
+ // Schéma porté dans l'enveloppe (validation AJV de requête). Pour un EFFACEMENT, on envoie le sentinel
820
+ // "" : le schéma STRICT du champ (ex. socialNetwork = objet, openingHours = array) rejetterait "" →
821
+ // "Request validation failed". On porte donc un schéma PERMISSIF ({}) pour la clé effacée (le "" est le
822
+ // sentinel voulu ; le backend prepElementData fait le $unset). Sinon, schéma réel du champ.
823
+ props[key] = isClear ? {} : (this._lookupPropSchema(combined, key) ?? (costumProps[key] as unknown) ?? {});
807
824
  }
808
825
 
809
826
  let didSave = false;
@@ -2901,7 +2918,23 @@ export class BaseEntity<TServerData = any> {
2901
2918
  */
2902
2919
  async entity<T extends keyof EntityTypeMap>(entityType: T, entityData: object = {}, config: BaseEntityConfig = {}): Promise<EntityTypeMap[T]> {
2903
2920
  try {
2904
- const entity = this._entityInstanceData(entityType, entityData, config);
2921
+ // Propagation du scope costum aux ENFANTS créés (chaîne `scope.org().project()` / parent-create
2922
+ // `parent.poi()`) : si CE parent porte un `_costumCtx` et que l'appelant n'a PAS fourni de costumCtx
2923
+ // explicite, l'enfant hérite de l'IDENTITÉ (slug/costumId/costumType = source.key) MAIS avec l'overlay
2924
+ // de champs RE-RÉSOLU pour SA collection (un projet ne reçoit pas les champs d'une org). Création
2925
+ // seulement (un load id/slug fait foi via _setData/source.key).
2926
+ let effectiveConfig = config;
2927
+ if (config.costumCtx === undefined && this._costumCtx && !this._hasAtLeastOne(entityData, ["id", "slug"])) {
2928
+ const p = this._costumCtx;
2929
+ const childCollection = entityType as unknown as Collection;
2930
+ const childCtx: CostumRuntimeContext = resolveCostumCtxFromSource(p.slug, childCollection) ?? {
2931
+ slug: p.slug, costumId: p.costumId, costumType: p.costumType, collection: childCollection,
2932
+ schema: { type: "object", additionalProperties: true, properties: {} },
2933
+ fields: [], presets: {}, hidden: [],
2934
+ };
2935
+ effectiveConfig = { ...config, costumCtx: childCtx };
2936
+ }
2937
+ const entity = this._entityInstanceData(entityType, entityData, effectiveConfig);
2905
2938
 
2906
2939
  const fetchKeysByEntity = {
2907
2940
  citoyens: ["id", "slug"],
@@ -4111,16 +4144,24 @@ export class BaseEntity<TServerData = any> {
4111
4144
  /**
4112
4145
  * Récupérer les événements d'une entitée : liste des événements de l'entité ou elle est "organizer" ou "attendee".
4113
4146
  * Constant : GET_EVENTS
4147
+ * `startDateUTC`/`endDateUTC` acceptent un `Date` ou une string ISO (un `Date` est coercé en ISO).
4148
+ * `recurrency` est typé `false` (garde parité, comme `searchEventsCostum`) : omettre (récurrents inclus
4149
+ * en mode calendrier) ou passer `false` (exclure) ; jamais `true` (le legacy `=== true` l'exclurait → divergence).
4114
4150
  * @param data - Paramètres (partiels) de recherche/pagination.
4115
4151
  * @returns - Les données de réponse.
4116
4152
  */
4117
4153
  async getEvents(
4118
- data: Partial<GetEventsData> = {},
4154
+ data: GetEventsInput = {},
4119
4155
  options?: { restoredState?: PaginatorState }
4120
4156
  ): Promise<PaginatorPage<EventEntity>> {
4121
- data.searchType = this._getDefaultFromEndpoint("GET_EVENTS", "searchType") as GetEventsData["searchType"];
4157
+ // DX : `startDateUTC`/`endDateUTC` acceptent un `Date` → coercé en ISO (un Date brut échouerait l'AJV
4158
+ // `type:string`). Cf. convention R0 de normalisation de champs.
4159
+ const finalInput: Partial<GetEventsData> = { ...(data as Partial<GetEventsData>) };
4160
+ if (data.startDateUTC instanceof Date) finalInput.startDateUTC = data.startDateUTC.toISOString();
4161
+ if (data.endDateUTC instanceof Date) finalInput.endDateUTC = data.endDateUTC.toISOString();
4162
+ finalInput.searchType = this._getDefaultFromEndpoint("GET_EVENTS", "searchType") as GetEventsData["searchType"];
4122
4163
  const paginator = this._createPaginatorEngine({
4123
- initialData: data,
4164
+ initialData: finalInput,
4124
4165
  methodName: "getEvents",
4125
4166
  restoredState: options?.restoredState,
4126
4167
  finalizer: async (finalData) => {
@@ -5257,6 +5298,66 @@ export class BaseEntity<TServerData = any> {
5257
5298
  return page;
5258
5299
  }
5259
5300
 
5301
+ /**
5302
+ * Agenda costum-aware : events scopés au costum (`source.key`) — pendant de `searchCostum` pour les events.
5303
+ * `_withCostumContext` injecte `costumSlug`/`contextId`/`contextType` + `sourceKey=[serverData.slug]` → les
5304
+ * events DU site/hôte costum (au lieu du filtre attendees/organizer FORCÉ de `getEvents`). À appeler sur
5305
+ * l'entité HÔTE du costum (ex. l'entité du déploiement). `sourceKey` surchargeable (agenda multi-sites / réseau).
5306
+ *
5307
+ * **Deux modes** (endpoint `/co2/search/agenda`), selon que tu passes une date ou non :
5308
+ *
5309
+ * 1. **CALENDRIER** — déclenché par `startDateUTC` et/ou `endDateUTC` (l'agenda d'une période) :
5310
+ * ramène **TOUT** ce qui matche la plage — ponctuels **+ récurrents** (`openingHours`, sauf `recurrency:false`) —
5311
+ * trié par **occurrence** (`startDateSort`/`startDateSortFormat` calculés côté serveur), résultat = **tableau**.
5312
+ * **Pas de pagination** serveur : une seule page (`next()`/`prev()` sans effet).
5313
+ * 2. **LISTE** — déclenché par l'**absence** de date (flux paginé) :
5314
+ * **ponctuels uniquement** (récurrents exclus), triés par `startDate` **décroissant** (plus récents d'abord),
5315
+ * paginés via `indexMin`/`indexStep` (défaut 30) — `next()`/`prev()` fonctionnent. (Backend : objet keyé `_id`,
5316
+ * hydraté en tableau d'`Event` côté lib.)
5317
+ *
5318
+ * Le scope costum (`sourceKey`) s'applique dans les **deux** modes.
5319
+ *
5320
+ * `recurrency` est typé `false` (garde parité) : **omettre** (mode calendrier → récurrents inclus) ou passer
5321
+ * `false` (exclure) ; **jamais `true`** — le legacy fait un test strict `=== true` qui exclurait les récurrents
5322
+ * (divergence), valeur donc interdite au type **et** à l'AJV.
5323
+ *
5324
+ * `startDateUTC`/`endDateUTC` acceptent un **`Date` ou une string ISO** : un `Date` est coercé en ISO
5325
+ * (`toISOString()`) avant l'envoi (le fil reste `type:string`). Évite le piège de l'ISO partielle
5326
+ * (`"2026-06-01"` n'est pas un `date-time` AJV valide).
5327
+ *
5328
+ // Mode CALENDRIER — agenda du mois, avec de vrais Date
5329
+ * const debut = new Date("2026-06-01T00:00:00Z");
5330
+ * const page = await org.searchEventsCostum({ startDateUTC: debut, endDateUTC: new Date("2026-06-30T23:59:59Z") });
5331
+ * page.results.forEach((e) => console.log(e.serverData.name, e.serverData.startDateSort));
5332
+ *
5333
+ // Mode LISTE — flux paginé (ponctuels, du plus récent)
5334
+ * let p = await org.searchEventsCostum({ indexStep: 20 });
5335
+ * if (p.hasNext) p = await p.next();
5336
+ */
5337
+ async searchEventsCostum(
5338
+ data: SearchEventsCostumInput = {},
5339
+ options?: { restoredState?: PaginatorState }
5340
+ ): Promise<PaginatorPage<EventEntity>> {
5341
+ // DX : coerce les `Date` en ISO (un objet Date échouerait la validation AJV `type:string`) — suit
5342
+ // la convention de normalisation de champs de la lib (R0 : `Date` → `toISOString()`).
5343
+ const finalInput: Partial<SearchEventsCostumData> = { ...(data as Partial<SearchEventsCostumData>) };
5344
+ if (data.startDateUTC instanceof Date) finalInput.startDateUTC = data.startDateUTC.toISOString();
5345
+ if (data.endDateUTC instanceof Date) finalInput.endDateUTC = data.endDateUTC.toISOString();
5346
+ finalInput.searchType = this._getDefaultFromEndpoint("SEARCH_EVENTS_COSTUM", "searchType") as SearchEventsCostumData["searchType"];
5347
+ const paginator = this._createPaginatorEngine({
5348
+ initialData: finalInput,
5349
+ methodName: "searchEventsCostum",
5350
+ restoredState: options?.restoredState,
5351
+ finalizer: this._withCostumContext(
5352
+ (finalData: SearchEventsCostumData) => {
5353
+ delete (finalData as { pathParams?: unknown }).pathParams;
5354
+ return this.endpointApi.searchEventsCostum(finalData);
5355
+ }
5356
+ ),
5357
+ });
5358
+ return paginator.next() as Promise<PaginatorPage<EventEntity>>;
5359
+ }
5360
+
5260
5361
  /**
5261
5362
  * @param data
5262
5363
  * Paramètres de recherche (partiels — les valeurs manquantes sont complétées
@@ -2,7 +2,7 @@
2
2
  import { ApiAuthenticationError } from "../error.js";
3
3
 
4
4
  import type ApiClient from "../ApiClient.js";
5
- import type { DocumentListData, PersonRegisterData, AuthenticateUrlData, RefreshTokenUrlData, PasswordRecoveryData, ServerExchangeTokenData, ChangePasswordData, DeleteAccountData, UpdateSettingsData, UpdateBlockDescriptionData, UpdateBlockInfoData, UpdateBlockSocialData, UpdateBlockLocalityData, UpdateBlockSlugData, CheckData, ProfilImageData, ProfilBannerData, GetElementsAboutData, MulticonnectData, GetNewsData, GetNewsByIdData, AddNewsData, AddImageNewsData, AddFileNewsData, DeleteNewsData, UpdateNewsData, ShareNewsData, GetCommentsData, AddCommentsData, DeleteCommentsData, UpdateCommentsData, SearchTagsData, ShowVoteData, GlobalAutocompleteData, CityAutocompleteData, CityAutocompleteByCountryData, SuggestionInputData, GetProjectsNoAdminData, GetProjectsAdminData, GetPoisNoAdminData, GetPoisAdminData, GetOrganizationsNoAdminData, GetOrganizationsAdminData, GetUserEligiblePlacesData, GetMembersNoAdminData, GetMembersAdminData, GetFriendsAdminData, GetSubscriptionsData, GetSubscriptionsAdminData, GetSubscribersData, GetSubscribersAdminData, GetContributorsNoAdminData, GetContributorsAdminData, GetBadgesData, GetBadgesFiltersData, ConnectData, DisconnectData, GetElementsKeyData, GetFavorisData, DeleteFavorisData, AddFavorisData, AddOrganizationData, AddProjectData, AddPoiData, AddEventData, DeleteElementData, AddImageElementData, LinkValidateData, SearchMemberAutocompleteData, GetNotificationsData, GetNotificationsCountData, NotificationUpdateData, MarkNotificationAsReadData, ActivitypubSearchData, ActivitypubLinkData, ActivitypubGetCommunityData, GetBadgeData, AddBadgesData, AssignBadgesData, GetEventsData, ShareEventsData, InviteEventData, FollowData, GetCostumJsonData, GlobalAutocompleteCostumData, NavigatorGettlData, CostumEventRequestActorsData, CostumEventRequestSubeventsData, CostumEventRequestElementEventData, CostumEventRequestCategoriesData, CostumEventRequestDatesData, CostumEventRequestEventData, CostumEventRequestLinkTlToEventData, CostumEventRequestLoadContextTagData, GetGalleryData, GetAttendeesNoAdminData, GetAttendeesAdminData, CoformAnswersSearchData, CoformAnswersByIdData, GetCoformByIdData, CoformUploadAnswerFileData, CoformGetAnswerFilesData, GetCoformCatalogsData, SaveCoformAnswerData, GetCoformAnswerHistoryData, GetCoformMultievalDataData, GetCoformCommontableContributorsData, AddVoteData, AddReportAbuseData, UpdatePathValueData, DeleteDocumentByContextData, DeleteDocumentByIdData, DemoteAdminData, CostumFilterCoformData, CostumFilterCoformByPathData, GetCountriesData, SearchZonesData, CoformAnswersByFormsData, GenerateAnswerFromFormData, FundingEnvelopeData, CoremuOperationData, CostumProjectActionRequestNewData, CostumProjectActionRequestSetStatusData, CostumProjectActionRequestSetDateData, CostumProjectActionRequestSetContributorsData, CostumProjectActionRequestCancelData, CostumProjectActionRequestArchiveData, LinkDiscourseAccountData, UnlinkDiscourseAccountData, DiscourseProfileData, DiscourseCheckEmailData, DiscourseDismissLinkData, LinkMediawikiAccountData, UnlinkMediawikiAccountData, GetMediawikiContributionsData, AddClassifiedData, PersonActivateData } from "./EndpointApi.types.js";
5
+ import type { DocumentListData, PersonRegisterData, AuthenticateUrlData, RefreshTokenUrlData, PasswordRecoveryData, ServerExchangeTokenData, ChangePasswordData, DeleteAccountData, UpdateSettingsData, UpdateBlockDescriptionData, UpdateBlockInfoData, UpdateBlockSocialData, UpdateBlockLocalityData, UpdateBlockSlugData, CheckData, ProfilImageData, ProfilBannerData, GetElementsAboutData, MulticonnectData, GetNewsData, GetNewsByIdData, AddNewsData, AddImageNewsData, AddFileNewsData, DeleteNewsData, UpdateNewsData, ShareNewsData, GetCommentsData, AddCommentsData, DeleteCommentsData, UpdateCommentsData, SearchTagsData, ShowVoteData, GlobalAutocompleteData, CityAutocompleteData, CityAutocompleteByCountryData, SuggestionInputData, GetProjectsNoAdminData, GetProjectsAdminData, GetPoisNoAdminData, GetPoisAdminData, GetOrganizationsNoAdminData, GetOrganizationsAdminData, GetUserEligiblePlacesData, GetMembersNoAdminData, GetMembersAdminData, GetFriendsAdminData, GetSubscriptionsData, GetSubscriptionsAdminData, GetSubscribersData, GetSubscribersAdminData, GetContributorsNoAdminData, GetContributorsAdminData, GetBadgesData, GetBadgesFiltersData, ConnectData, 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, InviteEventData, FollowData, GetCostumJsonData, GlobalAutocompleteCostumData, NavigatorGettlData, CostumEventRequestActorsData, CostumEventRequestSubeventsData, CostumEventRequestElementEventData, CostumEventRequestCategoriesData, CostumEventRequestDatesData, CostumEventRequestEventData, CostumEventRequestLinkTlToEventData, CostumEventRequestLoadContextTagData, GetGalleryData, GetAttendeesNoAdminData, GetAttendeesAdminData, CoformAnswersSearchData, CoformAnswersByIdData, GetCoformByIdData, CoformUploadAnswerFileData, CoformGetAnswerFilesData, GetCoformCatalogsData, SaveCoformAnswerData, GetCoformAnswerHistoryData, GetCoformMultievalDataData, GetCoformCommontableContributorsData, AddVoteData, AddReportAbuseData, UpdatePathValueData, DeleteDocumentByContextData, DeleteDocumentByIdData, DemoteAdminData, CostumFilterCoformData, CostumFilterCoformByPathData, GetCountriesData, SearchZonesData, CoformAnswersByFormsData, GenerateAnswerFromFormData, FundingEnvelopeData, CoremuOperationData, CostumProjectActionRequestNewData, CostumProjectActionRequestSetStatusData, CostumProjectActionRequestSetDateData, CostumProjectActionRequestSetContributorsData, CostumProjectActionRequestCancelData, CostumProjectActionRequestArchiveData, LinkDiscourseAccountData, UnlinkDiscourseAccountData, DiscourseProfileData, DiscourseCheckEmailData, DiscourseDismissLinkData, LinkMediawikiAccountData, UnlinkMediawikiAccountData, GetMediawikiContributionsData, AddClassifiedData, PersonActivateData } from "./EndpointApi.types.js";
6
6
 
7
7
  /**
8
8
  * Classe EndpointApi générée automatiquement depuis endpoints-copie.json
@@ -1366,6 +1366,21 @@ export class EndpointApi {
1366
1366
  return this.call("GET_EVENTS", data);
1367
1367
  }
1368
1368
 
1369
+ /**
1370
+ * Recherche d'events scopée costum (agenda) : Agenda costum-aware : events filtrés par sourceKey/costum + plage de dates. Même endpoint /co2/search/agenda que GET_EVENTS, mais surface costum (PAS le filtre attendees/organizer forcé de GET_EVENTS). Réponse = cible-co2-search-agenda.
1371
+ * Constant : SEARCH_EVENTS_COSTUM
1372
+ * @param data - Données envoyées à l'API
1373
+ * @returns Les données de réponse.
1374
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
1375
+ * @throws {Error} - En cas d'erreur inattendue.
1376
+ */
1377
+ async searchEventsCostum(data: SearchEventsCostumData): Promise<any> {
1378
+ if (!data || typeof data !== "object") {
1379
+ throw new TypeError("Le paramètre data doit être un objet.");
1380
+ }
1381
+ return this.call("SEARCH_EVENTS_COSTUM", data);
1382
+ }
1383
+
1369
1384
  /**
1370
1385
  * Partager un événement : Partage un événement avec d’autres utilisateurs ou entités.
1371
1386
  * Constant : SHARE_EVENTS