Une application de chat moderne inspirรฉe de WhatsApp, construite avec une identitรฉ visuelle sรฉnรฉgalaise โ vert, jaune et rouge.
Fonctionnalitรฉs โข Stack โข Dรฉmarrage rapide โข Architecture โข API โข Roadmap
SenChat est une plateforme de messagerie instantanรฉe full-stack qui combine la simplicitรฉ de WhatsApp avec une identitรฉ visuelle ancrรฉe dans la culture sรฉnรฉgalaise. Conรงue pour la communication moderne โ conversations privรฉes, groupes jusqu'ร 256 membres, partage de fichiers, indicateurs de prรฉsence et de frappe en temps rรฉel.
๐ก Ce projet sert รฉgalement de rรฉfรฉrence d'architecture full-stack moderne avec NestJS, Prisma, React, Tailwind et Socket.IO.
- Inscription / connexion avec JWT (access 15min + refresh httpOnly 7j)
- Hachage des mots de passe avec bcrypt (12 rounds)
- Rate limiting sur les endpoints sensibles
- Validation stricte avec
class-validator - Protection CORS configurable
- Conversations directes (1:1) avec dรฉduplication automatique
- Groupes jusqu'ร 256 membres avec rรดles (
OWNER,ADMIN,MEMBER) - Indicateurs de frappe en temps rรฉel
- Statut en ligne / hors ligne avec derniรจre connexion
- Statut lu / non lu avec compteur de non-lus
- Pagination par curseur (chargement infini)
- Upload d'images (JPEG, PNG, WebP, GIF)
- Documents (PDF, Word, Excel, TXT, ZIP)
- Limite 25 Mo par fichier
- Validation MIME stricte cรดtรฉ serveur
- Dark mode par dรฉfaut + thรจme clair
- Design responsive (mobile-first)
- Sidebar repliable sur mobile
- Couleurs nationales du Sรฉnรฉgal (vert
#00853F, or, rouge) - Animations fluides
- Icรดnes Lucide
- Accรจs LAN โ utilisable depuis n'importe quel appareil du rรฉseau local
- Auto-dรฉtection du host pour l'API et les WebSockets
- Recherche d'utilisateurs avec debounce
- Suppression douce (soft delete) des messages
|
|
Gรฉrรฉ avec npm workspaces โ types et รฉvรฉnements Socket.IO partagรฉs entre front et back via @senchat/shared.
senchat/
โโโ shared/ # Types TypeScript + contrats Socket.IO partagรฉs
โโโ backend/ # API NestJS + WebSocket gateway
โโโ frontend/ # SPA React
- Node.js โฅ 18
- npm โฅ 9
- MySQL 8 en local (port 3306, root sans mot de passe par dรฉfaut)
# 1. Cloner le projet
git clone https://github.com/realtidiane/senchat.git
cd senchat
# 2. Installer les dรฉpendances (workspaces)
npm install
# 3. Initialiser la base de donnรฉes
cd backend
npx prisma migrate dev --name init
npx prisma db seed
# 4. Lancer (dans 2 terminaux sรฉparรฉs)
# Terminal 1 โ Backend
npm run dev
# Terminal 2 โ Frontend
cd ../frontend && npm run devโก๏ธ Ouvre http://localhost:5173
| ๐ค Nom | ๐ง Email | ๐ Mot de passe |
|---|---|---|
| Alice Diallo | alice@senchat.sn |
password123 |
| Bob Ndiaye | bob@senchat.sn |
password123 |
| Charlie Sow | charlie@senchat.sn |
password123 |
Le fichier backend/.env est prรฉ-configurรฉ pour MySQL local sans mot de passe :
DATABASE_URL="mysql://root:@localhost:3306/senchat"
JWT_SECRET="dev-jwt-secret-change-in-production-32chars"
JWT_REFRESH_SECRET="dev-refresh-secret-change-in-prod-32chars"
BACKEND_PORT=3000
FRONTEND_URL=http://localhost:5173
โ ๏ธ Si ton MySQL utilise un mot de passe :mysql://root:TON_MDP@localhost:3306/senchat
Vite expose automatiquement l'app sur le LAN. Au lancement, tu verras :
โ Local: http://localhost:5173/
โ Network: http://192.168.x.x:5173/
Utilise l'URL Network depuis n'importe quel appareil du mรชme rรฉseau (tรฉlรฉphone, autre PC, etc.).
๐ก Le frontend dรฉtecte automatiquement le hostname pour rediriger les appels API.
โ ๏ธ Pense ร autoriser les ports3000et5173dans ton pare-feu Windows.
โโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ
โ User โโโโโโโโโ<โ ConversationMember โ>โโโโโโโโโ Conversation โ
โโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ
โ โ
โ โ
โ โโโโโโโโโโโ โ
โโโโโโโโโโโโโโ<โ Message โ>โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โโโโโโโโโโโ
โ
โ โโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโ<โ RefreshToken โ
โโโโโโโโโโโโโโโโ
5 modรจles (User, Conversation, ConversationMember, Message, RefreshToken) avec index optimisรฉs et onDelete: Cascade.
โโโโโโโโโโโโโโโ JWT in handshake โโโโโโโโโโโโโโโโโโโ
โ Client โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ>โ Socket.IO โ
โ (React) โ โ Gateway โ
โ โ message:send โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ>โ โ
โ โ โ โโโโโโโโโโโ โ
โ โ โ โ Rooms โ โ
โ โ message:new โ โ user:X โ โ
โ โ <โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ conv:Y โ โ
โ โ โ โโโโโโโโโโโ โ
โ โ typing:update โ โ
โ โ <โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ โ
โ โ presence:change โ โ
โ โ <โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
Prรฉfixe global :
/api
| Mรฉthode | Endpoint | Description |
|---|---|---|
POST |
/register |
Crรฉer un compte |
POST |
/login |
Se connecter |
POST |
/refresh |
Rafraรฎchir l'access token |
POST |
/logout |
Dรฉconnexion |
| Mรฉthode | Endpoint | Description |
|---|---|---|
GET |
/me |
Profil courant |
PATCH |
/me |
Modifier nom / bio |
POST |
/me/avatar |
Upload avatar |
GET |
/search?q= |
Rechercher des utilisateurs |
| Mรฉthode | Endpoint | Description |
|---|---|---|
GET |
/ |
Liste des conversations |
POST |
/ |
Crรฉer (DIRECT ou GROUP) |
GET |
/:id |
Dรฉtail d'une conversation |
PATCH |
/:id |
Modifier un groupe |
POST |
/:id/members |
Ajouter un membre |
DELETE |
/:id/members/:userId |
Retirer un membre |
POST |
/:id/leave |
Quitter un groupe |
GET |
/:id/messages |
Historique paginรฉ (curseur) |
GET |
/:id/messages/search?q= |
Recherche dans les messages |
| Mรฉthode | Endpoint | Description |
|---|---|---|
POST |
/upload |
Upload (max 25 Mo) |
GET |
/:filename |
Tรฉlรฉcharger |
| Mรฉthode | Endpoint | Description |
|---|---|---|
DELETE |
/:id |
Suppression douce |
| รvรฉnement | Direction | Payload |
|---|---|---|
message:send |
๐ค Client โ Serveur | { conversationId, type, content?, fileUrl? } |
message:new |
๐ฅ Serveur โ Client | Message complet |
message:read |
๐ค Client โ Serveur | { conversationId, messageId } |
message:status |
๐ฅ Serveur โ Client | { messageId, readBy } |
typing:start |
๐ค Client โ Serveur | { conversationId } |
typing:stop |
๐ค Client โ Serveur | { conversationId } |
typing:update |
๐ฅ Serveur โ Client | { userId, conversationId, isTyping } |
presence:change |
๐ฅ Serveur โ Client | { userId, isOnline, lastSeen } |
senchat/
โโโ shared/
โ โโโ src/
โ โโโ types/ # User, Conversation, Message
โ โโโ events/ # Socket events + payloads
โ
โโโ backend/
โ โโโ prisma/
โ โ โโโ schema.prisma # 5 modรจles + 3 enums
โ โ โโโ seed.ts # Donnรฉes de test
โ โโโ src/
โ โ โโโ auth/ # Register, login, refresh, logout
โ โ โโโ users/ # Profil, avatar, recherche
โ โ โโโ conversations/ # CRUD + gestion membres
โ โ โโโ messages/ # Historique, search, soft delete
โ โ โโโ files/ # Upload + download
โ โ โโโ gateway/ # Socket.IO + JWT auth
โ โ โโโ prisma/ # PrismaService
โ โ โโโ common/
โ โ โโโ decorators/ # @Public, @CurrentUser
โ โ โโโ filters/ # GlobalExceptionFilter
โ โ โโโ guards/ # JwtAuthGuard
โ โโโ test/ # Tests e2e
โ
โโโ frontend/
โโโ src/
โโโ components/ # ChatPanel, MessageBubble, ...
โโโ features/
โ โโโ auth/ # LoginPage, RegisterPage
โ โโโ chat/ # ChatLayout (sidebar + panel)
โ โโโ settings/ # SettingsPage
โโโ hooks/ # useAuth, useSocket, useMessages
โโโ lib/ # api.ts, socket.ts, utils.ts
โโโ stores/ # Zustand: auth, conversation, ui
Identitรฉ visuelle inspirรฉe du drapeau du Sรฉnรฉgal ๐ธ๐ณ
| Token | Hex | Usage |
|---|---|---|
๐ข sn-green |
#00853F |
Couleur principale, accents, statut en ligne |
๐ก sn-yellow |
#FDEF42 |
Accent secondaire (mode sombre) |
๐ด sn-red |
#E31B23 |
Erreurs, actions destructives |
Police : Inter โ moderne, lisible, optimisรฉe pour les รฉcrans.
Mode sombre activรฉ par dรฉfaut, basculable depuis les paramรจtres.
cd backend
npm run test # Watch mode
npm run test:cov # Avec couverturecd backend
npx jest --config test/jest-e2e.json --verbose --forceExitCouvre :
register,login, gestion des doublons, profil avec/sans token.
ร la racine du projet :
npm run dev:backend # Lance uniquement le backend
npm run dev:frontend # Lance uniquement le frontend
npm run build # Build des deux
npm run lint # Lint workspaceDans backend/ :
npx prisma studio # GUI pour explorer la base
npx prisma migrate dev # Crรฉer une nouvelle migration
npx prisma db seed # Rรฉinitialiser les donnรฉes de test- Authentification JWT (register, login, refresh)
- Conversations directes & groupes
- Messages temps rรฉel + indicateurs de frappe
- Upload de fichiers
- Statuts en ligne / lu
- Mode sombre / clair
- Responsive mobile
- ๐๏ธ Messages vocaux (enregistrement + lecture)
- ๐ Appels audio / vidรฉo (WebRTC)
- ๐ Chiffrement E2E (Signal Protocol)
- ๐ Rรฉactions aux messages (emoji)
- ๐ฐ Stories / Statuts (24h)
- ๐ Wolof + autres langues locales
- ๐ Notifications push (Web Push API)
- ๐จ Customisation des thรจmes utilisateurs
- ๐ฑ App mobile native (React Native)
Les contributions sont les bienvenues ! Pour participer :
- Fork le projet
- Crรฉe une branche (
git checkout -b feat/ma-fonctionnalite) - Commit tes changements (
git commit -m 'feat: ajout de X') - Push sur ta branche (
git push origin feat/ma-fonctionnalite) - Ouvre une Pull Request
๐ Suis la convention Conventional Commits.
Distribuรฉ sous licence MIT. Voir LICENSE pour plus d'informations.
Tidiane
- GitHub: @realtidiane