diff --git a/packages/server/migrations/2024-12-27.ts b/packages/server/migrations/2024-12-27.ts new file mode 100644 index 0000000..36f097e --- /dev/null +++ b/packages/server/migrations/2024-12-27.ts @@ -0,0 +1,90 @@ +import { Kysely, sql } from 'kysely'; + +export async function up(db: Kysely) { + await db.schema + .createTable('schema_migration') + .addColumn('version', 'char(16)') + .addColumn('dirty', 'boolean') + .execute(); + + await db.schema + .createTable('users') + .addColumn('username', 'varchar(256)', col => col.primaryKey()) + .addColumn('password_hash', 'varchar(64)', col => col.notNull()) + .addColumn('password_salt', 'varchar(64)', col => col.notNull()) + .execute(); + + await db.schema + .createTable('document') + .addColumn('id', 'serial', col => col.primaryKey()) + .addColumn('title', 'varchar(512)', col => col.notNull()) + .addColumn('content_type', 'varchar(16)', col => col.notNull()) + .addColumn('basepath', 'varchar(256)', col => col.notNull()) + .addColumn('filename', 'varchar(512)', col => col.notNull()) + .addColumn('content_hash', 'varchar') + .addColumn('additional', 'json') + .addColumn("pagenum", "integer", col => col.notNull()) + .addColumn('created_at', 'integer', col => col.notNull()) + .addColumn('modified_at', 'integer', col => col.notNull()) + .addColumn('deleted_at', 'integer') + .execute(); + + await db.schema + .createTable('tags') + .addColumn('name', 'varchar', col => col.primaryKey()) + .addColumn('description', 'text') + .execute(); + + await db.schema + .createTable('doc_tag_relation') + .addColumn('doc_id', 'integer', col => col.notNull()) + .addColumn('tag_name', 'varchar', col => col.notNull()) + .addForeignKeyConstraint('doc_id_fk', ['doc_id'], 'document', ['id']) + .addForeignKeyConstraint('tag_name_fk', ['tag_name'], 'tags', ['name']) + .addPrimaryKeyConstraint('doc_tag_relation_pk', ['doc_id', 'tag_name']) + .execute(); + + await db.schema + .createTable('permissions') + .addColumn('username', 'varchar', col => col.notNull()) + .addColumn('name', 'varchar', col => col.notNull()) + .addPrimaryKeyConstraint('permissions_pk', ['username', 'name']) + .addForeignKeyConstraint('username_fk', ['username'], 'users', ['username']) + .execute(); + + // create admin account. + await db + .insertInto('users') + .values({ + username: 'admin', + password_hash: 'unchecked', + password_salt: 'unchecked', + }) + .execute(); + + await db + .insertInto('schema_migration') + .values({ + version: '0.0.1', + dirty: false, + }) + .execute(); + + // create indexes + await db.schema.createIndex("index_document_basepath_filename") + .on("document") + .columns(["basepath", "filename"]) + .execute(); + await db.schema.createIndex("index_document_content_hash") + .on("document") + .columns(["content_hash"]) + .execute(); + await db.schema.createIndex("index_document_created_at") + .on("document") + .columns(["created_at"]) + .execute(); +} + +export async function down(db: Kysely) { + throw new Error('Downward migrations are not supported. Restore from backup.'); +} \ No newline at end of file