@communecter/cocolight-api-client 1.0.173 → 1.0.180

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.
@@ -79,6 +79,21 @@ export interface PasswordRecoveryData {
79
79
  type: "password";
80
80
  [k: string]: unknown;
81
81
  }
82
+ export interface PasswordResetData {
83
+ /**
84
+ * Identifiant (_id) du compte, extrait du lien de récupération
85
+ */
86
+ user: string;
87
+ /**
88
+ * Code de récupération, extrait du lien (usage unique, expire au bout de 24 h)
89
+ */
90
+ code: string;
91
+ /**
92
+ * Nouveau mot de passe (8 caractères minimum — même règle que CHANGE_PASSWORD)
93
+ */
94
+ newPassword: string;
95
+ [k: string]: unknown;
96
+ }
82
97
  export interface ServerExchangeTokenData {
83
98
  /**
84
99
  * URL du serveur distant
@@ -494,6 +509,13 @@ export interface MulticonnectData {
494
509
  };
495
510
  [k: string]: unknown;
496
511
  }
512
+ export interface RelaunchInvitationData {
513
+ /**
514
+ * _id du compte invité à relancer
515
+ */
516
+ id: string;
517
+ [k: string]: unknown;
518
+ }
497
519
  export interface GetNewsData {
498
520
  /**
499
521
  * Limite de date timestamp ou 0
@@ -1155,15 +1177,15 @@ export interface GetProjectsNoAdminData {
1155
1177
  */
1156
1178
  countType: "projects"[];
1157
1179
  /**
1158
- * Flag pour ne pas filtrer sur une clé de source spécifique
1180
+ * Périmètre RÉSEAU. PRÉSENT (quelle que soit sa valeur) = le filtrage par sourceKey est désactivé ; ABSENT = `sourceKey` s'applique. La garde serveur est un `empty()` (SearchNew.php:999) : en x-www-form-urlencoded un `false` part en chaîne "false", qui n'est pas vide — envoyer `false` désactiverait donc le périmètre, comme `true`. Sans `default` au contrat : le défaut historique (réseau) est posé par le finalizer, seul endroit d'où la clé peut aussi être OMISE.
1159
1181
  */
1160
- notSourceKey: true;
1182
+ notSourceKey?: boolean;
1183
+ /**
1184
+ * Périmètre(s) costum. Le serveur en fait `$or[ source.keys ∈, reference.costum ∈ ]` (SearchNew::searchSourceKey) — les deux voies de rattachement comptent. N'a d'effet que si `notSourceKey` est ABSENT du corps.
1185
+ */
1186
+ sourceKey?: string[];
1161
1187
  filters: {
1162
- $or?: Record<string, unknown>;
1163
- /**
1164
- * This interface was referenced by `undefined`'s JSON-Schema definition
1165
- * via the `patternProperty` "^links\.contributors\.(?:[a-f0-9]{24}|@\w+)$".
1166
- */
1188
+ $or: {};
1167
1189
  [k: string]: unknown;
1168
1190
  };
1169
1191
  /**
@@ -1233,15 +1255,15 @@ export interface GetProjectsAdminData {
1233
1255
  */
1234
1256
  countType: "projects"[];
1235
1257
  /**
1236
- * Flag pour ne pas filtrer sur une clé de source spécifique
1258
+ * Périmètre RÉSEAU. PRÉSENT (quelle que soit sa valeur) = le filtrage par sourceKey est désactivé ; ABSENT = `sourceKey` s'applique. La garde serveur est un `empty()` (SearchNew.php:999) : en x-www-form-urlencoded un `false` part en chaîne "false", qui n'est pas vide — envoyer `false` désactiverait donc le périmètre, comme `true`. Sans `default` au contrat : le défaut historique (réseau) est posé par le finalizer, seul endroit d'où la clé peut aussi être OMISE.
1237
1259
  */
1238
- notSourceKey: true;
1260
+ notSourceKey?: boolean;
1261
+ /**
1262
+ * Périmètre(s) costum. Le serveur en fait `$or[ source.keys ∈, reference.costum ∈ ]` (SearchNew::searchSourceKey) — les deux voies de rattachement comptent. N'a d'effet que si `notSourceKey` est ABSENT du corps.
1263
+ */
1264
+ sourceKey?: string[];
1239
1265
  filters: {
1240
- $or?: Record<string, unknown>;
1241
- /**
1242
- * This interface was referenced by `undefined`'s JSON-Schema definition
1243
- * via the `patternProperty` "^links\.contributors\.(?:[a-f0-9]{24}|@(?:\{[^}]+\}|[A-Za-z0-9_]+(?:\.[A-Za-z0-9_]+)?))$".
1244
- */
1266
+ $or: {};
1245
1267
  [k: string]: unknown;
1246
1268
  };
1247
1269
  /**
@@ -1322,17 +1344,15 @@ export interface GetPoisNoAdminData {
1322
1344
  */
1323
1345
  countType: "poi"[];
1324
1346
  /**
1325
- * Flag pour ne pas filtrer sur une clé de source spécifique
1347
+ * Périmètre RÉSEAU. PRÉSENT (quelle que soit sa valeur) = le filtrage par sourceKey est désactivé ; ABSENT = `sourceKey` s'applique. La garde serveur est un `empty()` (SearchNew.php:999) : en x-www-form-urlencoded un `false` part en chaîne "false", qui n'est pas vide — envoyer `false` désactiverait donc le périmètre, comme `true`. Sans `default` au contrat : le défaut historique (réseau) est posé par le finalizer, seul endroit d'où la clé peut aussi être OMISE.
1326
1348
  */
1327
- notSourceKey: true;
1349
+ notSourceKey?: boolean;
1350
+ /**
1351
+ * Périmètre(s) costum. Le serveur en fait `$or[ source.keys ∈, reference.costum ∈ ]` (SearchNew::searchSourceKey) — les deux voies de rattachement comptent. N'a d'effet que si `notSourceKey` est ABSENT du corps.
1352
+ */
1353
+ sourceKey?: string[];
1328
1354
  filters: {
1329
- /**
1330
- * This interface was referenced by `undefined`'s JSON-Schema definition
1331
- * via the `patternProperty` "^parent\.(?:[a-f0-9]{24}|@\w+)$".
1332
- */
1333
- [k: string]: {
1334
- $exists: true;
1335
- };
1355
+ [k: string]: unknown;
1336
1356
  };
1337
1357
  /**
1338
1358
  * Localité vide ou spécifique
@@ -1401,17 +1421,15 @@ export interface GetPoisAdminData {
1401
1421
  */
1402
1422
  countType: "poi"[];
1403
1423
  /**
1404
- * Flag pour ne pas filtrer sur une clé de source spécifique
1424
+ * Périmètre RÉSEAU. PRÉSENT (quelle que soit sa valeur) = le filtrage par sourceKey est désactivé ; ABSENT = `sourceKey` s'applique. La garde serveur est un `empty()` (SearchNew.php:999) : en x-www-form-urlencoded un `false` part en chaîne "false", qui n'est pas vide — envoyer `false` désactiverait donc le périmètre, comme `true`. Sans `default` au contrat : le défaut historique (réseau) est posé par le finalizer, seul endroit d'où la clé peut aussi être OMISE.
1405
1425
  */
1406
- notSourceKey: true;
1426
+ notSourceKey?: boolean;
1427
+ /**
1428
+ * Périmètre(s) costum. Le serveur en fait `$or[ source.keys ∈, reference.costum ∈ ]` (SearchNew::searchSourceKey) — les deux voies de rattachement comptent. N'a d'effet que si `notSourceKey` est ABSENT du corps.
1429
+ */
1430
+ sourceKey?: string[];
1407
1431
  filters: {
1408
- /**
1409
- * This interface was referenced by `undefined`'s JSON-Schema definition
1410
- * via the `patternProperty` "^parent\.(?:[a-f0-9]{24}|@(?:\{[^}]+\}|[A-Za-z0-9_]+(?:\.[A-Za-z0-9_]+)?))$".
1411
- */
1412
- [k: string]: {
1413
- $exists: true;
1414
- };
1432
+ [k: string]: unknown;
1415
1433
  };
1416
1434
  /**
1417
1435
  * Localité vide ou spécifique
@@ -1674,10 +1692,16 @@ export interface GetOrganizationsNoAdminData {
1674
1692
  */
1675
1693
  countType: ("NGO" | "Cooperative" | "LocalBusiness" | "Group" | "GovernmentOrganization")[];
1676
1694
  /**
1677
- * Flag pour ne pas filtrer sur une clé de source spécifique
1695
+ * Périmètre RÉSEAU. PRÉSENT (quelle que soit sa valeur) = le filtrage par sourceKey est désactivé ; ABSENT = `sourceKey` s'applique. La garde serveur est un `empty()` (SearchNew.php:999) : en x-www-form-urlencoded un `false` part en chaîne "false", qui n'est pas vide — envoyer `false` désactiverait donc le périmètre, comme `true`. Sans `default` au contrat : le défaut historique (réseau) est posé par le finalizer, seul endroit d'où la clé peut aussi être OMISE.
1678
1696
  */
1679
- notSourceKey: true;
1680
- filters: {};
1697
+ notSourceKey?: boolean;
1698
+ /**
1699
+ * Périmètre(s) costum. Le serveur en fait `$or[ source.keys ∈, reference.costum ∈ ]` (SearchNew::searchSourceKey) — les deux voies de rattachement comptent. N'a d'effet que si `notSourceKey` est ABSENT du corps.
1700
+ */
1701
+ sourceKey?: string[];
1702
+ filters: {
1703
+ [k: string]: unknown;
1704
+ };
1681
1705
  /**
1682
1706
  * Localité vide ou spécifique
1683
1707
  */
@@ -1745,9 +1769,13 @@ export interface GetOrganizationsAdminData {
1745
1769
  */
1746
1770
  countType: ("NGO" | "Cooperative" | "LocalBusiness" | "Group" | "GovernmentOrganization")[];
1747
1771
  /**
1748
- * Flag pour ne pas filtrer sur une clé de source spécifique
1772
+ * Périmètre RÉSEAU. PRÉSENT (quelle que soit sa valeur) = le filtrage par sourceKey est désactivé ; ABSENT = `sourceKey` s'applique. La garde serveur est un `empty()` (SearchNew.php:999) : en x-www-form-urlencoded un `false` part en chaîne "false", qui n'est pas vide — envoyer `false` désactiverait donc le périmètre, comme `true`. Sans `default` au contrat : le défaut historique (réseau) est posé par le finalizer, seul endroit d'où la clé peut aussi être OMISE.
1749
1773
  */
1750
- notSourceKey: true;
1774
+ notSourceKey?: boolean;
1775
+ /**
1776
+ * Périmètre(s) costum. Le serveur en fait `$or[ source.keys ∈, reference.costum ∈ ]` (SearchNew::searchSourceKey) — les deux voies de rattachement comptent. N'a d'effet que si `notSourceKey` est ABSENT du corps.
1777
+ */
1778
+ sourceKey?: string[];
1751
1779
  filters: {
1752
1780
  [k: string]: unknown;
1753
1781
  };
@@ -1820,9 +1848,13 @@ export interface GetUserEligiblePlacesData {
1820
1848
  */
1821
1849
  countType?: string[];
1822
1850
  /**
1823
- * true = désactive le filtrage automatique par sourceKey du contexte (cf. SearchNew.php). Configurable dynamiquement selon la config du finder du formulaire.
1851
+ * Périmètre RÉSEAU. PRÉSENT (quelle que soit sa valeur) = le filtrage par sourceKey est désactivé ; ABSENT = `sourceKey` s'applique. La garde serveur est un `empty()` (SearchNew.php:999) : en x-www-form-urlencoded un `false` part en chaîne "false", qui n'est pas vide — envoyer `false` désactiverait donc le périmètre, comme `true`. Sans `default` au contrat : le défaut historique (réseau) est posé par le finalizer, seul endroit d'où la clé peut aussi être OMISE.
1852
+ */
1853
+ notSourceKey?: boolean;
1854
+ /**
1855
+ * Périmètre(s) costum. Le serveur en fait `$or[ source.keys ∈, reference.costum ∈ ]` (SearchNew::searchSourceKey) — les deux voies de rattachement comptent. N'a d'effet que si `notSourceKey` est ABSENT du corps.
1824
1856
  */
1825
- notSourceKey: boolean;
1857
+ sourceKey?: string[];
1826
1858
  /**
1827
1859
  * Filtres MongoDB arbitraires : tags, source.key, links.members.{id}, etc. Les valeurs peuvent être une string (match exact), un tableau (any-of), ou un objet ($exists/$in/$ne/etc).
1828
1860
  */
@@ -2727,6 +2759,39 @@ export interface ConnectData {
2727
2759
  connectType: "admin" | "member" | "contributor" | "attendee" | "friend" | "connect";
2728
2760
  [k: string]: unknown;
2729
2761
  }
2762
+ export interface CreateInvitationLinkData {
2763
+ /**
2764
+ * Type de l'élément cible
2765
+ */
2766
+ targetType: "organizations" | "projects" | "events";
2767
+ /**
2768
+ * _id de l'élément cible
2769
+ */
2770
+ targetId: string;
2771
+ /**
2772
+ * true → le lien confère le rôle admin ; défaut member
2773
+ */
2774
+ isAdmin?: boolean | string;
2775
+ /**
2776
+ * Rôles costum à poser sur le lien créé (optionnel)
2777
+ */
2778
+ roles?: unknown[] | string;
2779
+ /**
2780
+ * URL de redirection après rattachement (optionnel)
2781
+ */
2782
+ urlRedirection?: string;
2783
+ [k: string]: unknown;
2784
+ }
2785
+ export interface ConnectByRefData {
2786
+ pathParams?: {
2787
+ /**
2788
+ * Référence publique du lien (hex ; uniqid legacy 13 ou token Node 24) — segment d URL
2789
+ */
2790
+ ref: string;
2791
+ [k: string]: unknown;
2792
+ };
2793
+ [k: string]: unknown;
2794
+ }
2730
2795
  export interface DisconnectData {
2731
2796
  /**
2732
2797
  * ID de l'élément à déconnecter (projet, organisation...)
@@ -4007,6 +4072,14 @@ export interface AssignBadgesData {
4007
4072
  [k: string]: unknown;
4008
4073
  }
4009
4074
  export interface GetEventsData {
4075
+ /**
4076
+ * Périmètre(s) costum. Le serveur en fait `$or[ source.keys ∈, reference.costum ∈ ]` (SearchNew::searchSourceKey) — les deux voies de rattachement comptent. N'a d'effet que si `notSourceKey` est ABSENT du corps.
4077
+ */
4078
+ sourceKey?: string[];
4079
+ /**
4080
+ * Périmètre RÉSEAU. PRÉSENT (quelle que soit sa valeur) = le filtrage par sourceKey est désactivé ; ABSENT = `sourceKey` s'applique. La garde serveur est un `empty()` (SearchNew.php:999) : en x-www-form-urlencoded un `false` part en chaîne "false", qui n'est pas vide — envoyer `false` désactiverait donc le périmètre, comme `true`. Sans `default` au contrat : le défaut historique (réseau) est posé par le finalizer, seul endroit d'où la clé peut aussi être OMISE.
4081
+ */
4082
+ notSourceKey?: boolean;
4010
4083
  searchType: "events"[];
4011
4084
  indexMin: number;
4012
4085
  indexStep: number;
@@ -4046,11 +4119,7 @@ export interface GetEventsData {
4046
4119
  */
4047
4120
  recurrency?: false;
4048
4121
  filters?: {
4049
- $or?: Record<string, unknown>;
4050
- /**
4051
- * This interface was referenced by `undefined`'s JSON-Schema definition
4052
- * via the `patternProperty` "^links\.attendees\.(?:[a-f0-9]{24}|@\w+)$".
4053
- */
4122
+ $or: {};
4054
4123
  [k: string]: unknown;
4055
4124
  };
4056
4125
  [k: string]: unknown;
@@ -6654,3 +6723,226 @@ export interface ZoneGetZonirisData {
6654
6723
  sourceKey?: string[];
6655
6724
  [k: string]: unknown;
6656
6725
  }
6726
+ export interface CostumListValuesData {
6727
+ /**
6728
+ * Slug du costum (élément porteur ou document `costum`).
6729
+ */
6730
+ slug: string;
6731
+ /**
6732
+ * Nom de la liste déclarée dans `costum.lists`.
6733
+ */
6734
+ list: string;
6735
+ /**
6736
+ * Recherche SERVEUR sur les valeurs. Comparaison canonique — minuscules, accents dépliés, ponctuation retirée — donc « economie » trouve « Économie ». C'est la MÊME normalisation que la clé de tri (`sansAccents` / `cleTri`), pour que les deux ports filtrent exactement le même ensemble. Sans `q`, la liste entière est rendue.
6737
+ */
6738
+ q?: string;
6739
+ /**
6740
+ * Nombre MAXIMAL de valeurs rendues, appliqué APRÈS `q`, le dédoublonnage et le tri — donc sur une liste déjà déterministe. Quand il coupe, la réponse porte `total` et `truncated`. Sans `limit`, la liste entière est rendue (comportement historique).
6741
+ */
6742
+ limit?: number;
6743
+ [k: string]: unknown;
6744
+ }
6745
+ export interface DirectoryProposalData {
6746
+ /**
6747
+ * searchType[0] = la COLLECTION interrogée par tous les find/count (typiquement 'answers'). Obligatoire — absent = 500 legacy.
6748
+ *
6749
+ * @minItems 1
6750
+ */
6751
+ searchType: [string, ...string[]];
6752
+ /**
6753
+ * Recherche texte (SearchNew::searchText) : $or par défaut name/title/slug/sigle/shortDescription + éclatement multi-mots.
6754
+ */
6755
+ name?: string;
6756
+ /**
6757
+ * Chemin de recherche texte SUPPLÉMENTAIRE — il S'AJOUTE au $or par défaut, il ne le remplace pas.
6758
+ */
6759
+ textPath?: string;
6760
+ /**
6761
+ * Tags — opérateur toujours $in ; chaque valeur devient une regex ANCRÉE insensible casse/accents (/^…$/i).
6762
+ */
6763
+ searchTags?: string[];
6764
+ /**
6765
+ * Chemin des tags (défaut serveur : 'tags').
6766
+ */
6767
+ tagsPath?: string;
6768
+ /**
6769
+ * Restreint à user = <userId>.
6770
+ */
6771
+ userId?: string;
6772
+ /**
6773
+ * Map {champ: 1|-1} (valeurs castées int) OU liste de champs (⇒ 1). Défaut serveur : {updated:-1}.
6774
+ */
6775
+ sortBy?: {
6776
+ [k: string]: 1 | -1;
6777
+ } | string[];
6778
+ /**
6779
+ * Projection Mongo (défaut : documents complets).
6780
+ */
6781
+ fields?: string[];
6782
+ /**
6783
+ * Offset (défaut serveur 0).
6784
+ */
6785
+ indexMin?: number;
6786
+ /**
6787
+ * Taille de page (défaut serveur 100) ; 'all' = SANS limite (findAndSort limit 0).
6788
+ */
6789
+ indexStep?: number | "all";
6790
+ /**
6791
+ * La PRÉSENCE de la clé ajoute count.<searchType[0]>. Transport form-urlencoded : count:false se sérialise "false" (truthy PHP) → identique à true ; const:true empêche le faux ami côté client.
6792
+ */
6793
+ count?: true;
6794
+ /**
6795
+ * Filtres. Clés à traitement SPÉCIAL (consommées, dans cet ordre) : formStandalone (bool, extrait en premier — bypass du gate onlyAdminCanSeeList) ; oneSubOrganization/allSubOrganisation (AVANT form, qu'ils REMPLACENT — voir plus bas) ; form (string → $or 3 voies : form=<val>, answers.aapStep2.choose.<idParentDuForm>.value='selected', links.aacForm.<formId> $exists — LE scoping réel de l'annuaire) ; address (string → regex accent-insensible sur <mapping.address>.postalCode/.name) ; views (['seen'|'notSeen'] → views.<userId SESSION> $exists — réponse USER-SCOPÉE : la query key doit porter l'userId) ; quartiers (string[] → answers.aapStep1.interventionArea $in) ; toute clé contenant '.choose.' (string[] → $in ; la valeur 'notselected' ajoute une branche $exists:false) ; admissibility (['admissible'|'inadmissible'] — [0] seul lu ; communauté CITOYENS du porteur ; 'admissible' = $ne 'inadmissible' donc matche aussi les non-notées ; ignoré si communauté vide) ; answers.aapStep1.depense.financer.idAndName ('<id>-idAndName-<nom>', [0] seul → $or name/id) ; vote (truthy → vote.<userId SESSION> $exists — user-scopé) ; inproject (['inproject'|'inproposal'] cumulables → project.id $exists true/false ; ⚠ supprime silencieusement un éventuel filters['project.id']) ; status (si le tableau contient 'unnotified' : status $ne notified/notificationSent ; la clé n'est retirée que si c'est la SEULE valeur, sinon le tableau ENTIER repart en pass-through). Sous-organisations (fix 2026-08 appliqué L+B, BUG-L-226/227) : oneSubOrganization PRIME (string[], valeurs éclatées sur '-' → form $in ; consomme aussi allSubOrganisation et form), sinon allSubOrganisation (string[] → form $in [valeurs + filters.form si présent]) — les deux REMPLACENT le scoping $or 3 voies de form. ⚠ Sur un serveur legacy ANTÉRIEUR au fix (branche fix/aap-suborganisation-filters) : oneSubOrganization était mort (pass-through → liste VIDE) et allSubOrganisation ajoutait null au $in en prod (élargit) / 500 en dev. Toute autre clé : pass-through SearchNew::searchFilters (tableau → $in de regex partielles ; string → $or [valeur, bool]).
6796
+ */
6797
+ filters?: {
6798
+ [k: string]: unknown;
6799
+ };
6800
+ pathParams?: {
6801
+ /**
6802
+ * Slug du costum (contexte). Le legacy accepte des appels sans source (purement contextuel via beforeAction) — le SDK le requiert : les usages site-json sont toujours sous costum.
6803
+ */
6804
+ source: string;
6805
+ /**
6806
+ * Id du FORM PARENT AAC. Effectivement requis (le legacy fait findOneById puis lit form.parent → 500 sans form valide). ⚠ Il ne filtre JAMAIS les résultats (scoping commenté, Aap.php:1201) : sans filters.form la requête balaie TOUTES les réponses de la collection — toujours poser filters.form.
6807
+ */
6808
+ form: string;
6809
+ [k: string]: unknown;
6810
+ };
6811
+ [k: string]: unknown;
6812
+ }
6813
+ export interface DirectoryProposalCountData {
6814
+ /**
6815
+ * searchType[0] = la COLLECTION interrogée par tous les find/count (typiquement 'answers'). Obligatoire — absent = 500 legacy.
6816
+ *
6817
+ * @minItems 1
6818
+ */
6819
+ searchType: [string, ...string[]];
6820
+ /**
6821
+ * Recherche texte (SearchNew::searchText) : $or par défaut name/title/slug/sigle/shortDescription + éclatement multi-mots.
6822
+ */
6823
+ name?: string;
6824
+ /**
6825
+ * Chemin de recherche texte SUPPLÉMENTAIRE — il S'AJOUTE au $or par défaut, il ne le remplace pas.
6826
+ */
6827
+ textPath?: string;
6828
+ /**
6829
+ * Tags — opérateur toujours $in ; chaque valeur devient une regex ANCRÉE insensible casse/accents (/^…$/i).
6830
+ */
6831
+ searchTags?: string[];
6832
+ /**
6833
+ * Chemin des tags (défaut serveur : 'tags').
6834
+ */
6835
+ tagsPath?: string;
6836
+ /**
6837
+ * Restreint à user = <userId>.
6838
+ */
6839
+ userId?: string;
6840
+ /**
6841
+ * Map {champ: 1|-1} (valeurs castées int) OU liste de champs (⇒ 1). Défaut serveur : {updated:-1}.
6842
+ */
6843
+ sortBy?: {
6844
+ [k: string]: 1 | -1;
6845
+ } | string[];
6846
+ /**
6847
+ * Projection Mongo (défaut : documents complets).
6848
+ */
6849
+ fields?: string[];
6850
+ /**
6851
+ * Offset (défaut serveur 0).
6852
+ */
6853
+ indexMin?: number;
6854
+ /**
6855
+ * Taille de page (défaut serveur 100) ; 'all' = SANS limite (findAndSort limit 0).
6856
+ */
6857
+ indexStep?: number | "all";
6858
+ /**
6859
+ * La PRÉSENCE de la clé ajoute count.<searchType[0]>. Transport form-urlencoded : count:false se sérialise "false" (truthy PHP) → identique à true ; const:true empêche le faux ami côté client.
6860
+ */
6861
+ count?: true;
6862
+ /**
6863
+ * Filtres. Clés à traitement SPÉCIAL (consommées, dans cet ordre) : formStandalone (bool, extrait en premier — bypass du gate onlyAdminCanSeeList) ; oneSubOrganization/allSubOrganisation (AVANT form, qu'ils REMPLACENT — voir plus bas) ; form (string → $or 3 voies : form=<val>, answers.aapStep2.choose.<idParentDuForm>.value='selected', links.aacForm.<formId> $exists — LE scoping réel de l'annuaire) ; address (string → regex accent-insensible sur <mapping.address>.postalCode/.name) ; views (['seen'|'notSeen'] → views.<userId SESSION> $exists — réponse USER-SCOPÉE : la query key doit porter l'userId) ; quartiers (string[] → answers.aapStep1.interventionArea $in) ; toute clé contenant '.choose.' (string[] → $in ; la valeur 'notselected' ajoute une branche $exists:false) ; admissibility (['admissible'|'inadmissible'] — [0] seul lu ; communauté CITOYENS du porteur ; 'admissible' = $ne 'inadmissible' donc matche aussi les non-notées ; ignoré si communauté vide) ; answers.aapStep1.depense.financer.idAndName ('<id>-idAndName-<nom>', [0] seul → $or name/id) ; vote (truthy → vote.<userId SESSION> $exists — user-scopé) ; inproject (['inproject'|'inproposal'] cumulables → project.id $exists true/false ; ⚠ supprime silencieusement un éventuel filters['project.id']) ; status (si le tableau contient 'unnotified' : status $ne notified/notificationSent ; la clé n'est retirée que si c'est la SEULE valeur, sinon le tableau ENTIER repart en pass-through). Sous-organisations (fix 2026-08 appliqué L+B, BUG-L-226/227) : oneSubOrganization PRIME (string[], valeurs éclatées sur '-' → form $in ; consomme aussi allSubOrganisation et form), sinon allSubOrganisation (string[] → form $in [valeurs + filters.form si présent]) — les deux REMPLACENT le scoping $or 3 voies de form. ⚠ Sur un serveur legacy ANTÉRIEUR au fix (branche fix/aap-suborganisation-filters) : oneSubOrganization était mort (pass-through → liste VIDE) et allSubOrganisation ajoutait null au $in en prod (élargit) / 500 en dev. Toute autre clé : pass-through SearchNew::searchFilters (tableau → $in de regex partielles ; string → $or [valeur, bool]).
6864
+ */
6865
+ filters?: {
6866
+ [k: string]: unknown;
6867
+ };
6868
+ pathParams?: {
6869
+ /**
6870
+ * Slug du costum (contexte). Le legacy accepte des appels sans source (purement contextuel via beforeAction) — le SDK le requiert : les usages site-json sont toujours sous costum.
6871
+ */
6872
+ source: string;
6873
+ /**
6874
+ * Id du FORM PARENT AAC. Effectivement requis (le legacy fait findOneById puis lit form.parent → 500 sans form valide). ⚠ Il ne filtre JAMAIS les résultats (scoping commenté, Aap.php:1201) : sans filters.form la requête balaie TOUTES les réponses de la collection — toujours poser filters.form.
6875
+ */
6876
+ form: string;
6877
+ [k: string]: unknown;
6878
+ };
6879
+ [k: string]: unknown;
6880
+ }
6881
+ export interface DirectoryProposalNewCounterData {
6882
+ /**
6883
+ * searchType[0] = la COLLECTION interrogée par tous les find/count (typiquement 'answers'). Obligatoire — absent = 500 legacy.
6884
+ *
6885
+ * @minItems 1
6886
+ */
6887
+ searchType: [string, ...string[]];
6888
+ /**
6889
+ * Recherche texte (SearchNew::searchText) : $or par défaut name/title/slug/sigle/shortDescription + éclatement multi-mots.
6890
+ */
6891
+ name?: string;
6892
+ /**
6893
+ * Chemin de recherche texte SUPPLÉMENTAIRE — il S'AJOUTE au $or par défaut, il ne le remplace pas.
6894
+ */
6895
+ textPath?: string;
6896
+ /**
6897
+ * Tags — opérateur toujours $in ; chaque valeur devient une regex ANCRÉE insensible casse/accents (/^…$/i).
6898
+ */
6899
+ searchTags?: string[];
6900
+ /**
6901
+ * Chemin des tags (défaut serveur : 'tags').
6902
+ */
6903
+ tagsPath?: string;
6904
+ /**
6905
+ * Restreint à user = <userId>.
6906
+ */
6907
+ userId?: string;
6908
+ /**
6909
+ * Map {champ: 1|-1} (valeurs castées int) OU liste de champs (⇒ 1). Défaut serveur : {updated:-1}.
6910
+ */
6911
+ sortBy?: {
6912
+ [k: string]: 1 | -1;
6913
+ } | string[];
6914
+ /**
6915
+ * Projection Mongo (défaut : documents complets).
6916
+ */
6917
+ fields?: string[];
6918
+ /**
6919
+ * Offset (défaut serveur 0).
6920
+ */
6921
+ indexMin?: number;
6922
+ /**
6923
+ * Taille de page (défaut serveur 100) ; 'all' = SANS limite (findAndSort limit 0).
6924
+ */
6925
+ indexStep?: number | "all";
6926
+ /**
6927
+ * La PRÉSENCE de la clé ajoute count.<searchType[0]>. Transport form-urlencoded : count:false se sérialise "false" (truthy PHP) → identique à true ; const:true empêche le faux ami côté client.
6928
+ */
6929
+ count?: true;
6930
+ /**
6931
+ * Filtres. Clés à traitement SPÉCIAL (consommées, dans cet ordre) : formStandalone (bool, extrait en premier — bypass du gate onlyAdminCanSeeList) ; oneSubOrganization/allSubOrganisation (AVANT form, qu'ils REMPLACENT — voir plus bas) ; form (string → $or 3 voies : form=<val>, answers.aapStep2.choose.<idParentDuForm>.value='selected', links.aacForm.<formId> $exists — LE scoping réel de l'annuaire) ; address (string → regex accent-insensible sur <mapping.address>.postalCode/.name) ; views (['seen'|'notSeen'] → views.<userId SESSION> $exists — réponse USER-SCOPÉE : la query key doit porter l'userId) ; quartiers (string[] → answers.aapStep1.interventionArea $in) ; toute clé contenant '.choose.' (string[] → $in ; la valeur 'notselected' ajoute une branche $exists:false) ; admissibility (['admissible'|'inadmissible'] — [0] seul lu ; communauté CITOYENS du porteur ; 'admissible' = $ne 'inadmissible' donc matche aussi les non-notées ; ignoré si communauté vide) ; answers.aapStep1.depense.financer.idAndName ('<id>-idAndName-<nom>', [0] seul → $or name/id) ; vote (truthy → vote.<userId SESSION> $exists — user-scopé) ; inproject (['inproject'|'inproposal'] cumulables → project.id $exists true/false ; ⚠ supprime silencieusement un éventuel filters['project.id']) ; status (si le tableau contient 'unnotified' : status $ne notified/notificationSent ; la clé n'est retirée que si c'est la SEULE valeur, sinon le tableau ENTIER repart en pass-through). Sous-organisations (fix 2026-08 appliqué L+B, BUG-L-226/227) : oneSubOrganization PRIME (string[], valeurs éclatées sur '-' → form $in ; consomme aussi allSubOrganisation et form), sinon allSubOrganisation (string[] → form $in [valeurs + filters.form si présent]) — les deux REMPLACENT le scoping $or 3 voies de form. ⚠ Sur un serveur legacy ANTÉRIEUR au fix (branche fix/aap-suborganisation-filters) : oneSubOrganization était mort (pass-through → liste VIDE) et allSubOrganisation ajoutait null au $in en prod (élargit) / 500 en dev. Toute autre clé : pass-through SearchNew::searchFilters (tableau → $in de regex partielles ; string → $or [valeur, bool]).
6932
+ */
6933
+ filters?: {
6934
+ [k: string]: unknown;
6935
+ };
6936
+ pathParams?: {
6937
+ /**
6938
+ * Slug du costum (contexte). Le legacy accepte des appels sans source (purement contextuel via beforeAction) — le SDK le requiert : les usages site-json sont toujours sous costum.
6939
+ */
6940
+ source: string;
6941
+ /**
6942
+ * Id du FORM PARENT AAC. Effectivement requis (le legacy fait findOneById puis lit form.parent → 500 sans form valide). ⚠ Il ne filtre JAMAIS les résultats (scoping commenté, Aap.php:1201) : sans filters.form la requête balaie TOUTES les réponses de la collection — toujours poser filters.form.
6943
+ */
6944
+ form: string;
6945
+ [k: string]: unknown;
6946
+ };
6947
+ [k: string]: unknown;
6948
+ }
@@ -1,7 +1,7 @@
1
1
  import { BaseEntity } from "./BaseEntity.js";
2
2
  import type { Answer } from "./Answer.js";
3
3
  import type { PaginatorPage, PaginatorState } from "./BaseEntity.js";
4
- import type { CoformAnswersSearchData } from "./EndpointApi.types.js";
4
+ import type { CoformAnswersSearchData, DirectoryProposalCountData, DirectoryProposalData, DirectoryProposalNewCounterData } from "./EndpointApi.types.js";
5
5
  import type { CoformCommonTableContributor, FormItemNormalized } from "./serverDataType/Form.js";
6
6
  /**
7
7
  * Une entrée de catalogue commonTable (une criteria agrégée cross-réponses).
@@ -29,6 +29,41 @@ export interface CommonTableCatalogEntry {
29
29
  * (`getCatalogs` normalise les `[]` PHP — catalogues vides — en `{}`).
30
30
  */
31
31
  export type CommonTableCatalogs = Record<string, Record<string, CommonTableCatalogEntry>>;
32
+ /**
33
+ * Les 10 blocs latéraux batch-résolus de l'annuaire des communs AAP
34
+ * (directoryproposal). Chaque bloc VIDE se sérialise `[]` (array PHP vide),
35
+ * peuplé c'est une map keyée par id.
36
+ */
37
+ export interface DirectoryProposalSideBlocks {
38
+ users: Record<string, unknown> | unknown[];
39
+ usersStatus: Record<string, unknown> | unknown[];
40
+ sousOrga: Record<string, unknown> | unknown[];
41
+ checkSeen: Record<string, unknown> | unknown[];
42
+ allActions: Record<string, unknown> | unknown[];
43
+ allImages: Record<string, unknown> | unknown[];
44
+ allDocuments: Record<string, unknown> | unknown[];
45
+ elements: Record<string, unknown> | unknown[];
46
+ inputs: Record<string, unknown> | unknown[];
47
+ allNotSeenComments: Record<string, unknown> | unknown[];
48
+ }
49
+ /**
50
+ * Réponse de `form.getProposals` (mode normal). `results` : lignes
51
+ * PRÉ-FORMATÉES par le serveur (parsePropositionData : `name`, `image`
52
+ * toujours présent, `tags` ré-indexés, `funds` agrégés, `user_count`,
53
+ * `interrest_count`…), normalisées map→tableau par le client (id injecté).
54
+ * À consommer BRUT — pour un détail/action, reviver l'Answer par id
55
+ * (`form.answer({ id })`), jamais via `_linkEntities` (les lignes ne sont
56
+ * pas des documents answers complets).
57
+ */
58
+ export interface DirectoryProposalPage extends DirectoryProposalSideBlocks {
59
+ results: Array<Record<string, unknown>>;
60
+ /** Présent SEULEMENT si la clé `count` était posée dans la requête. */
61
+ count?: Record<string, number>;
62
+ }
63
+ /** Réponse de `form.countProposals` (mode countonly) : count sans results, blocs latéraux présents et vides. */
64
+ export interface DirectoryProposalCountPage extends DirectoryProposalSideBlocks {
65
+ count: Record<string, number>;
66
+ }
32
67
  export declare class Form extends BaseEntity<FormItemNormalized> {
33
68
  static entityType: string;
34
69
  static entityTag: string;
@@ -156,4 +191,50 @@ export declare class Form extends BaseEntity<FormItemNormalized> {
156
191
  getCatalogs(params: {
157
192
  inputKeys: string[];
158
193
  }): Promise<CommonTableCatalogs>;
194
+ /**
195
+ * Gardes communes des 3 wrappers directoryproposal + construction des
196
+ * pathParams `{source, form}` : `source` = slug du parent costum (le Form
197
+ * doit avoir été créé via `org.form({id})` / `project.form({id})`),
198
+ * `form` = id de ce Form (le form PARENT AAC).
199
+ */
200
+ private _proposalPathParams;
201
+ /**
202
+ * Annuaire des communs AAP (`co2/aap/directoryproposal`, mode normal).
203
+ *
204
+ * Wrapper de `endpointApi.directoryProposal` qui encapsule les invariants
205
+ * piégeux du legacy :
206
+ * - `pathParams.form` ne FILTRE JAMAIS les résultats → `filters.form = this.id`
207
+ * est TOUJOURS injecté (sans lui, la requête balaierait toutes les réponses
208
+ * de la collection) ;
209
+ * - `searchType: ["answers"]` par défaut (obligatoire côté serveur) ;
210
+ * - `source` = slug du parent costum, `form` = id de ce Form.
211
+ *
212
+ * Le retour est BRUT (lignes pré-formatées serveur) — voir
213
+ * {@link DirectoryProposalPage}. Pagination : passer `indexStep`/`indexMin` ;
214
+ * poser la clé `count` (ex. `count: true`) pour recevoir `count.answers`.
215
+ * ⚠ `filters.views`/`filters.vote` scopent la réponse à l'utilisateur de
216
+ * SESSION — toute query key de cache doit alors porter l'userId.
217
+ *
218
+ * @example
219
+ * const org = await api.organization({ slug: "coSindniSmarterre" });
220
+ * const form = await org.form({ id: AAC_FORM_ID });
221
+ * const page = await form.getProposals({ indexStep: 30, indexMin: 0, count: true });
222
+ * page.results; // lignes pré-formatées (name, image, tags, funds…)
223
+ * page.count?.answers; // total
224
+ */
225
+ getProposals(data?: Partial<DirectoryProposalData>): Promise<DirectoryProposalPage>;
226
+ /**
227
+ * Annuaire des communs AAP — compte seul (mode countonly).
228
+ * Mêmes gardes et injections que {@link Form#getProposals} ; la réponse porte
229
+ * `count.<searchType[0]>` SANS `results` (blocs latéraux présents, vides `[]`).
230
+ */
231
+ countProposals(data?: Partial<DirectoryProposalCountData>): Promise<DirectoryProposalCountPage>;
232
+ /**
233
+ * Annuaire des communs AAP — compteur de non-vus (mode newcounter).
234
+ * Réponse `{ newCounter: int }` seule ; compteur de l'utilisateur de SESSION
235
+ * (0 si non connecté) — query key de cache à scoper par userId.
236
+ */
237
+ getProposalsNewCounter(data?: Partial<DirectoryProposalNewCounterData>): Promise<{
238
+ newCounter: number;
239
+ }>;
159
240
  }