feat: non-blocking background URL title fetching via Next.js after()

This commit is contained in:
Tien Tran committed 2026-09-29 00:06:59 -07:00
1 parent f826efdf00
commit 8a9aae2050
1 file changed
+18 -1
+18 -1
View File
@@ -1,9 +1,10 @@
import { NextResponse } from "next/server"; import { NextResponse, after } from "next/server";
import bcrypt from "bcryptjs"; import bcrypt from "bcryptjs";
import { prisma } from "@/lib/prisma"; import { prisma } from "@/lib/prisma";
import { getCurrentUser } from "@/lib/auth"; import { getCurrentUser } from "@/lib/auth";
import { generateRandomCode, getDefaultUrlLength } from "@/lib/short-code"; import { generateRandomCode, getDefaultUrlLength } from "@/lib/short-code";
import { generateQRCodeDataUrl } from "@/lib/qr"; import { generateQRCodeDataUrl } from "@/lib/qr";
import { fetchUrlTitle } from "@/lib/url-metadata";
export async function POST(req: Request) { export async function POST(req: Request) {
try { try {
@@ -140,6 +141,22 @@ export async function POST(req: Request) {
// Generate QR Code // Generate QR Code
const qrCodeDataUrl = await generateQRCodeDataUrl(fullShortUrl, { size: 240 }); const qrCodeDataUrl = await generateQRCodeDataUrl(fullShortUrl, { size: 240 });
// Non-blocking background task via Next.js after()
// Response is returned immediately to the client; title is fetched & updated afterward.
after(async () => {
try {
const pageTitle = await fetchUrlTitle(url.trim());
if (pageTitle) {
await prisma.shortUrl.update({
where: { id: createdUrl.id },
data: { title: pageTitle },
});
}
} catch {
// Silently ignore background scraping errors
}
});
return NextResponse.json({ return NextResponse.json({
success: true, success: true,
data: { data: {