Commit graph

492 commits

Author SHA1 Message Date
senke
70ba65b0f4 feat(v0.11.1): F396-F399 frontend advanced analytics components
- AnalyticsViewHeatmap: track listening heatmap visualization (F396)
- AnalyticsViewComparison: period comparison with % changes (F397)
- AnalyticsViewMarketplace: product conversion rates and revenue (F398)
- AnalyticsViewAlerts: opt-in metric alerts with CRUD (F399)
- Updated analytics service with new API methods
- Extended tab navigation with 3 new tabs
- All components have ARIA labels and keyboard navigation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 17:13:13 +01:00
senke
5e9940e95c feat(v0.11.0): F381-F385 frontend creator analytics components
Add new analytics tabs and components:
- AnalyticsViewSales: revenue, sales history, top selling tracks (F383)
- AnalyticsViewAudience: aggregated audience profile with privacy (F384)
- AnalyticsViewGeographic: geographic play distribution (F381)
- Updated analyticsService with all new API endpoints
- Updated AnalyticsView with tab navigation (overview/sales/audience/geographic)
- Discovery sources integration into Origins component

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 16:30:59 +01:00
senke
f2881ad865 feat(gdpr): v0.10.8 portabilité données - export ZIP async, suppression compte, hard delete cron
Some checks failed
Backend API CI / test-unit (push) Failing after 1s
Frontend CI / test (push) Failing after 3s
Storybook Audit / Build & audit Storybook (push) Failing after 2s
Backend API CI / test-integration (push) Failing after 6s
- Export: table data_exports, POST /me/export (202), GET /me/exports, messages+playback_history
- Notification email quand ZIP prêt, rate limit 3/jour
- Suppression: keep_public_tracks, anonymisation PII complète (users, user_profiles)
- HardDeleteWorker: final anonymization après 30 jours
- Frontend: POST export, checkbox keep_public_tracks
- MSW handlers pour Storybook
2026-03-10 13:57:04 +01:00
senke
2292ecd56b feat(v0.10.7): Collaboration Temps Réel F481-F483
Some checks failed
Backend API CI / test-unit (push) Failing after 2s
Frontend CI / test (push) Failing after 3s
Backend API CI / test-integration (push) Failing after 5s
Storybook Audit / Build & audit Storybook (push) Failing after 2s
- F481: Co-listening sessions (WebSocket sync, ListenTogether page)
- F482: Stem sharing (upload/list/download wav,aiff,flac)
- F483: Collaborative rooms (type collaborative, max 10, invite-only)
- Roadmap: v0.10.7 → DONE
2026-03-10 13:34:16 +01:00
senke
3c01fa742f feat(v0.10.6): Livestreaming basique F471-F476
Some checks failed
Backend API CI / test-unit (push) Failing after 4s
Frontend CI / test (push) Failing after 2s
Storybook Audit / Build & audit Storybook (push) Failing after 3s
Backend API CI / test-integration (push) Failing after 4s
- Backend: callbacks on_publish/on_publish_done, UpdateStreamURL, GetByStreamKey
- Nginx-RTMP: config infra, docker-compose service (profil live)
- Frontend: stream_url dans LiveStream, HLS.js dans LiveViewPlayer, état Stream terminé
- Chat: rate limit send_live_message 1 msg/3s pour rooms live_streams
- Env: RTMP_CALLBACK_SECRET, STREAM_HLS_BASE_URL, NGINX_RTMP_HOST
- Roadmap v0.10.6 marquée DONE
2026-03-10 10:21:57 +01:00
senke
9de06bbf48 feat(v0.10.5): Notifications Complètes (F551-F555)
- Phase 1: Default prefs — push_message & push_follow only; migration 941
- Phase 2: Digest = new tracks from followed artists (ORIGIN §8.1), not unread notifications
- Phase 3: Toggle 'désactiver marketing' + button 'Tout désactiver sauf messages et follows'
- Phase 4: PushPreferencesSection first in NotificationSettings (source of truth)
- Roadmap: v0.10.5 → DONE
2026-03-10 10:09:32 +01:00
senke
c2b3a68fd5 feat(v0.10.5): Notifications complètes — F551-F555
Some checks failed
Backend API CI / test-unit (push) Failing after 1s
Backend API CI / test-integration (push) Failing after 2s
Frontend CI / test (push) Failing after 2s
Storybook Audit / Build & audit Storybook (push) Failing after 2s
F555: Backend pagination/filter GetNotifications (type, page, limit) + frontend pagination
F551: WebSocket real-time — backend inject chat hub, send on CreateNotification; frontend useChat invalidates
F553: Quiet hours — migration 132, CreateNotification skips push/WS, UI in PushPreferencesSection
F554: Notification grouping — migration 133, group_key/actor_count for like/comment, UI format
F552: Weekly digest — migration 134, NotificationDigestWorker, email template, prefs UI

Acceptance: no gamification notif; defaults unchanged; individual toggles for marketing
2026-03-10 10:02:21 +01:00
senke
16a338da62 stabilisation commit: while implementing v0.10.5 2026-03-09 19:36:33 +01:00
senke
7259526d43 feat(v0.10.4): Playlists collaboratives - F136, F140, F141, F143, F145
Some checks failed
Backend API CI / test-unit (push) Failing after 2s
Backend API CI / test-integration (push) Failing after 6s
Frontend CI / test (push) Failing after 4s
Storybook Audit / Build & audit Storybook (push) Failing after 3s
Backend:
- F141: GET /discover/playlists/editorial for editorial playlists
- F143: GET /playlists/shared/:token (public, no auth)
- F145: POST /playlists/import (JSON), GET /playlists/:id/export/m3u
- F136: GET /playlists/favoris (creates Favoris playlist if needed)
- Repo: GetFavorisByUserID, service GetOrCreateFavorisPlaylist

Frontend:
- SharedPlaylistPage at /playlists/shared/:token (public route)
- Editorial playlists section in DiscoverPage
- Export M3U in ExportPlaylistButton dropdown
- Import JSON via ImportPlaylistButton (PlaylistListPage)
- Favoris sidebar link, FavorisRedirectPage, AddToFavorisButton on tracks

Roadmap: v0.10.4 marked DONE
2026-03-09 16:49:05 +01:00
senke
ef1ca1a908 feat(v0.10.3): Commentaires & Interactions Sociales - F201-F215
- F201: Commentaires avec timestamp cliquable, modération mots-clés
- F202: Likes privés (compteur visible créateur uniquement)
- F203: Reposts de tracks sur le profil, bouton Repost, onglet Reposts
- F204: Notifications (commentaire, repost), pas de gamification

Backend: migrations 127/128, comment_moderation_service, track_repost_service,
  GetTrackLikes/GetTrack masquent like_count pour non-créateurs
Frontend: LikeButton isCreator, RepostButton, Reposts tab profil, timestamp seek
2026-03-09 10:30:47 +01:00
senke
d584778249 feat(v0.10.1): Track edit form - tags/genres (Phase 4.4)
- TrackMetadataEditModal: genres multi-select (max 3) from taxonomy
- Tag input with validation: max 10 tags, 30 chars each
- discoverService.getGenres() for genre list
- UpdateTrackParams/Request: add genres field
2026-03-09 10:00:07 +01:00
senke
6690e334a1 feat(v0.10.1): Tags & Genres discover - F351-F355
- Tags déclaratifs (max 10, 30 chars) via track_tags + tags
- Genres normalisés (max 3) via track_genres + taxonomy
- GET /api/v1/discover/genre/:genre, tag/:tag (browse chrono)
- POST/DELETE follow genre/tag
- Section feed "Nouvelles sorties dans vos genres"
- Track update: SyncTrackTags, SyncTrackGenres via discover service
- Frontend: discoverService, FeedPage by_genres, DiscoverPage
- Migration 126_tags_genres_discover
- MSW handlers for discover
2026-03-09 01:52:56 +01:00
senke
7df866cd3f v0.9.7 beta 2026-03-06 18:58:37 +01:00
senke
99136948cb v0.9.7 2026-03-06 18:52:08 +01:00
senke
05446064ea v0.9.6 2026-03-06 10:29:30 +01:00
senke
8138723eca chore(release): v0.971 — Phantom (gamification removal, WebRTC Beta, limits doc) 2026-03-02 19:25:37 +01:00
senke
4f47cec05d feat(v0.923): API contract tests, OpenAPI generation, CI type sync check 2026-02-27 20:23:10 +01:00
senke
515494007f release(v0.903): Vault - ORDER BY whitelist, rate limiter, VERSION sync, chat-server cleanup, Go 1.24
- ORDER BY dynamiques : whitelist explicite, fallback created_at DESC
- Login/register soumis au rate limiter global
- VERSION sync + check CI
- Nettoyage références veza-chat-server
- Go 1.24 partout (Dockerfile, workflows)
- TODO/FIXME/HACK convertis en issues ou résolus
2026-02-27 09:43:25 +01:00
senke
a3624ce4b3 feat(v0.802): frontend Cloud/Gear, MSW, docs, scope v0.803, archive
- Cloud: CloudFileVersions, CloudShareModal, versions/share in CloudView
- Gear: GearDocumentsTab, GearRepairsTab, warranty badge, initialTab
- MSW: cloud versions/share, gear documents/repairs, tags suggest
- Stories: CloudFileVersions, CloudShareModal, GearDetailModal variants
- gearService: listDocuments, uploadDocument, deleteDocument, listRepairs, createRepair, deleteRepair
- cloudService: listVersions, restoreVersion, shareFile, getSharedFile
- gear_warranty_notifier: 24h ticker, notifications for expiring warranty
- tag_handler_test: unit tests
- docs: API_REFERENCE, CHANGELOG, PROJECT_STATE, FEATURE_STATUS v0.802
- SCOPE_CONTROL, .cursorrules: scope v0.803
- archive: V0_802_RELEASE_SCOPE, RETROSPECTIVE_V0802
2026-02-25 14:00:58 +01:00
senke
a74e5d9876 feat(player): add WakeLock for background playback on mobile 2026-02-25 09:57:37 +01:00
senke
03c29c92ec feat(a11y): ARIA labels, aria-haspopup menu, icon button labels 2026-02-25 09:55:30 +01:00
senke
93666a3390 feat(v0.703): Go Live & Streaming Complet
- Backend: room creation for live streams, permissions CanJoin/CanSend/CanRead for stream rooms
- LiveViewChat: useLiveStreamChat hook, WebSocket connection, stream_id as room
- LiveViewPlayer: real-time viewer count via polling (5s)
- Media Session: seekbackward/seekforward handlers (10s step)
- GoLiveView.stories.tsx: Default, Loading, Error, StreamKeyVisible
- Docs: API_REFERENCE, CHANGELOG, PROJECT_STATE, FEATURE_STATUS, RETROSPECTIVE_V0703
- SCOPE_CONTROL, .cursorrules: update to v0.801
- Archive V0_703_RELEASE_SCOPE.md
2026-02-25 09:35:22 +01:00
senke
f5aa218f57 feat(live): add GoLivePage, GoLiveView, liveService methods, lazy export, route, Navbar/Sidebar wiring 2026-02-24 10:00:43 +01:00
senke
eb9513f00d feat(marketplace): add ProductDetailPage, lazy export, route /marketplace/products/:id 2026-02-24 00:17:39 +01:00
senke
022770ef9f feat(v0.701): AdminTransfers page/route, MSW, stories, Deep Health, API ref, docs, scope v0.702
- Step 13: AdminTransfersPage, LazyAdminTransfers, route /admin/transfers
- Step 14: MSW handlers admin transfers
- Step 15: AdminTransfersView stories (Default, Empty, WithFailedTransfers, Error, Loading)
- Step 16-17: DeepHealth handler (disk, config), GET /health/deep
- Step 19: health_deep_test.go (4 tests)
- Step 20: docs/API_REFERENCE.md
- Step 21: Archive V0_604, MIGRATIONS.md migration 116
- Step 22: CHANGELOG, PROJECT_STATE, FEATURE_STATUS v0.701
- Step 23: RETROSPECTIVE_V0701, V0_702 placeholder, SCOPE_CONTROL, .cursorrules
- Step 24: Archive V0_701_RELEASE_SCOPE
- Fix: AdminTransfersView Select component (use options API)
2026-02-23 23:42:02 +01:00
senke
f929d415d6 fix(player): make PlayerBarGlass 100% responsive
- GlobalPlayer: responsive margins (left-2/right-2 on mobile, left-4/right-4 on sm+),
  bottom-4 on mobile, max-w-full min-w-0 to prevent overflow
- Inner flex: smaller gaps (gap-1.5 sm:gap-2 md:gap-3), reduced padding (px-2 sm:px-3 md:px-4),
  overflow-hidden to contain content
- PlayerBarTrackInfo: min-w-0 for shrink, smaller cover (w-9 on mobile, w-10 sm, w-11 md)
- PlayerBarRight: min-w-0, smaller gaps, hide PiP on <md, hide Like on <sm,
  hide volume divider on <sm, responsive volume slider width
- Hide PlaybackSpeedControl and time display on <sm to save space
2026-02-23 19:37:28 +01:00
senke
fe05567c85 fix(auth): restore login and logout flow
- Clear React Query user cache on logout (auth.ts + logoutLocal in authStore)
  to prevent stale user data in Header/useUser after disconnect
- Fix LoginPage redirect: user was removed from persist (Action 4.1.1.5),
  so parsed.state?.user was always undefined and redirect never triggered.
  Use isAuthenticated directly as source of truth.
- Close Header user menu on logout for cleaner UX
2026-02-23 09:54:05 +01:00
senke
611bb3bf2a feat(player): integrate HLS streaming with ABR quality switching
- Connect useHLSPlayer hook to useAudioPlayerLifecycle for automatic
  HLS activation when feature flag and browser support are available
- Wire quality selector to HLS level switching via hlsPlayer.setQuality
- Expose isHLSActive and hlsLevels from lifecycle hook for UI components
- Create MSW handlers for HLS endpoints (info, status, master/quality
  playlists) for Storybook and testing
- Enable VITE_FEATURE_HLS_STREAMING in .env.storybook
2026-02-22 21:24:40 +01:00
senke
107f9a6a60 feat(chat): Sprint 4 -- Docker cleanup, frontend migration to Go WS
- Remove Rust chat-server from docker-compose.yml, staging.yml, prod.yml
- Remove VITE_WS_URL from docker frontend env vars (auto-derived from API_URL)
- Update env.ts: derive WS_URL from API_URL (/api/v1/ws) when not explicitly set
- Remove 127.0.0.1:8081 dev hack from useChat.ts
- Add missing types: EditMessage, DeleteMessage, FetchHistory, SearchMessages,
  SyncMessages, MessageEdited, MessageDeleted, SearchResults, SyncChunk
- Update MSW chat/token handler to return ws_url: /api/v1/ws
- Update .env.example and .env.storybook
2026-02-22 20:46:58 +01:00
senke
28136f2897 feat(v0.501): Sprint 5 -- integration, tests, and cleanup
- INT-01: Add E2E streaming tests (upload -> HLS auth)
- INT-02: Add E2E cloud tests (CRUD auth, public gear)
- INT-03: Split track/handler.go into 4 focused sub-handlers
- INT-04: Create migration squash script + MIGRATIONS.md
- INT-05: Add Trivy container image scanning CI workflow
- INT-06: Replace production console.log with structured logger
2026-02-22 18:40:07 +01:00
senke
bcc885327b feat(v0.501): Sprint 4 -- Cloud frontend + Gear advanced
- C1-09: Create CloudPage with folder tree, file list, and /cloud route
- C1-10: Create CloudUploadModal with drag-and-drop and progress
- C1-11: Create CloudFilePreview mini player inline
- C1-12: Add Cloud stories (loading, empty, populated, quota full)
- G1-01: Add is_public toggle, public gear endpoint, GearShowcase
- G1-02: Add gear image upload endpoints, GearImageGallery component
- G1-03: Add gear search with ILIKE + SearchBar in toolbar
- G1-04: Add stories for GearShowcase and GearImageGallery
2026-02-22 18:30:49 +01:00
senke
465aa9e008 feat(v0.501): Sprint 2 -- HLS production-ready
- S1-01: Add multi-bitrate streaming profiles (128k, 256k, 320k)
- S1-02: Update master.m3u8 endpoint with 3-tier quality system
- S1-03: Integrate hls.js with ABR + useHLSPlayer hook
- S1-04: Add Cache-Control headers on HLS segments and manifests
- S1-05: Create WaveformService with async generation (FFmpeg + audiowaveform)
- S1-06: Add GET /tracks/:id/waveform endpoint with Redis cache
- S1-07: Create WaveformDisplay component with story
- S1-08: Add 4 Prometheus metrics for streaming monitoring
2026-02-22 18:16:37 +01:00
senke
13bde80a65 refactor(frontend): eliminate ~45 'any' types in production code
CLN-04: Replaced any with unknown, proper interfaces, or concrete
types across 17 files. Focus: error handlers, API responses,
WebSocket data, and function parameters.
2026-02-22 17:44:49 +01:00
senke
de5b3bc542 feat(auth): add ephemeral stream-token endpoint for HLS and WebSocket authentication
SEC-03: TokenStorage.getAccessToken() returns null with httpOnly cookies.
New POST /api/v1/auth/stream-token returns a 5-min JWT compatible with
both stream server (Claims struct) and chat server (JwtClaims struct).
Frontend hlsService and websocket updated to use fetchStreamToken() fallback.
2026-02-22 17:28:00 +01:00
senke
901b1ce2ce feat(marketplace): wire RefundRequestModal to API, add refund button to SellerDashboard (v0.403 R2)
- RefundRequestModal: call marketplaceService.refundOrder, loading state, onSuccess callback
- PurchasesView: pass loadPurchases as onSuccess to refetch after refund
- SellerDashboardView: add Refund button on each sale, RefundRequestModal with fetchData onSuccess
- MSW: add POST /marketplace/orders/:id/refund handler
2026-02-22 16:19:31 +01:00
senke
3ff3784946 feat(marketplace): add invoice download link to PurchasesView and LicensesView 2026-02-22 16:15:55 +01:00
senke
cfb270e5a9 feat(marketplace): add review API to frontend 2026-02-22 16:09:04 +01:00
senke
230b35009f feat(checkout): integrate Hyperswitch payment form in Cart 2026-02-22 14:46:06 +01:00
senke
49d1a0f67e feat(checkout): add CheckoutSuccessView, CheckoutErrorView and getOrder 2026-02-22 14:42:15 +01:00
senke
76d38b2718 feat(marketplace): add getMyLicenses, enrich LicenceCard/LicenceDetailsModal, LicensesView 2026-02-22 14:18:05 +01:00
senke
d57c45c32e feat(marketplace): add BPM, key, category filters to MarketplaceHome 2026-02-22 14:14:20 +01:00
senke
b517258ef5 feat(chat): add call signaling types 2026-02-22 03:46:10 +01:00
senke
8f4f445dcb feat(presence): P2.1 rich presence, P2.2 invisible mode
Backend:
- UserPresence: track_id, track_title, invisible
- UpdatePresenceFull, GetPresenceForViewer (invisible hides for others)
- PUT /users/me/presence
- Migration 094 rich presence columns

Frontend:
- presenceService.updatePresence
- usePresenceSync: sync currentTrack to presence
- PresenceBadge: statusMessage tooltip
- PresenceInvisibleToggle in PrivacySettings
- MSW: PUT /users/me/presence
2026-02-21 16:47:09 +01:00
senke
f1f6317370 feat(notifications): N1 Web Push subscribe, preferences, badge
- notificationService: subscribePush, getPreferences, updatePreferences
- PushPreferencesSection: API-connected toggles, subscribe button
- usePushSubscribe: permission, pushManager.subscribe, POST to API
- NotificationMenu: document.title badge (N1.4)
- sw.js: payload compat (link/url)
- MSW: push/subscribe, preferences handlers
2026-02-21 16:43:48 +01:00
senke
d8be2c0164 feat(social): GET /social/explore, explore tab, feed filters all/following/groups (S1.5, S1.6) 2026-02-21 05:31:12 +01:00
senke
7e106cc096 feat(social): feed pagination with cursor (S1.4) 2026-02-21 05:28:19 +01:00
senke
2fc102e46b feat(social): connect feed to social API, enrich with actor/track, FeedItem supports posts (S1.1-S1.3) 2026-02-21 05:26:52 +01:00
senke
b63106a9a3 feat(presence): PresenceBadge and display (P1.3) 2026-02-21 05:22:52 +01:00
senke
3ddb52e3e0 feat(chat): wire typing indicators, read receipts, delivered status (C1)
- Add setMessageRead to chatStore, handle MessageRead in useChat
- Send MarkAsRead when receiving messages and when loading history
- Add read_at to ChatMessage, tooltip 'Vu à HH:mm' for read status
- Typing, Delivered, MessageRead already wired in useChat
2026-02-21 05:18:54 +01:00
senke
b02946cc75 fix(player): resolve TypeScript errors in PlayerQueue and queue API types 2026-02-21 05:11:07 +01:00