Files
xamxam/public/admin

PostERG - Formulaire d'ajout de mémoires

Le formulaire permet aux étudiant.e.s sortant de l'ERG en cursus de Master de soumettre leurs mémoires et travaux de fin d'études.

Fonctionnalités

  • Soumission de mémoires avec métadonnées complètes
  • Stockage structuré dans base de données SQLite
  • Support multi-auteurs, multi-superviseurs, multi-langues
  • Gestion des mots-clés (max 10 par TFE)
  • Téléversement sécurisé des fichiers
  • Protection CSRF et validation complète
  • Workflow de publication (soumission → soutenance → publication)

Technologies

  • PHP 7.4+ avec PDO SQLite
  • SQLite 3.8+
  • CSS fait-main + Simple.css
  • Symfony YAML (pour migration legacy)
  • Just pour les tâches de développement

Installation

Prérequis

# PHP avec SQLite
php -v  # 7.4 ou supérieur
php -m | grep sqlite  # Vérifier extension SQLite

# Composer
composer install

# Just (optionnel mais recommandé)
# macOS: brew install just
# Linux: cargo install just

Configuration

  1. Base de données production:

    cd ../db
    sqlite3 posterg.db < schema.sql
    
  2. Base de données de test:

    just init-test-db
    

Développement local

Avec Just (recommandé)

# Configuration complète et lancement du serveur
just dev

# Ou étape par étape:
just init-test-db    # Créer la base de test
just serve           # Lancer le serveur (réinitialise la DB)
just serve-only      # Lancer sans réinitialiser

# Nettoyage
just cleanup         # Supprimer test.db et fichiers uploadés
just reset          # Cleanup + réinitialisation

# Statistiques
just stats          # Voir les stats de la DB
just recent         # Voir les soumissions récentes
just show 1         # Voir le TFE #1

# Autres commandes
just query          # Shell SQLite interactif
just dump           # Backup de la DB

Sans Just

# Créer la base de test
sqlite3 test.db < ../db/schema.sql

# Lancer le serveur
php -S 127.0.0.1:3000

# Ouvrir dans le navigateur
open http://127.0.0.1:3000

Structure du projet

formulaire/
├── assets/             # CSS et ressources
│   ├── normalize.css
│   ├── simple.css
│   ├── posterg.css
│   └── icon.svg
├── data/               # Données (gitignored)
│   ├── theses/        # Fichiers TFE uploadés
│   ├── covers/        # Images de couverture
│   └── yaml/          # Legacy YAML (migration)
├── Database.php        # Classe helper pour DB
├── index.php          # Formulaire de soumission
├── formulaire.php     # Traitement de soumission
├── thanks.php         # Page de confirmation
├── justfile           # Tâches de développement
├── .gitignore         # Fichiers ignorés
├── MIGRATION.md       # Guide de migration YAML → SQLite
├── SECURITY.md        # Documentation sécurité
└── README.md          # Ce fichier

Workflow de soumission

  1. Étudiant remplit le formulaire (index.php)

    • Informations de base (nom, année, titre)
    • Détails académiques (orientation, AP, finalité)
    • Contenu (synopsis, mots-clés, langues, formats)
    • Upload fichiers (TFE + annexes)
  2. Validation et traitement (formulaire.php)

    • Validation CSRF token
    • Sanitization des entrées
    • Transaction DB (all-or-nothing)
    • Création/liaison entités (auteur, superviseurs, mots-clés)
    • Upload sécurisé avec noms aléatoires
    • Génération identifiant unique (YYYY-NNN)
  3. Confirmation (thanks.php)

    • Affichage récapitulatif
    • Statut: "En attente de publication"
    • Liste des fichiers uploadés
  4. Publication (admin - à venir)

    • Après soutenance
    • Ajout note contextuelle du jury (optionnel)
    • Points du jury
    • Publication publique

Base de données

Structure

  • 19 tables incluant tables de jonction et vues
  • Normalized 3NF avec clés étrangères
  • Timestamps automatiques via triggers
  • Cascade deletes pour intégrité référentielle

Tables principales

  • theses - TFE avec métadonnées
  • authors - Auteurs (réutilisables)
  • supervisors - Promoteurs
  • thesis_files - Métadonnées fichiers
  • keywords - Mots-clés (extensible)
  • Plus tables de référence et jonctions

Vues

  • v_theses_full - Vue complète pour admin
  • v_theses_public - Vue filtrée pour public

Voir ../db/README.md pour documentation complète.

Sécurité

Protection CSRF - Tokens de session SQL Injection - Prepared statements PDO Path Traversal - Validation stricte des chemins File Upload - Noms aléatoires, validation MIME Input Validation - Sanitization + validation typage Error Handling - Pas d'exposition de chemins système

Voir SECURITY.md pour détails complets.

Tests

Test manuel

  1. Lancer serveur: just dev
  2. Ouvrir http://127.0.0.1:3000
  3. Remplir formulaire avec données test
  4. Vérifier confirmation
  5. Vérifier DB: just stats et just recent

Checklist

  • Form se charge sans erreurs
  • Dropdowns peuplés depuis DB
  • Validation champs requis fonctionne
  • Upload fichiers réussit
  • Transaction rollback sur erreur
  • Page confirmation affiche données
  • Identifiant unique généré (YYYY-NNN)
  • Fichiers stockés avec noms aléatoires

Migration données legacy

Si vous avez des fichiers YAML existants:

# Script de migration à créer
php migrate_yaml_to_sqlite.php

Voir MIGRATION.md pour guide complet.

Production

Déploiement

  1. Copier fichiers:

    rsync -av --exclude='test.db' --exclude='data/' \
          formulaire/ user@server:/var/www/posterg/
    
  2. Créer DB production:

    cd /var/www/posterg/db
    sqlite3 posterg.db < schema.sql
    
  3. Permissions:

    chown -R www-data:www-data /var/www/posterg
    chmod 644 db/posterg.db
    chmod 755 data/theses data/covers
    
  4. Configuration nginx:

    location /formulaire {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
    
        try_files $uri $uri/ /index.php?$query_string;
    
        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
            include fastcgi_params;
        }
    }
    

Backup

# Backup automatique quotidien
0 2 * * * sqlite3 /var/www/posterg/db/posterg.db \
          .dump > /backups/posterg_$(date +\%Y\%m\%d).sql

Support

  • Schema DB: ../db/README.md
  • Setup DB: ../db/SETUP.md
  • Sécurité: SECURITY.md
  • Migration: MIGRATION.md
  • Specs techniques: ../db/posterg_fiche-technique.md

Changelog

v2.0 - 2026-01-27

  • Migration vers SQLite
  • Support multi-entités (auteurs, superviseurs, etc.)
  • Sécurité renforcée
  • Workflow de publication
  • Justfile pour développement

v1.0 - Précédent

  • Stockage YAML
  • Formulaire basique