diff --git a/docs/superpowers/plans/2026-07-31-mail-versand.md b/docs/superpowers/plans/2026-07-31-mail-versand.md new file mode 100644 index 0000000..92d75e8 --- /dev/null +++ b/docs/superpowers/plans/2026-07-31-mail-versand.md @@ -0,0 +1,664 @@ +# Mailversand reparieren + Templates neu gestalten — Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Mailversand für Registrierung und Passwort-vergessen im NestJS-Backend +(`myteamwallet_backend`) wieder funktionsfähig machen, das mail-only `nestjs-i18n` Setup +entfernen (Texte direkt auf Deutsch), und die zwei Handlebars-Templates in einem zu +"TeamWallet" (Grün `#2e7d32`) passenden, hübschen Design neu bauen. + +**Architecture:** `MailService` (`@nestjs-modules/mailer` + Nodemailer + Handlebars) bleibt die +zentrale Versandstelle. Der Bug ist ein totes `return;` vor `sendMail(...)` in beiden Methoden — +Fix ist ein reiner Code-Fix, keine Config-Änderung nötig (`.env` ist bereits lokal korrekt +befüllt). `nestjs-i18n` wird komplett entfernt, deutsche Texte wandern direkt in die +`.hbs`-Templates bzw. als String-Literale in `mail.service.ts`. Die zwei Templates teilen sich +ein gemeinsames Handlebars-Block-Partial (`partials/layout.hbs`) für Header/Footer, um +Duplikation zu vermeiden. + +**Tech Stack:** NestJS 9, `@nestjs-modules/mailer` 1.8.1 (Nodemailer 6.8.0), Handlebars 4.7.7, +Jest 29 (Unit-Tests), TypeScript 4.8. + +## Global Constraints + +- Nur Deutsch — keine mehrsprachige i18n-Infrastruktur für Mails, keine Sprachdateien. +- `nestjs-i18n` wird vollständig aus dem Backend entfernt (Modul, Dependency, `src/i18n/`). +- Branding: Akzentfarbe `#2e7d32` (Grün), Textwordmark „TeamWallet" (kein Bild-Logo), Roboto mit + Fallback-Stack `Roboto, Helvetica, Arial, sans-serif`, abgerundete Card-Optik (~12px Radius), + `max-width: 600px`, Inline-CSS-safe (die `HandlebarsAdapter` inlined ` + +
+