# Project Structure ``` dudi/ ├── bin/ │ └── console # Symfony CLI ├── config/ │ ├── packages/ │ │ ├── doctrine.yaml # ORM + DBAL config │ │ ├── security.yaml # Firewall, providers, access control │ │ ├── mailer.yaml │ │ └── ... │ └── routes.yaml # Auto-discovers #[Route] attributes ├── migrations/ # Legacy SQL migrations (pre-Symfony) ├── public/ # Apache DocumentRoot │ ├── index.php # Symfony kernel entry point │ ├── .htaccess # RewriteRule → index.php │ ├── app.js # Frontend SPA (vanilla JS) │ ├── style.css │ └── logo.png ├── src/ │ ├── Controller/ │ │ ├── AppController.php # Catch-all → renders app.html.twig │ │ ├── AuthController.php # /api/me, /api/register, /api/reset-*, /api/change-password │ │ ├── GoalController.php # /api/goals CRUD │ │ ├── InviteController.php # /api/invite, /api/invites │ │ └── AdminController.php # /api/admin/users (ADMIN_EMAIL-guarded) │ ├── Entity/ │ │ ├── User.php # Maps to users table (delight-im/auth compatible schema) │ │ ├── Goal.php │ │ └── Invite.php │ ├── Repository/ │ │ ├── UserRepository.php # implements PasswordUpgraderInterface │ │ ├── GoalRepository.php │ │ └── InviteRepository.php │ ├── Security/ │ │ └── JsonLoginAuthenticator.php # Handles POST /api/login with JSON body │ └── Kernel.php ├── templates/ │ └── app.html.twig # Full SPA shell + all