mail und logging
This commit is contained in:
117
apps/api/scripts/render-mail-previews.ts
Normal file
117
apps/api/scripts/render-mail-previews.ts
Normal file
@@ -0,0 +1,117 @@
|
||||
import { mkdirSync, writeFileSync } from 'node:fs';
|
||||
import { join } from 'node:path';
|
||||
import { tmpdir } from 'node:os';
|
||||
import { mailBrandingFromConfig } from '../src/mail/mail-branding';
|
||||
import { MailTemplateName } from '../src/mail/mail-template.constants';
|
||||
import { MailTemplateRendererService } from '../src/mail/mail-template-renderer.service';
|
||||
|
||||
const outputDir = process.env.MAIL_PREVIEW_DIR ?? join(tmpdir(), 'ldap-portal-mail-previews');
|
||||
const renderer = new MailTemplateRendererService();
|
||||
const branding = mailBrandingFromConfig({
|
||||
get: (key: string) =>
|
||||
({
|
||||
PUBLIC_WEB_URL: 'https://portal.example.com',
|
||||
MAIL_PRODUCT_NAME: 'LDAP Portal',
|
||||
MAIL_COMPANY_NAME: 'Example AG',
|
||||
MAIL_PRIMARY_COLOR: '#2563eb',
|
||||
MAIL_SUPPORT_EMAIL: 'support@example.com',
|
||||
MAIL_IMPRINT_URL: 'https://example.com/impressum',
|
||||
MAIL_PRIVACY_URL: 'https://example.com/datenschutz',
|
||||
})[key],
|
||||
} as never);
|
||||
|
||||
const common = {
|
||||
branding,
|
||||
locale: 'de-DE',
|
||||
};
|
||||
|
||||
const previews: Array<{ fileName: string; templateName: MailTemplateName; context: Record<string, unknown> }> = [
|
||||
{
|
||||
fileName: 'password-reset.html',
|
||||
templateName: MailTemplateName.PASSWORD_RESET,
|
||||
context: {
|
||||
...common,
|
||||
preheader: 'Passwort zuruecksetzen.',
|
||||
title: 'Passwort zuruecksetzen',
|
||||
subtitle: 'Fuer Ihr Benutzerkonto wurde das Zuruecksetzen des Passworts angefordert.',
|
||||
greeting: 'Guten Tag Max Mustermann,',
|
||||
action: {
|
||||
label: 'Passwort zuruecksetzen',
|
||||
url: 'https://portal.example.com/reset-password?token=preview-token',
|
||||
},
|
||||
alternateUrlLabel: 'Falls die Schaltflaeche nicht funktioniert, kopieren Sie diese URL:',
|
||||
expiresAtLabel: '17.07.2026, 15:30',
|
||||
warningBox: {
|
||||
title: 'Sicherheitshinweis',
|
||||
text: 'Falls Sie diese Anfrage nicht selbst gestellt haben, koennen Sie diese E-Mail ignorieren.',
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
fileName: 'account-created.html',
|
||||
templateName: MailTemplateName.ACCOUNT_CREATED,
|
||||
context: {
|
||||
...common,
|
||||
preheader: 'Ihr Benutzerkonto wurde angelegt.',
|
||||
title: 'Benutzerkonto erstellt',
|
||||
subtitle: 'Ihr Benutzerkonto fuer LDAP Portal ist einsatzbereit.',
|
||||
greeting: 'Guten Tag Max Mustermann,',
|
||||
username: 'max.mustermann@example.com',
|
||||
keyValues: [{ key: 'Benutzername', value: 'max.mustermann@example.com' }],
|
||||
action: { label: 'Zur Anwendung', url: 'https://portal.example.com' },
|
||||
alternateUrlLabel: 'Direkter Link zur Anwendung:',
|
||||
},
|
||||
},
|
||||
{
|
||||
fileName: 'invitation.html',
|
||||
templateName: MailTemplateName.INVITATION,
|
||||
context: {
|
||||
...common,
|
||||
preheader: 'Einladung zu LDAP Portal.',
|
||||
title: 'Einladung annehmen',
|
||||
subtitle: 'Example AG hat Sie zu LDAP Portal eingeladen.',
|
||||
greeting: 'Guten Tag,',
|
||||
inviter: 'Example AG',
|
||||
expiresAtLabel: '24.07.2026, 12:00',
|
||||
action: { label: 'Einladung annehmen', url: 'https://portal.example.com/invitation/preview' },
|
||||
alternateUrlLabel: 'Falls die Schaltflaeche nicht funktioniert, kopieren Sie diese URL:',
|
||||
warningBox: {
|
||||
title: 'Sicherheitshinweis',
|
||||
text: 'Leiten Sie diese Einladung nicht weiter. Der Link ist nur fuer die vorgesehene Person bestimmt.',
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
fileName: 'generic-notification.html',
|
||||
templateName: MailTemplateName.GENERIC_NOTIFICATION,
|
||||
context: {
|
||||
...common,
|
||||
preheader: 'Neue Benachrichtigung in LDAP Portal.',
|
||||
title: 'Neue Benachrichtigung',
|
||||
paragraphs: ['Eine fachliche Aktion wurde erfolgreich abgeschlossen.', 'Weitere Details finden Sie in der Anwendung.'],
|
||||
infoBox: { title: 'Hinweis', text: 'Diese Nachricht dient nur Ihrer Information.' },
|
||||
action: { label: 'Details ansehen', url: 'https://portal.example.com/notifications/preview' },
|
||||
},
|
||||
},
|
||||
{
|
||||
fileName: 'warning-notification.html',
|
||||
templateName: MailTemplateName.WARNING_NOTIFICATION,
|
||||
context: {
|
||||
...common,
|
||||
preheader: 'Warnmeldung in LDAP Portal.',
|
||||
title: 'Warnmeldung',
|
||||
paragraphs: ['Eine geplante Verarbeitung konnte nicht vollstaendig abgeschlossen werden.'],
|
||||
warningBox: { title: 'Pruefung erforderlich', text: 'Bitte pruefen Sie die Details in der Anwendung.' },
|
||||
action: { label: 'Warnung pruefen', url: 'https://portal.example.com/admin/audit' },
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
mkdirSync(outputDir, { recursive: true });
|
||||
|
||||
for (const preview of previews) {
|
||||
const html = renderer.renderHtml(preview.templateName, preview.context);
|
||||
writeFileSync(join(outputDir, preview.fileName), html, 'utf8');
|
||||
}
|
||||
|
||||
console.log(`Mail previews written to ${outputDir}`);
|
||||
Reference in New Issue
Block a user