mailer/src/routes/email.ts

83 lines
2.5 KiB
TypeScript

import { Hono } from 'hono'
import { bearerAuth } from 'hono/bearer-auth'
import { zValidator } from '@hono/zod-validator'
import { z } from 'zod'
import { EmailService } from '../services/email'
import { getEmailTemplate } from '../templates'
import { Language } from '../types'
import { toBuffer } from 'bwip-js/node'
const emailRouter = new Hono()
const emailService = new EmailService()
const sendEmailSchema = z.object({
to: z.string().email(),
templateName: z.string(),
language: z.enum(['en', 'de']),
data: z.record(z.any())
})
async function generateBarcodeDataURL(data) {
return `https://barcodeapi.org/api/128/${data}`
const buffer = await toBuffer({
bcid: 'code128',
text: data,
scale: 3,
height: 10,
includetext: true,
textxalign: 'center',
});
const base64Data = buffer.toString('base64');
const dataURL = `data:image/png;base64,${base64Data}`;
return dataURL;
}
emailRouter.post('/', bearerAuth({ token: process.env.AUTHKEY }), zValidator('json', sendEmailSchema), async (c) => {
let { to, templateName, language, data } = c.req.valid('json')
try {
const template = getEmailTemplate(templateName, language as Language)
if (templateName === "welcome") {
if (data.name && data.link && data.barcode_content) {
const dataURL = await generateBarcodeDataURL(data.barcode_content);
data.barcode_url = dataURL;
} else {
return c.json({ success: false, error: "required params 'data.name', 'data.link', 'data.barcode_content' not provided" }, 406)
}
}
if (templateName === "password-reset") {
if (data.token) {
console.log(data);
data.reset_link = `${process.env.FRONTEND_URL}/reset/${(Buffer.from(data.token)).toString("base64")}`
} else {
return c.json({ success: false, error: "'data.token' not provided" }, 406)
}
}
data.event_date = process.env.EVENT_DATE
data.event_name = process.env.EVENT_NAME
await emailService.sendEmail({
to,
subject: template.subject(data),
html: template.html(data),
text: template.text(data)
})
return c.json({ success: true })
} catch (error) {
return c.json({ success: false, error: (error as Error).message }, 400)
}
})
// Add queue status endpoint
emailRouter.get('/status', bearerAuth({ token: process.env.AUTHKEY }), async (c) => {
try {
const status = await emailService.getQueueStatus()
return c.json(status)
} catch (error) {
return c.json({ error: (error as Error).message }, 500)
}
})
export { emailRouter }