83 lines
2.5 KiB
TypeScript
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 } |