Système d'Amis

Cette section détaille le système de gestion des amis, permettant aux utilisateurs de créer des liens, d'envoyer des demandes, et de recevoir des notifications en temps réel.

FriendsService (friends.service.ts)

Service qui gère la logique métier des relations d'amitié.

Méthodes principales

async searchUsers(searchTerm: string, currentUserFirebaseUid: string)

Description : Recherche des utilisateurs par nom d'utilisateur.
Paramètres :

Validation :

Retour : Promise<UserSearchResult[]> (username, avatarUrl, firebaseUid, friendshipStatus)

async sendFriendRequest(senderUid: string, receiverUid: string)

Description : Envoie une demande d'ami.
Paramètres :

Validations :

Actions :

  1. Ajout à pendingFriendsRequest du destinataire
  2. Notification temps réel via FriendsNotificationService
  3. Notification push FCM si mobile

Retour : Promise<void>

async acceptFriendRequest(accepterUid: string, requesterUid: string)

Description : Accepte une demande d'ami.
Paramètres :

Actions :

  1. Ajout mutuel dans friends[] des deux utilisateurs
  2. Retrait de pendingFriendsRequest
  3. Notifications aux deux utilisateurs

Retour : Promise<void>

async rejectFriendRequest(rejecterUid: string, requesterUid: string)

Description : Refuse une demande d'ami.
Actions :

  1. Retrait de pendingFriendsRequest
  2. Notification au demandeur

Retour : Promise<void>

async getFriendsList(firebaseUid: string)

Description : Récupère la liste des amis avec leurs informations.
Retour : Promise<FriendInfo[]> (username, avatarUrl, isOnline, etc.)

async getPendingRequests(firebaseUid: string)

Description : Récupère les demandes d'amis reçues.
Retour : Promise<FriendRequestInfo[]>

async getSentRequests(firebaseUid: string)

Description : Récupère les demandes d'amis envoyées.
Retour : Promise<FriendRequestInfo[]>

async removeFriend(userUid: string, friendUid: string)

Description : Supprime une relation d'amitié.
Actions :

  1. Retrait mutuel de friends[]
  2. Notifications aux deux utilisateurs

Retour : Promise<void>

FriendsController (friends.controller.ts)

Contrôleur REST pour les endpoints d'amis.

Endpoints

GET /api/friends/search?username=X

Description : Recherche des utilisateurs.
Query params :

Réponse :

{
    users: [{
        firebaseUid: string,
        username: string,
        avatarUrl: string,
        friendshipStatus: 'none' | 'friend' | 'pending_sent' | 'pending_received'
    }]
}

POST /api/friends/request

Description : Envoie une demande d'ami.
Body :

{ receiverFirebaseUid: string }

Réponse :

{ success: true, message: string }

POST /api/friends/accept

Description : Accepte une demande d'ami.
Body :

{ requesterFirebaseUid: string }

POST /api/friends/reject

Description : Refuse une demande d'ami.
Body :

{ requesterFirebaseUid: string }

GET /api/friends/list

Description : Liste des amis.
Réponse :

{
    friends: [{
        firebaseUid: string,
        username: string,
        avatarUrl: string,
        isOnline: boolean
    }]
}

GET /api/friends/pending

Description : Demandes d'amis reçues.

GET /api/friends/sent

Description : Demandes d'amis envoyées.

DELETE /api/friends/:friendFirebaseUid

Description : Supprime un ami.
Params :

FriendsSocketService (friends-socket.service.ts)

Service qui gère les événements Socket.IO pour les amis.

Méthodes

handleSocket(socket: Socket): void

Description : Configure les écouteurs d'événements pour les amis.
Événements : Aucun event reçu directement, service utilisé pour émettre les notifications

FriendsNotificationService (friends-notification.service.ts)

Service qui envoie les notifications en temps réel pour les événements d'amis.

Méthodes

notifyFriendRequest(senderUid: string, receiverUid: string): void

Description : Notifie un utilisateur d'une nouvelle demande d'ami.
Event émis : FriendRequestReceived à la room user:{receiverUid}
Retour : void

notifyFriendRequestAccepted(accepterUid: string, requesterUid: string): void

Description : Notifie les deux utilisateurs de l'acceptation.
Events émis : FriendRequestAccepted aux deux rooms
Retour : void

notifyFriendRequestRejected(rejecterUid: string, requesterUid: string): void

Description : Notifie le demandeur du refus.
Event émis : FriendRequestRejected à la room user:{requesterUid}
Retour : void

notifyFriendRemoved(userUid: string, friendUid: string): void

Description : Notifie les deux utilisateurs de la suppression de l'amitié.
Events émis : FriendRemoved aux deux rooms
Retour : void

Events Socket.IO

Events émis

Event Description Destinataire
FriendRequestReceived Nouvelle demande d'ami Room user:{receiverUid}
FriendRequestAccepted Demande acceptée Rooms des deux utilisateurs
FriendRequestRejected Demande refusée Room user:{requesterUid}
FriendRemoved Ami supprimé Rooms des deux utilisateurs

Intégration avec UserService

Le système d'amis modifie directement les propriétés de la classe User :

Notifications Push (FCM)

Le système d'amis s'intègre avec FirebaseMessagingService pour envoyer des notifications push aux utilisateurs mobiles :

Statut de relation

Lors de la recherche d'utilisateurs, le serveur calcule le statut de la relation :

Statut Description
none Aucune relation
friend Déjà amis
pending_sent Demande envoyée (en attente)
pending_received Demande reçue (en attente)

Ce statut permet au client d'afficher les actions appropriées (envoyer demande, accepter, déjà ami, etc.).