chore(release): v0.971 — Phantom (gamification removal, WebRTC Beta, limits doc)
Some checks failed
Backend API CI / test-unit (push) Failing after 0s
Backend API CI / test-integration (push) Failing after 0s
Frontend CI / test (push) Failing after 0s
Storybook Audit / Build & audit Storybook (push) Failing after 0s

This commit is contained in:
senke 2026-03-02 19:25:37 +01:00
parent da837fc085
commit d577f8c9be
12 changed files with 144 additions and 19 deletions

View file

@ -1,5 +1,27 @@
# Changelog - Veza
## [v0.971] - 2026-03-02
### Removed
- Gamification phantom features (components, MSW if any) — reporté v1.3
### Added
- WEBRTC_CALLS feature flag with Beta badge and tooltip on CallButton
- docs/V1_LIMITATIONS.md
- docs/API_VERSIONING_POLICY.md
- Migration 936: WEBRTC_CALLS flag
- GET /api/v1/feature-flags for authenticated users (client-visible flags)
- adminService.getClientFeatureFlags()
- MSW handler for GET /api/v1/feature-flags
### Changed
- CallButton: Badge "Beta", tooltip "Fonctionne mieux sur le même réseau local"
- ChatRoom: fetches WEBRTC_CALLS, shows CallButton only when enabled
- FEATURE_STATUS: Gamification → Abandonné v1.0, WebRTC → Beta LAN only
- PROJECT_STATE: dernier tag v0.971, prochaine v0.981
---
## [v0.951] - 2026-03-02
### Added

View file

@ -1 +1 @@
0.951
0.971

View file

@ -1,4 +1,6 @@
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { Tooltip } from '@/components/ui/tooltip';
import { Phone } from 'lucide-react';
interface CallButtonProps {
@ -15,15 +17,18 @@ export function CallButton({
disabled = false,
}: CallButtonProps) {
return (
<Button
variant="ghost"
size="sm"
onClick={onCall}
disabled={disabled}
className="h-8 w-8 p-0 text-muted-foreground hover:text-foreground"
aria-label="Appeler"
>
<Phone className="h-4 w-4" />
</Button>
<Tooltip content="Fonctionne mieux sur le même réseau local">
<Button
variant="ghost"
size="sm"
onClick={onCall}
disabled={disabled}
className="h-8 gap-1.5 px-2 text-muted-foreground hover:text-foreground"
aria-label="Appeler (Beta)"
>
<Phone className="h-4 w-4" />
<Badge variant="gold" label="Beta" className="text-[10px] px-1 py-0" />
</Button>
</Tooltip>
);
}

View file

@ -15,6 +15,7 @@ import {
import { Button } from '@/components/ui/button';
import { cn } from '@/lib/utils';
import { useUser } from '@/features/auth/hooks/useUser';
import { adminService } from '@/services/adminService';
interface ChatRoomProps {
conversationId: string;
@ -28,11 +29,19 @@ export const ChatRoom: React.FC<ChatRoomProps> = ({ conversationId }) => {
const webrtc = useWebRTC({ sendMessage: sendRawMessage });
const messagesEndRef = useRef<HTMLDivElement>(null);
const [showSearch, setShowSearch] = useState(false);
const [webrtcEnabled, setWebrtcEnabled] = useState(true);
const [highlightedMessageId, setHighlightedMessageId] = useState<
string | null
>(null);
const highlightTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
useEffect(() => {
adminService.getClientFeatureFlags().then((flags) => {
const webrtc = flags.find((f) => f.name === 'WEBRTC_CALLS');
setWebrtcEnabled(webrtc?.enabled ?? true);
}).catch(() => setWebrtcEnabled(true));
}, []);
// Cleanup highlight timeout on unmount
useEffect(() => {
return () => {
@ -167,7 +176,7 @@ export const ChatRoom: React.FC<ChatRoomProps> = ({ conversationId }) => {
</div>
) : (
<div className="flex justify-end items-center gap-2 pointer-events-auto">
{isDM && targetUserId && (
{isDM && targetUserId && webrtcEnabled && (
<CallButton
conversationId={conversationId}
targetUserId={targetUserId}

View file

@ -301,7 +301,7 @@ export const handlersAdmin = [
);
}),
// v0.803: Feature flags
// v0.803: Feature flags (admin)
http.get('*/api/v1/admin/feature-flags', () => {
return HttpResponse.json({
feature_flags: [
@ -309,6 +309,20 @@ export const handlersAdmin = [
{ name: 'ROLE_MANAGEMENT', enabled: true, description: 'Enable role management' },
{ name: 'PLAYLIST_SHARE', enabled: true, description: 'Enable playlist sharing' },
{ name: 'PLAYLIST_RECOMMENDATIONS', enabled: true, description: 'Enable playlist recommendations' },
{ name: 'WEBRTC_CALLS', enabled: true, description: 'WebRTC audio calls — Beta' },
],
});
}),
// v0.971: Client feature flags (authenticated users)
http.get('*/api/v1/feature-flags', () => {
return HttpResponse.json({
feature_flags: [
{ name: 'HLS_STREAMING', enabled: true },
{ name: 'ROLE_MANAGEMENT', enabled: true },
{ name: 'PLAYLIST_SHARE', enabled: true },
{ name: 'PLAYLIST_RECOMMENDATIONS', enabled: true },
{ name: 'WEBRTC_CALLS', enabled: true },
],
});
}),

View file

@ -106,6 +106,12 @@ export const adminService = {
return response.data?.feature_flags ?? [];
},
/** v0.971: Client-visible flags for any authenticated user (e.g. WEBRTC_CALLS) */
getClientFeatureFlags: async () => {
const response = await apiClient.get<{ feature_flags: { name: string; enabled: boolean }[] }>('/feature-flags');
return response.data?.feature_flags ?? [];
},
toggleFeatureFlag: async (name: string, enabled: boolean) => {
await apiClient.put(`/admin/feature-flags/${encodeURIComponent(name)}`, { enabled });
return { success: true };

View file

@ -0,0 +1,33 @@
# Politique de versioning API — Veza v1.0
**Référence** : v0.971
**Contrat stable** : `/api/v1/`
## 1. Routes stables vs beta
| Type | Exemple | Engagement |
|------|---------|------------|
| **Stable** | `/api/v1/tracks`, `/api/v1/auth/*`, `/api/v1/playlists`, `/api/v1/marketplace/*` | Rétro-compatibilité garantie pour v1.x |
| **Beta** | Fonctionnalités derrière feature flag (ex. WEBRTC_CALLS) | Peut évoluer sans préavis en v1.x |
## 2. Politique de dépréciation
- Les routes dépréciées conservent un header `X-API-Deprecated: true` et une date de fin de vie dans la réponse.
- Période de dépréciation : minimum 6 mois avant suppression.
- Documentation : `API_REFERENCE.md` et Swagger reflètent le statut des routes.
## 3. Headers de version
- `X-API-Version: v1` — optionnel, le path `/api/v1/` suffit.
- `Accept: application/vnd.veza.v1+json` — supporté pour content negotiation.
## 4. Engagement rétro-compatibilité v1.x
- Aucun breaking change sur les routes stables pendant v1.x.
- Les ajouts (nouveaux champs, nouvelles routes) sont rétro-compatibles.
- En cas de breaking change : nouvelle version majeure (v2).
## 5. Breaking changes v0.803 → v1.0
- **Pagination cursor** : certains endpoints utilisent `cursor` / `next_cursor` au lieu de `page` / `limit` (v0.931).
- Voir `CHANGELOG.md` pour la liste complète des changements.

View file

@ -1,6 +1,6 @@
# Statut des fonctionnalités — Veza
**Dernière mise à jour** : février 2026 — v0.803 livrée (Sécurité, Compliance, Modération, Maintenance, Annonces, Feature flags)
**Dernière mise à jour** : mars 2026 — v0.971 (Phantom: gamification supprimé, WebRTC Beta)
Ce document décrit le statut réel des fonctionnalités par rapport au code.
@ -34,7 +34,12 @@ Ce document décrit le statut réel des fonctionnalités par rapport au code.
|---------|-------------|--------|
| **Studio** (Cloud File Browser) | Supprimé | Dossier supprimé |
| **Education** | Supprimé | Dossier supprimé |
| **Gamification** (achievements, leaderboard) | MSW handlers | api_manager archivé (internal/api/archive/), MSW uniquement |
## Abandonné v1.0 (reporté versions futures)
| Feature | Version cible |
|---------|---------------|
| **Gamification** (achievements, leaderboard, XP) | v1.3 — supprimé v0.971 (phantom) |
## Fonctionnalités désactivées (feature flags)
@ -50,6 +55,7 @@ Ce document décrit le statut réel des fonctionnalités par rapport au code.
| Feature | Limitation | Version cible |
|---------|------------|--------------|
| **Go Live** (streaming vidéo) | Livré v0.703 — page /live/go-live, stream key, OBS instructions | — |
| **Appels WebRTC** | Beta — fonctionne mieux sur le même réseau local (TURN/STUN v1.1) | v1.1 (flag WEBRTC_CALLS) |
| **2FA SMS** | Option « Envoyer par SMS » pendant la vérification 2FA — requiert infra Twilio + users.phone_number | v0.104 |
| **Passkeys / WebAuthn** | Login sans mot de passe — requiert go-webauthn, table webauthn_credentials, frontend navigator.credentials | v0.104 |

View file

@ -1,4 +1,4 @@
# État du projet Veza — Février 2026
# État du projet Veza — Mars 2026
**Document opérationnel** : Où en sommes-nous, quelles sont les prochaines étapes.
@ -8,10 +8,10 @@
| Élément | Valeur |
|---------|--------|
| **Dernier tag** | v0.803 |
| **Dernier tag** | v0.971 |
| **Branche courante** | `main` |
| **Phase** | Phase 8 — Polish & Scale |
| **Prochaine version** | v0.901 |
| **Phase** | Phase 9 — v1.0 Launch |
| **Prochaine version** | v0.981 (Beta) |
---

21
docs/V1_LIMITATIONS.md Normal file
View file

@ -0,0 +1,21 @@
# Limitations v1.0 — Veza
Ce document liste les fonctionnalités **non incluses** dans la v1.0 et leur version cible.
| Feature | Limitation | Version cible |
|---------|------------|---------------|
| **WebRTC TURN/STUN** | Appels audio fonctionnent mieux sur le même réseau local. Pas de serveur TURN pour NAT symétrique. | v1.1 |
| **2FA SMS** | Envoi code par SMS pendant vérification 2FA — requiert infra Twilio. | v1.1 |
| **Passkeys / WebAuthn** | Login sans mot de passe. | v1.2 |
| **Live RTMP réel** | Streaming vidéo live — infrastructure RTMP/TLS. | v1.2 |
| **Gamification** | XP, achievements, leaderboards — supprimé v0.971. | v1.3 |
| **Studio** | Cloud File Browser — abandonné. | — |
| **Education** | Cours, certificats — abandonné. | — |
| **Mobile app** | Apps natives iOS/Android — abandonné pour v1.0. | — |
| **Redis HA** | Haute disponibilité Redis (Sentinel, clustering). | v1.1 |
| **PostgreSQL replication** | Read replicas, streaming replication. | v1.1 |
## Notes
- WebRTC : flag `WEBRTC_CALLS` activé par défaut, badge "Beta" sur le bouton d'appel.
- Gamification : composants et handlers MSW supprimés en v0.971 (Phantom).

View file

@ -317,6 +317,11 @@ func (r *APIRouter) setupCoreProtectedRoutes(v1 *gin.RouterGroup) {
reportHandlerForUser := handlers.NewReportHandler(reportServiceForUser)
protected.POST("/reports", reportHandlerForUser.CreateReport)
// v0.971: Client-visible feature flags (e.g. WEBRTC_CALLS for CallButton)
featureFlagSvc := services.NewFeatureFlagService(r.db.GormDB, r.logger)
featureFlagHandler := handlers.NewFeatureFlagHandler(featureFlagSvc)
protected.GET("/feature-flags", featureFlagHandler.List)
audit := protected.Group("/audit")
{
audit.GET("/logs", auditHandler.SearchLogs())

View file

@ -0,0 +1,4 @@
-- v0.971: WEBRTC_CALLS feature flag (Beta, works best on same network)
INSERT INTO feature_flags (name, enabled, description) VALUES
('WEBRTC_CALLS', true, 'WebRTC audio calls — Beta, works best on same network')
ON CONFLICT (name) DO NOTHING;