36 lines
1005 B
TypeScript
36 lines
1005 B
TypeScript
import { createCanvas } from "canvas";
|
|
import { resolve } from "path";
|
|
import sharp from "sharp";
|
|
import { CANVAS_SIZE, renderQRCodeToCanvas } from "~/utils/renderer";
|
|
import { settingsSchema } from "~/utils/settings";
|
|
|
|
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.errors.map((x) => [x.path.join("."), x.message]),
|
|
),
|
|
},
|
|
});
|
|
}
|
|
|
|
const { format, logo, content } = parsed.data;
|
|
|
|
const canvas = createCanvas(CANVAS_SIZE, CANVAS_SIZE);
|
|
const logoUrl = resolve("public", `${logo}.png`);
|
|
await renderQRCodeToCanvas(canvas, content, logoUrl);
|
|
|
|
let image = canvas.toBuffer();
|
|
if (format !== "png") {
|
|
image = await sharp(image).toFormat(format).toBuffer();
|
|
}
|
|
|
|
event.node.res.setHeader("Content-Type", `image/${format}`);
|
|
return image;
|
|
});
|