11import type { AsyncTypedHandler } from "@/types/api.js";
22import { ApiError, asyncHandler } from "@/types/api.js";
33import { Router } from "express";
4- import _ from "lodash";
54import { v4 as uuidv4 } from "uuid";
6- import { z } from "zod";
75
86import { and, asc, count, desc, eq, inArray, takeFirst } from "@ctrlplane/db";
97import { db } from "@ctrlplane/db/client";
@@ -21,22 +19,6 @@ import { listDeploymentVariablesByDeploymentRouter } from "./deployment-variable
2119
2220const PLAN_TTL_MS = 60 * 60 * 1000;
2321
24- const getJobAgentsByDeploymentId = async (
25- deploymentIds: string[],
26- ): Promise<Record<string, { ref: string; config: Record<string, any> }[]>> => {
27- if (deploymentIds.length === 0) return {};
28- const links = await db
29- .select()
30- .from(schema.deploymentJobAgent)
31- .where(inArray(schema.deploymentJobAgent.deploymentId, deploymentIds));
32- return _.chain(links)
33- .groupBy((l) => l.deploymentId)
34- .mapValues((group) =>
35- group.map((l) => ({ ref: l.jobAgentId, config: l.config })),
36- )
37- .value();
38- };
39-
4022const parseSelector = (raw: string | null | undefined): string | undefined => {
4123 if (raw == null || raw === "false") return undefined;
4224 return raw;
@@ -126,14 +108,8 @@ const listDeployments: AsyncTypedHandler<
126108 systemsByDeploymentId.set(link.deploymentId, arr);
127109 }
128110
129- const agentsByDeploymentId = await getJobAgentsByDeploymentId(deploymentIds);
130111 const items = deployments.map((dep) => ({
131- deployment: {
132- ...formatDeployment(dep),
133- jobAgents: (agentsByDeploymentId[dep.id] ?? []).map(
134- ({ ref, config }) => ({ ref, config }),
135- ),
136- },
112+ deployment: formatDeployment(dep),
137113 systems: (systemsByDeploymentId.get(dep.id) ?? []).map(formatSystem),
138114 }));
139115
@@ -155,8 +131,6 @@ const getDeployment: AsyncTypedHandler<
155131
156132 if (dep == null) throw new ApiError("Deployment not found", 404);
157133
158- const agentsByDeploymentId = await getJobAgentsByDeploymentId([deploymentId]);
159-
160134 const systemRows = await db
161135 .select({ system: schema.system })
162136 .from(schema.systemDeployment)
@@ -196,12 +170,7 @@ const getDeployment: AsyncTypedHandler<
196170 }
197171
198172 res.status(200).json({
199- deployment: {
200- ...formatDeployment(dep),
201- jobAgents: (agentsByDeploymentId[dep.id] ?? []).map(
202- ({ ref, config }) => ({ ref, config }),
203- ),
204- },
173+ deployment: formatDeployment(dep),
205174 systems: systemRows.map((r) => formatSystem(r.system)),
206175 variables: variables.map((v) => ({
207176 variable: {
@@ -234,48 +203,17 @@ const postDeployment: AsyncTypedHandler<
234203
235204 const id = uuidv4();
236205
237- const jobAgentId = body.jobAgentId ?? body.jobAgents?.[0]?.ref;
238- if (jobAgentId != null && !z.string().uuid().safeParse(jobAgentId).success)
239- throw new ApiError("Invalid job agent ID", 400);
240-
241- const jobAgentConfig =
242- body.jobAgentConfig ?? body.jobAgents?.[0]?.config ?? {};
243-
244206 await db.insert(schema.deployment).values({
245207 id,
246208 name: body.name,
247209 description: body.description ?? "",
248210 resourceSelector: body.resourceSelector ?? "false",
249- jobAgentSelector:
250- body.jobAgentSelector ??
251- (jobAgentId ? `jobAgent.id == "${jobAgentId}"` : "false"),
252- jobAgentConfig,
211+ jobAgentSelector: body.jobAgentSelector ?? "false",
212+ jobAgentConfig: body.jobAgentConfig ?? {},
253213 metadata: body.metadata ?? {},
254214 workspaceId,
255215 });
256216
257- if (jobAgentId)
258- await db
259- .insert(schema.deploymentJobAgent)
260- .values({
261- deploymentId: id,
262- jobAgentId,
263- config: jobAgentConfig,
264- })
265- .onConflictDoNothing();
266-
267- if (body.jobAgents != null && body.jobAgents.length > 0)
268- await db
269- .insert(schema.deploymentJobAgent)
270- .values(
271- body.jobAgents.map((agent) => ({
272- deploymentId: id,
273- jobAgentId: agent.ref,
274- config: agent.config,
275- })),
276- )
277- .onConflictDoNothing();
278-
279217 enqueueReleaseTargetsForDeployment(db, workspaceId, id);
280218
281219 res.status(202).json({ id, message: "Deployment creation requested" });
@@ -291,12 +229,7 @@ const upsertDeployment: AsyncTypedHandler<
291229 const isValid = validResourceSelector(body.resourceSelector);
292230 if (!isValid) throw new ApiError("Invalid resource selector", 400);
293231
294- const jobAgentId = body.jobAgentId ?? body.jobAgents?.[0]?.ref;
295- if (jobAgentId != null && !z.string().uuid().safeParse(jobAgentId).success)
296- throw new ApiError("Invalid job agent ID", 400);
297-
298- const jobAgentConfig =
299- body.jobAgentConfig ?? body.jobAgents?.[0]?.config ?? {};
232+ const jobAgentConfig = body.jobAgentConfig ?? {};
300233
301234 await db
302235 .insert(schema.deployment)
@@ -305,9 +238,7 @@ const upsertDeployment: AsyncTypedHandler<
305238 name: body.name,
306239 description: body.description ?? "",
307240 resourceSelector: body.resourceSelector ?? "false",
308- jobAgentSelector:
309- body.jobAgentSelector ??
310- (jobAgentId ? `jobAgent.id == "${jobAgentId}"` : "false"),
241+ jobAgentSelector: body.jobAgentSelector ?? "false",
311242 jobAgentConfig,
312243 metadata: body.metadata ?? {},
313244 workspaceId,
@@ -321,50 +252,10 @@ const upsertDeployment: AsyncTypedHandler<
321252 metadata: body.metadata ?? {},
322253 ...(body.jobAgentSelector != null
323254 ? { jobAgentSelector: body.jobAgentSelector, jobAgentConfig }
324- : jobAgentId != null
325- ? {
326- jobAgentSelector: `jobAgent.id == "${jobAgentId}"`,
327- jobAgentConfig,
328- }
329- : {}),
255+ : {}),
330256 },
331257 });
332258
333- if (jobAgentId)
334- await db
335- .insert(schema.deploymentJobAgent)
336- .values({
337- deploymentId,
338- jobAgentId,
339- config: jobAgentConfig,
340- })
341- .onConflictDoUpdate({
342- target: [
343- schema.deploymentJobAgent.deploymentId,
344- schema.deploymentJobAgent.jobAgentId,
345- ],
346- set: { config: jobAgentConfig },
347- });
348-
349- if (body.jobAgents != null)
350- await db.transaction(async (tx) => {
351- await tx
352- .delete(schema.deploymentJobAgent)
353- .where(eq(schema.deploymentJobAgent.deploymentId, deploymentId));
354-
355- if (body.jobAgents!.length > 0)
356- await tx
357- .insert(schema.deploymentJobAgent)
358- .values(
359- body.jobAgents!.map((agent) => ({
360- deploymentId,
361- jobAgentId: agent.ref,
362- config: agent.config,
363- })),
364- )
365- .onConflictDoNothing();
366- });
367-
368259 enqueueReleaseTargetsForDeployment(db, workspaceId, deploymentId);
369260
370261 res
0 commit comments