From 922c12f20f75047a8689a1578fd6c55f42fcd7c0 Mon Sep 17 00:00:00 2001 From: Bastian Wagner Date: Thu, 20 Aug 2026 21:17:37 +0200 Subject: [PATCH] feat(combat): migrate combat_event_type_enum for Slice 0.6 event types --- .../1790000000000-ExtendCombatEventTypes.ts | 26 ++++++++++++++++++ ...xtend-combat-event-types.migration.spec.ts | 27 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 apps/api/src/database/migrations/1790000000000-ExtendCombatEventTypes.ts create mode 100644 apps/api/src/database/migrations/extend-combat-event-types.migration.spec.ts diff --git a/apps/api/src/database/migrations/1790000000000-ExtendCombatEventTypes.ts b/apps/api/src/database/migrations/1790000000000-ExtendCombatEventTypes.ts new file mode 100644 index 0000000..3724c8f --- /dev/null +++ b/apps/api/src/database/migrations/1790000000000-ExtendCombatEventTypes.ts @@ -0,0 +1,26 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class ExtendCombatEventTypes1790000000000 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TYPE "combat_event_type_enum" ADD VALUE 'HEAL'`); + await queryRunner.query(`ALTER TYPE "combat_event_type_enum" ADD VALUE 'DEFEND'`); + await queryRunner.query(`ALTER TYPE "combat_event_type_enum" ADD VALUE 'TELEGRAPH'`); + await queryRunner.query(`ALTER TYPE "combat_event_type_enum" ADD VALUE 'INTERRUPT'`); + } + + public async down(queryRunner: QueryRunner): Promise { + // Postgres has no "DROP VALUE"; rebuild the type from scratch instead. + // This fails if any row already uses one of the new values -- expected + // for a dev rollback, same tradeoff Postgres migrations always make here. + await queryRunner.query( + `ALTER TABLE "combat_events" ALTER COLUMN "type" TYPE varchar USING "type"::text`, + ); + await queryRunner.query(`DROP TYPE "combat_event_type_enum"`); + await queryRunner.query( + `CREATE TYPE "combat_event_type_enum" AS ENUM ('DAMAGE', 'COMBAT_WON', 'COMBAT_LOST')`, + ); + await queryRunner.query( + `ALTER TABLE "combat_events" ALTER COLUMN "type" TYPE "combat_event_type_enum" USING "type"::"combat_event_type_enum"`, + ); + } +} diff --git a/apps/api/src/database/migrations/extend-combat-event-types.migration.spec.ts b/apps/api/src/database/migrations/extend-combat-event-types.migration.spec.ts new file mode 100644 index 0000000..d50ffff --- /dev/null +++ b/apps/api/src/database/migrations/extend-combat-event-types.migration.spec.ts @@ -0,0 +1,27 @@ +import 'reflect-metadata'; +import { getMetadataArgsStorage } from 'typeorm'; +import { CombatEvent } from '../../combat/entities/combat-event.entity'; +import { CombatEventType } from '../../combat/combat-event-type.enum'; + +describe('combat_events.type enum', () => { + it('includes the Playable Slice 0.6 event types', () => { + const metadata = getMetadataArgsStorage(); + const column = metadata.columns.find( + (candidate) => candidate.target === CombatEvent && candidate.propertyName === 'type', + ); + + expect(column).toBeDefined(); + expect(column?.options.enum).toBe(CombatEventType); + expect(Object.values(CombatEventType)).toEqual( + expect.arrayContaining([ + 'DAMAGE', + 'HEAL', + 'DEFEND', + 'TELEGRAPH', + 'INTERRUPT', + 'COMBAT_WON', + 'COMBAT_LOST', + ]), + ); + }); +});