feat: add multi-dialect schema initialization
This commit is contained in:
13
src/core/errors.ts
Normal file
13
src/core/errors.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
export class IdentityDBError extends Error {
|
||||
constructor(message: string) {
|
||||
super(message);
|
||||
this.name = 'IdentityDBError';
|
||||
}
|
||||
}
|
||||
|
||||
export class IdentityDBConfigurationError extends IdentityDBError {
|
||||
constructor(message: string) {
|
||||
super(message);
|
||||
this.name = 'IdentityDBConfigurationError';
|
||||
}
|
||||
}
|
||||
68
src/core/migrations.ts
Normal file
68
src/core/migrations.ts
Normal file
@@ -0,0 +1,68 @@
|
||||
import type { Kysely } from 'kysely';
|
||||
|
||||
import {
|
||||
FACTS_TABLE,
|
||||
FACT_TOPICS_TABLE,
|
||||
TOPICS_TABLE,
|
||||
} from './schema';
|
||||
import type { IdentityDatabaseSchema } from '../types/database';
|
||||
|
||||
export async function initializeSchema(
|
||||
db: Kysely<IdentityDatabaseSchema>,
|
||||
): Promise<void> {
|
||||
await db.schema
|
||||
.createTable(TOPICS_TABLE)
|
||||
.ifNotExists()
|
||||
.addColumn('id', 'text', (column) => column.primaryKey())
|
||||
.addColumn('name', 'text', (column) => column.notNull())
|
||||
.addColumn('normalized_name', 'text', (column) => column.notNull().unique())
|
||||
.addColumn('category', 'text', (column) => column.notNull())
|
||||
.addColumn('granularity', 'text', (column) => column.notNull())
|
||||
.addColumn('description', 'text')
|
||||
.addColumn('metadata', 'text')
|
||||
.addColumn('created_at', 'text', (column) => column.notNull())
|
||||
.addColumn('updated_at', 'text', (column) => column.notNull())
|
||||
.execute();
|
||||
|
||||
await db.schema
|
||||
.createTable(FACTS_TABLE)
|
||||
.ifNotExists()
|
||||
.addColumn('id', 'text', (column) => column.primaryKey())
|
||||
.addColumn('statement', 'text', (column) => column.notNull())
|
||||
.addColumn('summary', 'text')
|
||||
.addColumn('source', 'text')
|
||||
.addColumn('confidence', 'real')
|
||||
.addColumn('metadata', 'text')
|
||||
.addColumn('created_at', 'text', (column) => column.notNull())
|
||||
.addColumn('updated_at', 'text', (column) => column.notNull())
|
||||
.execute();
|
||||
|
||||
await db.schema
|
||||
.createTable(FACT_TOPICS_TABLE)
|
||||
.ifNotExists()
|
||||
.addColumn('fact_id', 'text', (column) =>
|
||||
column.notNull().references(`${FACTS_TABLE}.id`).onDelete('cascade'),
|
||||
)
|
||||
.addColumn('topic_id', 'text', (column) =>
|
||||
column.notNull().references(`${TOPICS_TABLE}.id`).onDelete('cascade'),
|
||||
)
|
||||
.addColumn('role', 'text')
|
||||
.addColumn('position', 'integer', (column) => column.notNull())
|
||||
.addColumn('created_at', 'text', (column) => column.notNull())
|
||||
.addPrimaryKeyConstraint('fact_topics_pk', ['fact_id', 'topic_id', 'position'])
|
||||
.execute();
|
||||
|
||||
await db.schema
|
||||
.createIndex('fact_topics_topic_id_idx')
|
||||
.ifNotExists()
|
||||
.on(FACT_TOPICS_TABLE)
|
||||
.column('topic_id')
|
||||
.execute();
|
||||
|
||||
await db.schema
|
||||
.createIndex('fact_topics_fact_id_idx')
|
||||
.ifNotExists()
|
||||
.on(FACT_TOPICS_TABLE)
|
||||
.column('fact_id')
|
||||
.execute();
|
||||
}
|
||||
Reference in New Issue
Block a user