@communecter/cocolight-api-client 1.0.77 → 1.0.78

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.77",
3
+ "version": "1.0.78",
4
4
  "description": "Client Axios simplifié pour l'API cocolight",
5
5
  "repository": {
6
6
  "type": "git",
@@ -2231,9 +2231,8 @@ export class BaseEntity<TServerData = any> {
2231
2231
  * - `connectTypeConnect` : valeur envoyée pour `connect()`
2232
2232
  * - `connectTypeDisconnect` : valeur envoyée pour `disconnect()`
2233
2233
  * @throws {ApiError} - Si le type d'entité est inconnu.
2234
- * @protected
2235
2234
  */
2236
- protected _getLinkMeta(): LinkMeta {
2235
+ _getLinkMeta(): LinkMeta {
2237
2236
  const map = {
2238
2237
  organizations: {
2239
2238
  linkType: "memberOf",
package/src/api/User.ts CHANGED
@@ -888,6 +888,191 @@ export class User extends BaseEntity<UserItemNormalized> {
888
888
  }
889
889
  return super.entityBySlug(slug);
890
890
  }
891
+
892
+ /**
893
+ * Valide les préconditions communes pour les méthodes de vérification de rôle.
894
+ * @private
895
+ * @param methodName - Nom de la méthode appelante (pour les messages d'erreur).
896
+ * @param expectedTypes - Types d'entité parent autorisés.
897
+ * @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
898
+ * @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
899
+ * @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré.
900
+ * @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée.
901
+ * @throws {ApiError} 400 - Si le type d'entité parent n'est pas valide.
902
+ */
903
+ private _validateRoleCheckPreconditions(methodName: string, expectedTypes: string[]): void {
904
+ if (!this.userId) {
905
+ throw new ApiError(`Vous devez être connecté pour ${methodName}.`, 401);
906
+ }
907
+
908
+ if(!this.parent?.isAdmin()){
909
+ throw new ApiError("Vous devez être administrateur pour effectuer cette action.", 401);
910
+ }
911
+
912
+ if (!this.id) {
913
+ throw new ApiError(`${this.constructor.name} non enregistrée.`, 404);
914
+ }
915
+
916
+ if(!this.parent?.id){
917
+ throw new ApiError("L'entité parente n'est pas enregistrée.", 404);
918
+ }
919
+
920
+ if (!expectedTypes.includes(this.parent.getEntityType())) {
921
+ throw new ApiError(`L'entité doit être de type : ${expectedTypes.join(", ")}, reçu : ${this.parent.getEntityType()}`, 400);
922
+ }
923
+ }
924
+
925
+ /**
926
+ * Récupère le lien utilisateur pour l'entité parente.
927
+ * @private
928
+ * @returns Le lien utilisateur ou null.
929
+ */
930
+ private _getUserLinkForParent(): any {
931
+ const { linkType } = this.parent!._getLinkMeta();
932
+ const parentId = this.parent!.id;
933
+ if (!parentId) return null;
934
+ return this?.serverData?.links?.[linkType]?.[parentId] || null;
935
+ }
936
+
937
+ /**
938
+ * Vérifie si l'utilisateur est administrateur de l'entité parente.
939
+ *
940
+ * Cette méthode permet de vérifier si un utilisateur possède les droits d'administration
941
+ * sur l'organisation ou le projet parent. Elle est particulièrement utile après avoir
942
+ * récupéré des membres via `getMembers()` pour déterminer leur niveau de permissions.
943
+ *
944
+ * @returns `true` si l'utilisateur est administrateur de l'entité parente, `false` sinon.
945
+ *
946
+ * @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
947
+ * @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
948
+ * @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré (pas d'ID).
949
+ * @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée (pas d'ID).
950
+ * @throws {ApiError} 400 - Si l'entité parente n'est pas de type "organizations" ou "projects".
951
+ *
952
+ * @example
953
+ * // Vérifier les admins d'une organisation
954
+ * const org = await me.organization({ slug: "openAtlas" });
955
+ * const members = await org.getMembers();
956
+ *
957
+ * for (const member of members.results) {
958
+ * if (member.getEntityType() === "citoyens") {
959
+ * if (member.isAdmin()) {
960
+ * console.log(`${member.data.name} est administrateur`);
961
+ * }
962
+ * }
963
+ * }
964
+ *
965
+ * @example
966
+ * // Récupérer uniquement les membres admins
967
+ * const org = await me.organization({ slug: "myOrg" });
968
+ * const adminMembers = await org.getMembers({}, { isAdmin: true });
969
+ *
970
+ * // Vérifier chaque admin
971
+ * for (const admin of adminMembers.results) {
972
+ * if (admin.getEntityType() === "citoyens" && admin.isAdmin()) {
973
+ * console.log(`${admin.data.name} a les droits admin`);
974
+ * }
975
+ * }
976
+ */
977
+ override isAdmin(): boolean {
978
+ this._validateRoleCheckPreconditions("isAdmin", ["organizations", "projects"]);
979
+ const userLink = this._getUserLinkForParent();
980
+ return this._validateUserLink(userLink) && userLink?.isAdmin === true && !userLink?.isAdminPending;
981
+ }
982
+
983
+ /**
984
+ * Vérifie si l'utilisateur est membre de l'organisation parente.
985
+ *
986
+ * Cette méthode permet de vérifier si un utilisateur est membre actif d'une organisation.
987
+ * Elle est utile pour déterminer si un utilisateur a accès aux ressources de l'organisation.
988
+ *
989
+ * @returns `true` si l'utilisateur est membre validé de l'organisation parente, `false` sinon.
990
+ *
991
+ * @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
992
+ * @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
993
+ * @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré (pas d'ID).
994
+ * @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée (pas d'ID).
995
+ * @throws {ApiError} 400 - Si l'entité parente n'est pas de type "organizations".
996
+ *
997
+ * @example
998
+ * // Vérifier les membres d'une organisation
999
+ * const org = await me.organization({ slug: "myOrg" });
1000
+ * const members = await org.getMembers();
1001
+ *
1002
+ * for (const member of members.results) {
1003
+ * if (member.getEntityType() === "citoyens" && member.isMember()) {
1004
+ * console.log(`${member.data.name} est membre de l'organisation`);
1005
+ * }
1006
+ * }
1007
+ */
1008
+ override isMember(): boolean {
1009
+ this._validateRoleCheckPreconditions("isMember", ["organizations"]);
1010
+ const userLink = this._getUserLinkForParent();
1011
+ return this._validateUserLink(userLink);
1012
+ }
1013
+
1014
+ /**
1015
+ * Vérifie si l'utilisateur est contributeur du projet parent.
1016
+ *
1017
+ * Cette méthode permet de vérifier si un utilisateur est contributeur actif d'un projet.
1018
+ * Elle est utile pour déterminer si un utilisateur peut participer aux activités du projet.
1019
+ *
1020
+ * @returns `true` si l'utilisateur est contributeur validé du projet parent, `false` sinon.
1021
+ *
1022
+ * @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
1023
+ * @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
1024
+ * @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré (pas d'ID).
1025
+ * @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée (pas d'ID).
1026
+ * @throws {ApiError} 400 - Si l'entité parente n'est pas de type "projects".
1027
+ *
1028
+ * @example
1029
+ * // Vérifier les contributeurs d'un projet
1030
+ * const project = await me.project({ slug: "myProject" });
1031
+ * const contributors = await project.getContributors();
1032
+ *
1033
+ * for (const contributor of contributors.results) {
1034
+ * if (contributor.getEntityType() === "citoyens" && contributor.isContributor()) {
1035
+ * console.log(`${contributor.data.name} est contributeur du projet`);
1036
+ * }
1037
+ * }
1038
+ */
1039
+ override isContributor(): boolean {
1040
+ this._validateRoleCheckPreconditions("isContributor", ["projects"]);
1041
+ const userLink = this._getUserLinkForParent();
1042
+ return this._validateUserLink(userLink);
1043
+ }
1044
+
1045
+ /**
1046
+ * Vérifie si l'utilisateur est participant de l'événement parent.
1047
+ *
1048
+ * Cette méthode permet de vérifier si un utilisateur est inscrit comme participant à un événement.
1049
+ * Elle est utile pour déterminer si un utilisateur a confirmé sa participation à l'événement.
1050
+ *
1051
+ * @returns `true` si l'utilisateur est participant validé de l'événement parent, `false` sinon.
1052
+ *
1053
+ * @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
1054
+ * @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
1055
+ * @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré (pas d'ID).
1056
+ * @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée (pas d'ID).
1057
+ * @throws {ApiError} 400 - Si l'entité parente n'est pas de type "events".
1058
+ *
1059
+ * @example
1060
+ * // Vérifier les participants d'un événement
1061
+ * const event = await me.event({ slug: "myEvent" });
1062
+ * const attendees = await event.getAttendees();
1063
+ *
1064
+ * for (const attendee of attendees.results) {
1065
+ * if (attendee.getEntityType() === "citoyens" && attendee.isAttendee()) {
1066
+ * console.log(`${attendee.data.name} participe à l'événement`);
1067
+ * }
1068
+ * }
1069
+ */
1070
+ override isAttendee(): boolean {
1071
+ this._validateRoleCheckPreconditions("isAttendee", ["events"]);
1072
+ const userLink = this._getUserLinkForParent();
1073
+ return this._validateUserLink(userLink);
1074
+ }
1075
+
891
1076
  }
892
1077
 
893
1078
  // Incorporation des mixins dans User
@@ -803,9 +803,8 @@ export declare class BaseEntity<TServerData = any> {
803
803
  * - `connectTypeConnect` : valeur envoyée pour `connect()`
804
804
  * - `connectTypeDisconnect` : valeur envoyée pour `disconnect()`
805
805
  * @throws {ApiError} - Si le type d'entité est inconnu.
806
- * @protected
807
806
  */
808
- protected _getLinkMeta(): LinkMeta;
807
+ _getLinkMeta(): LinkMeta;
809
808
  /**
810
809
  * Vérifie si l'entité prend en charge les opérations de lien (`connect`, `disconnect`, etc.).
811
810
  * Utilise `_getLinkMeta()` comme source unique de vérité.
@@ -341,5 +341,142 @@ export declare class User extends BaseEntity<UserItemNormalized> {
341
341
  * @returns L'entité correspondante au slug.
342
342
  */
343
343
  entityBySlug(slug: string): Promise<EntityTypes>;
344
+ /**
345
+ * Valide les préconditions communes pour les méthodes de vérification de rôle.
346
+ * @private
347
+ * @param methodName - Nom de la méthode appelante (pour les messages d'erreur).
348
+ * @param expectedTypes - Types d'entité parent autorisés.
349
+ * @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
350
+ * @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
351
+ * @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré.
352
+ * @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée.
353
+ * @throws {ApiError} 400 - Si le type d'entité parent n'est pas valide.
354
+ */
355
+ private _validateRoleCheckPreconditions;
356
+ /**
357
+ * Récupère le lien utilisateur pour l'entité parente.
358
+ * @private
359
+ * @returns Le lien utilisateur ou null.
360
+ */
361
+ private _getUserLinkForParent;
362
+ /**
363
+ * Vérifie si l'utilisateur est administrateur de l'entité parente.
364
+ *
365
+ * Cette méthode permet de vérifier si un utilisateur possède les droits d'administration
366
+ * sur l'organisation ou le projet parent. Elle est particulièrement utile après avoir
367
+ * récupéré des membres via `getMembers()` pour déterminer leur niveau de permissions.
368
+ *
369
+ * @returns `true` si l'utilisateur est administrateur de l'entité parente, `false` sinon.
370
+ *
371
+ * @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
372
+ * @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
373
+ * @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré (pas d'ID).
374
+ * @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée (pas d'ID).
375
+ * @throws {ApiError} 400 - Si l'entité parente n'est pas de type "organizations" ou "projects".
376
+ *
377
+ * @example
378
+ * // Vérifier les admins d'une organisation
379
+ * const org = await me.organization({ slug: "openAtlas" });
380
+ * const members = await org.getMembers();
381
+ *
382
+ * for (const member of members.results) {
383
+ * if (member.getEntityType() === "citoyens") {
384
+ * if (member.isAdmin()) {
385
+ * console.log(`${member.data.name} est administrateur`);
386
+ * }
387
+ * }
388
+ * }
389
+ *
390
+ * @example
391
+ * // Récupérer uniquement les membres admins
392
+ * const org = await me.organization({ slug: "myOrg" });
393
+ * const adminMembers = await org.getMembers({}, { isAdmin: true });
394
+ *
395
+ * // Vérifier chaque admin
396
+ * for (const admin of adminMembers.results) {
397
+ * if (admin.getEntityType() === "citoyens" && admin.isAdmin()) {
398
+ * console.log(`${admin.data.name} a les droits admin`);
399
+ * }
400
+ * }
401
+ */
402
+ isAdmin(): boolean;
403
+ /**
404
+ * Vérifie si l'utilisateur est membre de l'organisation parente.
405
+ *
406
+ * Cette méthode permet de vérifier si un utilisateur est membre actif d'une organisation.
407
+ * Elle est utile pour déterminer si un utilisateur a accès aux ressources de l'organisation.
408
+ *
409
+ * @returns `true` si l'utilisateur est membre validé de l'organisation parente, `false` sinon.
410
+ *
411
+ * @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
412
+ * @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
413
+ * @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré (pas d'ID).
414
+ * @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée (pas d'ID).
415
+ * @throws {ApiError} 400 - Si l'entité parente n'est pas de type "organizations".
416
+ *
417
+ * @example
418
+ * // Vérifier les membres d'une organisation
419
+ * const org = await me.organization({ slug: "myOrg" });
420
+ * const members = await org.getMembers();
421
+ *
422
+ * for (const member of members.results) {
423
+ * if (member.getEntityType() === "citoyens" && member.isMember()) {
424
+ * console.log(`${member.data.name} est membre de l'organisation`);
425
+ * }
426
+ * }
427
+ */
428
+ isMember(): boolean;
429
+ /**
430
+ * Vérifie si l'utilisateur est contributeur du projet parent.
431
+ *
432
+ * Cette méthode permet de vérifier si un utilisateur est contributeur actif d'un projet.
433
+ * Elle est utile pour déterminer si un utilisateur peut participer aux activités du projet.
434
+ *
435
+ * @returns `true` si l'utilisateur est contributeur validé du projet parent, `false` sinon.
436
+ *
437
+ * @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
438
+ * @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
439
+ * @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré (pas d'ID).
440
+ * @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée (pas d'ID).
441
+ * @throws {ApiError} 400 - Si l'entité parente n'est pas de type "projects".
442
+ *
443
+ * @example
444
+ * // Vérifier les contributeurs d'un projet
445
+ * const project = await me.project({ slug: "myProject" });
446
+ * const contributors = await project.getContributors();
447
+ *
448
+ * for (const contributor of contributors.results) {
449
+ * if (contributor.getEntityType() === "citoyens" && contributor.isContributor()) {
450
+ * console.log(`${contributor.data.name} est contributeur du projet`);
451
+ * }
452
+ * }
453
+ */
454
+ isContributor(): boolean;
455
+ /**
456
+ * Vérifie si l'utilisateur est participant de l'événement parent.
457
+ *
458
+ * Cette méthode permet de vérifier si un utilisateur est inscrit comme participant à un événement.
459
+ * Elle est utile pour déterminer si un utilisateur a confirmé sa participation à l'événement.
460
+ *
461
+ * @returns `true` si l'utilisateur est participant validé de l'événement parent, `false` sinon.
462
+ *
463
+ * @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
464
+ * @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
465
+ * @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré (pas d'ID).
466
+ * @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée (pas d'ID).
467
+ * @throws {ApiError} 400 - Si l'entité parente n'est pas de type "events".
468
+ *
469
+ * @example
470
+ * // Vérifier les participants d'un événement
471
+ * const event = await me.event({ slug: "myEvent" });
472
+ * const attendees = await event.getAttendees();
473
+ *
474
+ * for (const attendee of attendees.results) {
475
+ * if (attendee.getEntityType() === "citoyens" && attendee.isAttendee()) {
476
+ * console.log(`${attendee.data.name} participe à l'événement`);
477
+ * }
478
+ * }
479
+ */
480
+ isAttendee(): boolean;
344
481
  }
345
482
  export {};