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.jspourfetchet la gestion du loaderstate.jscomme source de vérité uniqueui.jsuniquement pour le renduapp.jspour 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é viaphp.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.