79 lines
2.1 KiB
TypeScript
79 lines
2.1 KiB
TypeScript
/**
|
|
* 导入 short-link JSON 数据到数据库
|
|
* 运行: bun run scripts/import-data.ts
|
|
*/
|
|
|
|
import { drizzle } from 'drizzle-orm/node-postgres';
|
|
import { shortLink } from '@/db/schemas/n-code-schema.ts';
|
|
import { useConfig } from '@kevisual/use-config';
|
|
import { readFileSync } from 'node:fs';
|
|
import { resolve } from 'node:path';
|
|
|
|
const config = useConfig() as any;
|
|
const DATABASE_URL = config.DATABASE_URL || process.env.DATABASE_URL || '';
|
|
if (!DATABASE_URL) {
|
|
console.error('缺少 DATABASE_URL 配置');
|
|
process.exit(1);
|
|
}
|
|
|
|
const db = drizzle(DATABASE_URL);
|
|
|
|
// 读取 JSON 数据
|
|
const jsonPath = resolve(import.meta.dir, 'ncode-list.json');
|
|
const rawData = JSON.parse(readFileSync(jsonPath, 'utf-8')) as Array<{
|
|
code: string;
|
|
data: Record<string, any>;
|
|
description: string;
|
|
slug: string;
|
|
tags: string[];
|
|
title: string;
|
|
type: string;
|
|
userId: string;
|
|
version: string;
|
|
}>;
|
|
|
|
async function importData() {
|
|
console.log(`准备导入 ${rawData.length} 条 short-link 数据...`);
|
|
|
|
let inserted = 0;
|
|
let skipped = 0;
|
|
|
|
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
|
|
for (const item of rawData) {
|
|
const userId = item.userId && uuidRegex.test(item.userId) ? item.userId : null;
|
|
|
|
try {
|
|
await db
|
|
.insert(shortLink)
|
|
.values({
|
|
slug: item.slug,
|
|
code: item.code,
|
|
type: item.type || 'link',
|
|
version: item.version || '1.0',
|
|
title: item.title || '',
|
|
description: item.description || '',
|
|
tags: item.tags ?? [],
|
|
data: item.data ?? {},
|
|
userId: userId as any,
|
|
})
|
|
.onConflictDoNothing();
|
|
|
|
console.log(` ✓ 导入: slug=${item.slug}, code=${item.code}, title=${item.title}`);
|
|
inserted++;
|
|
} catch (err: any) {
|
|
const cause = err.cause || err;
|
|
console.warn(` ✗ 跳过: slug=${item.slug}, code=${item.code} — ${cause.message || err.message}`);
|
|
skipped++;
|
|
}
|
|
}
|
|
|
|
console.log(`\n完成: 成功 ${inserted} 条,跳过 ${skipped} 条`);
|
|
process.exit(0);
|
|
}
|
|
|
|
importData().catch((err) => {
|
|
console.error('导入失败:', err);
|
|
process.exit(1);
|
|
});
|