From 796c1ff024123ce413a84f48398e15cdc68fe89d Mon Sep 17 00:00:00 2001 From: TZGyn Date: Mon, 11 Mar 2024 06:39:54 +0800 Subject: [PATCH] added api for shortener qr code --- frontend/bun.lockb | Bin 153566 -> 148481 bytes frontend/package.json | 5 ++++- frontend/src/lib/components/QR.svelte | 10 +++++++++- frontend/src/routes/(app)/links/+page.svelte | 1 + .../routes/api/shortener/[id]/qr/+server.ts | 18 ++++++++++++++++++ 5 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 frontend/src/routes/api/shortener/[id]/qr/+server.ts diff --git a/frontend/bun.lockb b/frontend/bun.lockb index 53b8c423e412c462d59b1542cc4e1c1a2e271201..d8261544f0e0c9da52fa7e9c047736cd73c422cb 100755 GIT binary patch delta 33627 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 {value} - +
+ + +
diff --git a/frontend/src/routes/(app)/links/+page.svelte b/frontend/src/routes/(app)/links/+page.svelte index 0297444..34c9760 100644 --- a/frontend/src/routes/(app)/links/+page.svelte +++ b/frontend/src/routes/(app)/links/+page.svelte @@ -281,6 +281,7 @@ {data.shortener_url + '/' + qrCode} diff --git a/frontend/src/routes/api/shortener/[id]/qr/+server.ts b/frontend/src/routes/api/shortener/[id]/qr/+server.ts new file mode 100644 index 0000000..22ccc65 --- /dev/null +++ b/frontend/src/routes/api/shortener/[id]/qr/+server.ts @@ -0,0 +1,18 @@ +import type { RequestHandler } from './$types' +import QRCode from 'qrcode' + +const shortenerUrl = Bun.env.PUBLIC_SHORTENER_URL ?? 'shortener.url' + +export const GET: RequestHandler = async (event) => { + const shortenerId = event.params.id + const image = await QRCode.toBuffer( + shortenerUrl + '/' + shortenerId, + { type: 'png', errorCorrectionLevel: 'L', margin: 1, scale: 20 }, + ) + + return new Response(image, { + headers: { + 'Content-Type': 'image/png', + }, + }) +}