31 lines
805 B
TypeScript
31 lines
805 B
TypeScript
import { resolve } from "path";
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const query = getQuery(event);
|
|
|
|
const parsed = settingsSchema.safeParse(query);
|
|
if (!parsed.success) {
|
|
return createError({
|
|
status: 400,
|
|
data: {
|
|
errors: Object.fromEntries(
|
|
parsed.error.issues.map((x) => [x.path.join("."), x.message]),
|
|
),
|
|
},
|
|
});
|
|
}
|
|
|
|
const { format, logo, content } = parsed.data;
|
|
|
|
const logoUrl = logo ? resolve("public", `logos/${logo}.png`) : undefined;
|
|
const canvas = await renderQRCodeToCanvas(content, logoUrl);
|
|
|
|
const image = canvas.toBuffer(format);
|
|
event.node.res.setHeader("Content-Type", `image/${format}`);
|
|
event.node.res.setHeader(
|
|
"Content-Disposition",
|
|
`filename="qrcode.${format}"`,
|
|
);
|
|
return image;
|
|
});
|