From 6b73365d278976ac04cf99c35346401a84fd53a1 Mon Sep 17 00:00:00 2001 From: Matt Aitken Date: Thu, 15 Jan 2026 13:02:07 +0000 Subject: [PATCH 1/3] Add projectId (nullable for now) to TaskScheduleInstance --- .../migration.sql | 16 ++++++++++++++++ internal-packages/database/prisma/schema.prisma | 8 ++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 internal-packages/database/prisma/migrations/20260115125846_add_project_id_to_task_schedule_instance/migration.sql diff --git a/internal-packages/database/prisma/migrations/20260115125846_add_project_id_to_task_schedule_instance/migration.sql b/internal-packages/database/prisma/migrations/20260115125846_add_project_id_to_task_schedule_instance/migration.sql new file mode 100644 index 0000000000..59f75a9377 --- /dev/null +++ b/internal-packages/database/prisma/migrations/20260115125846_add_project_id_to_task_schedule_instance/migration.sql @@ -0,0 +1,16 @@ +-- AlterTable +ALTER TABLE "public"."TaskScheduleInstance" +ADD COLUMN IF NOT EXISTS "projectId" TEXT; + +-- AddForeignKey +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_constraint WHERE conname = 'TaskScheduleInstance_projectId_fkey' + ) THEN + ALTER TABLE "public"."TaskScheduleInstance" + ADD CONSTRAINT "TaskScheduleInstance_projectId_fkey" + FOREIGN KEY ("projectId") REFERENCES "public"."Project" ("id") + ON DELETE CASCADE ON UPDATE CASCADE; + END IF; +END $$; \ No newline at end of file diff --git a/internal-packages/database/prisma/schema.prisma b/internal-packages/database/prisma/schema.prisma index 52dd7d88db..e44be632b0 100644 --- a/internal-packages/database/prisma/schema.prisma +++ b/internal-packages/database/prisma/schema.prisma @@ -404,7 +404,8 @@ model Project { connectedGithubRepository ConnectedGithubRepository? customerQueries CustomerQuery[] - buildSettings Json? + buildSettings Json? + taskScheduleInstances TaskScheduleInstance[] } enum ProjectVersion { @@ -589,7 +590,7 @@ model TaskRun { /// Debounce options: { key: string, delay: string, createdAt: Date } debounce Json? - taskIdentifier String + taskIdentifier String isTest Boolean @default(false) @@ -1945,6 +1946,9 @@ model TaskScheduleInstance { environment RuntimeEnvironment @relation(fields: [environmentId], references: [id], onDelete: Cascade, onUpdate: Cascade) environmentId String + project Project? @relation(fields: [projectId], references: [id], onDelete: Cascade, onUpdate: Cascade) + projectId String? + createdAt DateTime @default(now()) updatedAt DateTime @updatedAt From cd2d2c2c9d1156d8aa8b8752db45b3ffa8e8578e Mon Sep 17 00:00:00 2001 From: Matt Aitken Date: Thu, 15 Jan 2026 13:06:48 +0000 Subject: [PATCH 2/3] TaskScheduleInstance environmentId index MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added only if it doesn’t exist and concurrently --- .../migration.sql | 2 ++ internal-packages/database/prisma/schema.prisma | 1 + 2 files changed, 3 insertions(+) create mode 100644 internal-packages/database/prisma/migrations/20260115130417_taskscheduleinstance_environmentid_index/migration.sql diff --git a/internal-packages/database/prisma/migrations/20260115130417_taskscheduleinstance_environmentid_index/migration.sql b/internal-packages/database/prisma/migrations/20260115130417_taskscheduleinstance_environmentid_index/migration.sql new file mode 100644 index 0000000000..c88056b784 --- /dev/null +++ b/internal-packages/database/prisma/migrations/20260115130417_taskscheduleinstance_environmentid_index/migration.sql @@ -0,0 +1,2 @@ +-- CreateIndex +CREATE INDEX CONCURRENTLY IF NOT EXISTS "TaskScheduleInstance_environmentId_idx" ON "public"."TaskScheduleInstance" ("environmentId"); \ No newline at end of file diff --git a/internal-packages/database/prisma/schema.prisma b/internal-packages/database/prisma/schema.prisma index e44be632b0..44c5409970 100644 --- a/internal-packages/database/prisma/schema.prisma +++ b/internal-packages/database/prisma/schema.prisma @@ -1959,6 +1959,7 @@ model TaskScheduleInstance { //you can only have a schedule attached to each environment once @@unique([taskScheduleId, environmentId]) + @@index([environmentId]) } model RuntimeEnvironmentSession { From 5e60aa2f8a392c2645766d013b2f79ed81e955d8 Mon Sep 17 00:00:00 2001 From: Matt Aitken Date: Thu, 15 Jan 2026 14:11:54 +0000 Subject: [PATCH 3/3] Set the TaskScheduleInstance.projectId everywhere --- apps/webapp/app/v3/services/createBackgroundWorker.server.ts | 1 + apps/webapp/app/v3/services/upsertTaskSchedule.server.ts | 2 ++ internal-packages/schedule-engine/test/scheduleEngine.test.ts | 1 + .../schedule-engine/test/scheduleRecovery.test.ts | 3 +++ 4 files changed, 7 insertions(+) diff --git a/apps/webapp/app/v3/services/createBackgroundWorker.server.ts b/apps/webapp/app/v3/services/createBackgroundWorker.server.ts index 41fbf2afe2..2938164b74 100644 --- a/apps/webapp/app/v3/services/createBackgroundWorker.server.ts +++ b/apps/webapp/app/v3/services/createBackgroundWorker.server.ts @@ -593,6 +593,7 @@ export async function syncDeclarativeSchedules( create: [ { environmentId: environment.id, + projectId: environment.projectId, }, ], }, diff --git a/apps/webapp/app/v3/services/upsertTaskSchedule.server.ts b/apps/webapp/app/v3/services/upsertTaskSchedule.server.ts index f7fa8f4d18..d9d8b6c0a4 100644 --- a/apps/webapp/app/v3/services/upsertTaskSchedule.server.ts +++ b/apps/webapp/app/v3/services/upsertTaskSchedule.server.ts @@ -109,6 +109,7 @@ export class UpsertTaskScheduleService extends BaseService { data: { taskScheduleId: scheduleRecord.id, environmentId, + projectId, }, include: { environment: { @@ -183,6 +184,7 @@ export class UpsertTaskScheduleService extends BaseService { data: { taskScheduleId: scheduleRecord.id, environmentId, + projectId: existingSchedule.projectId, }, include: { environment: { diff --git a/internal-packages/schedule-engine/test/scheduleEngine.test.ts b/internal-packages/schedule-engine/test/scheduleEngine.test.ts index fdc05e2574..99bac0936d 100644 --- a/internal-packages/schedule-engine/test/scheduleEngine.test.ts +++ b/internal-packages/schedule-engine/test/scheduleEngine.test.ts @@ -93,6 +93,7 @@ describe("ScheduleEngine Integration", () => { data: { taskScheduleId: taskSchedule.id, environmentId: environment.id, + projectId: project.id, active: true, }, }); diff --git a/internal-packages/schedule-engine/test/scheduleRecovery.test.ts b/internal-packages/schedule-engine/test/scheduleRecovery.test.ts index 9ad345101e..99a3351aed 100644 --- a/internal-packages/schedule-engine/test/scheduleRecovery.test.ts +++ b/internal-packages/schedule-engine/test/scheduleRecovery.test.ts @@ -79,6 +79,7 @@ describe("Schedule Recovery", () => { data: { taskScheduleId: taskSchedule.id, environmentId: environment.id, + projectId: project.id, active: true, }, }); @@ -184,6 +185,7 @@ describe("Schedule Recovery", () => { data: { taskScheduleId: taskSchedule.id, environmentId: environment.id, + projectId: project.id, active: true, }, }); @@ -293,6 +295,7 @@ describe("Schedule Recovery", () => { data: { taskScheduleId: taskSchedule.id, environmentId: environment.id, + projectId: project.id, active: true, }, });