feat(api): normalize logo name
This commit is contained in:
@@ -1,4 +1,8 @@
|
|||||||
import { resolve } from "path";
|
import { resolve } from "path";
|
||||||
|
import type { Canvas } from "skia-canvas";
|
||||||
|
import { getLogoNames } from "../utils/logos";
|
||||||
|
|
||||||
|
const normalize = (s: string) => s.toLowerCase().replace(/\s+/g, "");
|
||||||
|
|
||||||
export default defineEventHandler(async (event) => {
|
export default defineEventHandler(async (event) => {
|
||||||
const { format, logo, content } = await getValidatedQuery(
|
const { format, logo, content } = await getValidatedQuery(
|
||||||
@@ -6,8 +10,26 @@ export default defineEventHandler(async (event) => {
|
|||||||
settingsSchema.parse,
|
settingsSchema.parse,
|
||||||
);
|
);
|
||||||
|
|
||||||
const logoUrl = logo ? resolve("public", `logos/${logo}.png`) : undefined;
|
let canvas: Canvas;
|
||||||
const canvas = await renderQRCodeToCanvas(content, logoUrl);
|
|
||||||
|
if (logo) {
|
||||||
|
const names = await getLogoNames();
|
||||||
|
if (!names)
|
||||||
|
throw createError({
|
||||||
|
statusCode: 500,
|
||||||
|
message: "Could not retrieve logos",
|
||||||
|
});
|
||||||
|
|
||||||
|
const match = names.find((n) => normalize(n) === normalize(logo));
|
||||||
|
const resolvedLogo = match ?? logo;
|
||||||
|
|
||||||
|
canvas = await renderQRCodeToCanvas(
|
||||||
|
content,
|
||||||
|
resolve("public", `logos/${resolvedLogo}.png`),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
canvas = await renderQRCodeToCanvas(content, undefined);
|
||||||
|
}
|
||||||
|
|
||||||
const image = canvas.toBuffer(format);
|
const image = canvas.toBuffer(format);
|
||||||
event.node.res.setHeader("Content-Type", `image/${format}`);
|
event.node.res.setHeader("Content-Type", `image/${format}`);
|
||||||
|
|||||||
@@ -1,22 +1,9 @@
|
|||||||
import { readdir } from "fs/promises";
|
import { getLogoNames } from "../utils/logos";
|
||||||
import { join } from "path";
|
|
||||||
import { createHash } from "crypto";
|
|
||||||
|
|
||||||
const logosDir = import.meta.dev
|
export default defineEventHandler(async () => {
|
||||||
? join(process.cwd(), "public/logos")
|
const names = await getLogoNames();
|
||||||
: join(process.cwd(), ".output/public/logos");
|
if (!names)
|
||||||
|
throw createError({ statusCode: 500, message: "Could not retrieve logos" });
|
||||||
|
|
||||||
export default defineCachedEventHandler(async () => {
|
return names;
|
||||||
const files = await readdir(logosDir);
|
|
||||||
return files
|
|
||||||
.filter((f) => f.endsWith(".png"))
|
|
||||||
.map((f) => f.replace(/\.png$/, ""))
|
|
||||||
.sort();
|
|
||||||
}, {
|
|
||||||
maxAge: 60 * 60 * 24,
|
|
||||||
getKey: async () => {
|
|
||||||
const files = await readdir(logosDir);
|
|
||||||
const key = files.filter((f) => f.endsWith(".png")).sort().join(",");
|
|
||||||
return createHash("sha256").update(key).digest("hex");
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|||||||
29
server/utils/logos.ts
Normal file
29
server/utils/logos.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import { readdir } from "fs/promises";
|
||||||
|
import { join } from "path";
|
||||||
|
import { createHash } from "crypto";
|
||||||
|
|
||||||
|
const logosDir = import.meta.dev
|
||||||
|
? join(process.cwd(), "public/logos")
|
||||||
|
: join(process.cwd(), ".output/public/logos");
|
||||||
|
|
||||||
|
export const getLogoNames = cachedFunction(
|
||||||
|
async () => {
|
||||||
|
const files = await readdir(logosDir);
|
||||||
|
return files
|
||||||
|
.filter((f) => f.endsWith(".png"))
|
||||||
|
.map((f) => f.replace(/\.png$/, ""))
|
||||||
|
.sort();
|
||||||
|
},
|
||||||
|
{
|
||||||
|
maxAge: 60 * 60 * 24,
|
||||||
|
name: "logoNames",
|
||||||
|
getKey: async () => {
|
||||||
|
const files = await readdir(logosDir);
|
||||||
|
const key = files
|
||||||
|
.filter((f) => f.endsWith(".png"))
|
||||||
|
.sort()
|
||||||
|
.join(",");
|
||||||
|
return createHash("sha256").update(key).digest("hex");
|
||||||
|
},
|
||||||
|
},
|
||||||
|
);
|
||||||
Reference in New Issue
Block a user