# Itinova Podcasts - TODO ## Base de données - [x] Table `etablissements` (id, nom, description, logoUrl, createdAt) - [x] Table `podcasts` (id, titre, resume, etablissementId, audioUrl, audioKey, duree, statut, auteurId, createdAt, updatedAt) - [x] Table `mots_cles` (id, label) - [x] Table `podcast_mots_cles` (podcastId, motCleId) - relation many-to-many - [x] Migration DB avec `pnpm db:push` ## Backend API (tRPC) - [x] Router `etablissements` : list, create, update, delete (admin) - [x] Router `podcasts` : list (public), getById, create (auth), update (auth), delete (auth/admin) - [x] Router `motsCles` : list (public), create (admin) - [x] Route upload audio : POST /api/upload-audio (S3) - [x] Filtrage podcasts par établissement et mots-clés - [x] Pagination des podcasts ## Interface Web d'Administration - [x] Layout dashboard avec sidebar (AdminLayout) - [x] Page d'accueil / tableau de bord avec statistiques - [x] Page liste des podcasts (tableau avec recherche/filtres) - [x] Formulaire création/édition podcast (titre, résumé, établissement, mots-clés, upload audio) - [x] Confirmation suppression podcast - [x] Page gestion des établissements (liste, ajout, édition, suppression) - [x] Page gestion des mots-clés - [x] Gestion des rôles utilisateurs (admin peut promouvoir) ## Interface Mobile Responsive (Écoute) - [x] Page d'accueil mobile avec logo Itinova et CTA - [x] Page liste/écoute avec filtres (établissement, mots-clés) - [x] Lecteur audio HTML5 intégré avec contrôles (play/pause, progress, volume) - [x] Carte podcast avec titre, résumé, établissement, durée - [x] Connexion OAuth pour professionnels sur mobile - [x] Formulaire publication podcast sur mobile (après connexion) - [x] Navigation mobile avec bottom bar ## Authentification & Sécurité - [x] Authentification Manus OAuth (déjà en place) - [x] Rôles : admin (gestion complète) / user (publication propres podcasts) - [x] Protection des routes d'administration - [x] Validation des formulaires (zod) ## Tests - [x] Tests unitaires routers podcasts - [x] Tests unitaires routers établissements - [x] Tests upload audio ## Design & UX - [x] Palette couleurs Itinova (bleu institutionnel, blanc, accents) - [x] Typographie professionnelle (Inter) - [x] Responsive mobile-first pour interface écoute - [x] États de chargement (skeletons) - [x] Messages d'erreur et de succès (toasts) ## Compte administrateur local - [x] Étendre le schéma DB avec champ `passwordHash` et `username` dans la table users - [x] Ajouter route tRPC `auth.loginLocal` (vérification username + bcrypt) - [x] Créer le compte immuable `adminServPodcast` (protégé contre modification/suppression) - [x] Page de connexion avec choix : connexion Manus OAuth ou connexion locale - [x] Formulaire de connexion locale (username + mot de passe) - [x] Tests Vitest pour `auth.loginLocal` ## Suppression connexion Manus OAuth - [x] Page /login : afficher directement le formulaire local, supprimer le choix Manus - [x] AdminLayout : supprimer le bouton "Se connecter avec Manus" - [x] Interface mobile : supprimer les boutons/liens de connexion Manus - [x] Retirer les imports getLoginUrl inutilisés ## Gestion des utilisateurs (CRUD complet) - [x] API : route createUser (nom, username, mot de passe, rôle) - [x] API : route updateUser (nom, username, mot de passe optionnel, rôle) - [x] API : route deleteUser (avec protection compte immuable) - [x] Page AdminUtilisateurs : tableau avec colonnes (nom, identifiant, rôle, méthode, date) - [x] Bouton "Nouvel utilisateur" en haut à droite - [x] Boutons Modifier / Supprimer en fin de chaque ligne - [x] Modale création utilisateur (formulaire validé) - [x] Modale modification utilisateur (formulaire pré-rempli) - [x] Dialogue de confirmation suppression - [x] Protection : compte immuable non modifiable/supprimable ## Bugs - [x] Erreur 404 sur le bouton "Nouveau podcast" dans l'interface admin ## Logos en-tête page d'accueil - [x] Uploader logo Itinova vers CDN - [x] Uploader logo Santinova vers CDN - [x] Intégrer les deux logos côte à côte dans l'en-tête de la page d'accueil (mobile + web) ## Corrections UI - [x] Supprimer le bouton "Nouveau podcast" du tableau de bord ## Bug session - [x] Le bouton Connexion n'apparaît pas toujours : session OAuth Manus résiduelle reconnecte l'utilisateur automatiquement sans passer par la connexion locale ## Refonte UI moderne - [x] Styles globaux : palette Itinova enrichie, typographie Inter, tokens CSS, animations - [x] Page d'accueil mobile : header avec logos, hero gradient, cartes podcast modernes, lecteur flottant redesigné - [x] Composant PodcastCard : design carte moderne avec waveform visuelle, badges colorés - [x] Composant PodcastPlayer : lecteur bottom-sheet moderne avec artwork, progression animée - [x] Interface admin : sidebar redesignée, dashboard avec métriques visuelles, tableaux épurés - [x] AdminLayout : sidebar avec icônes plus grandes, couleurs riches, transitions ## Bug logos - [x] Logos Itinova/Santinova invisibles sur la page Login (filtre brightness-0 invert sur fond bleu les rend blancs sur blanc) ## Enregistrement audio depuis smartphone - [x] Composant AudioRecorder : enregistrement microphone via MediaRecorder API - [x] Chronomètre d'enregistrement en temps réel - [x] Prévisualisation audio avant upload (lecture du fichier enregistré) - [x] Choix dans PodcastForm : onglet "Fichier existant" / onglet "Enregistrer" - [x] Upload du fichier enregistré vers S3 (même route que upload fichier) - [x] Interface mobile : bouton "Enregistrer un podcast" accessible sans admin ## Logos page de connexion - [x] Logo Itinova en haut de la page de connexion - [x] "powered by" + logo Santinova en bas de la page de connexion ## Logos panneau droit connexion - [x] Logo Itinova en haut du panneau droit (formulaire) de la page de connexion - [x] "powered by" + logo Santinova en bas du panneau droit (formulaire) de la page de connexion ## Correction logos page connexion (v2) - [x] Supprimer les logos du panneau gauche bleu - [x] Logo Itinova juste au-dessus de la carte de connexion (panneau droit) - [x] "powered by" + logo Santinova sur la même ligne, juste en dessous de la carte de connexion