Canvas: Persistent log storage

Change-Id: I3eac705329e6d68d8e4b9a371c6e9b9807f357ec
diff --git a/apps/canvas/back/prisma/migrations/20250702123930_logs/migration.sql b/apps/canvas/back/prisma/migrations/20250702123930_logs/migration.sql
new file mode 100644
index 0000000..cbfe7f9
--- /dev/null
+++ b/apps/canvas/back/prisma/migrations/20250702123930_logs/migration.sql
@@ -0,0 +1,12 @@
+-- CreateTable
+CREATE TABLE "Log" (
+    "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+    "projectId" INTEGER NOT NULL,
+    "timestampMilli" INTEGER NOT NULL,
+    "contents" TEXT NOT NULL,
+    "commit" TEXT,
+    "serviceName" TEXT NOT NULL,
+    "workerId" TEXT NOT NULL,
+    "runId" TEXT NOT NULL,
+    CONSTRAINT "Log_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
+);
diff --git a/apps/canvas/back/prisma/migrations/20250702125305_/migration.sql b/apps/canvas/back/prisma/migrations/20250702125305_/migration.sql
new file mode 100644
index 0000000..f3dfec3
--- /dev/null
+++ b/apps/canvas/back/prisma/migrations/20250702125305_/migration.sql
@@ -0,0 +1,25 @@
+/*
+  Warnings:
+
+  - You are about to alter the column `timestampMilli` on the `Log` table. The data in that column could be lost. The data in that column will be cast from `Int` to `BigInt`.
+
+*/
+-- RedefineTables
+PRAGMA defer_foreign_keys=ON;
+PRAGMA foreign_keys=OFF;
+CREATE TABLE "new_Log" (
+    "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+    "projectId" INTEGER NOT NULL,
+    "timestampMilli" BIGINT NOT NULL,
+    "contents" TEXT NOT NULL,
+    "commit" TEXT,
+    "serviceName" TEXT NOT NULL,
+    "workerId" TEXT NOT NULL,
+    "runId" TEXT NOT NULL,
+    CONSTRAINT "Log_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
+);
+INSERT INTO "new_Log" ("commit", "contents", "id", "projectId", "runId", "serviceName", "timestampMilli", "workerId") SELECT "commit", "contents", "id", "projectId", "runId", "serviceName", "timestampMilli", "workerId" FROM "Log";
+DROP TABLE "Log";
+ALTER TABLE "new_Log" RENAME TO "Log";
+PRAGMA foreign_keys=ON;
+PRAGMA defer_foreign_keys=OFF;
diff --git a/apps/canvas/back/prisma/schema.prisma b/apps/canvas/back/prisma/schema.prisma
index 07482f3..adc03cf 100644
--- a/apps/canvas/back/prisma/schema.prisma
+++ b/apps/canvas/back/prisma/schema.prisma
@@ -25,4 +25,17 @@
   githubToken     String?
   access          String?
   geminiApiKey     String?
+  logs            Log[]
+}
+
+model Log {
+  id              Int     @id @default(autoincrement())
+  projectId       Int
+  project         Project @relation(fields: [projectId], references: [id])
+  timestampMilli  BigInt
+  contents        String
+  commit          String?
+  serviceName     String
+  workerId        String
+  runId           String
 }
\ No newline at end of file