113 lines
3.5 KiB
Markdown
113 lines
3.5 KiB
Markdown
# XIP — Réseau social « sans modération »
|
|
|
|
SPA satirique : un chat public en temps réel où **ton pseudo = ton adresse IP**,
|
|
noyé sous les pubs et le merchandising. Catalogue de messages distant, liste
|
|
perso de favoris, statistiques dérivées, marketplace à crédits fictifs, thèmes
|
|
(dont WhatsApp).
|
|
|
|
🌐 **Application déployée : https://xip.kerboul.me**
|
|
|
|
---
|
|
|
|
## Stack
|
|
|
|
| Couche | Technologies |
|
|
|--------|--------------|
|
|
| Frontend | Vue 3 (`<script setup>`, Composition API), Vite, TypeScript, vue-router |
|
|
| Backend | Bun, Hono, Prisma, PostgreSQL, Redis (WebSocket temps réel) |
|
|
| Tests | Vitest, @vue/test-utils, happy-dom |
|
|
| Déploiement | Docker, nginx, Traefik, CI Gitea Actions (auto-deploy sur push `main`) |
|
|
|
|
Pas de framework de composants prêts-à-l'emploi : tout le découpage et le CSS
|
|
sont faits à la main.
|
|
|
|
---
|
|
|
|
## Fonctionnalités
|
|
|
|
- **Chat temps réel** (WebSocket) : messages, réponses en thread, présence,
|
|
stats live qui défilent.
|
|
- **Explorer** (`/explorer`) : catalogue distant paginé (défilement infini),
|
|
**recherche debouncée et annulable** (AbortController), filtre.
|
|
- **Détail** d'un message (`/message/:id`) et d'un produit (`/shop/p/:id`) par
|
|
identifiant d'URL.
|
|
- **Favoris** (`/favoris`) : liste personnelle persistée en localStorage,
|
|
notation (note + statut + commentaire), reflétée partout (★).
|
|
- **Mes stats** (`/mes-stats`) : synthèse dérivée des favoris (note moyenne,
|
|
répartition par pays, top auteurs…), mise à jour automatique ; page gardée
|
|
(inaccessible si aucun favori).
|
|
- **Marketplace** à crédits fictifs : cosmétiques (couleur d'IP, pets, skin du
|
|
bouton d'envoi), abonnement NoAds, messages riches (HTML/CSS, et JS en iframe
|
|
sandbox), pièces jointes.
|
|
- **Thèmes** dynamiques (Classique, Bulles, Compact, **WhatsApp**), persistés.
|
|
- **Géolocalisation** des IP (drapeau + ville) sur chaque message.
|
|
|
|
---
|
|
|
|
## Lancer en local
|
|
|
|
Prérequis : [Bun](https://bun.sh) + Docker (pour Postgres/Redis).
|
|
|
|
```bash
|
|
bun install
|
|
bun run dev:stack
|
|
```
|
|
|
|
`dev:stack` lève Postgres + Redis (docker compose), applique les migrations
|
|
Prisma, seede la base, puis démarre le backend (http://localhost:3000) et le
|
|
frontend (http://localhost:5173).
|
|
|
|
En local, le **paywall est désactivé** (tout gratuit).
|
|
|
|
---
|
|
|
|
## Tests
|
|
|
|
```bash
|
|
bun run --cwd frontend test # exécution
|
|
bun run --cwd frontend test:cov # avec couverture
|
|
```
|
|
|
|
Couvre la logique d'état (favoris, wallet, perks), des fonctions réutilisables
|
|
(parseMeta, debounce, couleur d'IP) et l'interaction de composants (ThemePicker,
|
|
SearchBox). **Couverture ≈ 86 %** sur le code métier ciblé.
|
|
|
|
## Vérifications
|
|
|
|
```bash
|
|
bun run --cwd frontend typecheck # vue-tsc, 0 erreur
|
|
bun run --cwd frontend build # build de production
|
|
bun run --cwd backend typecheck # tsc, 0 erreur
|
|
```
|
|
|
|
---
|
|
|
|
## Configuration / secrets
|
|
|
|
Aucun secret dans le code. Copier les exemples committés et renseigner les vraies
|
|
valeurs (les `.env` réels sont gitignorés) :
|
|
|
|
- `backend/.env.example` → `backend/.env` (dév local)
|
|
- `.env.prod.example` → `.env.prod` (production)
|
|
|
|
---
|
|
|
|
## Déploiement
|
|
|
|
Déploiement continu : tout push sur `main` déclenche la CI Gitea qui rebuild et
|
|
redéploie la stack Docker derrière Traefik. Détails dans **[DEPLOY.md](DEPLOY.md)**.
|
|
|
|
---
|
|
|
|
## Mention IA
|
|
|
|
Ce projet a été développé avec une assistance IA importante (génération et
|
|
refactorisation de code comprises). Le code a été relu, corrigé et intégré par
|
|
l'équipe.
|
|
|
|
## Auteurs
|
|
|
|
- Ethan Puyaubreau
|
|
- Raphaël Thieffry
|
|
- Antonin Russac
|