-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Expand file tree
/
Copy pathEnvironmentVariablesPresenter.server.ts
More file actions
127 lines (114 loc) · 3.53 KB
/
EnvironmentVariablesPresenter.server.ts
File metadata and controls
127 lines (114 loc) · 3.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import { flipCauseOption } from "effect/Cause";
import { PrismaClient, prisma } from "~/db.server";
import { Project } from "~/models/project.server";
import { User } from "~/models/user.server";
import { filterOrphanedEnvironments, sortEnvironments } from "~/utils/environmentSort";
import { EnvironmentVariablesRepository } from "~/v3/environmentVariables/environmentVariablesRepository.server";
type Result = Awaited<ReturnType<EnvironmentVariablesPresenter["call"]>>;
export type EnvironmentVariableWithSetValues = Result["environmentVariables"][number];
export class EnvironmentVariablesPresenter {
#prismaClient: PrismaClient;
constructor(prismaClient: PrismaClient = prisma) {
this.#prismaClient = prismaClient;
}
public async call({ userId, projectSlug }: { userId: User["id"]; projectSlug: Project["slug"] }) {
const project = await this.#prismaClient.project.findFirst({
select: {
id: true,
},
where: {
slug: projectSlug,
organization: {
members: {
some: {
userId,
},
},
},
},
});
if (!project) {
throw new Error("Project not found");
}
const environmentVariables = await this.#prismaClient.environmentVariable.findMany({
select: {
id: true,
key: true,
values: {
select: {
id: true,
environmentId: true,
valueReference: {
select: {
key: true,
},
},
isSecret: true,
},
},
},
where: {
project: {
slug: projectSlug,
organization: {
members: {
some: {
userId,
},
},
},
},
},
});
const environments = await this.#prismaClient.runtimeEnvironment.findMany({
select: {
id: true,
type: true,
orgMember: {
select: {
userId: true,
},
},
},
where: {
project: {
slug: projectSlug,
},
},
});
const sortedEnvironments = sortEnvironments(filterOrphanedEnvironments(environments)).filter(
(e) => e.orgMember?.userId === userId || e.orgMember === null
);
const repository = new EnvironmentVariablesRepository(this.#prismaClient);
const variables = await repository.getProject(project.id);
return {
environmentVariables: environmentVariables
.flatMap((environmentVariable) => {
const variable = variables.find((v) => v.key === environmentVariable.key);
return sortedEnvironments.flatMap((env) => {
const val = variable?.values.find((v) => v.environment.id === env.id);
const isSecret =
environmentVariable.values.find((v) => v.environmentId === env.id)?.isSecret ?? false;
if (!val) {
return [];
}
return [
{
id: environmentVariable.id,
key: environmentVariable.key,
environment: { type: env.type, id: env.id },
value: isSecret ? "" : val.value,
isSecret,
},
];
});
})
.sort((a, b) => a.key.localeCompare(b.key)),
environments: sortedEnvironments.map((environment) => ({
id: environment.id,
type: environment.type,
})),
hasStaging: environments.some((environment) => environment.type === "STAGING"),
};
}
}