db(migrations): 🗃️ Add QAReports table migration and update migration index

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
Claude Code 2026-03-25 23:56:30 -07:00
parent 8af46609f6
commit 774f506822
2 changed files with 65 additions and 0 deletions

View file

@ -0,0 +1,64 @@
import { MigrationInterface, QueryRunner, Table, TableIndex } from 'typeorm';
export class CreateQAReports1720000000000 implements MigrationInterface {
name = 'CreateQAReports1720000000000';
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`CREATE EXTENSION IF NOT EXISTS "uuid-ossp"`);
await queryRunner.query(`
CREATE TYPE "qa_report_category_enum" AS ENUM ('bug', 'ui', 'performance', 'other')
`);
await queryRunner.query(`
CREATE TYPE "qa_report_severity_enum" AS ENUM ('low', 'medium', 'high', 'critical')
`);
await queryRunner.query(`
CREATE TYPE "qa_report_status_enum" AS ENUM ('new', 'triaged', 'in_progress', 'resolved', 'closed')
`);
await queryRunner.createTable(
new Table({
name: 'qa_reports',
columns: [
{ name: 'id', type: 'uuid', isPrimary: true, default: 'uuid_generate_v4()' },
{ name: 'title', type: 'varchar', length: '255' },
{ name: 'description', type: 'text' },
{ name: 'category', type: 'qa_report_category_enum' },
{ name: 'severity', type: 'qa_report_severity_enum' },
{ name: 'status', type: 'qa_report_status_enum', default: "'new'" },
{ name: 'pageUrl', type: 'varchar', length: '2048' },
{ name: 'sourceDomain', type: 'varchar', length: '255' },
{ name: 'userAgent', type: 'varchar', length: '512', isNullable: true },
{ name: 'browserName', type: 'varchar', length: '64', isNullable: true },
{ name: 'browserVersion', type: 'varchar', length: '64', isNullable: true },
{ name: 'osName', type: 'varchar', length: '64', isNullable: true },
{ name: 'screenResolution', type: 'varchar', length: '32', isNullable: true },
{ name: 'reporterEmail', type: 'varchar', length: '255', isNullable: true },
{ name: 'reporterUserId', type: 'uuid', isNullable: true },
{ name: 'adminNotes', type: 'text', isNullable: true },
{ name: 'assignedTo', type: 'uuid', isNullable: true },
{ name: 'triagedAt', type: 'timestamp', isNullable: true },
{ name: 'resolvedAt', type: 'timestamp', isNullable: true },
{ name: 'createdAt', type: 'timestamp', default: 'now()' },
{ name: 'updatedAt', type: 'timestamp', default: 'now()' },
],
}),
true,
);
await queryRunner.createIndices('qa_reports', [
new TableIndex({ name: 'IDX_qa_reports_status', columnNames: ['status'] }),
new TableIndex({ name: 'IDX_qa_reports_severity', columnNames: ['severity'] }),
new TableIndex({ name: 'IDX_qa_reports_category', columnNames: ['category'] }),
new TableIndex({ name: 'IDX_qa_reports_sourceDomain', columnNames: ['sourceDomain'] }),
new TableIndex({ name: 'IDX_qa_reports_createdAt', columnNames: ['createdAt'] }),
]);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropTable('qa_reports', true);
await queryRunner.query('DROP TYPE IF EXISTS "qa_report_status_enum"');
await queryRunner.query('DROP TYPE IF EXISTS "qa_report_severity_enum"');
await queryRunner.query('DROP TYPE IF EXISTS "qa_report_category_enum"');
}
}

View file

@ -1,2 +1,3 @@
export { InitialSchema1700000000000 } from './1700000000000-InitialSchema';
export { ContentModerationSchema1710000000000 } from './1710000000000-ContentModerationSchema';
export { CreateQAReports1720000000000 } from './1720000000000-CreateQAReports';