diff --git a/backend/migrations/20220405095220_gmtm.ts b/backend/migrations/20220405095220_gmtm.ts new file mode 100644 index 0000000000000000000000000000000000000000..1b7e2907d0515dcaad4b3649c6d195ed8eac0e02 --- /dev/null +++ b/backend/migrations/20220405095220_gmtm.ts @@ -0,0 +1,21 @@ +import { Knex } from "knex"; + +export async function up(knex: Knex): Promise<void> { + return knex.schema + .alterTable("games", (table) => table.integer("began_at_gmtm").unsigned()) + .alterTable("clues", (table) => table.integer("began_at_gmtm").unsigned()) + .alterTable("shots", (table) => table.integer("began_at_gmtm").unsigned()) + .alterTable("games", (table) => table.integer("ended_at_gmtm").unsigned()) + .alterTable("clues", (table) => table.integer("ended_at_gmtm").unsigned()) + .alterTable("shots", (table) => table.integer("ended_at_gmtm").unsigned()); +} + +export async function down(knex: Knex): Promise<void> { + return knex.schema + .alterTable("games", (table) => table.dropColumn("began_at_gmtm")) + .alterTable("clues", (table) => table.dropColumn("began_at_gmtm")) + .alterTable("shots", (table) => table.dropColumn("began_at_gmtm")) + .alterTable("games", (table) => table.dropColumn("ended_at_gmtm")) + .alterTable("clues", (table) => table.dropColumn("ended_at_gmtm")) + .alterTable("shots", (table) => table.dropColumn("ended_at_gmtm")); +} diff --git a/backend/src/schemas.ts b/backend/src/schemas.ts index 072c8afc5629237180e4d6f8339011625a9a0a78..d55f0e050333a5b85c87cad595ea47839a890e19 100644 --- a/backend/src/schemas.ts +++ b/backend/src/schemas.ts @@ -20,6 +20,8 @@ export const Game = Type.Object({ device_id: Type.Readonly(Type.String({ format: "uuid" })), began_at: Nullable(Type.String({ format: "date-time" })), ended_at: Nullable(Type.String({ format: "date-time" })), + began_at_gmtm: Nullable(Type.Number({ minimum: 0 })), + ended_at_gmtm: Nullable(Type.Number({ minimum: 0 })), }); export const Clue = Type.Object({ @@ -28,6 +30,8 @@ export const Clue = Type.Object({ word_id: Type.Readonly(Type.String({ format: "uuid" })), began_at: Nullable(Type.String({ format: "date-time" })), ended_at: Nullable(Type.String({ format: "date-time" })), + began_at_gmtm: Nullable(Type.Number({ minimum: 0 })), + ended_at_gmtm: Nullable(Type.Number({ minimum: 0 })), }); export const Shot = Type.Object({ @@ -36,17 +40,19 @@ export const Shot = Type.Object({ clue_id: Nullable(Type.String({ format: "uuid" })), began_at: Type.String({ format: "date-time" }), ended_at: Type.String({ format: "date-time" }), + began_at_gmtm: Nullable(Type.Number({ minimum: 0 })), + ended_at_gmtm: Nullable(Type.Number({ minimum: 0 })), typed: Type.String(), final: Type.String(), }); export const GameUpdate = Type.Partial( - Type.Pick(Game, ["began_at", "ended_at"]), + Type.Pick(Game, ["began_at", "ended_at", "began_at_gmtm", "ended_at_gmtm"]), ); export const GameCreate = GameUpdate; export const ClueUpdate = Type.Partial( - Type.Pick(Clue, ["began_at", "ended_at"]), + Type.Pick(Clue, ["began_at", "ended_at", "began_at_gmtm", "ended_at_gmtm"]), ); export const ClueCreate = Type.Intersect([ Type.Pick(Clue, ["word_id"]),