Files
ghostwriter/server/plugins/migrations.ts

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`);
}
});