import SqliteDb from 'better-sqlite3' import { Kysely, Migrator, SqliteDialect, Migration, MigrationProvider, } from 'kysely' // Types export type DatabaseSchema = { status: Status auth_session: AuthSession auth_state: AuthState } export type Status = { uri: string authorDid: string status: string createdAt: string indexedAt: string } export type AuthSession = { key: string session: AuthSessionJson } export type AuthState = { key: string state: AuthStateJson } type AuthStateJson = string type AuthSessionJson = string // Migrations const migrations: Record = {} const migrationProvider: MigrationProvider = { async getMigrations() { return migrations }, } migrations['001'] = { async up(db: Kysely) { await db.schema .createTable('status') .addColumn('uri', 'varchar', (col) => col.primaryKey()) .addColumn('authorDid', 'varchar', (col) => col.notNull()) .addColumn('status', 'varchar', (col) => col.notNull()) .addColumn('createdAt', 'varchar', (col) => col.notNull()) .addColumn('indexedAt', 'varchar', (col) => col.notNull()) .execute() await db.schema .createTable('auth_session') .addColumn('key', 'varchar', (col) => col.primaryKey()) .addColumn('session', 'varchar', (col) => col.notNull()) .execute() await db.schema .createTable('auth_state') .addColumn('key', 'varchar', (col) => col.primaryKey()) .addColumn('state', 'varchar', (col) => col.notNull()) .execute() }, async down(db: Kysely) { await db.schema.dropTable('auth_state').execute() await db.schema.dropTable('auth_session').execute() await db.schema.dropTable('status').execute() }, } // APIs export const createDb = (location: string): Database => { return new Kysely({ dialect: new SqliteDialect({ database: new SqliteDb(location), }), }) } export const migrateToLatest = async (db: Database) => { const migrator = new Migrator({ db, provider: migrationProvider }) const { error } = await migrator.migrateToLatest() if (error) throw error } export type Database = Kysely