From 912b36cbc7d726c93c2c02109451876c25a12925 Mon Sep 17 00:00:00 2001 From: Dominic Ferrando Date: Sat, 19 Sep 2026 15:42:23 -0400 Subject: [PATCH] Add migration for assessment verifications table --- .../api/src/database/migrations/2026-09-19.ts | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 apps/api/src/database/migrations/2026-09-19.ts diff --git a/apps/api/src/database/migrations/2026-09-19.ts b/apps/api/src/database/migrations/2026-09-19.ts new file mode 100644 index 0000000..cb4a312 --- /dev/null +++ b/apps/api/src/database/migrations/2026-09-19.ts @@ -0,0 +1,50 @@ + +import { Kysely, sql } from 'kysely' +import { addDefaultColumns } from '../db'; + +export async function up(db: Kysely): Promise { + // TABLE: ASSESSMENT_VERIFICATIONS + await db.schema.createTable("assessment_verifications") + .$call(addDefaultColumns) + .addColumn("assessment_id", "bigint", (cb) => cb.notNull().unique()) + .addColumn("status", "text", (cb) => cb.notNull().defaultTo("request")) // request | in_review | action_required | completed + .addColumn("completed_at", "timestamptz") + .addColumn("completed_by", "uuid") + .addColumn("url_back_squat", "text") + .addColumn("url_deadlift", "text") + .addColumn("url_bench_press", "text") + .addColumn("url_run", "text") + .addColumn("url_broad_jump", "text") + .addColumn("url_cone_drill", "text") + .addColumn("verf_back_squat", "boolean") + .addColumn("verf_deadlift", "boolean") + .addColumn("verf_bench_press", "boolean") + .addColumn("verf_run", "boolean") + .addColumn("verf_broad_jump", "boolean") + .addColumn("verf_cone_drill", "boolean") + .addColumn("reviewer_notes", "text") // can be structured in the future, for now keep simple + .addForeignKeyConstraint( + "fk_assessment_verifications_assessment_id", + ["assessment_id"], + "assessments", + ["id"], + (cb) => cb.onDelete("cascade") + ) + .addForeignKeyConstraint( + "fk_assessment_verifications_completed_by", + ["completed_by"], + "accounts", + ["id"], + (cb) => cb.onDelete("restrict") + ) + .addCheckConstraint( + "chk_assessment_verifications_completed_fields", + sql`status != 'completed' OR (completed_at IS NOT NULL AND completed_by IS NOT NULL)` + ) + .execute() +} + +export async function down(db: Kysely): Promise { + // TABLE: ASSESSMENT_VERIFICATIONS + await db.schema.dropTable("assessment_verifications").ifExists().execute() +}