Commit Graph

139 Commits

Author SHA1 Message Date
Bastian Wagner
c7dfdd7498 fix: address penalty catalog review findings 2026-08-01 14:46:58 +02:00
Bastian Wagner
fa05e55d43 feat: manage penalty catalog in modern frontend 2026-08-01 13:32:22 +02:00
Bastian Wagner
17228a52db feat: secure penalty catalog management 2026-08-01 13:17:44 +02:00
Bastian Wagner
4c1bd49405 fixes 2026-08-01 13:17:26 +02:00
Bastian Wagner
45658e42fa docs: add penalty catalog management plan 2026-08-01 12:52:07 +02:00
Bastian Wagner
e3bff40181 Merge branch 'feature/admin-user-management' 2026-08-01 11:50:27 +02:00
Bastian Wagner
945369796e fix: refresh admin self profile state 2026-08-01 11:45:03 +02:00
Bastian Wagner
431eba86e7 fix: align admin profile request validation 2026-08-01 11:20:47 +02:00
Bastian Wagner
d962200b79 test: cover assignment failure recovery 2026-08-01 10:52:17 +02:00
Bastian Wagner
9eec6268d0 fix: lock directory during assignment changes 2026-08-01 10:44:17 +02:00
Bastian Wagner
9dc9dc3dcf fix: stabilize admin user UI state 2026-08-01 10:32:51 +02:00
Bastian Wagner
3ae0fd2000 feat: build admin user management UI 2026-08-01 10:01:25 +02:00
Bastian Wagner
1288f5fc60 fix(mail): resolve templates from __dirname so they exist in the built image
The Docker runtime image only ships dist/, but mail-config.service.ts
pointed at src/mail/mail-templates and nest-cli.json never copied the
.hbs files into dist/ either. This was silently masked before because
the return-before-sendMail bug meant the path was never touched; fixing
that bug now surfaces it as a hard crash on boot (readFileSync throwing
synchronously inside the MailerModule factory). Resolve the templates
dir from __dirname instead, which is correct in both dev (src/mail) and
the compiled image (dist/mail), and add the mail-templates .hbs files
to nest-cli.json's asset copy list so they actually land in dist/.
2026-08-01 09:27:44 +02:00
Bastian Wagner
d0ec000bff fix: harden admin frontend contracts 2026-08-01 09:26:14 +02:00
Bastian Wagner
484c7473fb feat: add admin user frontend contract 2026-08-01 09:17:57 +02:00
Bastian Wagner
78761b570b chore: untrack SDD reports 2026-08-01 00:21:26 +02:00
Bastian Wagner
bec1826bfa fix: close admin user security gaps 2026-08-01 00:19:49 +02:00
Bastian Wagner
e6acfdcac7 feat: secure admin user management 2026-07-31 23:37:54 +02:00
Bastian Wagner
8e318df94f Merge branch 'worktree-mail-versand' 2026-07-31 23:35:41 +02:00
Bastian Wagner
c80f78594e fix: register mail layout partial on handlebars singleton for real mailer wiring
The HandlebarsAdapter reads partials config from a top-level sibling of
`template` (mailerOptions.options.partials), not from
template.options.partials where it was nested. Because the mail templates
use partial blocks ({{#> layout}}...{{/layout}}), the unregistered partial
rendered silently as an unstyled fragment instead of throwing, so this went
unnoticed. A config-only fix also breaks on Windows because the adapter's
glob-based directory loader mishandles backslash path separators.

Fix registers the shared `layout` partial directly on the handlebars module
singleton in MailConfigService, bypassing the broken glob loader entirely.

Also:
- add mail-config.service.spec.ts, an integration test that drives the real
  MailerOptions + HandlebarsAdapter wiring (would have caught this bug,
  unlike the existing template-only spec which registers the partial itself)
- remove stale nestjs-i18n references from .env.example, env-example, and
  the backend README (i18n was already removed from the code)
- add missing trailing newlines to activation.hbs and reset-password.hbs

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 23:29:19 +02:00
Bastian Wagner
0a0990c6f4 feat(mail): redesign email templates with TeamWallet branding and shared layout partial 2026-07-31 22:49:40 +02:00
Bastian Wagner
ae9de39ac4 chore(mail): remove nestjs-i18n, only ever used for the two mail templates
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 22:41:01 +02:00
Bastian Wagner
4105460400 test: guard inactive directory membership 2026-07-31 22:36:18 +02:00
Bastian Wagner
81040efd8b css 2026-07-31 22:34:52 +02:00
Bastian Wagner
247aeefd4c fix(mail): remove dead return before sendMail, add firstName personalization
- Remove I18n dependency injection from MailService constructor
- Hardcode German email subject/body strings directly in the service
- Add optional firstName field to userSignUp and forgotPassword methods
- Wire firstName from user object through auth.service.ts call sites
- Add comprehensive unit tests for MailService

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 22:33:34 +02:00
Bastian Wagner
d738b49cbf fix: query user directory safely 2026-07-31 22:29:15 +02:00
Bastian Wagner
e722d9e26b css 2026-07-31 22:28:57 +02:00
Bastian Wagner
fb3ed10b41 docs: add mail-versand implementation plan 2026-07-31 22:22:27 +02:00
Bastian Wagner
c382234746 feat: add safe user directory query 2026-07-31 22:12:53 +02:00
Bastian Wagner
e5ba292815 scss 2026-07-31 22:12:38 +02:00
Bastian Wagner
ed5a00a577 docs: correct mail design spec after deeper env/infra investigation
.env already exists locally with valid creds (the deleted repo-root
.env was an unused duplicate), and no MailDev infra exists for the
e2e mail tests, so the plan shifts to a MailService unit test plus
one manual send instead of touching .env or standing up e2e infra.
2026-07-31 22:09:59 +02:00
Bastian Wagner
539d073de4 docs: add design spec for mail sending fix and template redesign
Captures the brainstorming outcome for fixing the broken mail dispatch,
removing the mail-only nestjs-i18n setup in favor of hardcoded German
copy, and redesigning the registration/forgot-password email templates.
2026-07-31 22:04:16 +02:00
Bastian Wagner
1d4546d483 styling 2026-07-31 22:01:09 +02:00
Bastian Wagner
bcb4207233 docs: add admin user management plan 2026-07-31 21:58:47 +02:00
Bastian Wagner
7df56110a6 chore: ignore local worktrees 2026-07-31 21:48:04 +02:00
Bastian Wagner
72b3a9dc93 files 2026-07-31 21:38:58 +02:00
Bastian Wagner
e6757ab9dc files 2026-07-31 21:25:31 +02:00
Bastian Wagner
4ef35b3755 migration 2026-07-31 21:20:16 +02:00
Bastian Wagner
6bea4f766a first commit 2026-07-31 21:02:47 +02:00