feat: conformite enonce - explorer, favoris, stats perso, tests, slots
Some checks failed
Deploy XIP / deploy (push) Failing after 37s
Some checks failed
Deploy XIP / deploy (push) Failing after 37s
Fonctionnel
- Backend messages : GET /api/messages/:id (detail) + recherche (q),
pagination par curseur (before/limit) avec enveloppe { items, nextCursor,
hasMore } ; le flux temps reel garde l'ancien format quand aucun parametre.
- Explorer (/explorer) : catalogue distant, recherche debouncee + annulable
(AbortController), filtre, defilement infini, etat garde (keep-alive).
- Details par id : /message/:id et /shop/p/:id (consomment route.params).
- Favoris (/favoris) : liste perso persistee en localStorage, notation
(note/rating/statut) via modale, refletee partout (bouton favori).
- Mes stats (/mes-stats) : agregats derives des favoris (note moyenne, top
pays/auteurs, statuts), auto-mis a jour, route gardee si liste vide.
- Routeur : pages secondaires en lazy-load + repli, garde beforeEnter.
Technique
- Slots : PrefSection (slot defaut + slot nomme) enveloppe les 5 sections
"Mes Persos" ; Modal (Teleport + slots).
- v-model custom : SearchBox (defineModel + debounce).
- Directive custom : v-click-outside.
- Tests Vitest : 25 tests (etat, fonctions, composants), ~86% du code metier.
- Retrait d'Ionic (inutilise). Script typecheck backend ; tsconfig @types/bun.
- Correctif type : garde stockLimit nullable dans l'achat (catalog.ts).
- README complet (URL, stack, run, tests, secrets, deploiement, mention IA).
This commit is contained in:
125
README.md
125
README.md
@@ -1,35 +1,110 @@
|
||||
# XIP
|
||||
# XIP — Réseau social « sans modération »
|
||||
|
||||
Réseau social à consommer 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).
|
||||
|
||||
## Concept
|
||||
🌐 **Application déployée : https://xip.kerboul.me**
|
||||
|
||||
Faire un réseau social open sans contrôles ni modération.
|
||||
Pas de compte, Pseudo = IP.
|
||||
Merchandising à fond.
|
||||
Envahit par des Pubs.
|
||||
---
|
||||
|
||||
## 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
|
||||
|
||||
**Gratuit :**
|
||||
- Envoyer des messages
|
||||
- contenant du texte (267 charactères)
|
||||
- contenant des fichiers (JPEG, .exe, ...) 1 Mo max
|
||||
- Répondre à un message (sous forme de sous-thread)
|
||||
- Récupérer mes messages
|
||||
- **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.
|
||||
|
||||
**Payant :**
|
||||
- Acheter des fonctionnalités (Marketplace)
|
||||
- mettre du CSS & HTML dans les messages (taille fixe), pas de script
|
||||
- pas de limite de taille de fichiers
|
||||
- mettre du javascript (très très cher)
|
||||
- "Skins" de ton IP
|
||||
- "Skins" des éléments (boutons, text area, encadré pub, ...)
|
||||
- Choisir sa pub
|
||||
- Retirer les pubs
|
||||
- payer alerte audio générale (consommable, cooldown, durée max mais volume à fond, possibilité de fournir le mp3)
|
||||
---
|
||||
|
||||
**Si localhost :**
|
||||
- Pas de paywall (tout gratuit)
|
||||
## 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
|
||||
|
||||
<!-- à compléter : noms du groupe -->
|
||||
|
||||
Reference in New Issue
Block a user