Skip to content

MatthiasBlc/ForestManager

Repository files navigation

Forest Manager

Application de gestion de communautes pour le partage de recettes. Communautes privees (invite-only), recettes collaboratives avec propositions et variantes, administration plateforme via SuperAdmin.

TypeScript React Vite TailwindCSS NodeJS Express Prisma PostgreSQL Docker GitHub Actions

Fonctionnalites

  • Authentification : inscription, connexion, sessions securisees, profil utilisateur
  • Recettes personnelles : CRUD complet avec tags, ingredients, etapes numerotees, temps de preparation
  • Photos de recettes : upload d'images (drag & drop, conversion WebP automatique, stockage MinIO)
  • Communautes privees : creation, invitation par utilisateur, roles (Member / Moderator), avatar personnalise
  • Recettes communautaires : publication, edition collaborative, permissions par role
  • Propositions & variantes : suggestion de modifications, historique des variantes
  • Partage inter-communautes : fork de recettes entre communautes, tracabilite
  • Systeme de tags : tags globaux et communautaires, suggestions de tags, moderation
  • Ingredients normalises : base d'ingredients avec unites, autocomplete intelligent
  • Feed d'activite : activite communautaire et personnelle
  • Notifications temps reel : 5 categories, preferences par communaute, WebSocket, groupement intelligent
  • SuperAdmin : dashboard admin isole, authentification 2FA (TOTP), gestion tags/ingredients/unites/communautes/features

Stack technique

Couche Technologies
Frontend React 18, TypeScript, Vite, TailwindCSS, daisyUI, React Router, Axios
Backend Node.js, Express, TypeScript, Prisma ORM, Socket.IO
Base de donnees PostgreSQL 15
Stockage MinIO (compatible S3)
Tests Vitest, Supertest, Testing Library, MSW (~1150 tests)
Infrastructure Docker, GitHub Actions, Portainer, Traefik

Demarrage rapide

Prerequis

Installation

# 1. Cloner le repository
git clone https://github.com/MatthiasBlc/ForestManager.git
cd ForestManager

# 2. Configurer l'environnement
cp .env.example .env
# Editer .env avec vos valeurs (mots de passe, secrets de session)

# 3. Demarrer les services
npm run docker:up:build

URLs de developpement

Service URL
Frontend http://localhost:3000
Backend API http://localhost:3001
MinIO Console http://localhost:9001
Prisma Studio http://localhost:5555 (via npm run prisma:studio)

Comptes de test

La base est automatiquement seedee au premier demarrage :

Utilisateur Mot de passe
pizza_lover password123
pie_fan password123

Scripts

Docker

npm run docker:up              # Demarrer les conteneurs
npm run docker:up:d            # Demarrer en arriere-plan
npm run docker:up:build        # Rebuild + demarrer + nettoyage images
npm run docker:down            # Arreter les conteneurs
npm run docker:clean           # Arreter + supprimer les volumes
npm run docker:logs            # Logs de tous les services
npm run docker:logs:backend    # Logs backend uniquement
npm run docker:logs:frontend   # Logs frontend uniquement
npm run docker:restart         # Redemarrer les conteneurs

Prisma

npm run prisma:studio          # Ouvrir Prisma Studio (GUI base de donnees)
npm run prisma:migrate         # Executer les migrations
npm run prisma:generate        # Regenerer le client Prisma

Tests

npm test                       # Tous les tests (backend + frontend)
npm run test:backend           # Tests backend uniquement
npm run test:frontend          # Tests frontend uniquement
npm run test:watch:backend     # Mode watch backend
npm run test:watch:frontend    # Mode watch frontend
npm run test:coverage          # Tests avec rapport de couverture

Les tests s'executent dans les conteneurs Docker. Les conteneurs doivent etre demarres (npm run docker:up:d).

Tests

Stack de tests

Outil Role
Vitest Framework de tests (backend + frontend)
Supertest Tests d'integration API (backend)
Testing Library Tests de composants React (frontend)
MSW Mock Service Worker pour simuler l'API (frontend)

Structure

backend/src/__tests__/
  setup/
    globalSetup.ts          # Connexion DB + cleanup entre tests
    testHelpers.ts          # Factories (createTestUser, createTestAdmin, etc.)
  integration/
    auth.test.ts            # Auth utilisateur (signup, login, logout)
    recipes.test.ts         # CRUD recettes personnelles
    communities.test.ts     # CRUD communautes
    communityRecipes.test.ts # Recettes communautaires
    invitations.test.ts     # Invitations
    members.test.ts         # Gestion membres
    proposals.test.ts       # Propositions de modifications
    share.test.ts           # Partage inter-communautes
    variants.test.ts        # Variantes de recettes
    activity.test.ts        # Feed d'activite
    tags.test.ts            # Autocomplete tags
    ingredients.test.ts     # Autocomplete ingredients
    admin*.test.ts          # APIs admin (auth 2FA, tags, ingredients, features, communities, dashboard, activity)

frontend/src/__tests__/
  setup/
    vitestSetup.ts          # Config globale + MSW
    mswHandlers.ts          # Mocks des endpoints API
    testUtils.tsx           # Helpers de rendu avec providers
  unit/
    *.test.tsx              # Tests composants, pages, contexts

CI/CD

Les tests sont executes automatiquement a chaque push sur master ou preprod :

push master/preprod
       |
       v
+-------------+     +---------------+
| test-backend| --> | test-frontend |
+-------------+     +---------------+
       |                   |
       v                   v
       +-------------------+
                |
                v (si tous les tests passent)
         +------------+
         |   build    |
         +------------+
                |
                v
         +------------+
         |   deploy   |
         +------------+

Structure du projet

ForestManager/
  backend/
    src/
      controllers/          # Logique metier (auth, recipes, communities, proposals, share...)
      routes/               # Endpoints API REST
      middleware/            # Auth, roles communaute, securite (helmet, CORS, rate limiting)
      services/             # Services metier (gestion recettes orphelines)
      admin/                # Module admin isole (controllers, routes, middleware)
      types/                # Extensions TypeScript (Express, sessions)
    prisma/
      schema.prisma         # Schema base de donnees
      seed.js               # Donnees initiales
  frontend/
    src/
      pages/                # Pages React (Dashboard, Recipes, Communities, Profile...)
      components/           # Composants reutilisables (Layout, Navbar, modals, cards...)
      contexts/             # Contexts React (AuthContext, AdminAuthContext)
      network/              # Client API (Axios)
      models/               # Types TypeScript
      hooks/                # Custom hooks
  docker-compose.yml        # Configuration dev
  docker-compose.prod.yml   # Configuration production
  docker-compose.preprod.yml # Configuration pre-production
  .github/workflows/        # Pipeline CI/CD

Variables d'environnement

Copier .env.example vers .env et renseigner les valeurs :

Variable Description Defaut dev
COMPOSE_PROJECT_NAME Nom du projet Docker Compose forestmanager
POSTGRES_USER Utilisateur PostgreSQL forestmanager
POSTGRES_PASSWORD Mot de passe PostgreSQL -
POSTGRES_DB Nom de la base de donnees forestmanager_db
PORT Port du backend 3001
SESSION_SECRET Secret sessions utilisateur (min 32 chars) -
ADMIN_SESSION_SECRET Secret sessions admin (min 32 chars) -
CORS_ORIGIN Origine CORS autorisee http://localhost:3000
VITE_BACKEND_URL URL du backend (frontend) http://localhost:3001

Deploiement

Architecture production

L'application est deployee via Docker avec Traefik comme reverse proxy et Portainer pour l'orchestration :

  • Traefik : reverse proxy avec terminaison SSL automatique (Let's Encrypt)
  • Portainer : gestion des stacks Docker, deploiement via API
  • GitHub Actions : pipeline CI/CD (tests -> build -> push registry -> deploy)
  • Docker Registry : registry prive pour les images

GitHub Secrets requis

Secret Description
REGISTRY_URL URL du registry Docker
REGISTRY_USERNAME Utilisateur du registry
REGISTRY_PASSWORD Mot de passe du registry
IMAGE_NAME Prefixe des images Docker
PORTAINER_URL URL de Portainer
PORTAINER_API Cle API Portainer
STACK_ID ID de la stack Portainer
ENDPOINT_ID ID de l'endpoint Portainer
POSTGRES_USER Utilisateur PostgreSQL (prod)
POSTGRES_PASSWORD Mot de passe PostgreSQL (prod)
POSTGRES_DB Nom de la base (prod)
SESSION_SECRET Secret sessions utilisateur (prod)
ADMIN_SESSION_SECRET Secret sessions admin (prod)
CORS_ORIGIN Origine CORS autorisee (prod)
API_URL URL publique de l'API

Pipeline CI/CD

A chaque push sur master :

  1. Tests : backend (PostgreSQL service container) + frontend (mocks MSW)
  2. Build : images Docker backend + frontend
  3. Push : envoi des images vers le registry prive
  4. Deploy : mise a jour de la stack via l'API Portainer
  5. Cleanup : suppression des anciennes images du registry

Nettoyage du registry

Ajouter ce cron job sur le serveur pour recuperer l'espace disque :

# Execution quotidienne a 3h
0 3 * * * docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml --delete-untagged

Creation d'un SuperAdmin

# Dans le conteneur backend
docker compose exec backend npx ts-node src/scripts/createAdmin.ts

Le script demande un username et un mot de passe, puis genere un QR code TOTP a scanner avec une application d'authentification (Google Authenticator, Authy, etc.).

Documentation

Document Description
Architecture Architecture technique et patterns
Specification API Contrat REST complet
Regles metier Regles metier detaillees
User Stories Fonctionnalites utilisateur
Roadmap MVP Plan de developpement (archive)

Features post-MVP

Feature Spec Description
Tags Rework SPEC Systeme de tags scope-aware (global/community)
Ingredients Rework SPEC Base ingredients avec unites et moderation
Recipe Rework v2 SPEC Etapes numerotees, temps, portions
Notifications SPEC Notifications temps reel (WebSocket)
Input Validation SPEC Validation et securite renforcees
Photo Upload SPEC Upload images via MinIO

Auteur

Cree par MatthiasBlc

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors