From 4f442c357fb1354ed1461299ed5af8f7e64f2582 Mon Sep 17 00:00:00 2001
From: Paolo Brasolin <paolo.brasolin@eurac.edu>
Date: Tue, 5 Apr 2022 14:30:11 +0200
Subject: [PATCH] feat: #be add gmtm tracking

---
 backend/migrations/20220405095220_gmtm.ts | 21 +++++++++++++++++++++
 backend/src/schemas.ts                    | 10 ++++++++--
 2 files changed, 29 insertions(+), 2 deletions(-)
 create mode 100644 backend/migrations/20220405095220_gmtm.ts

diff --git a/backend/migrations/20220405095220_gmtm.ts b/backend/migrations/20220405095220_gmtm.ts
new file mode 100644
index 0000000..1b7e290
--- /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 072c8af..d55f0e0 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"]),
-- 
GitLab