Retour aux projets
Fullstack· 2026Livré

Workspace App

Application web collaborative de gestion de contenu : workspaces, pages, commentaires et invitations. PHP natif, MySQL et JavaScript vanilla, API REST et tests d'integration.

Contexte du projet

Workspace App est une application de gestion de contenu collaborative construite sans framework, afin de comprendre en profondeur le cycle HTTP, le routing et la séparation des responsabilités. L'objectif était d'obtenir une base solide, lisible et testée pour des workspaces partageables.

Fonctionnalités principales

  • Authentification par sessions PHP : inscription, connexion, déconnexion
  • CRUD complet des workspaces et des pages
  • Collaboration avec invitations et rôles viewer, editor, admin
  • Commentaires avec modération par l'owner
  • Dashboard avec statistiques agrégées et activité récente
  • API REST avec plus de 30 routes et des codes HTTP sémantiques
  • Tests d'intégration : 22 tests, 56 assertions

Architecture technique

Backend — PHP 8.3 natif

  • Front Controller unique via public/index.php
  • Router regex avec support des paramètres dynamiques
  • Controllers pour la validation et les réponses HTTP
  • Models limités aux requêtes SQL
  • Middleware d'authentification par session

Frontend — JavaScript vanilla

  • api.js pour fetch et la gestion du loader
  • state.js comme source de vérité unique
  • ui.js uniquement pour le rendu
  • app.js pour l'orchestration des événements

Base de données — MySQL 8

  • Relations 1-N et N-N avec index de jointure
  • Requêtes agrégées pour le dashboard
  • Contraintes et clés étrangères pour l'intégrité
workspace-app/
├── public/
│   └── index.php
├── backend/
│   ├── config/
│   ├── controllers/
│   ├── middleware/
│   ├── models/
│   └── Router.php
├── frontend/
│   ├── js/
│   └── css/
├── database/
│   └── workspace_app.sql
└── tests/
    └── Integration/

Modèle de données

Le schéma repose sur users, workspaces, workspace_members, pages, page_shares et comments. Les dépendances d'un workspace sont en ON DELETE CASCADE pour un nettoyage complet des pages, commentaires, membres et partages.

La suppression d'un utilisateur retire ses memberships, partages et commentaires, tandis que ses workspaces et pages restent avec owner_id = NULL afin de conserver l'historique.

Sécurité

  • Mots de passe hachés avec bcrypt (coût par défaut de PHP 8.3)
  • Requêtes préparées PDO sur toutes les opérations
  • session_regenerate_id() après chaque connexion
  • Cookie de session HttpOnly (recommandé via php.ini)
  • Messages d'erreur de connexion volontairement vagues
  • Contrôle d'accès à chaque route : authentification, existence et autorisation

Tests et qualité

La suite PHPUnit 12 exécute des tests d'intégration HTTP sur une base dédiée. Elle couvre les parcours nominaux et les cas d'erreur avec 22 tests et 56 assertions.

Décisions techniques

  • PHP natif pour comprendre le routing, le middleware et le cycle HTTP sans abstraction
  • Sessions plutôt que JWT, car le frontend est sur le même domaine
  • Tests d'intégration préférés aux tests unitaires pour couvrir l'ensemble de la stack

Statut actuel

Le projet est livré, conteneurisé et déployé en production.

Backend hébergé sur Render (Apache + PHP 8.3), base de données MySQL 8 sur Railway. Le pipeline de déploiement est entièrement automatisé : chaque push sur main déclenche un redéploiement sur Render.

Déploiement

L'application est conteneurisée avec Docker et déployée sur deux services distincts :

  • Render — service web PHP 8.3 + Apache, redéploiement automatique sur push main
  • Railway — instance MySQL 8 avec initialisation automatique du schéma

Les variables d'environnement (identifiants de base de données, configuration) sont injectées au runtime. Le Dockerfile configure les permissions Apache (www-data) pour les uploads de fichiers.