@communecter/cocolight-api-client 1.0.190 → 1.0.192
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/4686.cocolight-api-client.browser.js +1 -0
- package/dist/4686.cocolight-api-client.cjs +1 -0
- package/dist/cocolight-api-client.browser.js +2 -2
- package/dist/cocolight-api-client.cjs +1 -1
- package/dist/cocolight-api-client.vite.mjs.js +1 -1
- package/dist/cocolight-api-client.vite.mjs.js.map +1 -1
- package/package.json +1 -1
- package/types/ApiClient.d.ts +62 -1
- package/types/api/BaseEntity.d.ts +81 -14
- package/types/api/EndpointApi.types.d.ts +292 -4
- package/types/api/User.d.ts +12 -0
- package/types/api/UserApi.d.ts +19 -1
- package/types/costum/schemas/associationEkilibre.d.ts +3 -0
- package/types/costum/types.d.ts +52 -1
- package/types/endpoints.module.d.ts +1359 -631
package/package.json
CHANGED
package/types/ApiClient.d.ts
CHANGED
|
@@ -42,6 +42,23 @@ export interface ApiClientOptions {
|
|
|
42
42
|
* un artefact périmé masque indéfiniment les champs réels. Contrepartie : plus de démarrage à froid.
|
|
43
43
|
*/
|
|
44
44
|
costumForceLive?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Identité costum du SITE APPELANT (l'entité qui porte le costum servi par ce front).
|
|
47
|
+
* C'est le pendant client de `Costum::init` côté legacy : posée UNE fois, elle est injectée
|
|
48
|
+
* automatiquement dans le payload de tout endpoint dont le contrat déclare `costumSlug`
|
|
49
|
+
* (cf. `setSiteCostum`). À ne pas confondre avec le scope d'une ENTITÉ (`BaseEntity.setCostumScope`),
|
|
50
|
+
* qui décrit la provenance/l'autorité d'un élément — ici on décrit QUI APPELLE, pas QUI EST VISÉ.
|
|
51
|
+
*/
|
|
52
|
+
siteCostum?: SiteCostumContext | null;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Identité costum du site appelant. `slug` = slug de l'ENTITÉ PORTEUSE (ex. `navigatorDesTierslieux`),
|
|
56
|
+
* jamais celui du moteur (`costumize`) : c'est ce slug qui est la clé de cache costum du legacy.
|
|
57
|
+
*/
|
|
58
|
+
export interface SiteCostumContext {
|
|
59
|
+
slug: string;
|
|
60
|
+
costumId?: string;
|
|
61
|
+
costumType?: string;
|
|
45
62
|
}
|
|
46
63
|
/**
|
|
47
64
|
* Structure des données pour les appels d'endpoint
|
|
@@ -102,7 +119,51 @@ export default class ApiClient extends EventEmitter {
|
|
|
102
119
|
private _refreshToken;
|
|
103
120
|
private _setUserId;
|
|
104
121
|
private _mode;
|
|
105
|
-
|
|
122
|
+
/** Contexte costum du SITE appelant, injecté sur les endpoints qui le déclarent (cf. setSiteCostum). */
|
|
123
|
+
private _siteCostum;
|
|
124
|
+
constructor({ baseURL, accessToken, refreshToken, refreshUrl, endpoints, timeout, debug, maxRetries, circuitBreakerThreshold, circuitBreakerResetTime, fromJSONValue, mode, tokenStorageStrategy, costumForceLive, siteCostum }: ApiClientOptions);
|
|
125
|
+
/**
|
|
126
|
+
* Déclare l'identité costum du SITE APPELANT — l'entité au nom de laquelle ce front agit.
|
|
127
|
+
*
|
|
128
|
+
* POURQUOI. Le legacy ne sait de quel costum vient une action que par `$_POST["costumSlug"]` :
|
|
129
|
+
* `CommunecterController::beforeAction` → `costumCacheParams()` réchauffe alors le cache costum
|
|
130
|
+
* AVANT l'action, et `Mail::getCustomMail`/`Mail::getAppName` y lisent le domaine (`costum.host`),
|
|
131
|
+
* le titre, le logo et l'expéditeur de l'e-mail, tandis que `Cron::save` y stampe `source.key`.
|
|
132
|
+
* Historiquement ce contexte venait du DOMAINE servi par le legacy lui-même ; dès lors que le
|
|
133
|
+
* domaine d'un costum pointe sur un front autonome, plus rien ne le porte — d'où cette déclaration.
|
|
134
|
+
*
|
|
135
|
+
* PORTÉE. Posée une fois (au démarrage du front), elle est injectée automatiquement dans le payload
|
|
136
|
+
* de **tout endpoint dont le contrat déclare `costumSlug`** — le contrat sert de liste blanche, donc
|
|
137
|
+
* aucun endpoint de recherche ou d'upload n'est pollué. Une valeur explicite passée par l'appelant,
|
|
138
|
+
* ou une enveloppe costum d'entité ({@link BaseEntity.setCostumScope}), restent prioritaires.
|
|
139
|
+
*
|
|
140
|
+
* NE PAS CONFONDRE avec le scope d'une ENTITÉ : celui-ci dit de quel costum PROVIENT un élément
|
|
141
|
+
* (son `source.key`, qui fait autorité pour l'ÉDITER) ; celui-là dit qui APPELLE. Pour brander un
|
|
142
|
+
* e-mail c'est l'appelant qui compte — une organisation créée sous le costum « meir » et invitée
|
|
143
|
+
* depuis le site « institutBleu » doit produire un e-mail « institutBleu ».
|
|
144
|
+
*
|
|
145
|
+
* @param slug slug de l'ENTITÉ PORTEUSE du costum (ex. `navigatorDesTierslieux`), jamais celui du
|
|
146
|
+
* moteur (`costumize`) : c'est la clé de cache costum du legacy.
|
|
147
|
+
* @param opts `costumId`/`costumType` = `contextId`/`contextType` de l'entité porteuse (facultatifs).
|
|
148
|
+
*/
|
|
149
|
+
setSiteCostum(slug: string | null, opts?: {
|
|
150
|
+
costumId?: string;
|
|
151
|
+
costumType?: string;
|
|
152
|
+
}): void;
|
|
153
|
+
/** Identité costum du site appelant, ou `null` si ce client n'agit au nom d'aucun costum. */
|
|
154
|
+
getSiteCostum(): {
|
|
155
|
+
costumSlug: string;
|
|
156
|
+
costumId?: string;
|
|
157
|
+
costumType?: string;
|
|
158
|
+
} | null;
|
|
159
|
+
/**
|
|
160
|
+
* L'endpoint porte-t-il le marqueur `costumContext: "request"` du contrat — c.-à-d. reçoit-il
|
|
161
|
+
* automatiquement l'identité costum du site (cf. {@link setSiteCostum}) ?
|
|
162
|
+
* Exposé pour qu'un front qui construit lui-même un payload (`callEndpoint` brut) sache s'il doit y
|
|
163
|
+
* poser le trio à la main, SANS avoir à deviner depuis le schéma : 65 endpoints déclarent `costumSlug`
|
|
164
|
+
* avec un sens métier, seuls les endpoints marqués sont concernés.
|
|
165
|
+
*/
|
|
166
|
+
hasCostumContext(constant: string): boolean;
|
|
106
167
|
/**
|
|
107
168
|
* Sets the access token for the API client and updates the authorization header.
|
|
108
169
|
*/
|
|
@@ -1712,8 +1712,9 @@ export declare class BaseEntity<TServerData = any> {
|
|
|
1712
1712
|
* Récupérer les événements d'une entitée : liste des événements de l'entité ou elle est "organizer" ou "attendee".
|
|
1713
1713
|
* Constant : GET_EVENTS
|
|
1714
1714
|
* `startDateUTC`/`endDateUTC` acceptent un `Date` ou une string ISO (un `Date` est coercé en ISO).
|
|
1715
|
-
* `recurrency`
|
|
1716
|
-
*
|
|
1715
|
+
* `recurrency` (booléen) : omettre ou `true` = récurrents inclus, `false` = exclus — fiable sur les deux
|
|
1716
|
+
* serveurs depuis le 2026-09-04 (parse booléen legacy + miroir Node). Mode LISTE (sans date) : mêmes
|
|
1717
|
+
* paramètres optionnels `from`/`to`/`order` que `searchEventsCostum` (voir sa doc).
|
|
1717
1718
|
* @param data - Paramètres (partiels) de recherche/pagination.
|
|
1718
1719
|
* @returns - Les données de réponse.
|
|
1719
1720
|
*/
|
|
@@ -1892,6 +1893,54 @@ export declare class BaseEntity<TServerData = any> {
|
|
|
1892
1893
|
* court-circuiter sur ce test.
|
|
1893
1894
|
*/
|
|
1894
1895
|
hasCostumScope(): boolean;
|
|
1896
|
+
/**
|
|
1897
|
+
* Contexte costum de REQUÊTE de cette entité — `{costumSlug, costumId?, costumType?}` ou `undefined`.
|
|
1898
|
+
* Sert à BRANDER l'action côté serveur : le legacy lit `costumSlug` dans `$_POST`
|
|
1899
|
+
* (`CommunecterController::beforeAction` → `costumCacheParams()`), ce qui réchauffe le cache costum
|
|
1900
|
+
* AVANT l'action et donne son domaine/titre/logo/expéditeur à l'e-mail émis.
|
|
1901
|
+
*
|
|
1902
|
+
* ⚠ NE LIT QUE `_adminScope`, jamais `_costumCtx` — et c'est la question centrale du sujet.
|
|
1903
|
+
* Les deux ne disent pas la même chose : `_costumCtx` est la PROVENANCE de l'entité, re-dérivée de
|
|
1904
|
+
* `source.key` à chaque `_setData` (donc à chaque refresh), c'est-à-dire le costum qui a CRÉÉ
|
|
1905
|
+
* l'élément ; `_adminScope`, posé par `setCostumScope`, dit « j'agis délibérément au nom de CE
|
|
1906
|
+
* costum » et survit aux ré-hydratations. Pour brander un e-mail c'est l'APPELANT qui compte, pas
|
|
1907
|
+
* la provenance de la cible. Mesuré : 7 des 19 sites ont un porteur de provenance étrangère (l'org
|
|
1908
|
+
* hôte `institutBleu` porte `source.key:"meir"`) — lire `_costumCtx` ferait partir l'e-mail branché
|
|
1909
|
+
* « meir », et comme l'enveloppe l'emporte sur le défaut du client, ce serait PIRE que de ne rien
|
|
1910
|
+
* poser. Sans scope explicite on ne renvoie donc rien, et `ApiClient.setSiteCostum` — le costum du
|
|
1911
|
+
* SITE, la bonne réponse dans le cas nominal — s'applique.
|
|
1912
|
+
*
|
|
1913
|
+
* Ne lève JAMAIS et n'exige pas une identité complète (contrairement à `_requireCostumCtx`) : ses
|
|
1914
|
+
* appelants (invitation, connect, follow, commentaire, news…) doivent fonctionner hors costum.
|
|
1915
|
+
*
|
|
1916
|
+
* @internal Public par nécessité : `User` lit le contexte de SON PARENT (`this.parent`), ce qu'un
|
|
1917
|
+
* membre `protected` interdit (accès inter-instances).
|
|
1918
|
+
*/
|
|
1919
|
+
_costumRequestContext(): {
|
|
1920
|
+
costumSlug: string;
|
|
1921
|
+
costumId?: string;
|
|
1922
|
+
costumType?: string;
|
|
1923
|
+
} | undefined;
|
|
1924
|
+
/**
|
|
1925
|
+
* Pose l'enveloppe costum (canal Symbol) sur un payload de requête, SI un contexte est disponible.
|
|
1926
|
+
*
|
|
1927
|
+
* POURQUOI, alors que `ApiClient.setSiteCostum` suffit au cas nominal (un front dédié à UN costum) :
|
|
1928
|
+
* l'enveloppe permet d'AGIR AU NOM d'un costum PRÉCIS, choisi par l'appelant (`setCostumScope`), et
|
|
1929
|
+
* elle est PRIORITAIRE sur le défaut du client — c'est ce qu'il faut pour un back-office multi-sites,
|
|
1930
|
+
* ou pour une action déclenchée sur un élément d'un autre costum que celui du front. Sans contexte :
|
|
1931
|
+
* on ne pose rien (comportement historique, non régressif — le défaut du client s'applique alors).
|
|
1932
|
+
*
|
|
1933
|
+
* `properties` reste vide : aucun champ DATA costum ici, seulement le CONTEXTE (cf. `symbol.ts`).
|
|
1934
|
+
*
|
|
1935
|
+
* @param payload Payload muté en place (le Symbol est invisible pour `Object.keys`/AJV/le wire).
|
|
1936
|
+
* @param ctx Contexte à poser ; par défaut celui de CETTE entité.
|
|
1937
|
+
* @protected
|
|
1938
|
+
*/
|
|
1939
|
+
protected _stampCostumEnvelope<T extends object>(payload: T, ctx?: {
|
|
1940
|
+
costumSlug: string;
|
|
1941
|
+
costumId?: string;
|
|
1942
|
+
costumType?: string;
|
|
1943
|
+
} | undefined): T;
|
|
1895
1944
|
/**
|
|
1896
1945
|
* Pose EXPLICITEMENT le scope costum de l'entité — l'API OFFICIELLE pour rattacher une entité
|
|
1897
1946
|
* HÔTE de costum (qui n'a pas de `source.key` : c'est elle la source, la lib ne lui auto-dérive
|
|
@@ -2556,19 +2605,32 @@ export declare class BaseEntity<TServerData = any> {
|
|
|
2556
2605
|
* **Deux modes** (endpoint `/co2/search/agenda`), selon que tu passes une date ou non :
|
|
2557
2606
|
*
|
|
2558
2607
|
* 1. **CALENDRIER** — déclenché par `startDateUTC` et/ou `endDateUTC` (l'agenda d'une période) :
|
|
2559
|
-
* ramène **TOUT** ce qui matche la plage — ponctuels **+ récurrents** (`openingHours`, sauf `recurrency:false`)
|
|
2560
|
-
* trié par **occurrence** (`startDateSort
|
|
2561
|
-
* **Pas de pagination** serveur :
|
|
2562
|
-
*
|
|
2563
|
-
*
|
|
2564
|
-
*
|
|
2565
|
-
*
|
|
2608
|
+
* ramène **TOUT** ce qui matche la plage — ponctuels **+ récurrents** (`openingHours`, sauf `recurrency:false`),
|
|
2609
|
+
* chaque récurrent **déplié en une ligne par occurrence** — trié par **occurrence** (`startDateSort`/
|
|
2610
|
+
* `startDateSortFormat` calculés côté serveur), résultat = **tableau**. **Pas de pagination** serveur :
|
|
2611
|
+
* une seule page (`next()`/`prev()` sans effet). Pour une GRILLE (mois/semaine/jour).
|
|
2612
|
+
* 2. **LISTE** — déclenché par l'**absence** de date (flux paginé, `indexMin`/`indexStep`, `next()`/`prev()`) :
|
|
2613
|
+
* ponctuels **+ récurrents** (depuis le legacy 14c2caa1, **une ligne par récurrent** portant sa PROCHAINE
|
|
2614
|
+
* occurrence dans `startDateSort`/`startDateSortFormat`), résultat = **tableau**. Par défaut trié par
|
|
2615
|
+
* occurrence **décroissant** et **non borné** : la 1re page contient les events les plus LOINTAINS.
|
|
2616
|
+
* Trois paramètres **optionnels** (legacy 2026-09-04, miroir Node) rendent ce mode utilisable pour
|
|
2617
|
+
* « les prochains » :
|
|
2618
|
+
* - `from` (Date ou ISO) : borne basse « pas encore terminé à from » (ponctuel : `endDate ≥ from` sinon
|
|
2619
|
+
* `startDate ≥ from` ; récurrent : prochaine occurrence calculée DEPUIS `from`, un créneau en cours reste
|
|
2620
|
+
* servi). C'est aussi l'**ancre** de la pagination : `next()` rejoue la même valeur, la clé de tri des
|
|
2621
|
+
* récurrents ne bouge pas entre deux pages — passe donc un instant figé, pas `new Date()` à chaque appel.
|
|
2622
|
+
* - `to` (Date ou ISO) : borne haute stricte sur la clé d'occurrence.
|
|
2623
|
+
* - `order` : `"asc"` | `"desc"` (défaut `"desc"`).
|
|
2624
|
+
* Dès qu'un des trois est présent, chaque ligne porte **`endDateSortFormat`** (fin d'occurrence calculée
|
|
2625
|
+
* serveur, dans le fuseau de l'événement ; `null` sans fin connue) — ne PAS la recalculer côté client.
|
|
2626
|
+
* Sans eux, la réponse est strictement celle d'avant (aucune clé nouvelle).
|
|
2627
|
+
* « Les prochains » = `{ from: now, order: "asc" }` · « Les passés » = `{ to: now, order: "desc", recurrency: false }`.
|
|
2566
2628
|
*
|
|
2567
2629
|
* Le scope costum (`sourceKey`) s'applique dans les **deux** modes.
|
|
2568
2630
|
*
|
|
2569
|
-
* `recurrency`
|
|
2570
|
-
*
|
|
2571
|
-
*
|
|
2631
|
+
* `recurrency` (booléen) : omettre ou `true` = récurrents inclus, `false` = exclus (en LISTE, la requête des
|
|
2632
|
+
* récurrents est sautée). Fiable sur les deux serveurs depuis le 2026-09-04 (parse booléen legacy + miroir
|
|
2633
|
+
* Node) — l'ancienne garde `const:false` du contrat est levée.
|
|
2572
2634
|
*
|
|
2573
2635
|
* `startDateUTC`/`endDateUTC` acceptent un **`Date` ou une string ISO** : un `Date` est coercé en ISO
|
|
2574
2636
|
* (`toISOString()`) avant l'envoi (le fil reste `type:string`). Évite le piège de l'ISO partielle
|
|
@@ -2579,9 +2641,14 @@ export declare class BaseEntity<TServerData = any> {
|
|
|
2579
2641
|
* const page = await org.searchEventsCostum({ startDateUTC: debut, endDateUTC: new Date("2026-06-30T23:59:59Z") });
|
|
2580
2642
|
* page.results.forEach((e) => console.log(e.serverData.name, e.serverData.startDateSort));
|
|
2581
2643
|
*
|
|
2582
|
-
// Mode LISTE —
|
|
2583
|
-
*
|
|
2644
|
+
// Mode LISTE — les prochains à partir de maintenant (en cours compris), une ligne par récurrent
|
|
2645
|
+
* const now = new Date(); // ancre figée, rejouée par next()
|
|
2646
|
+
* let p = await org.searchEventsCostum({ indexStep: 20, from: now, order: "asc" });
|
|
2647
|
+
* p.results.forEach((e) => console.log(e.serverData.startDateSortFormat, e.serverData.endDateSortFormat));
|
|
2584
2648
|
* if (p.hasNext) p = await p.next();
|
|
2649
|
+
*
|
|
2650
|
+
// Mode LISTE — les passés, du plus récent, sans récurrent
|
|
2651
|
+
* const passes = await org.searchEventsCostum({ indexStep: 20, to: now, order: "desc", recurrency: false });
|
|
2585
2652
|
*/
|
|
2586
2653
|
searchEventsCostum(data?: SearchEventsCostumInput, options?: {
|
|
2587
2654
|
restoredState?: PaginatorState;
|