89 lines
2.6 KiB
TypeScript
89 lines
2.6 KiB
TypeScript
import { drizzle } from "drizzle-orm/better-sqlite3";
|
|
import { migrate } from "drizzle-orm/better-sqlite3/migrator";
|
|
import Database from "better-sqlite3";
|
|
import { users, tokens, preferences } from "../database/schema";
|
|
import { existsSync, readFileSync } from "node:fs";
|
|
|
|
export default defineNitroPlugin(async () => {
|
|
const db = useDrizzle();
|
|
|
|
migrate(db, { migrationsFolder: "./server/database/migrations" });
|
|
console.log("Database migrations applied");
|
|
|
|
const feedPath = "./tmp/feed.json";
|
|
|
|
if (existsSync(feedPath)) {
|
|
const feed = JSON.parse(readFileSync(feedPath, "utf-8"));
|
|
console.log(`Importing ${feed.length} users from feed.json`);
|
|
|
|
for (const entry of feed) {
|
|
const userId = String(entry.user.id);
|
|
const createdAt =
|
|
entry.user.created_at && entry.user.created_at !== "\r"
|
|
? new Date(entry.user.created_at)
|
|
: new Date();
|
|
|
|
const userData = {
|
|
id: userId,
|
|
name: entry.user.name || "Unknown",
|
|
avatar: entry.user.avatar || null,
|
|
city: entry.user.city || null,
|
|
country:
|
|
typeof entry.user.country === "string" && entry.user.country !== "\r"
|
|
? entry.user.country
|
|
: null,
|
|
sex:
|
|
typeof entry.user.sex === "string" && entry.user.sex !== "\r"
|
|
? entry.user.sex
|
|
: null,
|
|
weight: Number(entry.user.weight) || null,
|
|
createdAt,
|
|
};
|
|
|
|
await db
|
|
.insert(users)
|
|
.values(userData)
|
|
.onConflictDoUpdate({
|
|
target: users.id,
|
|
set: { ...userData },
|
|
});
|
|
|
|
const tokenData = {
|
|
userId: userId,
|
|
refreshToken: entry.token.refresh_token || null,
|
|
accessToken: entry.token.access_token || null,
|
|
expiresAt: new Date(entry.token.expires_at),
|
|
};
|
|
|
|
await db
|
|
.insert(tokens)
|
|
.values(tokenData)
|
|
.onConflictDoUpdate({
|
|
target: tokens.userId,
|
|
set: { ...tokenData },
|
|
});
|
|
|
|
const prefsData = {
|
|
userId,
|
|
data: {
|
|
enabled: entry.preferences.enabled ?? true,
|
|
language: entry.preferences.language || "English",
|
|
units: entry.preferences.units || "Metric",
|
|
tone: entry.preferences.tone || [],
|
|
highlights: entry.preferences.highlights || [],
|
|
},
|
|
};
|
|
|
|
await db
|
|
.insert(preferences)
|
|
.values(prefsData)
|
|
.onConflictDoUpdate({
|
|
target: preferences.userId,
|
|
set: { ...prefsData },
|
|
});
|
|
}
|
|
|
|
console.log(`Successfully imported ${feed.length} users`);
|
|
}
|
|
});
|