@communecter/cocolight-api-client 1.0.129 → 1.0.131

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.
@@ -2,7 +2,7 @@
2
2
  import { ApiAuthenticationError } from "../error.js";
3
3
 
4
4
  import type ApiClient from "../ApiClient.js";
5
- import type { 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, GetMembersNoAdminData, GetMembersAdminData, GetFriendsAdminData, GetSubscriptionsData, GetSubscriptionsAdminData, GetSubscribersData, GetSubscribersAdminData, GetContributorsNoAdminData, GetContributorsAdminData, GetBadgesData, GetBadgesFiltersData, ConnectData, DisconnectData, GetElementsKeyData, GetFavorisData, DeleteFavorisData, AddFavorisData, AddOrganizationData, AddProjectData, AddPoiData, AddEventData, DeletePoiData, DeleteEventData, DeleteElementData, AddImageElementData, LinkValidateData, SearchMemberAutocompleteData, GetNotificationsData, GetNotificationsCountData, NotificationUpdateData, MarkNotificationAsReadData, ActivitypubSearchData, ActivitypubLinkData, ActivitypubGetCommunityData, GetBadgeData, AddBadgesData, AssignBadgesData, GetEventsData, ShareEventsData, InviteEventData, FollowData, GetCostumJsonData, GlobalAutocompleteCostumData, CostumEventRequestActorsData, CostumEventRequestSubeventsData, CostumEventRequestElementEventData, CostumEventRequestCategoriesData, CostumEventRequestDatesData, CostumEventRequestEventData, CostumEventRequestLinkTlToEventData, CostumEventRequestLoadContextTagData, GetGalleryData, GetAttendeesNoAdminData, GetAttendeesAdminData, CoformAnswersSearchData, CoformAnswersByIdData, GetCoformByIdData, CoformUploadAnswerFileData, CoformGetAnswerFilesData, SaveCoformAnswerData, AddVoteData, AddReportAbuseData, UpdatePathValueData, DeleteDocumentByContextData, DeleteDocumentByIdData, DemoteAdminData, CostumFilterCoformData, GetCountriesData, SearchZonesData, CoformAnswersByFormsData, GenerateAnswerFromFormData, FundingEnvelopeData, CoremuOperationData, CostumProjectActionRequestNewData, LinkDiscourseAccountData, UnlinkDiscourseAccountData, DiscourseProfileData, DiscourseCheckEmailData, DiscourseDismissLinkData, LinkMediawikiAccountData, UnlinkMediawikiAccountData, GetMediawikiContributionsData, AddClassifiedData } from "./EndpointApi.types.js";
5
+ import type { 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, GetMembersNoAdminData, GetMembersAdminData, GetFriendsAdminData, GetSubscriptionsData, GetSubscriptionsAdminData, GetSubscribersData, GetSubscribersAdminData, GetContributorsNoAdminData, GetContributorsAdminData, GetBadgesData, GetBadgesFiltersData, ConnectData, DisconnectData, GetElementsKeyData, GetFavorisData, DeleteFavorisData, AddFavorisData, AddOrganizationData, AddProjectData, AddPoiData, AddEventData, DeletePoiData, DeleteEventData, DeleteElementData, AddImageElementData, LinkValidateData, SearchMemberAutocompleteData, GetNotificationsData, GetNotificationsCountData, NotificationUpdateData, MarkNotificationAsReadData, ActivitypubSearchData, ActivitypubLinkData, ActivitypubGetCommunityData, GetBadgeData, AddBadgesData, AssignBadgesData, GetEventsData, ShareEventsData, InviteEventData, FollowData, GetCostumJsonData, GlobalAutocompleteCostumData, CostumEventRequestActorsData, CostumEventRequestSubeventsData, CostumEventRequestElementEventData, CostumEventRequestCategoriesData, CostumEventRequestDatesData, CostumEventRequestEventData, CostumEventRequestLinkTlToEventData, CostumEventRequestLoadContextTagData, GetGalleryData, GetAttendeesNoAdminData, GetAttendeesAdminData, CoformAnswersSearchData, CoformAnswersByIdData, GetCoformByIdData, CoformUploadAnswerFileData, CoformGetAnswerFilesData, SaveCoformAnswerData, AddVoteData, AddReportAbuseData, UpdatePathValueData, DeleteDocumentByContextData, DeleteDocumentByIdData, DemoteAdminData, CostumFilterCoformData, GetCountriesData, SearchZonesData, CoformAnswersByFormsData, GenerateAnswerFromFormData, FundingEnvelopeData, CoremuOperationData, CostumProjectActionRequestNewData, CostumProjectActionRequestSetStatusData, CostumProjectActionRequestSetDateData, CostumProjectActionRequestSetContributorsData, CostumProjectActionRequestCancelData, CostumProjectActionRequestArchiveData, LinkDiscourseAccountData, UnlinkDiscourseAccountData, DiscourseProfileData, DiscourseCheckEmailData, DiscourseDismissLinkData, LinkMediawikiAccountData, UnlinkMediawikiAccountData, GetMediawikiContributionsData, AddClassifiedData } from "./EndpointApi.types.js";
6
6
 
7
7
  /**
8
8
  * Classe EndpointApi générée automatiquement depuis endpoints-copie.json
@@ -1920,6 +1920,86 @@ export class EndpointApi {
1920
1920
  return this.callIsConnected("COSTUM_PROJECT_ACTION_REQUEST_NEW", data);
1921
1921
  }
1922
1922
 
1923
+ /**
1924
+ * Change le statut d'une action (avec logique métier) : Change le status d'une action via l'endpoint dédié backend. Ajoute une entrée à updateStatus[], gère les tags (discuter/totest/next), auto-injecte startDate/endDate selon le status, gère tracking, envoie une notification Rocket.Chat au parent. NE PAS confondre avec UPDATE_PATH_VALUE qui bypass toute cette logique.
1925
+ * Constant : COSTUM_PROJECT_ACTION_REQUEST_SET_STATUS
1926
+ * @param data - Données envoyées à l'API
1927
+ * @returns Les données de réponse.
1928
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
1929
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
1930
+ * @throws {Error} - En cas d'erreur inattendue.
1931
+ */
1932
+ async costumProjectActionRequestSetStatus(data: CostumProjectActionRequestSetStatusData): Promise<any> {
1933
+ if (!data || typeof data !== "object") {
1934
+ throw new TypeError("Le paramètre data doit être un objet.");
1935
+ }
1936
+ return this.callIsConnected("COSTUM_PROJECT_ACTION_REQUEST_SET_STATUS", data);
1937
+ }
1938
+
1939
+ /**
1940
+ * Met à jour les dates d'une action : Met à jour startDate et/ou endDate d'une action via l'endpoint dédié. Supporte nativement l'effacement (envoyer chaîne vide → $unset). Parser de date robuste côté backend.
1941
+ * Constant : COSTUM_PROJECT_ACTION_REQUEST_SET_DATE
1942
+ * @param data - Données envoyées à l'API
1943
+ * @returns Les données de réponse.
1944
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
1945
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
1946
+ * @throws {Error} - En cas d'erreur inattendue.
1947
+ */
1948
+ async costumProjectActionRequestSetDate(data: CostumProjectActionRequestSetDateData): Promise<any> {
1949
+ if (!data || typeof data !== "object") {
1950
+ throw new TypeError("Le paramètre data doit être un objet.");
1951
+ }
1952
+ return this.callIsConnected("COSTUM_PROJECT_ACTION_REQUEST_SET_DATE", data);
1953
+ }
1954
+
1955
+ /**
1956
+ * Définit les contributeurs d'une action : Modifie links.contributors d'une action via 3 modes : (A) `contributors` array de userIds = remplace toute la liste ; (B) `contributor` + `participate=1` = ajoute un user ; (C) `contributor` + `participate=0` = retire un user. Valide les bornes `min`/`max` côté backend. Émet `.set-contributors{parentId}` et `.cd-int-contributors` aux clients socket.
1957
+ * Constant : COSTUM_PROJECT_ACTION_REQUEST_SET_CONTRIBUTORS
1958
+ * @param data - Données envoyées à l'API
1959
+ * @returns Les données de réponse.
1960
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
1961
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
1962
+ * @throws {Error} - En cas d'erreur inattendue.
1963
+ */
1964
+ async costumProjectActionRequestSetContributors(data: CostumProjectActionRequestSetContributorsData): Promise<any> {
1965
+ if (!data || typeof data !== "object") {
1966
+ throw new TypeError("Le paramètre data doit être un objet.");
1967
+ }
1968
+ return this.callIsConnected("COSTUM_PROJECT_ACTION_REQUEST_SET_CONTRIBUTORS", data);
1969
+ }
1970
+
1971
+ /**
1972
+ * Annule une action : Annule une action : status=closed + unset tracking + retire le tag 'totest'.
1973
+ * Constant : COSTUM_PROJECT_ACTION_REQUEST_CANCEL
1974
+ * @param data - Données envoyées à l'API
1975
+ * @returns Les données de réponse.
1976
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
1977
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
1978
+ * @throws {Error} - En cas d'erreur inattendue.
1979
+ */
1980
+ async costumProjectActionRequestCancel(data: CostumProjectActionRequestCancelData): Promise<any> {
1981
+ if (!data || typeof data !== "object") {
1982
+ throw new TypeError("Le paramètre data doit être un objet.");
1983
+ }
1984
+ return this.callIsConnected("COSTUM_PROJECT_ACTION_REQUEST_CANCEL", data);
1985
+ }
1986
+
1987
+ /**
1988
+ * Archive une action : Archive une action : status=disabled + unset tracking.
1989
+ * Constant : COSTUM_PROJECT_ACTION_REQUEST_ARCHIVE
1990
+ * @param data - Données envoyées à l'API
1991
+ * @returns Les données de réponse.
1992
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
1993
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
1994
+ * @throws {Error} - En cas d'erreur inattendue.
1995
+ */
1996
+ async costumProjectActionRequestArchive(data: CostumProjectActionRequestArchiveData): Promise<any> {
1997
+ if (!data || typeof data !== "object") {
1998
+ throw new TypeError("Le paramètre data doit être un objet.");
1999
+ }
2000
+ return this.callIsConnected("COSTUM_PROJECT_ACTION_REQUEST_ARCHIVE", data);
2001
+ }
2002
+
1923
2003
  /**
1924
2004
  * Interoperabilité Discourse Lié un compte : Lier un compte Discourse
1925
2005
  * Constant : LINK_DISCOURSE_ACCOUNT
@@ -5620,6 +5620,79 @@ export interface CostumProjectActionRequestNewData {
5620
5620
  }
5621
5621
 
5622
5622
 
5623
+ export interface CostumProjectActionRequestSetStatusData {
5624
+ /**
5625
+ * ID de l'action
5626
+ */
5627
+ id: string;
5628
+ /**
5629
+ * Nouveau statut. Triggers backend : 'done' set endDate=now, 'tracking' set startDate=now+tracking:true, 'discuter'/'next'/'totest' ajoutent un tag et forcent status='todo', 'todo' unset startDate/endDate, 'closed' purge les tags discuter/totest/next, 'disabled' unset tracking.
5630
+ */
5631
+ status: "todo" | "done" | "tracking" | "discuter" | "next" | "totest" | "disabled" | "closed";
5632
+ /**
5633
+ * Optionnel : userId qui effectue le changement (utilisé pour updateStatus[].author et notification RC). Par défaut session userId.
5634
+ */
5635
+ user?: string;
5636
+ [k: string]: unknown;
5637
+ }
5638
+
5639
+
5640
+ export interface CostumProjectActionRequestSetDateData {
5641
+ /**
5642
+ * ID de l'action
5643
+ */
5644
+ id: string;
5645
+ /**
5646
+ * Date de début ISO 8601, ou chaîne vide pour effacer ($unset)
5647
+ */
5648
+ startDate?: string;
5649
+ /**
5650
+ * Date de fin ISO 8601, ou chaîne vide pour effacer ($unset)
5651
+ */
5652
+ endDate?: string;
5653
+ [k: string]: unknown;
5654
+ }
5655
+
5656
+
5657
+ export interface CostumProjectActionRequestSetContributorsData {
5658
+ /**
5659
+ * ID de l'action (côté backend lu via $_POST['action'], pas 'id')
5660
+ */
5661
+ action: string;
5662
+ /**
5663
+ * Mode A : remplace la liste complète des contributeurs par cet array de userIds.
5664
+ */
5665
+ contributors?: string[];
5666
+ /**
5667
+ * Mode B/C : userId à ajouter (participate=1) ou retirer (participate=0).
5668
+ */
5669
+ contributor?: string;
5670
+ /**
5671
+ * Mode B/C : 1=join, 0=quit. Couplé avec `contributor`.
5672
+ */
5673
+ participate?: 0 | 1;
5674
+ [k: string]: unknown;
5675
+ }
5676
+
5677
+
5678
+ export interface CostumProjectActionRequestCancelData {
5679
+ /**
5680
+ * ID de l'action à annuler
5681
+ */
5682
+ id: string;
5683
+ [k: string]: unknown;
5684
+ }
5685
+
5686
+
5687
+ export interface CostumProjectActionRequestArchiveData {
5688
+ /**
5689
+ * ID de l'action à archiver
5690
+ */
5691
+ id: string;
5692
+ [k: string]: unknown;
5693
+ }
5694
+
5695
+
5623
5696
  export interface LinkDiscourseAccountData {
5624
5697
  /**
5625
5698
  * Nom d'utilisateur du compte Discourse
@@ -98,6 +98,49 @@ export function fromEntityJSON(json: unknown, parent: ApiClient | BaseEntity | n
98
98
  return meta.entityClass.fromJSON(json, actualParent, meta.deps);
99
99
  }
100
100
 
101
+ /**
102
+ * Walker récursif : parcourt un objet/tableau et ressuscite toutes les entités
103
+ * sérialisées (marqueurs `__isSerializedEntity` / `__entityTag`) rencontrées.
104
+ *
105
+ * Pensé pour les wrappers non-entité retournés par certains endpoints (ex: `fundingEnvelope`)
106
+ * ou pour réhydrater un état côté client après un transfert JSON (SSR, cache restore).
107
+ *
108
+ * Dates, RegExp et primitives sont préservées. Pour les entités, la chaîne de parents
109
+ * est reconstruite automatiquement depuis les méta embarquées par `toJSON()`.
110
+ *
111
+ * @param obj - L'objet à parcourir (wrapper, array, primitive…)
112
+ * @param parent - Parent racine (typiquement l'ApiClient côté client)
113
+ * @returns L'objet avec toutes les entités revived
114
+ *
115
+ * @example
116
+ * // Côté client SSR : revive l'état dehydraté
117
+ * const apiClient = new ApiClient({ baseURL });
118
+ * const envelope = reviveEntities(window.__INIT__.envelope, apiClient);
119
+ * envelope.projects[0].serverData.actions[0]; // Action instance
120
+ */
121
+ export function reviveEntities<T = unknown>(
122
+ obj: unknown,
123
+ parent: ApiClient | BaseEntity | null = null
124
+ ): T {
125
+ if (obj === null || obj === undefined) return obj as T;
126
+ if (typeof obj !== "object") return obj as T;
127
+ if (obj instanceof Date || obj instanceof RegExp) return obj as T;
128
+
129
+ if (isEntityJSON(obj)) {
130
+ return fromEntityJSON(obj, parent) as T;
131
+ }
132
+
133
+ if (Array.isArray(obj)) {
134
+ return obj.map(item => reviveEntities(item, parent)) as T;
135
+ }
136
+
137
+ const result: Record<string, unknown> = {};
138
+ for (const [key, value] of Object.entries(obj as object)) {
139
+ result[key] = reviveEntities(value, parent);
140
+ }
141
+ return result as T;
142
+ }
143
+
101
144
  /**
102
145
  * Mappe un EntityTag vers son CollectionKey correspondant.
103
146
  */
@@ -478,12 +478,14 @@ export class Organization extends BaseEntity<OrganizationItemNormalized> {
478
478
  throw new ApiError("L'organisation n'a pas d'ID, impossible de mettre à jour les horaires d'ouverture.", 400);
479
479
  }
480
480
 
481
- return this.endpointApi.updatePathValue({
481
+ const result = await this.endpointApi.updatePathValue({
482
482
  id: this.id,
483
483
  collection: "organizations",
484
484
  path: "openingHours",
485
485
  value: hours as unknown as { [k: string]: unknown }
486
486
  });
487
+ await this._refreshIfDirect();
488
+ return result;
487
489
  }
488
490
 
489
491
  /**
@@ -362,6 +362,20 @@ export class Project extends BaseEntity<ProjectItemNormalized> {
362
362
  return super.news(newsData);
363
363
  }
364
364
 
365
+ /**
366
+ * Vérifie qu'un milestoneId existe dans `serverData.oceco.milestones[]`.
367
+ * Sert à valider une référence avant d'attacher une entité (Action) à un milestone.
368
+ *
369
+ * @param milestoneId - L'ID du milestone à chercher.
370
+ * @returns `true` si trouvé, `false` sinon (y compris si oceco/milestones absents).
371
+ */
372
+ hasMilestone(milestoneId: string): boolean {
373
+ if (typeof milestoneId !== "string" || milestoneId.length === 0) return false;
374
+ const milestones = (this.serverData.oceco as { milestones?: Array<{ milestoneId?: string }> } | undefined)?.milestones;
375
+ if (!Array.isArray(milestones)) return false;
376
+ return milestones.some(m => m?.milestoneId === milestoneId);
377
+ }
378
+
365
379
  /**
366
380
  * {@inheritDoc BaseEntity#action}
367
381
  *