feat: extract MediaController, wire into Dispatcher, delete media.php

This commit is contained in:
Pontoporeia
2026-04-17 11:44:08 +02:00
parent b03be51b92
commit 75f808bee4
157 changed files with 1713 additions and 452 deletions

View File

@@ -0,0 +1,58 @@
# Analysis: Proposed PHP Structure Reorganization
## Summary
The proposed structure is a standard Laravel/Symfony-inspired architecture, but **overengineered for this project's scale and conflicts with existing architectural decisions**.
## Key Issues
### 1. Redundant Separation
The project already has good separation of concerns:
- Controllers in `src/` (14 focused classes)
- Templates in `templates/`
- Data in `storage/` (outside web root)
- Organized tests
### 2. Conflicts with Existing Decisions
- **`docs/orm-assessment.md`** explicitly decided against Doctrine/ORM → Proposed `src/Model/` entities contradict this
- **No Composer** in current project → Proposed structure requires PSR-4 autoloading
- **`App.php` already does the job** → Adding `Core/AppKernel.php` is redundant
### 3. Overengineering
- Repository + Service + Model layers for a ~15 page SQLite app creates 3x the code
- `ThesisCreationService`, `AuthService`, `ExportService` split logic that's currently cohesive
- `Config/Settings.php` replaces working `config/bootstrap.php` for no clear benefit
## What Actually Makes Sense
### High Value, Low Cost:
1. **`.env` for secrets** → Replace hardcoded credentials pattern
2. **Single entry point** → Move to `public/index.php` routing (requires nginx config changes)
3. **Keep logic out of `public/`** → Already partially achieved
### Medium Value:
4. **Consolidate `src/` classes** → Group into subdirectories without full MVC overhaul
5. **Move `test.db` from root** → Into `storage/` where it belongs
### Low Value (Skip):
- Entity classes (conflicts with ORM assessment)
- Repository pattern (SQLite direct access is fine)
- Service layer over-splitting
- Composer integration (unless you need PHP packages)
## Recommendation
**Do NOT adopt the full proposed structure.**
Instead, make incremental improvements:
1. Add `.env` support
2. Consolidate to single entry point
3. Organize `src/` into logical subdirectories
4. Move stray files to proper locations
This achieves 80% of the benefits at 20% of the cost.
## Questions to Consider
1. Are you planning to add external PHP dependencies? (If yes, Composer makes sense)
2. Do you expect multiple developers to work on this simultaneously? (Justifies stricter structure)
3. Is the current codebase difficult to maintain? (If no, restructure is premature optimization)

134
docs/SETUP.md Normal file
View File

@@ -0,0 +1,134 @@
# Post-ERG Setup Guide
Complete setup guide for development and production deployment.
## Requirements
- PHP 8.4
- SQLite3 (`php8.4-sqlite3`)
- nginx (production)
## Development Setup
### 1. Initial Setup
```bash
just setup
```
### 2. Start Development Server
```bash
just serve
```
Access at: http://localhost:8000
### 3. Run Tests
```bash
just test
```
## Production Deployment
### First-Time Server Setup
```bash
ssh posterg
sudo mkdir -p /var/www/posterg
sudo chown www-data:posterg /var/www/posterg
sudo chmod 775 /var/www/posterg
exit
```
### Deploy Application
```bash
just deploy
just deploy-nginx
```
### Set Admin Password
```bash
just manage-admin-users
ssh posterg "sudo bash /tmp/manage-admin-users.sh"
```
### Verify Deployment
```bash
# Test public site
curl -I https://posterg.erg.be/
# Test admin protection
curl -I https://posterg.erg.be/admin/
# Test file protection
curl -I https://posterg.erg.be/storage/test.db
```
## Nginx Configuration
See `nginx/SETUP.md` and `nginx/docs/PRODUCTION_DEPLOYMENT.md` for detailed nginx setup.
## Admin Panel
The admin panel is protected by:
1. nginx HTTP Basic Authentication (htpasswd)
2. PHP session authentication
Manage users with:
```bash
just manage-admin-users
```
## Database
### Initialize Test Database
```bash
just init-db
```
### Reset Database
```bash
just reset-db
```
### Deploy Test Database to Server
```bash
just deploy-db
```
## Common Operations
### View Logs
```bash
just logs
```
### Stop Development Server
```bash
just stop
```
### Run Migrations
```bash
just migrate
```
## Security
- Admin panel: HTTP Basic Auth + PHP session
- File uploads: Stored outside webroot, served via `media.php`
- Rate limiting: 30 req/min general, 10 req/min admin
- Security headers: X-Frame-Options, CSP, HSTS, etc.
See `nginx/docs/SECURITY_HEADERS.md` for details.

36
docs/SPECS.md Normal file
View File

@@ -0,0 +1,36 @@
- l'ordre des TFE sur la page d'accueil ; est-ce que ce serait possible de les faire dérouler par année avec les plus récents tout en haut , mais en rendant l'ordre de chaque année aléatoire
- On a les pdf et notes d'intention des dernières années, est-ce que vous voulez déjà y avoir accès ? Est-ce qu'il y a une nomenclature particulière qui vous fait plaisir ?
## admin
- Il a été décidé de pour linstant ne pas rendre les TFE visibles vers lextérieur.
- option douverture “interne” qui sera à priori le défaut appliqué sur une majorité des TFE
pas disponnible:
- le pdf ainsi que la note dintention ne soient que disponibles quand les personnes se trouvent physiquement à lerg (via adresse IP) ou via login (à voir ce qui est le plus simple à intégrer techniquement).
## le formulaire de dépôt
- On demandera aux étudiant·es de préparer une image au bon format pour le dépôt du TFE. Est-ce que vous pouvez nous donner la taille qu'il faudrait ?
- la page de formulaire:celle que les étudiant·es doivent remplir lors du dépôt du TFE, ajouter:
- l'explication;
- le contexte des différents choix soient visibles.
- Quand un·é étudiant·e dépose son TFE, il ne doit pas être publié directement. Il doit arriver dans la base de donnée, et quelqu'un viendrait juste clicker sur “publier” dans le backoffice une fois la défense orale terminée (et en fonction du retour du jury).
- loption “libre” ne doit donc pas encore exister cette année.
- créer un système de toggle pour quelles sont les options actives dans le formulaire
- Il ny a pour linstant que loption “interdit” et “interne”. Loption “libre” ne sera activée que à partir de lannée académique prochaine.
- la case “contact” soit accompagnée dune case à cocher/décocher ; « Je veux que mon contact soit accessible à toustes depuis la plateforme xamxam ». En fonction de cette réponse, le contact apparaîtrait ou non sur la page du TFE.
## la base de donnée
- rajouter une catégorie “objet” pour que, dans un futur éventuel, on puisse différencier les TFE des FRART et des thèses. Pour linstant cest juste un tag qui doit apparaître en back-office.
- quelle(s) fonte(s) est-ce que vous utilisez sur le site ?
-ce que vous pouvez menvoyez un export de la maquette du site ? (en .jpg cest ok, cest juste pour rafraîchir nos mémoires afin qu'on puisse produire les textes en adéquation avec ce qui existe)