Files
speckle-server/packages/server/modules/emails/services/templateFormatting.ts
T
Kristaps Fabians Geikins b02a07e2b6 feat: Frontend 2.0 MVP
2023-05-08 10:47:01 +03:00

80 lines
2.0 KiB
TypeScript

import { packageRoot } from '@/bootstrap'
import path from 'path'
import ejs from 'ejs'
import { getFrontendOrigin } from '@/modules/shared/helpers/envHelper'
import { getServerInfo } from '@/modules/core/services/generic'
import { ServerInfo } from '@/modules/core/helpers/types'
type MultiTypeEmailBody = {
text: string
html: string
}
export type EmailTemplateServerInfo = {
name: string
url: string
company: string
contact: string
}
export type BasicEmailTemplateParams = {
html: { bodyStart?: string; bodyEnd?: string }
text: { bodyStart?: string; bodyEnd?: string }
cta?: {
url: string
title: string
altTitle?: string
}
/**
* If not set, this data will be automatically resolved from serverInfo
*/
server?: EmailTemplateServerInfo
}
function getPathToTemplatesDir(): string {
return path.resolve(packageRoot, './assets/emails/templates/')
}
function buildTemplatePath(name: string, ext: string): string {
return path.resolve(getPathToTemplatesDir(), `./${name}/${name}.${ext}`)
}
/**
* Build template params `server` object from a ServerInfo structure
*/
export function buildBasicTemplateServerInfo(
serverInfo: ServerInfo
): EmailTemplateServerInfo {
return {
name: serverInfo.name,
url: getFrontendOrigin(),
company: serverInfo.company,
contact: serverInfo.adminContact
}
}
/**
* Build an e-mail body using the 'basic' template
*/
export async function buildBasicTemplateEmail(
params: BasicEmailTemplateParams
): Promise<MultiTypeEmailBody> {
if (!params.server) {
const serverInfo = await getServerInfo()
params.server = buildBasicTemplateServerInfo(serverInfo)
}
const textPath = buildTemplatePath('basic', 'txt')
const htmlPath = buildTemplatePath('basic', 'html')
const [text, html] = await Promise.all([
ejs.renderFile(textPath, { params }, { cache: true, outputFunctionName: 'print' }),
ejs.renderFile(htmlPath, { params }, { cache: true, outputFunctionName: 'print' })
])
return {
text,
html
}
}