task_receipts/src/server/db/migrations/20240101000000_initial_schema.ts

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');
}