From fd473f00af1021f37cf653181a936fc339e07ca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20K=C3=BChn?= Date: Wed, 29 Apr 2026 15:40:57 +0200 Subject: [PATCH] Initial commit: Dudi habit tracker Symfony 8 SPA with Doctrine ORM, Symfony Security, vanilla JS frontend. Migrated from plain PHP (delight-im/auth + raw SQL) to full Symfony stack. Co-Authored-By: Claude Sonnet 4.6 --- .env | 18 + .gitignore | 18 + .htaccess | 15 + CLAUDE.md | 48 + README.md | 48 + api.php | 294 + app.js | 716 +++ bin/console | 21 + composer.json | 77 + composer.lock | 5486 +++++++++++++++++ config/bundles.php | 9 + config/packages/cache.yaml | 19 + config/packages/doctrine.yaml | 44 + config/packages/doctrine_migrations.yaml | 6 + config/packages/framework.yaml | 15 + config/packages/mailer.yaml | 3 + config/packages/messenger.yaml | 22 + config/packages/property_info.yaml | 3 + config/packages/routing.yaml | 10 + config/packages/security.yaml | 45 + config/packages/twig.yaml | 6 + config/packages/validator.yaml | 11 + config/preload.php | 5 + config/reference.php | 1372 +++++ config/routes.yaml | 11 + config/routes/framework.yaml | 4 + config/routes/security.yaml | 3 + config/services.yaml | 23 + deploy.sh | 29 + docs/api.md | 102 + docs/deployment.md | 69 + docs/structure.md | 66 + .../plans/2026-04-17-refactor-collapsible.md | 562 ++ .../plans/2026-04-21-registration-invites.md | 578 ++ .../specs/2026-04-17-refactor-design.md | 107 + .../2026-04-21-registration-invites-design.md | 98 + include/db.php | 60 + include/mailer.php | 19 + index.php | 8 + logo.png | Bin 0 -> 233309 bytes migrations/001_add_invites_note.sql | 1 + public/.htaccess | 17 + public/app.js | 716 +++ public/index.php | 9 + public/logo.png | Bin 0 -> 233309 bytes public/style.css | 113 + src/Controller/.gitignore | 0 src/Controller/AppController.php | 16 + src/Controller/AuthController.php | 212 + src/Controller/GoalController.php | 108 + src/Controller/InviteController.php | 90 + src/Entity/.gitignore | 0 src/Entity/Goal.php | 75 + src/Entity/Invite.php | 62 + src/Entity/User.php | 59 + src/Kernel.php | 11 + src/Repository/.gitignore | 0 src/Repository/GoalRepository.php | 21 + src/Repository/InviteRepository.php | 33 + src/Repository/UserRepository.php | 27 + src/Security/JsonLoginAuthenticator.php | 55 + style.css | 113 + symfony.lock | 170 + templates/app.html.twig | 329 + 64 files changed, 12287 insertions(+) create mode 100644 .env create mode 100644 .gitignore create mode 100644 .htaccess create mode 100644 CLAUDE.md create mode 100644 README.md create mode 100644 api.php create mode 100644 app.js create mode 100755 bin/console create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/bundles.php create mode 100644 config/packages/cache.yaml create mode 100644 config/packages/doctrine.yaml create mode 100644 config/packages/doctrine_migrations.yaml create mode 100644 config/packages/framework.yaml create mode 100644 config/packages/mailer.yaml create mode 100644 config/packages/messenger.yaml create mode 100644 config/packages/property_info.yaml create mode 100644 config/packages/routing.yaml create mode 100644 config/packages/security.yaml create mode 100644 config/packages/twig.yaml create mode 100644 config/packages/validator.yaml create mode 100644 config/preload.php create mode 100644 config/reference.php create mode 100644 config/routes.yaml create mode 100644 config/routes/framework.yaml create mode 100644 config/routes/security.yaml create mode 100644 config/services.yaml create mode 100755 deploy.sh create mode 100644 docs/api.md create mode 100644 docs/deployment.md create mode 100644 docs/structure.md create mode 100644 docs/superpowers/plans/2026-04-17-refactor-collapsible.md create mode 100644 docs/superpowers/plans/2026-04-21-registration-invites.md create mode 100644 docs/superpowers/specs/2026-04-17-refactor-design.md create mode 100644 docs/superpowers/specs/2026-04-21-registration-invites-design.md create mode 100644 include/db.php create mode 100644 include/mailer.php create mode 100644 index.php create mode 100644 logo.png create mode 100644 migrations/001_add_invites_note.sql create mode 100644 public/.htaccess create mode 100644 public/app.js create mode 100644 public/index.php create mode 100644 public/logo.png create mode 100644 public/style.css create mode 100644 src/Controller/.gitignore create mode 100644 src/Controller/AppController.php create mode 100644 src/Controller/AuthController.php create mode 100644 src/Controller/GoalController.php create mode 100644 src/Controller/InviteController.php create mode 100644 src/Entity/.gitignore create mode 100644 src/Entity/Goal.php create mode 100644 src/Entity/Invite.php create mode 100644 src/Entity/User.php create mode 100644 src/Kernel.php create mode 100644 src/Repository/.gitignore create mode 100644 src/Repository/GoalRepository.php create mode 100644 src/Repository/InviteRepository.php create mode 100644 src/Repository/UserRepository.php create mode 100644 src/Security/JsonLoginAuthenticator.php create mode 100644 style.css create mode 100644 symfony.lock create mode 100644 templates/app.html.twig diff --git a/.env b/.env new file mode 100644 index 0000000..c36a3ba --- /dev/null +++ b/.env @@ -0,0 +1,18 @@ +###> symfony/framework-bundle ### +APP_ENV=dev +APP_SECRET=change_me +###< symfony/framework-bundle ### + +###> doctrine/doctrine-bundle ### +DATABASE_URL="mysql://app:!ChangeMe!@127.0.0.1:3306/app?serverVersion=10.11-MariaDB&charset=utf8mb4" +###< doctrine/doctrine-bundle ### + +###> symfony/mailer ### +MAILER_DSN=null://null +MAILER_FROM=noreply@example.com +###< symfony/mailer ### + +###> app ### +APP_URL=http://localhost +DEFAULT_URI=http://localhost/dd +###< app ### diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3ba2448 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +###> symfony ### +/.env.local +/.env.*.local +/var/ +/vendor/ +/public/bundles/ +###< symfony ### + +###> legacy (pre-symfony) ### +/include/config.php +###< legacy ### + +###> tools ### +/.claude/ +/.superpowers/ +/.aider* +/docs/private/ +###< tools ### diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..60fdb56 --- /dev/null +++ b/.htaccess @@ -0,0 +1,15 @@ +RewriteEngine On +RewriteBase /dd/ + +# Composer-Dateien nicht ausliefern + + Require all denied + + +# API-Requests an api.php weiterleiten, Pfad als Query-Parameter +RewriteRule ^api/(.+)$ api.php?_path=$1 [L,QSA] +RewriteRule ^api/?$ api.php [L,QSA] + +# Alles andere an index.php (SPA) +RewriteCond %{REQUEST_FILENAME} !-f +RewriteRule ^ index.php [L] diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..f6ed5d6 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,48 @@ +# Dudi – Claude Context + +## What this is +Habit & goal tracking PWA. Users set goals (e.g. "50 push-ups/day for 30 days"), log sets daily, and see progress. Invite-only registration. German UI. + +## Stack +- Symfony 8 + Doctrine ORM (src/) +- Vanilla JS SPA — no build step, no npm (public/app.js) +- HTML `