Skip to content

Commit 0dddbd0

Browse files
committed
feat: add @types/better-sqlite3 for improved TypeScript support and refactor database functions for clarity
1 parent 1417891 commit 0dddbd0

File tree

8 files changed

+37
-22
lines changed

8 files changed

+37
-22
lines changed

package-lock.json

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

services/backend/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
"fastify": "^5.3.3",
2323
"fastify-favicon": "^5.0.0",
2424
"lucia": "^3.2.2",
25-
2625
"pino": "^9.7.0",
2726
"pino-pretty": "^13.0.0",
2827
"zod": "^3.25.42"
@@ -32,7 +31,7 @@
3231
"@commitlint/config-conventional": "^19.8.1",
3332
"@eslint/js": "^9.27.0",
3433
"@release-it/conventional-changelog": "^10.0.1",
35-
34+
"@types/better-sqlite3": "^7.6.13",
3635
"@typescript-eslint/eslint-plugin": "^8.33.0",
3736
"@typescript-eslint/parser": "^8.33.0",
3837
"drizzle-kit": "^0.31.1",

services/backend/src/db/index.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { type Plugin, type DatabaseExtension } from '../plugin-system/types'; //
66
import { getDbConfig, saveDbConfig, type DbConfig, type SQLiteConfig } from './config';
77

88
// Schema Definitions
9-
import { baseTableDefinitions, pluginTableDefinitions as inputPluginTableDefinitions } from './schema';
9+
import { /* baseTableDefinitions, */ pluginTableDefinitions as inputPluginTableDefinitions } from './schema';
1010

1111
// Drizzle SQLite
1212
import { drizzle as drizzleSqliteAdapter, type BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';
@@ -36,11 +36,12 @@ function getColumnBuilder(type: 'text' | 'integer' | 'timestamp') {
3636
throw new Error(`Unsupported column type ${type}`);
3737
}
3838

39+
import * as staticSchema from './schema.sqlite';
40+
3941
function generateSchema(): AnySchema {
4042
// Import the static schema instead of generating it dynamically
4143
// This avoids SQL syntax errors caused by dynamic schema generation
42-
const staticSchema = require('./schema.sqlite');
43-
const generatedSchema = { ...staticSchema };
44+
const generatedSchema: AnySchema = { ...staticSchema };
4445

4546
// Add plugin tables to the static schema
4647
for (const [tableName, tableColumns] of Object.entries(inputPluginTableDefinitions)) {
@@ -60,7 +61,7 @@ function generateSchema(): AnySchema {
6061
return generatedSchema;
6162
}
6263

63-
async function ensureMigrationsTable(_db: AnyDatabase) { // db param not used due to raw exec
64+
async function ensureMigrationsTable() { // db param not used due to raw exec
6465
const createTableQuery = `
6566
CREATE TABLE IF NOT EXISTS ${MIGRATIONS_TABLE_NAME} (
6667
id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -72,7 +73,7 @@ async function ensureMigrationsTable(_db: AnyDatabase) { // db param not used du
7273
(dbConnection as SqliteDriver.Database).exec(createTableQuery);
7374
}
7475

75-
async function applyMigrations(db: AnyDatabase) {
76+
async function applyMigrations() {
7677
const projectRootMigrationsDir = path.join(process.cwd(), 'drizzle');
7778

7879
// fs.stat is async with fs/promises, so await it or use fs.existsSync
@@ -93,7 +94,7 @@ async function applyMigrations(db: AnyDatabase) {
9394
}
9495

9596
console.log(`[INFO] Checking for new migrations in ${migrationsPath}...`);
96-
await ensureMigrationsTable(db);
97+
await ensureMigrationsTable();
9798

9899
let appliedMigrations: { name: string }[] = [];
99100
const selectAppliedQuery = `SELECT migration_name as name FROM ${MIGRATIONS_TABLE_NAME}`;
@@ -173,7 +174,7 @@ export async function initializeDatabase(): Promise<boolean> {
173174
if (!dbExists) console.log(`[INFO] SQLite database created at: ${absoluteDbPath}`);
174175

175176
if (dbInstance) { // Ensure dbInstance is not null
176-
await applyMigrations(dbInstance);
177+
await applyMigrations();
177178
} else {
178179
throw new Error("Database instance could not be created.");
179180
}
@@ -284,7 +285,7 @@ export function registerPluginTables(plugins: Plugin[]) {
284285
}
285286
}
286287

287-
export async function createPluginTables(_db: AnyDatabase, plugins: Plugin[]) { // db param not used
288+
export async function createPluginTables(plugins: Plugin[]) { // db param not used
288289
console.log('[INFO] Attempting to create plugin tables (Note: Better handled by migrations)...');
289290
if (!currentDbConfig) {
290291
console.error("[ERROR] Cannot create plugin tables: DB config unknown.");

services/backend/src/db/schema.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -107,14 +107,16 @@ export const pluginTableDefinitions: Record<string, Record<string, (columnBuilde
107107
// Example of how it will be used in db/index.ts:
108108
//
109109
// import { baseTableDefinitions } from './schema';
110-
// import { pgTable, text as pgTextColumnBuilder, integer as pgIntegerColumnBuilder } from 'drizzle-orm/pg-core';
110+
// import { sqliteTable, text as sqliteTextColumnBuilder, integer as sqliteIntegerColumnBuilder } from 'drizzle-orm/sqlite-core';
111111
//
112-
// const users = pgTable('users', {
113-
// id: baseTableDefinitions.users.id(pgTextColumnBuilder),
114-
// email: baseTableDefinitions.users.email(pgTextColumnBuilder),
115-
// name: baseTableDefinitions.users.name(pgTextColumnBuilder),
116-
// createdAt: baseTableDefinitions.users.createdAt(pgIntegerColumnBuilder),
117-
// updatedAt: baseTableDefinitions.users.updatedAt(pgIntegerColumnBuilder),
112+
// const users = sqliteTable('users', {
113+
// id: baseTableDefinitions.users.id(sqliteTextColumnBuilder),
114+
// email: baseTableDefinitions.users.email(sqliteTextColumnBuilder),
115+
// name: baseTableDefinitions.users.name(sqliteTextColumnBuilder),
116+
// createdAt: baseTableDefinitions.users.createdAt(sqliteIntegerColumnBuilder),
117+
// updatedAt: baseTableDefinitions.users.updatedAt(sqliteIntegerColumnBuilder),
118118
// });
119119
//
120-
// export const schema = { users };
120+
// // The actual schema is built in 'services/backend/src/db/schema.sqlite.ts'
121+
// // and augmented with plugin tables in 'services/backend/src/db/index.ts'
122+
// // export const schema = { users };

services/backend/src/lib/lucia.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ function initializeLucia(): Lucia {
3030
}
3131

3232
// Use existing database connection and schema
33+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
3334
const db = getDb() as BetterSQLite3Database<any>;
3435
const schema = getSchema();
3536

services/backend/src/routes/auth/logout.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export default async function logoutRoute(fastify: FastifyInstance) {
3333
if (authSessionTable && authSessionTable.id) {
3434
const dbStatus = getDbStatus();
3535
if (dbStatus.dialect === 'sqlite') {
36+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
3637
const sqliteDb = db as BetterSQLite3Database<any>;
3738
await sqliteDb.delete(authSessionTable).where(eq(authSessionTable.id, sessionId));
3839
}
@@ -81,6 +82,7 @@ export default async function logoutRoute(fastify: FastifyInstance) {
8182
if (authSessionTable && authSessionTable.id) {
8283
const dbStatus = getDbStatus();
8384
if (dbStatus.dialect === 'sqlite') {
85+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
8486
const sqliteDb = db as BetterSQLite3Database<any>;
8587
await sqliteDb.delete(authSessionTable).where(eq(authSessionTable.id, sessionId));
8688
}

services/backend/src/types/fastify.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,15 @@ import 'fastify'
33
import { type AnyDatabase } from '../db'
44
// Import types for raw connections/pools
55
import type SqliteDriver from 'better-sqlite3'
6-
import type { Pool as PgPool } from 'pg'
76
import { type PluginManager } from '../plugin-system'
87

98
declare module 'fastify' {
109
interface FastifyInstance {
1110
// 'db' can now be a Drizzle instance for SQLite or PostgreSQL, or null if not initialized
1211
db: AnyDatabase | null
1312

14-
// 'rawDbConnection' holds the underlying driver connection (better-sqlite3) or pool (pg)
15-
rawDbConnection: SqliteDriver.Database | PgPool | null
13+
// 'rawDbConnection' holds the underlying driver connection (better-sqlite3)
14+
rawDbConnection: SqliteDriver.Database | null
1615

1716
// The 'sqlite' property is deprecated in favor of 'rawDbConnection' to avoid ambiguity.
1817
// If some parts of the application still rely on it, it should be:

services/frontend/src/views/Setup.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
</template>
7777

7878
<script setup lang="ts">
79-
import { ref, onMounted } from 'vue';
79+
import { onMounted } from 'vue';
8080
import { useRouter } from 'vue-router';
8181
import { useForm } from 'vee-validate';
8282
import { toTypedSchema } from '@vee-validate/zod';

0 commit comments

Comments
 (0)