Skip to content

Commit 12c8009

Browse files
refactor(server-nestjs): inject cluster deps via Effect Context.Tags
Co-authored-by: Automata <automata@shikanime.studio> Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr> Change-Id: I93db2e1e646d689dee53abaf14959ba66a6a6964
1 parent eddaf0a commit 12c8009

9 files changed

Lines changed: 359 additions & 490 deletions

File tree

‎apps/client/scripts/generate-icons.sh‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
set -e
44

55
echo "Create temporary file"
6-
FILE=$(mktemp -p . --suffix=".js")
6+
FILE=$(mktemp ./icons.XXXXXX).js && : > ${FILE}
77

88
echo "Add header"
99
tee -a ${FILE} << EOF

‎apps/server-nestjs/package.json‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
"@ts-rest/open-api": "catalog:runtime",
6969
"cache-manager": "catalog:runtime",
7070
"date-fns": "catalog:runtime",
71-
"effect": "catalog:",
71+
"effect": "catalog:runtime",
7272
"fastify": "catalog:runtime",
7373
"fastify-keycloak-adapter": "catalog:runtime",
7474
"json-2-csv": "catalog:runtime",
@@ -86,6 +86,7 @@
8686
"@cpn-console/eslint-config": "workspace:^",
8787
"@cpn-console/test-utils": "workspace:^",
8888
"@cpn-console/ts-config": "workspace:^",
89+
"@effect/vitest": "catalog:",
8990
"@eslint/eslintrc": "catalog:tools",
9091
"@eslint/js": "catalog:tools",
9192
"@faker-js/faker": "catalog:test",
Lines changed: 28 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { Kubeconfig as KubeconfigBody } from '@cpn-console/shared'
2-
import type { Cluster, Prisma, Project, Stage, User, Zone } from '@prisma/client'
2+
import type { Cluster, Prisma as PrismaClient, Project, Stage, User, Zone } from '@prisma/client'
33
import { ClusterPrivacySchema } from '@cpn-console/shared'
44

55
const CLUSTER_PUBLIC = ClusterPrivacySchema.enum.public
@@ -19,8 +19,8 @@ export const clusterListSelect = {
1919
createdAt: true,
2020
updatedAt: true,
2121
stages: true,
22-
} satisfies Prisma.ClusterSelect
23-
export type ClusterListRecord = Prisma.ClusterGetPayload<{ select: typeof clusterListSelect }>
22+
} satisfies PrismaClient.ClusterSelect
23+
export type ClusterListRecord = PrismaClient.ClusterGetPayload<{ select: typeof clusterListSelect }>
2424

2525
export const clusterDetailsSelect = {
2626
id: true,
@@ -39,8 +39,8 @@ export const clusterDetailsSelect = {
3939
projects: { select: { id: true } },
4040
kubeconfig: true,
4141
stages: true,
42-
} satisfies Prisma.ClusterSelect
43-
export type ClusterDetailsRecord = Prisma.ClusterGetPayload<{ select: typeof clusterDetailsSelect }>
42+
} satisfies PrismaClient.ClusterSelect
43+
export type ClusterDetailsRecord = PrismaClient.ClusterGetPayload<{ select: typeof clusterDetailsSelect }>
4444

4545
export const clusterEnvironmentsSelect = {
4646
id: true,
@@ -62,42 +62,10 @@ export const clusterEnvironmentsSelect = {
6262
members: true,
6363
},
6464
},
65-
} satisfies Prisma.EnvironmentSelect
66-
export type ClusterEnvironmentsRecord = Prisma.EnvironmentGetPayload<{ select: typeof clusterEnvironmentsSelect }>
65+
} satisfies PrismaClient.EnvironmentSelect
66+
export type ClusterEnvironmentsRecord = PrismaClient.EnvironmentGetPayload<{ select: typeof clusterEnvironmentsSelect }>
6767

68-
export function getClusterById(prisma: Prisma.TransactionClient, id: Cluster['id']) {
69-
return prisma.cluster.findUnique({
70-
where: { id },
71-
include: { kubeconfig: true },
72-
})
73-
}
74-
75-
export function getClusterEnvironments(prisma: Prisma.TransactionClient, clusterId: Cluster['id']) {
76-
return prisma.environment.findMany({
77-
where: { clusterId },
78-
select: clusterEnvironmentsSelect,
79-
})
80-
}
81-
82-
export function getClusterDetails(prisma: Prisma.TransactionClient, id: Cluster['id']) {
83-
return prisma.cluster.findUniqueOrThrow({
84-
where: { id },
85-
select: clusterDetailsSelect,
86-
})
87-
}
88-
89-
export function getClusterByLabel(prisma: Prisma.TransactionClient, label: Cluster['label']) {
90-
return prisma.cluster.findUnique({ where: { label } })
91-
}
92-
93-
export function listClusters(prisma: Prisma.TransactionClient, where: Prisma.ClusterWhereInput) {
94-
return prisma.cluster.findMany({
95-
where,
96-
select: clusterListSelect,
97-
})
98-
}
99-
100-
export function listClustersWhere(userId?: User['id']): Prisma.ClusterWhereInput {
68+
export function generateClusterWhereInput(userId?: User['id']): PrismaClient.ClusterWhereInput {
10169
return userId
10270
? {
10371
OR: [
@@ -110,27 +78,27 @@ export function listClustersWhere(userId?: User['id']): Prisma.ClusterWhereInput
11078
: {}
11179
}
11280

113-
export async function getProjectsByClusterId(prisma: Prisma.TransactionClient, id: Cluster['id']) {
114-
return (await prisma.cluster.findUniqueOrThrow({
81+
export async function getProjectsByClusterId(tx: PrismaClient.TransactionClient, id: Cluster['id']) {
82+
return (await tx.cluster.findUniqueOrThrow({
11583
where: { id },
11684
select: { projects: true },
11785
}))?.projects
11886
}
11987

120-
export async function listStagesByClusterId(prisma: Prisma.TransactionClient, id: Cluster['id']) {
121-
return (await prisma.cluster.findUniqueOrThrow({
88+
export async function listStagesByClusterId(tx: PrismaClient.TransactionClient, id: Cluster['id']) {
89+
return (await tx.cluster.findUniqueOrThrow({
12290
where: { id },
12391
select: { stages: true },
12492
}))?.stages
12593
}
12694

12795
export function createCluster(
128-
prisma: Prisma.TransactionClient,
96+
tx: PrismaClient.TransactionClient,
12997
data: Omit<Cluster, 'id' | 'updatedAt' | 'createdAt' | 'kubeConfigId' | 'secretName' | 'zoneId'>,
13098
kubeconfig: Pick<KubeconfigBody, 'user' | 'cluster'>,
13199
zoneId: string,
132100
) {
133-
return prisma.cluster.create({
101+
return tx.cluster.create({
134102
data: {
135103
...data,
136104
kubeconfig: {
@@ -145,12 +113,12 @@ export function createCluster(
145113
}
146114

147115
export function updateCluster(
148-
prisma: Prisma.TransactionClient,
116+
tx: PrismaClient.TransactionClient,
149117
id: Cluster['id'],
150118
data: Partial<Omit<Cluster, 'id' | 'updatedAt' | 'createdAt' | 'kubeConfigId' | 'zoneId'>>,
151119
kubeconfig?: Pick<KubeconfigBody, 'user' | 'cluster'>,
152120
) {
153-
return prisma.cluster.update({
121+
return tx.cluster.update({
154122
where: { id },
155123
data: kubeconfig
156124
? {
@@ -166,63 +134,51 @@ export function updateCluster(
166134
})
167135
}
168136

169-
export function linkClusterToProjects(prisma: Prisma.TransactionClient, id: Cluster['id'], projectIds: Project['id'][]) {
170-
return prisma.cluster.update({
137+
export function linkClusterToProjects(tx: PrismaClient.TransactionClient, id: Cluster['id'], projectIds: Project['id'][]) {
138+
return tx.cluster.update({
171139
where: { id },
172140
data: {
173141
projects: { connect: projectIds.map(projectId => ({ id: projectId })) },
174142
},
175143
})
176144
}
177145

178-
export function linkClusterToStages(prisma: Prisma.TransactionClient, id: Cluster['id'], stageIds: Stage['id'][]) {
179-
return prisma.cluster.update({
146+
export function linkClusterToStages(tx: PrismaClient.TransactionClient, id: Cluster['id'], stageIds: Stage['id'][]) {
147+
return tx.cluster.update({
180148
where: { id },
181149
data: {
182150
stages: { connect: stageIds.map(stageId => ({ id: stageId })) },
183151
},
184152
})
185153
}
186154

187-
export function removeClusterFromProject(prisma: Prisma.TransactionClient, id: Cluster['id'], projectId: Project['id']) {
188-
return prisma.cluster.update({
155+
export function removeClusterFromProject(tx: PrismaClient.TransactionClient, id: Cluster['id'], projectId: Project['id']) {
156+
return tx.cluster.update({
189157
where: { id },
190158
data: {
191159
projects: { disconnect: { id: projectId } },
192160
},
193161
})
194162
}
195163

196-
export function removeClusterFromStage(prisma: Prisma.TransactionClient, id: Cluster['id'], stageId: Stage['id']) {
197-
return prisma.cluster.update({
164+
export function removeClusterFromStage(tx: PrismaClient.TransactionClient, id: Cluster['id'], stageId: Stage['id']) {
165+
return tx.cluster.update({
198166
where: { id },
199167
data: {
200168
stages: { disconnect: { id: stageId } },
201169
},
202170
})
203171
}
204172

205-
export function deleteCluster(prisma: Prisma.TransactionClient, id: Cluster['id']) {
206-
return prisma.cluster.delete({ where: { id } })
173+
export function deleteCluster(tx: PrismaClient.TransactionClient, id: Cluster['id']) {
174+
return tx.cluster.delete({ where: { id } })
207175
}
208176

209-
export function linkZoneToClusters(prisma: Prisma.TransactionClient, zoneId: Zone['id'], clusterIds: Cluster['id'][]) {
210-
return prisma.zone.update({
177+
export function linkZoneToClusters(tx: PrismaClient.TransactionClient, zoneId: Zone['id'], clusterIds: Cluster['id'][]) {
178+
return tx.zone.update({
211179
where: { id: zoneId },
212180
data: {
213181
clusters: { connect: clusterIds.map(clusterId => ({ id: clusterId })) },
214182
},
215183
})
216184
}
217-
218-
export async function getClusterUsage(prisma: Prisma.TransactionClient, clusterId: Cluster['id']) {
219-
const clusterUsage = await prisma.environment.aggregate({
220-
_sum: { memory: true, cpu: true, gpu: true },
221-
where: { clusterId },
222-
})
223-
return {
224-
cpu: clusterUsage._sum.cpu ?? 0,
225-
gpu: clusterUsage._sum.gpu ?? 0,
226-
memory: clusterUsage._sum.memory ?? 0,
227-
}
228-
}

‎apps/server-nestjs/src/modules/cluster/cluster.controller.ts‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ import { UserGuard } from '../infrastructure/permission/user/user.guard'
1515
import { ZodValidationPipe } from '../infrastructure/pipe/zod-validation.pipe'
1616
import {
1717
ClusterNotFound,
18+
ClusterService,
1819
EnvironmentsActive,
1920
HookFailed,
2021
LabelTaken,
21-
} from './cluster.pipeline'
22-
import { ClusterService } from './cluster.service'
22+
} from './cluster.service'
2323

2424
type ClusterList = ClientInferResponseBody<typeof clusterContract.listClusters, 200>
2525
type ClusterDetails = ClientInferResponseBody<typeof clusterContract.getClusterDetails, 200>
@@ -32,7 +32,8 @@ function toHttpError(clusterId: string | undefined) {
3232
if (error instanceof LabelTaken) return new ConflictException('Ce label existe déjà pour un autre cluster')
3333
if (error instanceof EnvironmentsActive) return new BadRequestException('Impossible de supprimer le cluster, des environnements en activité y sont déployés')
3434
if (error instanceof HookFailed) return new UnprocessableEntityException('Echec des services à la création/mise à jour du cluster')
35-
return error instanceof Error ? error : new Error(String(error))
35+
if (error instanceof Error) return error
36+
return new Error(String(error))
3637
}
3738
}
3839

0 commit comments

Comments
 (0)