THE UNIFIED PLATFORM BIBLE — ADDENDUM 09
WebaCom · WebaCall — Sauvegarde média et appels vidéo — Juillet 2026
Version : 1.0
Date : 7 juillet 2026
Auteur : Alain Bessette, CFO/Product Owner, ABI Conglomerate
Domaine : GoWeBa.com
Statut : Addendum stratégique officiel — Spécification contraignante
Contraintes : ZÉRO perte de données · ZÉRO force-reset · ZÉRO interruption de service
⚠️ AVIS CRITIQUE
Cet addendum a la MÊME autorité que la Partie 1, la Partie 2 et tous les addendums précédents.
Toutes les fonctionnalités décrites sont déployées en production et sauvegardées en checkpoint.
Aucune modification de schéma incompatible n'a été effectuée.
📋 TABLE DES MATIÈRES
- Vue d'ensemble
- Phase I-5g — Sauvegarder les médias dans WebaDrive
- Phase J — WebaCall avec Jitsi Meet
- Architecture technique
- Fichiers principaux modifiés
- Feuille de route — Évolution vers Twilio
<a id="overview"></a>
SECTION 1 : VUE D'ENSEMBLE
Cet addendum documente deux nouvelles fonctionnalités majeures livrées le 7 juillet 2026, renforçant le module WebaCom (messagerie d'équipe) :
| Fonctionnalité | Phase | Description |
|---|---|---|
| Sauvegarde média → WebaDrive | I-5g | Tout contenu partagé dans WebaCom (photos, vidéos, audio, fichiers) peut être sauvegardé en un clic dans WebaDrive |
| WebaCall (Jitsi Meet) | J | Appels audio et vidéo intégrés dans les conversations (DM + canaux) via Jitsi Meet |
Principes de conception
- Zéro téléchargement : La sauvegarde vers WebaDrive utilise la copie S3 intra-bucket (aucun téléchargement/re-upload)
- Déterminisme : Les salles Jitsi sont générées à partir d'un hash SHA-256 de l'ID de conversation — même conversation = même salle
- Trilingue : Toutes les interfaces supportent le français, l'anglais et l'espagnol
- Aucune modification de schéma : Les deux fonctionnalités utilisent les champs existants (
contentType,metadata Json)
<a id="save-to-drive"></a>
SECTION 2 : PHASE I-5g — SAUVEGARDER LES MÉDIAS DANS WEBADRIVE
2.1 Problème résolu
Les utilisateurs partagent régulièrement des photos, vidéos, messages audio et fichiers dans WebaCom. Avant cette phase, ces médias restaient confinés dans la conversation sans possibilité de les organiser dans WebaDrive pour une consultation ultérieure ou un classement.
2.2 Solution implémentée
Un bouton « Sauvegarder » apparaît sur chaque type de média partagé dans les conversations WebaCom. En un clic, le fichier est copié dans un dossier système « WebaCom » automatiquement créé dans WebaDrive de l'utilisateur.
2.3 Fonctionnalités détaillées
2.3.1 API Backend
Route : POST /api/webacom/media/save-to-drive
| Paramètre | Type | Description |
|---|---|---|
cloudStoragePath | string | Chemin S3 du fichier source |
fileName | string | Nom du fichier à sauvegarder |
mimeType | string | Type MIME du fichier |
fileSize | number? | Taille en octets (optionnel, récupéré via HeadObject si absent) |
Comportement :
- Authentification requise (
requireAuth()+getOrgScope()) - Création automatique du dossier système « WebaCom » (type
SYSTEM_DEFAULT, couleur cyan, icône MessageCircle) - Copie S3 intra-bucket via
CopyObjectCommand— aucun téléchargement réseau - Détection de doublons (vérifie
description contains 'webacom-source:{path}'avant création) - Création d'un enregistrement
FileAssetavec traçabilité de la source - Gestion sérialisée de
BigIntpoursizeBytes
2.3.2 Utilitaires de stockage ajoutés
Deux nouvelles fonctions dans lib/storage.ts :
| Fonction | Description |
|---|---|
copyObjectInS3(sourceKey, destKey) | Copie S3 intra-bucket — aucun transfert réseau |
headObject(key) | Récupère taille + type MIME sans télécharger le contenu |
2.3.3 Interface utilisateur
Le bouton de sauvegarde apparaît sur quatre types de contenu dans les bulles de messages WebaCom :
| Type de contenu | Position du bouton | Particularité |
|---|---|---|
| Images | Bouton pill sous le nom de fichier | À côté du bouton de téléchargement |
| Fichiers (PDF, DOC, etc.) | Bouton pill sous le nom de fichier | À côté du bouton de téléchargement |
| Vidéos | Bouton pill dans la rangée d'actions | À côté de « Transcrire » |
| Audio | Bouton pill dans la rangée d'actions | À côté de « Transcrire » |
3 états visuels :
| État | Icône | Texte | Style |
|---|---|---|---|
| Prêt | HardDriveDownload | Sauvegarder / Save to Drive / Guardar | Normal |
| En cours | Spinner | Sauvegarde... / Saving... / Guardando... | Animé |
| Terminé | Check | Sauvegardé / Saved / Guardado | Vert ✓ |
Noms de fichiers auto-générés : Pour les vidéos/audio sans fileName dans les métadonnées, des noms descriptifs sont générés automatiquement (ex. video_abc123.mp4, audio_abc123.webm).
<a id="webacall"></a>
SECTION 3 : PHASE J — WEBACALL AVEC JITSI MEET
3.1 Problème résolu
Les membres d'une organisation communiquent via WebaCom (texte, audio, vidéo, fichiers), mais n'avaient pas de moyen intégré de lancer un appel vocal ou vidéo directement depuis une conversation.
3.2 Solution implémentée
WebaCall intègre Jitsi Meet (plateforme open-source de visioconférence) directement dans WebaCom. Deux boutons d'appel (audio + vidéo) apparaissent dans l'en-tête de chaque conversation, et une carte d'appel riche est affichée dans le fil de messages.
3.3 Fonctionnalités détaillées
3.3.1 Boutons d'appel dans l'en-tête du chat
| Bouton | Icône | Action | Position |
|---|---|---|---|
| Appel audio | Phone (bleu) | Lance un appel audio Jitsi | En-tête, avant l'indicateur SSE |
| Appel vidéo | Video (vert) | Lance un appel vidéo Jitsi | En-tête, avant l'indicateur SSE |
Comportement :
- Disponible sur tous les types de conversation : DM (1-à-1) et Canaux (groupe)
- Support inter-organisations (conversations
isCrossOrg) - Spinner de chargement pendant l'initialisation
- Ouvre Jitsi Meet dans un nouvel onglet du navigateur
3.3.2 API Backend
Route : POST /api/webacom/conversations/[id]/call
| Paramètre | Type | Description |
|---|---|---|
callType | 'audio' | 'video' | Type d'appel à démarrer |
Algorithme :
- Authentification (
requireAuth()+getOrgScope()) - Vérification d'appartenance à la conversation (supporte cross-org)
- Génération du nom de salle déterministe :
SHA-256(conversationId) → premiers 12 caractères → "GoWeBa-{hash12}" - Création d'un message
WebaComMessageavec :contentType = 'call'metadata = { jitsiUrl, roomName, callType, startedBy, startedByName, startedAt }
- Mise à jour du preview de conversation + compteurs non-lus
- Retour du message créé + URL Jitsi
URL de la salle : https://meet.jit.si/GoWeBa-{hash12}
Propriété clé : Le nom de salle est déterministe — la même conversation génère toujours la même salle. Les participants peuvent quitter et rejoindre à tout moment.
3.3.3 Carte d'appel dans les messages
Lorsqu'un appel est lancé, une carte riche apparaît dans le fil de messages :
| Élément | Audio | Vidéo |
|---|---|---|
| Icône | PhoneCall dans cercle bleu | Video dans cercle vert |
| Titre | Appel audio / Audio call / Llamada de audio | Appel vidéo / Video call / Videollamada |
| Sous-titre | Démarré par [nom] | Démarré par [nom] |
| Action | Bouton « Rejoindre » avec icône ExternalLink | Bouton « Rejoindre » avec icône ExternalLink |
La carte est stylisée de manière cohérente avec les cartes de partage d'email (email_share) :
- Bordure arrondie avec hover
- Couleurs adaptatives (différentes si envoyé par moi vs reçu)
- Lien cliquable vers la salle Jitsi
3.3.4 Capacités de Jitsi Meet
| Fonctionnalité | Supporté | Notes |
|---|---|---|
| Appels 1-à-1 | ✅ | Via DM |
| Appels de groupe | ✅ | Via canaux — jusqu'à 75+ participants |
| Audio seulement | ✅ | Caméra désactivable côté Jitsi |
| Vidéo HD | ✅ | Résolution adaptative selon bande passante |
| Partage d'écran | ✅ | Fonctionnalité native de Jitsi |
| Chat intégré | ✅ | Chat interne de Jitsi (en parallèle de WebaCom) |
| Chiffrement | ✅ | TLS + SRTP (chiffrement de bout en bout optionnel) |
| Enregistrement | ❌ | Non disponible sur les serveurs publics Jitsi |
| Transcription | ❌ | Non disponible sur les serveurs publics Jitsi |
<a id="architecture"></a>
SECTION 4 : ARCHITECTURE TECHNIQUE
4.1 Aucune modification de schéma
Les deux fonctionnalités ont été implémentées sans aucune modification du schéma Prisma. Elles exploitent les champs existants du modèle WebaComMessage :
| Champ | Type | Utilisation |
|---|---|---|
contentType | String @default("text") | Nouvelles valeurs : 'call' (WebaCall) |
metadata | Json? | Métadonnées structurées : URL Jitsi, type d'appel, etc. |
La sauvegarde WebaDrive crée des enregistrements FileAsset (modèle existant) et des dossiers StorageFolder (type SYSTEM_DEFAULT existant).
4.2 Sécurité
- Toutes les API nécessitent une authentification (
requireAuth()) - Vérification d'appartenance à la conversation avant toute action
- Support des conversations inter-organisations (
isCrossOrg) - Détection de doublons pour la sauvegarde WebaDrive
- Copie S3 intra-bucket (pas d'exposition de données en transit)
4.3 Performance
- Copie S3 intra-bucket : Aucun téléchargement/re-upload — transfert serveur-à-serveur instantané
headObject(): Récupère taille et type MIME sans télécharger le contenu- Hash SHA-256 déterministe : Calcul instantané, pas de recherche en base de données pour le nom de salle
<a id="fichiers"></a>
SECTION 5 : FICHIERS PRINCIPAUX MODIFIÉS
5.1 Phase I-5g — Sauvegarde média
| Fichier | Action | Description |
|---|---|---|
lib/storage.ts | Modifié | Ajout copyObjectInS3(), headObject(), imports CopyObjectCommand, HeadObjectCommand |
app/api/webacom/media/save-to-drive/route.ts | Nouveau | API de sauvegarde vers WebaDrive |
app/(app)/webacom/webacom-client.tsx | Modifié | Boutons « Sauvegarder » sur images, fichiers, vidéos, audio |
5.2 Phase J — WebaCall
| Fichier | Action | Description |
|---|---|---|
app/api/webacom/conversations/[id]/call/route.ts | Nouveau | API d'initiation d'appel Jitsi |
app/(app)/webacom/webacom-client.tsx | Modifié | Boutons d'appel en-tête, carte d'appel riche, fonction startCall() |
5.3 Icônes Lucide-React ajoutées
| Icône | Module | Utilisation |
|---|---|---|
HardDriveDownload | I-5g | Bouton sauvegarde WebaDrive |
Phone | J | Bouton appel audio |
PhoneCall | J | Icône carte d'appel audio |
<a id="roadmap"></a>
SECTION 6 : FEUILLE DE ROUTE — ÉVOLUTION VERS TWILIO
WebaCall utilise actuellement Jitsi Meet (serveurs publics gratuits) comme solution de visioconférence. L'architecture est conçue pour évoluer vers Twilio lorsque le besoin de fonctionnalités avancées se confirmera.
6.1 Phase J actuelle (Jitsi Meet)
| Aspect | Statut |
|---|---|
| Appels audio/vidéo 1-à-1 et groupe | ✅ Déployé |
| Partage d'écran | ✅ Via Jitsi |
| Carte d'appel dans WebaCom | ✅ Déployé |
| Coût | Gratuit |
6.2 Phase J-v2 prévue (Twilio)
| Fonctionnalité | Description |
|---|---|
| Enregistrement des appels | Sauvegarde automatique dans WebaDrive |
| Transcription automatique | Pipeline existant (I-5a) réutilisé : /api/webacom/media/transcribe |
| Traduction | Pipeline existant (I-5a) réutilisé : /api/webacom/media/translate |
| Historique complet | Log détaillé des appels avec durée, participants, statut |
| Numéros de téléphone | Appels PSTN via les lignes Twilio existantes |
Note : GoWeBa utilise déjà Twilio pour la téléphonie et les SMS, et SendGrid pour les emails. La migration vers Twilio pour la visioconférence s'inscrit dans la stratégie de consolidation sur une plateforme unifiée Twilio/SendGrid.
📝 HISTORIQUE DES VERSIONS
| Version | Date | Changements |
|---|---|---|
| 1.0 | 7 juillet 2026 | Version initiale — Phase I-5g + Phase J |
Fin de l'Addendum 09 — WebaCom · WebaCall — Juillet 2026