@communecter/cocolight-api-client 1.0.21 → 1.0.23
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/cocolight-api-client.browser.js +2 -2
- package/dist/cocolight-api-client.cjs +1 -1
- package/dist/cocolight-api-client.mjs.js +1 -1
- package/package.json +1 -1
- package/src/api/BaseEntity.js +460 -18
- package/src/api/EndpointApi.js +110 -105
- package/src/api/EndpointApi.types.d.ts +23 -2
- package/src/api/Event.js +22 -0
- package/src/api/Organization.js +107 -36
- package/src/api/Poi.js +22 -0
- package/src/api/Project.js +137 -0
- package/src/api/User.js +225 -18
- package/src/endpoints.module.js +2 -2
- package/src/index.js +21 -1
- package/src/utils/reactive.js +279 -0
package/src/api/User.js
CHANGED
|
@@ -81,7 +81,7 @@ export class User extends BaseEntity {
|
|
|
81
81
|
|
|
82
82
|
super(parent, data, deps);
|
|
83
83
|
}
|
|
84
|
-
|
|
84
|
+
|
|
85
85
|
get slug() {
|
|
86
86
|
return this._draftData.slug || null;
|
|
87
87
|
}
|
|
@@ -90,6 +90,14 @@ export class User extends BaseEntity {
|
|
|
90
90
|
return this.isConnected && this.userId === this.id;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
+
get parentIsMe() {
|
|
94
|
+
return super.isMe;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
get isActingUser() {
|
|
98
|
+
return this.parentIsMe && !this.isMe;
|
|
99
|
+
}
|
|
100
|
+
|
|
93
101
|
/**
|
|
94
102
|
* Récupère le profil complet de l'utilisateur.
|
|
95
103
|
* Si l'utilisateur est connecté, on appelle le endpoint ME_INFO_URL,
|
|
@@ -181,23 +189,7 @@ export class User extends BaseEntity {
|
|
|
181
189
|
}
|
|
182
190
|
|
|
183
191
|
static fromServerData(data, parent, deps) {
|
|
184
|
-
|
|
185
|
-
instance._serverData = { ...data };
|
|
186
|
-
// est ce que je besoin de ça si il est contruit dans le constructeur ?
|
|
187
|
-
// il doit y avaoir une raison pour les autres objets
|
|
188
|
-
const { draft, proxy } = instance._buildDraftAndProxy({
|
|
189
|
-
data: { ...data, ...instance.defaultFields },
|
|
190
|
-
serverData: instance._serverData,
|
|
191
|
-
constant: User.SCHEMA_CONSTANTS,
|
|
192
|
-
apiClient: instance.apiClient,
|
|
193
|
-
transforms: instance.transforms,
|
|
194
|
-
removeFields: instance.removeFields
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
instance._draftData = draft;
|
|
198
|
-
instance.data = proxy;
|
|
199
|
-
|
|
200
|
-
return instance;
|
|
192
|
+
return new User(parent.apiClient, data, deps);
|
|
201
193
|
}
|
|
202
194
|
|
|
203
195
|
/**
|
|
@@ -451,6 +443,18 @@ export class User extends BaseEntity {
|
|
|
451
443
|
return filteredBadges;
|
|
452
444
|
}
|
|
453
445
|
|
|
446
|
+
async user(userData) {
|
|
447
|
+
if(!this.isMe){
|
|
448
|
+
throw new ApiError("Vous devez être connecté et être l'utilisateur");
|
|
449
|
+
}
|
|
450
|
+
if (!userData.id && !userData.slug) {
|
|
451
|
+
throw new ApiError("Vous devez fournir un id ou un slug pour créer un User.");
|
|
452
|
+
}
|
|
453
|
+
const user = new User(this, userData, this.deps);
|
|
454
|
+
await user.get();
|
|
455
|
+
return user;
|
|
456
|
+
}
|
|
457
|
+
|
|
454
458
|
/**
|
|
455
459
|
* Crée une instance d'organisation et récupère son profil si nécessaire.
|
|
456
460
|
*
|
|
@@ -535,6 +539,209 @@ export class User extends BaseEntity {
|
|
|
535
539
|
return super.badge(badgeData);
|
|
536
540
|
}
|
|
537
541
|
|
|
542
|
+
/**
|
|
543
|
+
* ───────────────────────────────
|
|
544
|
+
* Lien utilisateur ↔ utilisateur (ami)
|
|
545
|
+
* (demander, valider, se retirer)
|
|
546
|
+
* ───────────────────────────────
|
|
547
|
+
*/
|
|
548
|
+
|
|
549
|
+
/**
|
|
550
|
+
* Envoie une demande d'amitié à cet utilisateur.
|
|
551
|
+
* L'utilisateur ciblé devra valider la demande pour établir la relation.
|
|
552
|
+
*
|
|
553
|
+
* @returns {Promise<Object>} - Résultat de la requête.
|
|
554
|
+
* @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'action est interdite.
|
|
555
|
+
*/
|
|
556
|
+
async sendFriendRequest() {
|
|
557
|
+
if (!this.isActingUser) {
|
|
558
|
+
throw new ApiError("Vous devez être connecté pour envoyer une demande d'amis.");
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
this._checkLinkableEntity();
|
|
562
|
+
if (!this.id) {
|
|
563
|
+
throw new ApiError(`${this.constructor.name} non enregistrée.`);
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
const { connectTypeConnect } = this._getLinkMeta();
|
|
567
|
+
const userLink = this._getLinkFromConnectedUser();
|
|
568
|
+
|
|
569
|
+
if (!userLink) {
|
|
570
|
+
const data = {
|
|
571
|
+
parentType: this.getEntityType(),
|
|
572
|
+
parentId: this.id,
|
|
573
|
+
connectType: connectTypeConnect
|
|
574
|
+
};
|
|
575
|
+
const retour = await this.endpointApi.connect(data);
|
|
576
|
+
// TODO : reflechier au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh
|
|
577
|
+
await this.parent.refresh();
|
|
578
|
+
return retour;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
if (userLink.isInviting && userLink.invitorId === this.id) {
|
|
582
|
+
return this.acceptFriendRequest();
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
if (userLink.isInviting && userLink.invitorId === this.userId) {
|
|
586
|
+
throw new ApiError("Vous avez déjà envoyé une demande d'amis à cet utilisateur.");
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
throw new ApiError("Vous êtes déjà connecté à cette entité.");
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
/**
|
|
593
|
+
* Accepte une demande d'amitié envoyée par cet utilisateur.
|
|
594
|
+
* Cette action établit un lien entre les deux utilisateurs.
|
|
595
|
+
*
|
|
596
|
+
* @returns {Promise<Object>} - Résultat de la validation du lien.
|
|
597
|
+
* @throws {ApiError} - Si aucune invitation n'est en attente ou si l'action est interdite.
|
|
598
|
+
*/
|
|
599
|
+
async acceptFriendRequest() {
|
|
600
|
+
if (!this.isActingUser) {
|
|
601
|
+
throw new ApiError("Vous devez être connecté pour accepter une demande d'amitié.");
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
this._checkLinkableEntity();
|
|
605
|
+
if (!this.id) {
|
|
606
|
+
throw new ApiError(`${this.constructor.name} non enregistrée.`);
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
const userLink = this._getLinkFromConnectedUser();
|
|
610
|
+
|
|
611
|
+
if (userLink?.isInviting && userLink.invitorId === this.id) {
|
|
612
|
+
const data = {
|
|
613
|
+
parentType: this.getEntityType(),
|
|
614
|
+
parentId: this.id,
|
|
615
|
+
linkOption: "isInviting"
|
|
616
|
+
};
|
|
617
|
+
const retour = await this.endpointApi.linkValidate(data);
|
|
618
|
+
// TODO : reflechier au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh
|
|
619
|
+
await this.parent.refresh();
|
|
620
|
+
return retour;
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
throw new ApiError("Vous n'avez pas d'invitation à valider.");
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
/**
|
|
627
|
+
* Supprime la relation d'amitié avec cet utilisateur.
|
|
628
|
+
* Cette action annule tout lien existant entre les deux profils.
|
|
629
|
+
*
|
|
630
|
+
* @returns {Promise<Object>} - Résultat de la suppression.
|
|
631
|
+
* @throws {ApiError} - Si aucune relation n'existe.
|
|
632
|
+
*/
|
|
633
|
+
async removeFriend() {
|
|
634
|
+
if (!this.isActingUser) {
|
|
635
|
+
throw new ApiError("Vous devez être connecté pour supprimer un ami.");
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
this._checkLinkableEntity();
|
|
639
|
+
if (!this.id) {
|
|
640
|
+
throw new ApiError(`${this.constructor.name} non enregistrée.`);
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
const { connectTypeDisconnect } = this._getLinkMeta();
|
|
644
|
+
const userLink = this._getLinkFromConnectedUser();
|
|
645
|
+
|
|
646
|
+
if (!userLink) {
|
|
647
|
+
throw new ApiError("Vous n'êtes pas connecté à cette entité.");
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
const data = {
|
|
651
|
+
parentType: this.getEntityType(),
|
|
652
|
+
parentId: this.id,
|
|
653
|
+
connectType: connectTypeDisconnect
|
|
654
|
+
};
|
|
655
|
+
const retour = await this.endpointApi.disconnect(data);
|
|
656
|
+
// TODO : reflechier au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh
|
|
657
|
+
await this.parent.refresh();
|
|
658
|
+
return retour;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
|
|
662
|
+
requestToJoin() {
|
|
663
|
+
throw new ApiError("l'utilisation de requestToJoin n'est pas autorisée sur un utilisateur.");
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
requestToJoinAdmin() {
|
|
667
|
+
throw new ApiError("l'utilisation de requestToJoinAdmin n'est pas autorisée sur un utilisateur.");
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
acceptInvitation() {
|
|
671
|
+
throw new ApiError("l'utilisation de acceptInvitation n'est pas autorisée sur un utilisateur.");
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
leave() {
|
|
675
|
+
throw new ApiError("l'utilisation de leave n'est pas autorisée sur un utilisateur.");
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
/**
|
|
679
|
+
* Suivre un utilisateur
|
|
680
|
+
* Cette action permet à l'utilisateur connecté de suivre un autre utilisateur.
|
|
681
|
+
* Elle nécessite que l'utilisateur soit connecté.
|
|
682
|
+
*
|
|
683
|
+
* @returns {Promise<Object>} - Résultat de la requête.
|
|
684
|
+
* @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'action est interdite.
|
|
685
|
+
*/
|
|
686
|
+
async follow() {
|
|
687
|
+
if (!this.isActingUser) {
|
|
688
|
+
throw new ApiError("Vous devez être connecté pour suivre un utilisateur.");
|
|
689
|
+
}
|
|
690
|
+
if (!this.id) {
|
|
691
|
+
throw new ApiError(`${this.constructor.name} non enregistrée.`);
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
const userLink = this.parent?.serverData?.links?.["follows"]?.[this.id] || null;
|
|
695
|
+
|
|
696
|
+
if (!userLink) {
|
|
697
|
+
const data = {
|
|
698
|
+
parentType: this.getEntityType(),
|
|
699
|
+
parentId: this.id
|
|
700
|
+
};
|
|
701
|
+
const retour = await this.endpointApi.follow(data);
|
|
702
|
+
// TODO : reflechier au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh
|
|
703
|
+
await this.parent.refresh();
|
|
704
|
+
return retour;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
throw new ApiError("Vous êtes déjà abonné à cet utilisateur.");
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
/**
|
|
711
|
+
* Se désabonner d'un utilisateur
|
|
712
|
+
* Cette action permet à l'utilisateur connecté de se désabonner d'un autre utilisateur.
|
|
713
|
+
* Elle nécessite que l'utilisateur soit connecté.
|
|
714
|
+
*
|
|
715
|
+
* @returns {Promise<Object>} - Résultat de la requête.
|
|
716
|
+
* @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'action est interdite.
|
|
717
|
+
*/
|
|
718
|
+
async unfollow() {
|
|
719
|
+
if (!this.isActingUser) {
|
|
720
|
+
throw new ApiError("Vous devez être connecté pour vous désabonner d'un utilisateur.");
|
|
721
|
+
}
|
|
722
|
+
if (!this.id) {
|
|
723
|
+
throw new ApiError(`${this.constructor.name} non enregistrée.`);
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
const userLink = this.parent?.serverData?.links?.["follows"]?.[this.id] || null;
|
|
727
|
+
|
|
728
|
+
if (userLink) {
|
|
729
|
+
const data = {
|
|
730
|
+
parentType: this.getEntityType(),
|
|
731
|
+
parentId: this.id,
|
|
732
|
+
connectType: "followers"
|
|
733
|
+
};
|
|
734
|
+
const retour = await this.endpointApi.disconnect(data);
|
|
735
|
+
// TODO : reflechir au moyen de remplir parent.serverData et this.serverData avec les data de retour pour eviter un refresh
|
|
736
|
+
await this.parent.refresh();
|
|
737
|
+
return retour;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
throw new ApiError("Vous n'êtes pas abonné à cet utilisateur.");
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
|
|
744
|
+
|
|
538
745
|
}
|
|
539
746
|
|
|
540
747
|
// Incorporation des mixins dans User
|