Skip to content

Latest commit

ย 

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ‡ธ๐Ÿ‡ณ SenChat

Messagerie instantanรฉe temps rรฉel aux couleurs du Sรฉnรฉgal

Une application de chat moderne inspirรฉe de WhatsApp, construite avec une identitรฉ visuelle sรฉnรฉgalaise โ€” vert, jaune et rouge.

Status License NestJS React TypeScript Socket.IO MySQL

Fonctionnalitรฉs โ€ข Stack โ€ข Dรฉmarrage rapide โ€ข Architecture โ€ข API โ€ข Roadmap


๐Ÿ“– ร€ propos

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.


โœจ Fonctionnalitรฉs

๐Ÿ” Authentification & Sรฉcuritรฉ

  • 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

๐Ÿ’ฌ Messagerie temps rรฉel

  • 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)

๐Ÿ“Ž Partage de fichiers

  • Upload d'images (JPEG, PNG, WebP, GIF)
  • Documents (PDF, Word, Excel, TXT, ZIP)
  • Limite 25 Mo par fichier
  • Validation MIME stricte cรดtรฉ serveur

๐ŸŽจ Interface

  • 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

๐ŸŒ Bonus

  • 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

๐Ÿ›  Stack technique

Backend

Tech Rรดle
NestJS 10 Framework API modulaire
Prisma 6 ORM type-safe
MySQL 8 Base de donnรฉes relationnelle
Socket.IO 4 WebSocket temps rรฉel
Passport JWT Authentification
bcrypt Hachage mots de passe
Multer Upload de fichiers
class-validator Validation DTOs
@nestjs/throttler Rate limiting

Frontend

Tech Rรดle
React 18 Bibliothรจque UI
Vite 6 Bundler ultra-rapide
TypeScript 5 Typage statique
Tailwind CSS 3 Styles utilitaires
Zustand 5 ร‰tat client (auth, UI)
TanStack Query 5 ร‰tat serveur + cache
socket.io-client WebSocket client
React Router 6 Routing SPA
lucide-react Icรดnes

๐Ÿ— Architecture monorepo

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

๐Ÿš€ Dรฉmarrage rapide

Prรฉrequis

  • Node.js โ‰ฅ 18
  • npm โ‰ฅ 9
  • MySQL 8 en local (port 3306, root sans mot de passe par dรฉfaut)

Installation en 4 รฉtapes

# 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

๐Ÿ”‘ Comptes de test (crรฉรฉs par le seed)

๐Ÿ‘ค Nom ๐Ÿ“ง Email ๐Ÿ”’ Mot de passe
Alice Diallo alice@senchat.sn password123
Bob Ndiaye bob@senchat.sn password123
Charlie Sow charlie@senchat.sn password123

โš™๏ธ Configuration

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

๐ŸŒ Accรจs depuis le rรฉseau local

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 ports 3000 et 5173 dans ton pare-feu Windows.


๐Ÿ—„ Architecture

Schรฉma de base de donnรฉes

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  User  โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€<โ”‚ ConversationMember โ”‚>โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚ Conversation โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
    โ”‚                                                     โ”‚
    โ”‚                                                     โ”‚
    โ”‚              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                            โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€<โ”‚ Message โ”‚>โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
    โ”‚              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
    โ”‚
    โ”‚              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€<โ”‚ RefreshToken โ”‚
                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

5 modรจles (User, Conversation, ConversationMember, Message, RefreshToken) avec index optimisรฉs et onDelete: Cascade.

Flux temps rรฉel

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       JWT in handshake        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   Client    โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚  Socket.IO      โ”‚
โ”‚  (React)    โ”‚                               โ”‚   Gateway       โ”‚
โ”‚             โ”‚       message:send            โ”‚                 โ”‚
โ”‚             โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚                 โ”‚
โ”‚             โ”‚                               โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚             โ”‚                               โ”‚   โ”‚ Rooms   โ”‚   โ”‚
โ”‚             โ”‚       message:new             โ”‚   โ”‚ user:X  โ”‚   โ”‚
โ”‚             โ”‚ <โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚   โ”‚ conv:Y  โ”‚   โ”‚
โ”‚             โ”‚                               โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚             โ”‚       typing:update           โ”‚                 โ”‚
โ”‚             โ”‚ <โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚                 โ”‚
โ”‚             โ”‚                               โ”‚                 โ”‚
โ”‚             โ”‚       presence:change         โ”‚                 โ”‚
โ”‚             โ”‚ <โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ”Œ API REST

Prรฉfixe global : /api

Authentification (/auth)

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

Utilisateurs (/users)

Mรฉthode Endpoint Description
GET /me Profil courant
PATCH /me Modifier nom / bio
POST /me/avatar Upload avatar
GET /search?q= Rechercher des utilisateurs

Conversations (/conversations)

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

Fichiers (/files)

Mรฉthode Endpoint Description
POST /upload Upload (max 25 Mo)
GET /:filename Tรฉlรฉcharger

Messages (/messages)

Mรฉthode Endpoint Description
DELETE /:id Suppression douce

๐Ÿ“ก ร‰vรฉnements Socket.IO

ร‰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 }

๐Ÿ“ Structure du projet

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

๐ŸŽจ Design system

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.


๐Ÿงช Tests

Tests unitaires

cd backend
npm run test              # Watch mode
npm run test:cov          # Avec couverture

Tests end-to-end

cd backend
npx jest --config test/jest-e2e.json --verbose --forceExit

Couvre : register, login, gestion des doublons, profil avec/sans token.


๐Ÿ›  Scripts utiles

ร€ 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 workspace

Dans 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

๐Ÿ—บ Roadmap

v1 (MVP) โ€” โœ… Livrรฉ

  • 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

v2 โ€” ๐Ÿšง ร€ venir

  • ๐ŸŽ™๏ธ 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)

๐Ÿค Contribuer

Les contributions sont les bienvenues ! Pour participer :

  1. Fork le projet
  2. Crรฉe une branche (git checkout -b feat/ma-fonctionnalite)
  3. Commit tes changements (git commit -m 'feat: ajout de X')
  4. Push sur ta branche (git push origin feat/ma-fonctionnalite)
  5. Ouvre une Pull Request

๐Ÿ“ Suis la convention Conventional Commits.


๐Ÿ“„ Licence

Distribuรฉ sous licence MIT. Voir LICENSE pour plus d'informations.


๐Ÿ‘ค Auteur

Tidiane


๐Ÿ‡ธ๐Ÿ‡ณ Fait avec โค๏ธ au Sรฉnรฉgal

Si ce projet t'a plu, n'hรฉsite pas ร  laisser une โญ !

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages