96 lines
3.6 KiB
TypeScript
96 lines
3.6 KiB
TypeScript
import { ConfigService } from '@nestjs/config';
|
|
import { mkdir, writeFile } from 'node:fs/promises';
|
|
import { join } from 'node:path';
|
|
import { mailBranding } from '../src/mail/mail-branding';
|
|
import { MailTemplateName } from '../src/mail/mail-template.constants';
|
|
import { MailTemplateRendererService } from '../src/mail/mail-template-renderer.service';
|
|
|
|
const outputDir = join(process.cwd(), 'tmp', 'mail-previews');
|
|
const config = new ConfigService({
|
|
MAIL_PRODUCT_NAME: 'LDAP Portal',
|
|
MAIL_COMPANY_NAME: 'Example Corp',
|
|
MAIL_PRIMARY_COLOR: '#0f6b6e',
|
|
MAIL_SUPPORT_EMAIL: 'support@example.com',
|
|
});
|
|
const branding = mailBranding(config);
|
|
const renderer = new MailTemplateRendererService();
|
|
|
|
async function main(): Promise<void> {
|
|
await mkdir(outputDir, { recursive: true });
|
|
const expiresAtText = new Intl.DateTimeFormat('de-DE', { dateStyle: 'medium', timeStyle: 'short' }).format(
|
|
new Date(Date.now() + 30 * 60_000),
|
|
);
|
|
|
|
const previews: Array<{ name: MailTemplateName; context: Record<string, unknown> }> = [
|
|
{
|
|
name: MailTemplateName.PASSWORD_RESET,
|
|
context: {
|
|
branding,
|
|
title: 'Passwort zuruecksetzen',
|
|
preheader: 'Fuer dein Benutzerkonto wurde das Zuruecksetzen des Passworts angefordert.',
|
|
greeting: 'Hallo Maria,',
|
|
intro: 'Fuer dein Benutzerkonto wurde das Zuruecksetzen des Passworts angefordert. Ueber die folgende Schaltflaeche kannst du ein neues Passwort vergeben.',
|
|
action: { label: 'Passwort zuruecksetzen', url: 'https://portal.example.com/reset-password?token=preview' },
|
|
resetUrl: 'https://portal.example.com/reset-password?token=preview',
|
|
expiresAtText,
|
|
warningBox: {
|
|
title: 'Sicherheitshinweis',
|
|
text: 'Falls du diese Anfrage nicht selbst gestellt hast, kannst du diese E-Mail ignorieren.',
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: MailTemplateName.ACCOUNT_CREATED,
|
|
context: {
|
|
branding,
|
|
title: 'Willkommen bei LDAP Portal',
|
|
greeting: 'Hallo Maria,',
|
|
intro: 'Dein Benutzerkonto wurde angelegt. Du kannst dich jetzt anmelden.',
|
|
action: { label: 'Zur Anwendung', url: 'https://portal.example.com' },
|
|
},
|
|
},
|
|
{
|
|
name: MailTemplateName.INVITATION,
|
|
context: {
|
|
branding,
|
|
title: 'Einladung zu LDAP Portal',
|
|
intro: 'Du wurdest eingeladen, die Anwendung zu nutzen.',
|
|
invitedBy: 'Max Mustermann',
|
|
action: { label: 'Einladung annehmen', url: 'https://portal.example.com/invite/preview' },
|
|
invitationUrl: 'https://portal.example.com/invite/preview',
|
|
expiresAtText,
|
|
infoBox: { text: `Diese Einladung ist gueltig bis ${expiresAtText}.` },
|
|
},
|
|
},
|
|
{
|
|
name: MailTemplateName.GENERIC_NOTIFICATION,
|
|
context: {
|
|
branding,
|
|
title: 'Neue Benachrichtigung',
|
|
intro: 'Es gibt eine neue Systembenachrichtigung.',
|
|
paragraphs: ['Der Status deines Vorgangs wurde aktualisiert.'],
|
|
action: { label: 'Details anzeigen', url: 'https://portal.example.com/notifications/preview' },
|
|
},
|
|
},
|
|
{
|
|
name: MailTemplateName.WARNING_NOTIFICATION,
|
|
context: {
|
|
branding,
|
|
title: 'Warnmeldung',
|
|
intro: 'Eine Aktion erfordert Aufmerksamkeit.',
|
|
warningBox: { text: 'Bitte pruefe die betroffene Konfiguration.' },
|
|
},
|
|
},
|
|
];
|
|
|
|
for (const preview of previews) {
|
|
const html = await renderer.renderHtml(preview.name, preview.context);
|
|
await writeFile(join(outputDir, `${preview.name}.html`), html, 'utf8');
|
|
}
|
|
}
|
|
|
|
main().catch((error) => {
|
|
console.error(error);
|
|
process.exitCode = 1;
|
|
});
|