veza/docs/V0_302_IMPLEMENTATION.md

151 lines
5.2 KiB
Markdown
Raw Normal View History

# Guide d'implémentation v0.302
**Version** : v0.302
**Date** : 21 février 2026
**Référence** : [V0_302_RELEASE_SCOPE.md](V0_302_RELEASE_SCOPE.md)
---
## 1. Résumé
| Lot | Statut | Description |
|-----|--------|-------------|
| S2 | ✅ Livré | Groupes avancés — demander à rejoindre, inviter, rôles, feed groupes, mes groupes |
| N1 | ✅ Livré | Web Push — subscription, envoi sur événement, préférences, badge |
| P2 | ✅ Livré | Présence enrichie — rich presence (track), mode invisible |
| C2 | ⏸ Reporté v0.303 | Chat appels WebRTC — ticket dans V0_303_RELEASE_SCOPE.md |
---
## 2. Migrations
Toutes les migrations sont dans `veza-backend-api/migrations/` :
| # | Fichier | Description |
|---|---------|-------------|
| 069 | `069_groups_and_members.sql` | groups, group_members (prérequis S2) |
| 089 | `089_group_join_requests.sql` | group_join_requests |
| 090 | `090_push_subscriptions.sql` | push_subscriptions |
| 091 | `091_user_presence_invisible.sql` | user_presence.invisible |
| 092 | `092_group_invitations.sql` | group_invitations |
| 093 | `093_notification_preferences.sql` | notification_preferences |
| 094 | `094_user_presence_rich.sql` | user_presence (track_id, track_title) |
---
## 3. Backend — Routes et handlers
### Lot S2 — Groupes avancés
| Méthode | Route | Handler |
|---------|-------|---------|
| GET | `/api/v1/social/groups/mine` | `groupHandler.ListMyGroups` |
| POST | `/api/v1/social/groups/:id/request` | `groupHandler.RequestToJoin` |
| GET | `/api/v1/social/groups/:id/requests` | `groupHandler.ListJoinRequests` |
| POST | `/api/v1/social/groups/:id/requests/:request_id/approve` | `groupHandler.ApproveJoinRequest` |
| POST | `/api/v1/social/groups/:id/requests/:request_id/reject` | `groupHandler.RejectJoinRequest` |
| POST | `/api/v1/social/groups/:id/invite` | `groupHandler.InviteMember` |
| PUT | `/api/v1/social/groups/:id/members/:user_id/role` | `groupHandler.UpdateMemberRole` |
**Fichiers** : `internal/handlers/group_handler.go`, `internal/core/social/group_service.go`, `internal/api/routes_social.go`
### Lot N1 — Notifications push
| Méthode | Route | Handler |
|---------|-------|---------|
| POST | `/api/v1/notifications/push/subscribe` | `NotificationHandlersInstance.SubscribePush` |
| GET | `/api/v1/notifications/preferences` | `NotificationHandlersInstance.GetPreferences` |
| PUT | `/api/v1/notifications/preferences` | `NotificationHandlersInstance.UpdatePreferences` |
**Fichiers** : `internal/services/push_service.go`, `internal/handlers/notification_handlers.go`, `internal/api/routes_core.go`
### Lot P2 — Présence enrichie
| Méthode | Route | Handler |
|---------|-------|---------|
| PUT | `/api/v1/users/me/presence` | `PresenceHandler.UpdatePresence` |
**Corps** : `{ status?, invisible?, track_id?, track_title? }`
**Fichiers** : `internal/handlers/presence_handler.go`, `internal/services/presence_service.go`
---
## 4. Frontend — Composants et services
### Lot S2
| Fichier | Rôle |
|---------|------|
| `src/services/groupService.ts` | API client — listMine, requestJoin, approveRequest, rejectRequest, invite, updateMemberRole |
| `src/components/social/groups/GroupsView.tsx` | Liste groupes, onglet « Mes groupes » |
| `src/components/social/groups/group-detail-view/useGroupDetailView.ts` | Logique détail groupe, demandes, invitations, rôles |
### Lot N1
| Fichier | Rôle |
|---------|------|
| `src/features/settings/components/PushPreferencesSection.tsx` | Préférences push (follow, like, message) |
| `src/features/notifications/hooks/usePushSubscribe.ts` | Subscription Web Push via pushManager |
| `public/sw.ts` | Service Worker — gestion push events, badge |
### Lot P2
| Fichier | Rôle |
|---------|------|
| `src/features/presence/hooks/usePresenceSync.ts` | Sync présence (status, track) vers API |
| `src/features/settings/components/PresenceInvisibleToggle.tsx` | Toggle mode invisible |
### MSW handlers
| Fichier | Routes mockées |
|---------|---------------|
| `src/mocks/handlers-social.ts` | groups/mine, groups/:id/request, groups/:id/requests, approve, reject, invite |
| `src/mocks/handlers-misc.ts` | push/subscribe, preferences, users/me/presence |
---
## 5. Configuration
### Variables d'environnement
| Composant | Variable | Obligatoire | Description |
|-----------|----------|-------------|-------------|
| Backend | `VAPID_PUBLIC_KEY` | Oui (pour push) | Clé publique VAPID Web Push |
| Backend | `VAPID_PRIVATE_KEY` | Oui (pour push) | Clé privée VAPID Web Push |
| Frontend | `VITE_FCM_VAPID_KEY` | Non | Clé publique VAPID (même que backend) pour pushManager.subscribe |
Sans VAPID configuré, le backend accepte les requêtes mais les push ne seront pas envoyés.
---
## 6. Validation
### Commandes
```bash
# Backend
cd veza-backend-api && go build ./...
# Frontend
cd apps/web && npm run build
```
### Tests légers
```bash
# Backend
cd veza-backend-api && go test ./... -short
# Frontend
cd apps/web && npm test -- --run
```
---
## Références
- [V0_302_RELEASE_SCOPE.md](V0_302_RELEASE_SCOPE.md) — Scope et critères
- [SCOPE_CONTROL.md](SCOPE_CONTROL.md) — Processus anti-scope-creep
- [FEATURE_STATUS.md](FEATURE_STATUS.md) — Statut des features