Move to better sqlite3

This commit is contained in:
2026-03-07 12:34:04 +02:00
parent 0370930894
commit 926fc0fd0b
15 changed files with 10648 additions and 3213 deletions

View File

@@ -1,92 +0,0 @@
import { migrate } from "drizzle-orm/bun-sqlite/migrator";
import path from "node:path";
export default defineNitroPlugin(async (nitroApp) => {
const db = useDrizzle();
const migrationsFolder = path.resolve("server/database/migrations");
console.log("Running database migrations...");
console.log(`Migrations folder: ${migrationsFolder}`);
migrate(db, { migrationsFolder });
console.log("Database migrations complete");
const feedFile = Bun.file(path.resolve("tmp/feed.json"));
const feedData = await feedFile.json().catch((err) => {
console.log(err.message);
return [];
});
for (const item of feedData) {
const userId = String(item.user.id);
await db
.insert(tables.users)
.values({
id: userId,
name: item.user.name,
avatar: item.user.avatar,
city: item.user.city,
country: item.user.country,
sex: item.user.sex,
weight: item.user.weight,
createdAt: new Date(item.user.created_at),
})
.onConflictDoUpdate({
target: tables.users.id,
set: {
name: item.user.name,
avatar: item.user.avatar,
city: item.user.city,
country: item.user.country,
sex: item.user.sex,
weight: item.user.weight,
},
});
await db
.insert(tables.tokens)
.values({
userId: userId,
refreshToken: item.token.refresh_token,
accessToken: item.token.access_token,
expiresAt: new Date(item.token.expires_at),
})
.onConflictDoUpdate({
target: tables.tokens.userId,
set: {
refreshToken: item.token.refresh_token,
accessToken: item.token.access_token,
expiresAt: new Date(item.token.expires_at),
},
});
await db
.insert(tables.preferences)
.values({
userId: userId,
data: {
enabled: item.preferences.enabled,
language: item.preferences.language,
units: item.preferences.units,
tone: item.preferences.tone,
highlights: [],
},
})
.onConflictDoUpdate({
target: tables.preferences.userId,
set: {
data: {
enabled: item.preferences.enabled,
language: item.preferences.language,
units: item.preferences.units,
tone: item.preferences.tone,
highlights: [],
},
},
});
}
console.log(`Processed ${feedData.length} feed items`);
});

View File

@@ -0,0 +1,88 @@
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`);
}
});