feat(backend): mail module + send personal Gemeinde-Teamer invites
New global mail/ module mirroring the files/storage/ provider pattern: - MailProvider abstraction; default LogMailProvider only logs (no delivery), MAIL_PROVIDER=smtp switches to a nodemailer SMTP transport (SMTP_*, MAIL_FROM). - MailService.sendTeamerInvite() composes the invite email with a link built from APP_BASE_URL. TeamerService.createInvite() now mails personal invites (those with an email) best-effort and returns `emailSent`; group links are unchanged. Delivery failures are logged and swallowed, never blocking invite creation. New env: APP_BASE_URL, MAIL_PROVIDER, MAIL_FROM, SMTP_HOST/PORT/SECURE/ USER/PASS. Tests: teamer spec covers mail-on-personal-invite, no-mail-on-group-link, and transport-drop; npm test green at 56. Docs updated. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -17,6 +17,20 @@ TEAM_JWT_SECRET="change-me-too"
|
||||
|
||||
PORT=3000
|
||||
|
||||
# Public base URL of the app, used to build links in outgoing emails.
|
||||
APP_BASE_URL="http://localhost:3000"
|
||||
|
||||
# Email: defaults to "log" (writes what it would send to the log, no
|
||||
# delivery). Set MAIL_PROVIDER=smtp plus the SMTP_* vars + MAIL_FROM to
|
||||
# actually send Gemeinde-Teamer invite emails.
|
||||
MAIL_PROVIDER="log"
|
||||
MAIL_FROM="KC-App <no-reply@example.org>"
|
||||
SMTP_HOST="smtp.example.org"
|
||||
SMTP_PORT=587
|
||||
SMTP_SECURE="false"
|
||||
SMTP_USER=""
|
||||
SMTP_PASS=""
|
||||
|
||||
# File storage: defaults to Nextcloud via WebDAV; set STORAGE_PROVIDER=s3 to
|
||||
# use an S3-compatible bucket instead (see S3_* vars below).
|
||||
STORAGE_PROVIDER="webdav"
|
||||
|
||||
Reference in New Issue
Block a user