90 lines
		
	
	
		
			No EOL
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			No EOL
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { Kysely, sql } from 'kysely';
 | 
						|
 | 
						|
export async function up(db: Kysely<any>) {
 | 
						|
    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: '2024-12-27',
 | 
						|
            dirty: 0,
 | 
						|
        })
 | 
						|
        .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<any>) {
 | 
						|
    throw new Error('Downward migrations are not supported. Restore from backup.');
 | 
						|
} |