diff --git a/prisma/migrations/20260121051633_15_add_link_og_fields/migration.sql b/prisma/migrations/20260121051633_15_add_link_og_fields/migration.sql new file mode 100644 index 00000000..d485ffac --- /dev/null +++ b/prisma/migrations/20260121051633_15_add_link_og_fields/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "link" +ADD COLUMN "og_description" VARCHAR(500), +ADD COLUMN "og_image_url" VARCHAR(500), +ADD COLUMN "og_title" VARCHAR(500); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index aa11b854..b57eeef2 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -277,18 +277,18 @@ model Revenue { } model Link { - id String @id() @unique() @map("link_id") @db.Uuid - name String @db.VarChar(100) - url String @db.VarChar(500) - slug String @unique() @db.VarChar(100) - title String? @db.VarChar(500) - description String? @db.VarChar(500) - image String? @db.VarChar(500) - userId String? @map("user_id") @db.Uuid - teamId String? @map("team_id") @db.Uuid - createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) - updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6) - deletedAt DateTime? @map("deleted_at") @db.Timestamptz(6) + id String @id() @unique() @map("link_id") @db.Uuid + name String @db.VarChar(100) + url String @db.VarChar(500) + slug String @unique() @db.VarChar(100) + ogTitle String? @map("og_title") @db.VarChar(500) + ogDescription String? @map("og_description") @db.VarChar(500) + ogImageUrl String? @map("og_image_url") @db.VarChar(500) + userId String? @map("user_id") @db.Uuid + teamId String? @map("team_id") @db.Uuid + createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) + updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6) + deletedAt DateTime? @map("deleted_at") @db.Timestamptz(6) user User? @relation("user", fields: [userId], references: [id]) team Team? @relation(fields: [teamId], references: [id]) diff --git a/src/app/(collect)/q/[slug]/route.ts b/src/app/(collect)/q/[slug]/route.ts index eb0587f1..f97ab7e2 100644 --- a/src/app/(collect)/q/[slug]/route.ts +++ b/src/app/(collect)/q/[slug]/route.ts @@ -7,6 +7,15 @@ import redis from '@/lib/redis'; import { notFound } from '@/lib/response'; import { findLink } from '@/queries/prisma'; +function escapeHtml(str: string): string { + return str + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(//g, '>') + .replace(/'/g, '''); +} + export async function GET(request: Request, { params }: { params: Promise<{ slug: string }> }) { const { slug } = await params; @@ -45,22 +54,28 @@ export async function GET(request: Request, { params }: { params: Promise<{ slug /facebookexternalhit|twitterbot|linkedinbot|whatsapp|slackbot|discordbot|telegrambot|applebot|bingbot|googlebot/i.test( userAgent, ); - const l = link; - if (isBot && (l.title || l.description || l.image)) { + + if (isBot && (link.ogTitle || link.ogDescription || link.ogImageUrl)) { + const ogTitle = escapeHtml(link.ogTitle || link.name); + const ogDescription = escapeHtml(link.ogDescription || ''); + const ogImageUrl = escapeHtml(link.ogImageUrl || ''); + const url = escapeHtml(link.url); + return new Response( `
- - - - +