50 lines
1.7 KiB
TypeScript
50 lines
1.7 KiB
TypeScript
import type { Knex } from 'knex';
|
|
|
|
export async function up(knex: Knex): Promise<void> {
|
|
// Create groups table
|
|
await knex.schema.createTable('groups', (table) => {
|
|
table.increments('id').primary();
|
|
table.string('name').notNullable();
|
|
table.integer('parent_id').references('id').inTable('groups');
|
|
table.timestamps(true, true);
|
|
});
|
|
|
|
// Create tasks table
|
|
await knex.schema.createTable('tasks', (table) => {
|
|
table.increments('id').primary();
|
|
table.string('title').notNullable();
|
|
table.integer('group_id').references('id').inTable('groups').notNullable();
|
|
table.integer('print_count').defaultTo(0);
|
|
table.timestamp('last_printed_at');
|
|
table.timestamps(true, true);
|
|
});
|
|
|
|
// Create steps table
|
|
await knex.schema.createTable('steps', (table) => {
|
|
table.increments('id').primary();
|
|
table.string('title').notNullable();
|
|
table.text('instructions').notNullable();
|
|
table.integer('task_id').references('id').inTable('tasks').notNullable();
|
|
table.integer('order').notNullable();
|
|
table.integer('print_count').defaultTo(0);
|
|
table.timestamp('last_printed_at');
|
|
table.timestamps(true, true);
|
|
});
|
|
|
|
// Create images table for step images
|
|
await knex.schema.createTable('images', (table) => {
|
|
table.increments('id').primary();
|
|
table.integer('step_id').references('id').inTable('steps').notNullable();
|
|
table.string('original_path').notNullable();
|
|
table.string('bw_path').notNullable();
|
|
table.integer('order').notNullable();
|
|
table.timestamps(true, true);
|
|
});
|
|
}
|
|
|
|
export async function down(knex: Knex): Promise<void> {
|
|
await knex.schema.dropTable('images');
|
|
await knex.schema.dropTable('steps');
|
|
await knex.schema.dropTable('tasks');
|
|
await knex.schema.dropTable('groups');
|
|
} |