Skip to content

Commit 7b3b2e0

Browse files
authored
Deal with Dev environments where the team member has been removed (#1141)
* Test page: don’t show deleted dev environments * Function to filter out environments that are dev and have no orgMember or orgMemberId * Don’t show tasks from deleted members (or the associated environment labels) * Show “Dev: Deleted” if the user has been removed. * Only show your environment in the env vars table * Renamed function * Use the displayableEnvironment function
1 parent 3900dda commit 7b3b2e0

10 files changed

+76
-60
lines changed

apps/webapp/app/models/runtimeEnvironment.server.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,17 +138,23 @@ type DisplayableInputEnvironment = Prisma.RuntimeEnvironmentGetPayload<{
138138
};
139139
}>;
140140

141-
export function displayableEnvironments(
141+
export function displayableEnvironment(
142142
environment: DisplayableInputEnvironment,
143143
userId: string | undefined
144144
) {
145+
let userName: string | undefined = undefined;
146+
147+
if (environment.type === "DEVELOPMENT") {
148+
if (!environment.orgMember) {
149+
userName = "Deleted";
150+
} else if (environment.orgMember.user.id !== userId) {
151+
userName = getUsername(environment.orgMember.user);
152+
}
153+
}
154+
145155
return {
146156
id: environment.id,
147157
type: environment.type,
148-
userName: environment.orgMember
149-
? environment.orgMember.user.id === userId
150-
? undefined
151-
: getUsername(environment.orgMember.user)
152-
: undefined,
158+
userName,
153159
};
154160
}

apps/webapp/app/presenters/ProjectPresenter.server.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { PrismaClient, prisma } from "~/db.server";
22
import { Project } from "~/models/project.server";
3-
import { displayableEnvironments } from "~/models/runtimeEnvironment.server";
3+
import { displayableEnvironment } from "~/models/runtimeEnvironment.server";
44
import { User } from "~/models/user.server";
55
import { sortEnvironments } from "~/utils/environmentSort";
66

@@ -86,7 +86,7 @@ export class ProjectPresenter {
8686
httpEndpointCount: project._count.httpEndpoints,
8787
environments: sortEnvironments(
8888
project.environments.map((environment) => ({
89-
...displayableEnvironments(environment, userId),
89+
...displayableEnvironment(environment, userId),
9090
userId: environment.orgMember?.user.id,
9191
}))
9292
),

apps/webapp/app/presenters/v3/EditSchedulePresenter.server.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { RuntimeEnvironmentType } from "@trigger.dev/database";
22
import { PrismaClient, prisma } from "~/db.server";
3+
import { displayableEnvironment } from "~/models/runtimeEnvironment.server";
34

45
type EditScheduleOptions = {
56
userId: string;
@@ -67,19 +68,7 @@ export class EditSchedulePresenter {
6768
});
6869

6970
const possibleEnvironments = project.environments.map((environment) => {
70-
let userName: undefined | string;
71-
if (environment.orgMember) {
72-
if (environment.orgMember.user.id !== userId) {
73-
userName =
74-
environment.orgMember.user.displayName ?? environment.orgMember.user.name ?? undefined;
75-
}
76-
}
77-
78-
return {
79-
id: environment.id,
80-
type: environment.type,
81-
userName,
82-
};
71+
return displayableEnvironment(environment, userId);
8372
});
8473

8574
return {

apps/webapp/app/presenters/v3/EnvironmentVariablesPresenter.server.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,19 @@ export class EnvironmentVariablesPresenter {
7979
project: {
8080
slug: projectSlug,
8181
},
82+
OR: [
83+
{
84+
type: {
85+
in: ["PREVIEW", "STAGING", "PRODUCTION"],
86+
},
87+
},
88+
{
89+
type: "DEVELOPMENT",
90+
orgMember: {
91+
userId,
92+
},
93+
},
94+
],
8295
},
8396
});
8497

apps/webapp/app/presenters/v3/RunListPresenter.server.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import parse from "parse-duration";
33
import { Direction } from "~/components/runs/RunStatuses";
44
import { FINISHED_STATUSES } from "~/components/runs/v3/TaskRunStatus";
55
import { sqlDatabaseSchema } from "~/db.server";
6-
import { displayableEnvironments } from "~/models/runtimeEnvironment.server";
6+
import { displayableEnvironment } from "~/models/runtimeEnvironment.server";
77
import { CANCELLABLE_STATUSES } from "~/v3/services/cancelTaskRun.server";
88
import { BasePresenter } from "./basePresenter.server";
99

@@ -280,7 +280,7 @@ export class RunListPresenter extends BasePresenter {
280280
spanId: run.spanId,
281281
isReplayable: true,
282282
isCancellable: CANCELLABLE_STATUSES.includes(run.status),
283-
environment: displayableEnvironments(environment, userId),
283+
environment: displayableEnvironment(environment, userId),
284284
};
285285
}),
286286
pagination: {

apps/webapp/app/presenters/v3/ScheduleListPresenter.server.ts

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Prisma, RuntimeEnvironmentType } from "@trigger.dev/database";
22
import { ScheduleListFilters } from "~/components/runs/v3/ScheduleFilters";
33
import { PrismaClient, prisma, sqlDatabaseSchema } from "~/db.server";
4+
import { displayableEnvironment } from "~/models/runtimeEnvironment.server";
45
import { getUsername } from "~/utils/username";
56
import { calculateNextScheduledTimestamp } from "~/v3/utils/calculateNextSchedule.server";
67

@@ -233,14 +234,7 @@ export class ScheduleListPresenter {
233234
);
234235
}
235236

236-
return {
237-
id: instance.environmentId,
238-
type: environment.type,
239-
userName:
240-
environment.orgMember?.user.id === userId
241-
? undefined
242-
: getUsername(environment.orgMember?.user),
243-
};
237+
return displayableEnvironment(environment, userId);
244238
}),
245239
};
246240
});
@@ -252,14 +246,7 @@ export class ScheduleListPresenter {
252246
schedules,
253247
possibleTasks: possibleTasks.map((task) => task.slug),
254248
possibleEnvironments: project.environments.map((environment) => {
255-
return {
256-
id: environment.id,
257-
type: environment.type,
258-
userName:
259-
environment.orgMember?.user.id === userId
260-
? undefined
261-
: getUsername(environment.orgMember?.user),
262-
};
249+
return displayableEnvironment(environment, userId);
263250
}),
264251
hasFilters,
265252
filters: {

apps/webapp/app/presenters/v3/TaskListPresenter.server.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import { QUEUED_STATUSES, RUNNING_STATUSES } from "~/components/runs/v3/TaskRunS
88
import { sqlDatabaseSchema } from "~/db.server";
99
import type { Organization } from "~/models/organization.server";
1010
import type { Project } from "~/models/project.server";
11-
import { displayableEnvironments } from "~/models/runtimeEnvironment.server";
11+
import { displayableEnvironment } from "~/models/runtimeEnvironment.server";
1212
import type { User } from "~/models/user.server";
13-
import { sortEnvironments } from "~/utils/environmentSort";
13+
import { filterOrphanedEnvironments, sortEnvironments } from "~/utils/environmentSort";
1414
import { logger } from "~/services/logger.server";
1515
import { BasePresenter } from "./basePresenter.server";
1616
import { TaskRunStatus } from "~/database-types";
@@ -86,7 +86,9 @@ export class TaskListPresenter extends BasePresenter {
8686
WITH workers AS (
8787
SELECT DISTINCT ON ("runtimeEnvironmentId") id, "runtimeEnvironmentId", version
8888
FROM ${sqlDatabaseSchema}."BackgroundWorker"
89-
WHERE "runtimeEnvironmentId" IN (${Prisma.join(project.environments.map((e) => e.id))})
89+
WHERE "runtimeEnvironmentId" IN (${Prisma.join(
90+
filterOrphanedEnvironments(project.environments).map((e) => e.id)
91+
)})
9092
ORDER BY "runtimeEnvironmentId", "createdAt" DESC
9193
)
9294
SELECT tasks.id, slug, "filePath", "exportName", "triggerSource", tasks."runtimeEnvironmentId", tasks."createdAt"
@@ -119,7 +121,7 @@ export class TaskListPresenter extends BasePresenter {
119121
existingTask.triggerSource = task.triggerSource;
120122
}
121123

122-
existingTask.environments.push(displayableEnvironments(environment, userId));
124+
existingTask.environments.push(displayableEnvironment(environment, userId));
123125

124126
//order the environments
125127
existingTask.environments = sortEnvironments(existingTask.environments);

apps/webapp/app/presenters/v3/TestPresenter.server.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,12 @@ export class TestPresenter {
3636
where: {
3737
OR: [
3838
{
39-
orgMember: null,
39+
type: {
40+
in: ["PREVIEW", "STAGING", "PRODUCTION"],
41+
},
4042
},
4143
{
44+
type: "DEVELOPMENT",
4245
orgMember: {
4346
userId,
4447
},

apps/webapp/app/presenters/v3/ViewSchedulePresenter.server.ts

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { PrismaClient, prisma } from "~/db.server";
22
import { nextScheduledTimestamps } from "~/v3/utils/calculateNextSchedule.server";
33
import { RunListPresenter } from "./RunListPresenter.server";
44
import { ScheduleObject } from "@trigger.dev/core/v3";
5+
import { displayableEnvironment } from "~/models/runtimeEnvironment.server";
56

67
type ViewScheduleOptions = {
78
userId?: string;
@@ -85,21 +86,7 @@ export class ViewSchedulePresenter {
8586
runs,
8687
environments: schedule.instances.map((instance) => {
8788
const environment = instance.environment;
88-
let userName: undefined | string;
89-
if (environment.orgMember) {
90-
if (environment.orgMember.user.id !== userId) {
91-
userName =
92-
environment.orgMember.user.displayName ??
93-
environment.orgMember.user.name ??
94-
undefined;
95-
}
96-
}
97-
98-
return {
99-
id: environment.id,
100-
type: environment.type,
101-
userName,
102-
};
89+
return displayableEnvironment(environment, userId);
10390
}),
10491
},
10592
};

apps/webapp/app/utils/environmentSort.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { RuntimeEnvironmentType } from "@trigger.dev/database";
1+
import { Prisma, RuntimeEnvironmentType } from "@trigger.dev/database";
22

33
const environmentSortOrder: RuntimeEnvironmentType[] = [
44
"DEVELOPMENT",
@@ -29,3 +29,32 @@ export function sortEnvironments<T extends SortType>(environments: T[]): T[] {
2929
return difference;
3030
});
3131
}
32+
33+
type FilterableEnvironment =
34+
| {
35+
type: RuntimeEnvironmentType;
36+
orgMemberId?: string;
37+
}
38+
| {
39+
type: RuntimeEnvironmentType;
40+
//intentionally vague so we can match anything
41+
orgMember?: Record<string, any>;
42+
};
43+
44+
export function filterOrphanedEnvironments<T extends FilterableEnvironment>(
45+
environments: T[]
46+
): T[] {
47+
return environments.filter((environment) => {
48+
if (environment.type !== "DEVELOPMENT") return true;
49+
50+
if ("orgMemberId" in environment) {
51+
return !!environment.orgMemberId;
52+
}
53+
54+
if ("orgMember" in environment) {
55+
return !!environment.orgMember;
56+
}
57+
58+
return false;
59+
});
60+
}

0 commit comments

Comments
 (0)