Add domain field to shortlink API responses and sync script

This commit is contained in:
2025-04-16 21:32:49 +08:00
parent b1753449f5
commit b9c2828e54
6 changed files with 500 additions and 20 deletions

View File

@@ -45,7 +45,8 @@ export async function GET(
favorites,
expires_at,
click_count,
unique_visitors
unique_visitors,
domain
FROM shorturl_analytics.shorturl
WHERE id = '${id}' AND deleted_at IS NULL
LIMIT 1
@@ -120,7 +121,7 @@ export async function GET(
projects: projects,
tags: tags.map((tag: any) => tag.tag_name || ''),
createdAt: shortlink.created_at,
domain: new URL(shortUrl || 'https://example.com').hostname
domain: shortlink.domain || (shortUrl ? new URL(shortUrl).hostname : '')
};
const response: ApiResponse<typeof formattedShortlink> = {

View File

@@ -43,7 +43,8 @@ export async function GET(request: NextRequest) {
favorites,
expires_at,
click_count,
unique_visitors
unique_visitors,
domain
FROM shorturl_analytics.shorturl
WHERE JSONHas(attributes, 'shortUrl')
AND JSONExtractString(attributes, 'shortUrl') = '${url}'
@@ -120,7 +121,7 @@ export async function GET(request: NextRequest) {
projects: projects,
tags: tags.map((tag) => tag.tag_name || ''),
createdAt: shortlink.created_at,
domain: new URL(shortUrl || 'https://example.com').hostname
domain: shortlink.domain || (shortUrl ? new URL(shortUrl).hostname : '')
};
console.log('Shortlink data formatted with externalId:', shortlink.external_id, 'Final object:', formattedShortlink);

View File

@@ -43,7 +43,8 @@ export async function GET(request: NextRequest) {
favorites,
expires_at,
click_count,
unique_visitors
unique_visitors,
domain
FROM shorturl_analytics.shorturl
WHERE JSONHas(attributes, 'shortUrl')
AND JSONExtractString(attributes, 'shortUrl') = '${shortUrl}'
@@ -120,7 +121,7 @@ export async function GET(request: NextRequest) {
projects: projects,
tags: tags.map((tag: any) => tag.tag_name || ''),
createdAt: shortlink.created_at,
domain: new URL(shortUrlValue || 'https://example.com').hostname
domain: shortlink.domain || (shortUrlValue ? new URL(shortUrlValue).hostname : '')
};
console.log('Formatted shortlink with externalId:', shortlink.external_id);

View File

@@ -75,7 +75,8 @@ export async function GET(request: NextRequest) {
favorites,
expires_at,
click_count,
unique_visitors
unique_visitors,
domain
FROM shorturl_analytics.shorturl
WHERE ${whereClause}
ORDER BY created_at DESC

View File

@@ -49,6 +49,7 @@ interface ShortLink {
expires_at?: string | null;
click_count?: number;
unique_visitors?: number;
domain?: string;
}
// Define ClickHouse shorturl type
@@ -77,6 +78,7 @@ interface ClickHouseShortUrl {
expires_at: string | null;
click_count: number;
unique_visitors: number;
domain?: string; // 添加domain字段
link_attributes?: string; // Optional JSON string containing link-specific attributes
}
@@ -175,7 +177,7 @@ export default function LinksPage() {
projects: projects,
tags: tags,
createdAt: link.created_at,
domain: shortUrlValue ? new URL(shortUrlValue).hostname : 'shorturl.example.com'
domain: link.domain || (shortUrlValue ? new URL(shortUrlValue).hostname : '')
};
// 打印完整数据,确保 externalId 被包含
@@ -197,19 +199,26 @@ export default function LinksPage() {
: link.attributes || {};
// Parse attributes to get domain if available
let domain = 'shorturl.example.com';
let domain = '';
try {
// Extract domain from shortUrl in attributes if available
const attributesObj = typeof link.attributes === 'string'
? JSON.parse(link.attributes)
: link.attributes || {};
if (attributesObj.shortUrl) {
try {
const urlObj = new URL(attributesObj.shortUrl);
domain = urlObj.hostname;
} catch (e) {
console.error('Error parsing shortUrl:', e);
// 首先尝试使用link.domain字段
if (link.domain) {
domain = link.domain;
}
// 如果没有domain字段从shortUrl中提取
else {
// Extract domain from shortUrl in attributes if available
const attributesObj = typeof link.attributes === 'string'
? JSON.parse(link.attributes)
: link.attributes || {};
if (attributesObj.shortUrl) {
try {
const urlObj = new URL(attributesObj.shortUrl);
domain = urlObj.hostname;
} catch (e) {
console.error('Error parsing shortUrl:', e);
}
}
}
} catch (e) {