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 }