3.2 KiB

Email Template Models

Overview

The Email Template module provides a reusable template system with Handlebars-style variable interpolation, version history, and test email functionality.

Models (4):

  • EmailTemplate — Template master with categories
  • EmailTemplateVariable — Variable definitions
  • EmailTemplateVersion — Version history
  • EmailTemplateTestLog — Test email audit

Key Features:

  • Handlebars-style {{VAR}} interpolation
  • 3 categories: INFLUENCE, MAP, SYSTEM
  • System template protection (isSystem flag prevents deletion)
  • Version history with auto-increment version numbers
  • Conditional variables for {{#if}} blocks
  • Test email sending with sample data
  • HTML + plain text content

See Schema Reference for complete field listings.


Template Categories

enum EmailTemplateCategory {
  INFLUENCE  // Campaign emails, response verification
  MAP        // Shift confirmations, reminders
  SYSTEM     // Password resets, welcome emails
}

Variable Interpolation

Syntax: Handlebars-style {{VARIABLE_NAME}}

Example Template:

<p>Hello {{USER_NAME}},</p>
<p>Thank you for signing up for the shift:</p>
<ul>
  <li>Title: {{SHIFT_TITLE}}</li>
  <li>Date: {{SHIFT_DATE}}</li>
  <li>Time: {{SHIFT_TIME}}</li>
</ul>
{{#if IS_NEW_USER}}
<p>Your temporary password is: {{TEMP_PASSWORD}}</p>
{{/if}}

Variable Record:

{
  key: 'USER_NAME',
  label: 'User Name',
  description: 'Name of the volunteer',
  isRequired: true,
  isConditional: false,
  sampleValue: 'Jane Doe',
  sortOrder: 0,
}

Version History

Auto-Increment Version Numbers:

const latestVersion = await prisma.emailTemplateVersion.findFirst({
  where: { templateId },
  orderBy: { versionNumber: 'desc' },
});

const newVersion = await prisma.emailTemplateVersion.create({
  data: {
    templateId,
    versionNumber: (latestVersion?.versionNumber || 0) + 1,
    subjectLine,
    htmlContent,
    textContent,
    changeNotes: 'Updated call-to-action wording',
    createdByUserId: user.id,
  },
});

System Templates (4 seeded)

1. campaign-email (INFLUENCE)

  • Variables: CAMPAIGN_TITLE, MESSAGE, USER_NAME, USER_EMAIL, POSTAL_CODE, RECIPIENT_NAME, RECIPIENT_LEVEL, ORGANIZATION_NAME, TIMESTAMP
  • Used by: Campaign email sending

2. response-verification (INFLUENCE)

  • Variables: CAMPAIGN_TITLE, RESPONSE_TYPE, RESPONSE_TEXT, SUBMITTER_NAME, SUBMITTED_DATE, VERIFICATION_URL, REPORT_URL, ORGANIZATION_NAME, TIMESTAMP
  • Used by: Response wall submission verification

3. shift-signup-confirmation (MAP)

  • Variables: ORGANIZATION_NAME, USER_NAME, USER_EMAIL, SHIFT_TITLE, SHIFT_DATE, SHIFT_TIME, SHIFT_LOCATION, IS_NEW_USER, TEMP_PASSWORD, LOGIN_URL
  • Used by: Public shift signup

4. shift-details (MAP)

  • Variables: ORGANIZATION_NAME, USER_NAME, SHIFT_TITLE, SHIFT_DATE, SHIFT_START_TIME, SHIFT_END_TIME, SHIFT_LOCATION, SHIFT_DESCRIPTION, CURRENT_VOLUNTEERS, MAX_VOLUNTEERS, SHIFT_STATUS
  • Used by: Shift reminder emails