diff --git a/apps/webservice/src/app/api/v1/config/route.ts b/apps/webservice/src/app/api/v1/config/route.ts index 5bdf14832..a24b02deb 100644 --- a/apps/webservice/src/app/api/v1/config/route.ts +++ b/apps/webservice/src/app/api/v1/config/route.ts @@ -235,7 +235,9 @@ const upsertReleases = async (db: Tx, config: CacV1, userId: string) => { .filter(isPresent); if (releaseMetadataInserts.length > 0) - await db.insert(schema.releaseMetadata).values(releaseMetadataInserts); + await db + .insert(schema.deploymentVersionMetadata) + .values(releaseMetadataInserts); await createReleaseJobTriggers(db, "new_release") .causedById(userId) diff --git a/apps/webservice/src/app/api/v1/job-agents/[agentId]/jobs/running/route.ts b/apps/webservice/src/app/api/v1/job-agents/[agentId]/jobs/running/route.ts index 953504a6a..3eeb25df9 100644 --- a/apps/webservice/src/app/api/v1/job-agents/[agentId]/jobs/running/route.ts +++ b/apps/webservice/src/app/api/v1/job-agents/[agentId]/jobs/running/route.ts @@ -39,8 +39,11 @@ export const GET = async ( eq(SCHEMA.deploymentVersion.id, SCHEMA.releaseJobTrigger.versionId), ) .leftJoin( - SCHEMA.releaseMetadata, - eq(SCHEMA.releaseMetadata.releaseId, SCHEMA.deploymentVersion.id), + SCHEMA.deploymentVersionMetadata, + eq( + SCHEMA.deploymentVersionMetadata.releaseId, + SCHEMA.deploymentVersion.id, + ), ) .leftJoin( SCHEMA.deployment, diff --git a/apps/webservice/src/app/api/v1/releases/[releaseId]/route.ts b/apps/webservice/src/app/api/v1/releases/[releaseId]/route.ts index 11731c1ab..28e026311 100644 --- a/apps/webservice/src/app/api/v1/releases/[releaseId]/route.ts +++ b/apps/webservice/src/app/api/v1/releases/[releaseId]/route.ts @@ -19,7 +19,7 @@ import { authn, authz } from "../../auth"; import { parseBody } from "../../body-parser"; import { request } from "../../middleware"; -const patchSchema = SCHEMA.updateRelease.and( +const patchSchema = SCHEMA.updateDeploymentVersion.and( z.object({ metadata: z.record(z.string()).optional() }), ); @@ -50,7 +50,7 @@ export const PATCH = request() if (Object.keys(body.metadata ?? {}).length > 0) await ctx.db - .insert(SCHEMA.releaseMetadata) + .insert(SCHEMA.deploymentVersionMetadata) .values( Object.entries(body.metadata ?? {}).map(([key, value]) => ({ releaseId, @@ -60,10 +60,12 @@ export const PATCH = request() ) .onConflictDoUpdate({ target: [ - SCHEMA.releaseMetadata.key, - SCHEMA.releaseMetadata.releaseId, + SCHEMA.deploymentVersionMetadata.key, + SCHEMA.deploymentVersionMetadata.releaseId, ], - set: buildConflictUpdateColumns(SCHEMA.releaseMetadata, ["value"]), + set: buildConflictUpdateColumns(SCHEMA.deploymentVersionMetadata, [ + "value", + ]), }); await createReleaseJobTriggers(ctx.db, "release_updated") diff --git a/apps/webservice/src/app/api/v1/releases/route.ts b/apps/webservice/src/app/api/v1/releases/route.ts index ee1dfab9a..63d39166f 100644 --- a/apps/webservice/src/app/api/v1/releases/route.ts +++ b/apps/webservice/src/app/api/v1/releases/route.ts @@ -27,7 +27,7 @@ import { authn, authz } from "../auth"; import { parseBody } from "../body-parser"; import { request } from "../middleware"; -const bodySchema = schema.createRelease.and( +const bodySchema = schema.createDeploymentVersion.and( z.object({ metadata: z.record(z.string()).optional(), status: z.nativeEnum(ReleaseStatus).optional(), @@ -83,7 +83,7 @@ export const POST = request() if (Object.keys(metadata).length > 0) await db - .insert(schema.releaseMetadata) + .insert(schema.deploymentVersionMetadata) .values( Object.entries(metadata).map(([key, value]) => ({ releaseId: release.id, @@ -93,12 +93,13 @@ export const POST = request() ) .onConflictDoUpdate({ target: [ - schema.releaseMetadata.releaseId, - schema.releaseMetadata.key, + schema.deploymentVersionMetadata.releaseId, + schema.deploymentVersionMetadata.key, ], - set: buildConflictUpdateColumns(schema.releaseMetadata, [ - "value", - ]), + set: buildConflictUpdateColumns( + schema.deploymentVersionMetadata, + ["value"], + ), }); const shouldTrigger = diff --git a/packages/api/src/router/deployment-version.ts b/packages/api/src/router/deployment-version.ts index 4baba4e63..d599addef 100644 --- a/packages/api/src/router/deployment-version.ts +++ b/packages/api/src/router/deployment-version.ts @@ -44,7 +44,7 @@ import { import { createTRPCRouter, protectedProcedure } from "../trpc"; import { releaseDeployRouter } from "./release-deploy"; -import { releaseMetadataKeysRouter } from "./release-metadata-keys"; +import { deploymentVersionMetadataKeysRouter } from "./release-metadata-keys"; export const versionRouter = createTRPCRouter({ list: protectedProcedure @@ -68,7 +68,7 @@ export const versionRouter = createTRPCRouter({ SCHEMA.deploymentVersion.deploymentId, input.deploymentId, ); - const releaseConditionCheck = SCHEMA.releaseMatchesCondition( + const releaseConditionCheck = SCHEMA.deploymentVersionMatchesCondition( ctx.db, input.filter, ); @@ -158,8 +158,8 @@ export const versionRouter = createTRPCRouter({ metadata: Object.fromEntries( await ctx.db .select() - .from(SCHEMA.releaseMetadata) - .where(eq(SCHEMA.releaseMetadata.releaseId, data.id)) + .from(SCHEMA.deploymentVersionMetadata) + .where(eq(SCHEMA.deploymentVersionMetadata.releaseId, data.id)) .then((r) => r.map((k) => [k.key, k.value])), ), }; @@ -175,7 +175,7 @@ export const versionRouter = createTRPCRouter({ .perform(Permission.DeploymentVersionCreate) .on({ type: "deployment", id: input.deploymentId }), }) - .input(SCHEMA.createRelease) + .input(SCHEMA.createDeploymentVersion) .mutation(async ({ ctx, input }) => { const { name, ...rest } = input; const relName = name == null || name === "" ? rest.version : name; @@ -212,7 +212,9 @@ export const versionRouter = createTRPCRouter({ }), update: protectedProcedure - .input(z.object({ id: z.string().uuid(), data: SCHEMA.updateRelease })) + .input( + z.object({ id: z.string().uuid(), data: SCHEMA.updateDeploymentVersion }), + ) .mutation(async ({ ctx, input: { id, data } }) => db .update(SCHEMA.deploymentVersion) @@ -326,7 +328,10 @@ export const versionRouter = createTRPCRouter({ .where( and( eq(SCHEMA.deploymentVersion.id, rel.id), - SCHEMA.releaseMatchesCondition(db, releaseChannelFilter), + SCHEMA.deploymentVersionMatchesCondition( + db, + releaseChannelFilter, + ), ), ) .then(takeFirstOrNull); @@ -613,7 +618,7 @@ export const versionRouter = createTRPCRouter({ eq(SCHEMA.deploymentVersion.status, ReleaseStatus.Ready), eq(SCHEMA.deploymentVersion.deploymentId, deploymentId), env.deployment_version_channel != null - ? SCHEMA.releaseMatchesCondition( + ? SCHEMA.deploymentVersionMatchesCondition( ctx.db, env.deployment_version_channel.releaseFilter, ) @@ -668,5 +673,5 @@ export const versionRouter = createTRPCRouter({ }), }), - metadataKeys: releaseMetadataKeysRouter, + metadataKeys: deploymentVersionMetadataKeysRouter, }); diff --git a/packages/api/src/router/deployment.ts b/packages/api/src/router/deployment.ts index 6f110ec85..cff4eaddd 100644 --- a/packages/api/src/router/deployment.ts +++ b/packages/api/src/router/deployment.ts @@ -96,7 +96,7 @@ const releaseChannelRouter = createTRPCRouter({ .where( and( eq(SCHEMA.deploymentVersion.deploymentId, channel.deploymentId), - SCHEMA.releaseMatchesCondition(ctx.db, filter), + SCHEMA.deploymentVersionMatchesCondition(ctx.db, filter), ), ) .then(takeFirst) diff --git a/packages/api/src/router/release-metadata-keys.ts b/packages/api/src/router/release-metadata-keys.ts index f586855d6..bfb71a982 100644 --- a/packages/api/src/router/release-metadata-keys.ts +++ b/packages/api/src/router/release-metadata-keys.ts @@ -7,7 +7,7 @@ import { Permission } from "@ctrlplane/validators/auth"; import { createTRPCRouter, protectedProcedure } from "../trpc"; -export const releaseMetadataKeysRouter = createTRPCRouter({ +export const deploymentVersionMetadataKeysRouter = createTRPCRouter({ bySystem: protectedProcedure .meta({ authorizationCheck: ({ canUser, input }) => @@ -19,11 +19,14 @@ export const releaseMetadataKeysRouter = createTRPCRouter({ .input(z.string().uuid()) .query(async ({ input, ctx }) => ctx.db - .selectDistinct({ key: SCHEMA.releaseMetadata.key }) + .selectDistinct({ key: SCHEMA.deploymentVersionMetadata.key }) .from(SCHEMA.deploymentVersion) .innerJoin( - SCHEMA.releaseMetadata, - eq(SCHEMA.releaseMetadata.releaseId, SCHEMA.deploymentVersion.id), + SCHEMA.deploymentVersionMetadata, + eq( + SCHEMA.deploymentVersionMetadata.releaseId, + SCHEMA.deploymentVersion.id, + ), ) .innerJoin( SCHEMA.deployment, @@ -44,11 +47,14 @@ export const releaseMetadataKeysRouter = createTRPCRouter({ .input(z.string().uuid()) .query(async ({ input, ctx }) => ctx.db - .selectDistinct({ key: SCHEMA.releaseMetadata.key }) + .selectDistinct({ key: SCHEMA.deploymentVersionMetadata.key }) .from(SCHEMA.deploymentVersion) .innerJoin( - SCHEMA.releaseMetadata, - eq(SCHEMA.releaseMetadata.releaseId, SCHEMA.deploymentVersion.id), + SCHEMA.deploymentVersionMetadata, + eq( + SCHEMA.deploymentVersionMetadata.releaseId, + SCHEMA.deploymentVersion.id, + ), ) .innerJoin( SCHEMA.deployment, diff --git a/packages/db/src/schema/release.ts b/packages/db/src/schema/release.ts index 93c36fcfd..2419ad50f 100644 --- a/packages/db/src/schema/release.ts +++ b/packages/db/src/schema/release.ts @@ -132,7 +132,7 @@ export const deploymentVersion = pgTable( export type DeploymentVersion = InferSelectModel; -export const createRelease = createInsertSchema(deploymentVersion, { +export const createDeploymentVersion = createInsertSchema(deploymentVersion, { version: z.string().min(1), name: z.string().optional(), config: z.record(z.any()), @@ -150,9 +150,9 @@ export const createRelease = createInsertSchema(deploymentVersion, { .default([]), }); -export const updateRelease = createRelease.partial(); -export type UpdateRelease = z.infer; -export const releaseMetadata = pgTable( +export const updateDeploymentVersion = createDeploymentVersion.partial(); +export type UpdateDeploymentVersion = z.infer; +export const deploymentVersionMetadata = pgTable( "deployment_version_metadata", { id: uuid("id").primaryKey().defaultRandom().notNull(), @@ -229,11 +229,11 @@ const buildMetadataCondition = (tx: Tx, cond: MetadataCondition): SQL => { return notExists( tx .select({ value: sql`1` }) - .from(releaseMetadata) + .from(deploymentVersionMetadata) .where( and( - eq(releaseMetadata.releaseId, deploymentVersion.id), - eq(releaseMetadata.key, cond.key), + eq(deploymentVersionMetadata.releaseId, deploymentVersion.id), + eq(deploymentVersionMetadata.key, cond.key), ), ) .limit(1), @@ -243,12 +243,12 @@ const buildMetadataCondition = (tx: Tx, cond: MetadataCondition): SQL => { return exists( tx .select({ value: sql`1` }) - .from(releaseMetadata) + .from(deploymentVersionMetadata) .where( and( - eq(releaseMetadata.releaseId, deploymentVersion.id), - eq(releaseMetadata.key, cond.key), - sql`${releaseMetadata.value} ~ ${cond.value}`, + eq(deploymentVersionMetadata.releaseId, deploymentVersion.id), + eq(deploymentVersionMetadata.key, cond.key), + sql`${deploymentVersionMetadata.value} ~ ${cond.value}`, ), ) .limit(1), @@ -258,12 +258,12 @@ const buildMetadataCondition = (tx: Tx, cond: MetadataCondition): SQL => { return exists( tx .select({ value: sql`1` }) - .from(releaseMetadata) + .from(deploymentVersionMetadata) .where( and( - eq(releaseMetadata.releaseId, deploymentVersion.id), - eq(releaseMetadata.key, cond.key), - ilike(releaseMetadata.value, `${cond.value}%`), + eq(deploymentVersionMetadata.releaseId, deploymentVersion.id), + eq(deploymentVersionMetadata.key, cond.key), + ilike(deploymentVersionMetadata.value, `${cond.value}%`), ), ) .limit(1), @@ -273,12 +273,12 @@ const buildMetadataCondition = (tx: Tx, cond: MetadataCondition): SQL => { return exists( tx .select({ value: sql`1` }) - .from(releaseMetadata) + .from(deploymentVersionMetadata) .where( and( - eq(releaseMetadata.releaseId, deploymentVersion.id), - eq(releaseMetadata.key, cond.key), - ilike(releaseMetadata.value, `%${cond.value}`), + eq(deploymentVersionMetadata.releaseId, deploymentVersion.id), + eq(deploymentVersionMetadata.key, cond.key), + ilike(deploymentVersionMetadata.value, `%${cond.value}`), ), ) .limit(1), @@ -288,12 +288,12 @@ const buildMetadataCondition = (tx: Tx, cond: MetadataCondition): SQL => { return exists( tx .select({ value: sql`1` }) - .from(releaseMetadata) + .from(deploymentVersionMetadata) .where( and( - eq(releaseMetadata.releaseId, deploymentVersion.id), - eq(releaseMetadata.key, cond.key), - ilike(releaseMetadata.value, `%${cond.value}%`), + eq(deploymentVersionMetadata.releaseId, deploymentVersion.id), + eq(deploymentVersionMetadata.key, cond.key), + ilike(deploymentVersionMetadata.value, `%${cond.value}%`), ), ) .limit(1), @@ -302,12 +302,12 @@ const buildMetadataCondition = (tx: Tx, cond: MetadataCondition): SQL => { return exists( tx .select({ value: sql`1` }) - .from(releaseMetadata) + .from(deploymentVersionMetadata) .where( and( - eq(releaseMetadata.releaseId, deploymentVersion.id), - eq(releaseMetadata.key, cond.key), - eq(releaseMetadata.value, cond.value), + eq(deploymentVersionMetadata.releaseId, deploymentVersion.id), + eq(deploymentVersionMetadata.key, cond.key), + eq(deploymentVersionMetadata.value, cond.value), ), ) .limit(1), @@ -353,7 +353,7 @@ const buildCondition = (tx: Tx, cond: ReleaseCondition): SQL => { return cond.not ? not(con) : con; }; -export function releaseMatchesCondition( +export function deploymentVersionMatchesCondition( tx: Tx, condition?: ReleaseCondition | null, ): SQL | undefined { diff --git a/packages/job-dispatch/src/environment-creation.ts b/packages/job-dispatch/src/environment-creation.ts index 533a8b3fc..5eaa8ab48 100644 --- a/packages/job-dispatch/src/environment-creation.ts +++ b/packages/job-dispatch/src/environment-creation.ts @@ -57,7 +57,10 @@ export const createJobsForNewEnvironment = async ( .where( and( eq(SCHEMA.deploymentVersion.deploymentId, deployment.id), - SCHEMA.releaseMatchesCondition(db, releaseFilter ?? undefined), + SCHEMA.deploymentVersionMatchesCondition( + db, + releaseFilter ?? undefined, + ), ), ) .orderBy(desc(SCHEMA.deploymentVersion.createdAt)) diff --git a/packages/job-dispatch/src/environment-release-channel-update.ts b/packages/job-dispatch/src/environment-release-channel-update.ts index 94214d9d8..eb9c54dcd 100644 --- a/packages/job-dispatch/src/environment-release-channel-update.ts +++ b/packages/job-dispatch/src/environment-release-channel-update.ts @@ -80,7 +80,7 @@ const cancelJobsForExcludedReleases = async ( eq(SCHEMA.deploymentVersion.deploymentId, deploymentId), eq(SCHEMA.releaseJobTrigger.environmentId, environmentId), eq(SCHEMA.job.status, JobStatus.Pending), - SCHEMA.releaseMatchesCondition(db, excludedReleasesFilter), + SCHEMA.deploymentVersionMatchesCondition(db, excludedReleasesFilter), ), ) .then((rows) => rows.map((r) => r.job.id)); @@ -104,7 +104,7 @@ const getLatestReleaseMatchingFilter = ( .where( and( eq(SCHEMA.deploymentVersion.deploymentId, deploymentId), - SCHEMA.releaseMatchesCondition(db, releaseFilter), + SCHEMA.deploymentVersionMatchesCondition(db, releaseFilter), ), ) .orderBy(desc(SCHEMA.deploymentVersion.createdAt)) diff --git a/packages/job-dispatch/src/policies/release-dependency.ts b/packages/job-dispatch/src/policies/release-dependency.ts index a00594d18..9393a3f18 100644 --- a/packages/job-dispatch/src/policies/release-dependency.ts +++ b/packages/job-dispatch/src/policies/release-dependency.ts @@ -118,7 +118,7 @@ export const isPassingReleaseDependencyPolicy = async ( ) .where( and( - schema.releaseMatchesCondition(db, dep.releaseFilter), + schema.deploymentVersionMatchesCondition(db, dep.releaseFilter), eq(schema.deployment.id, dep.deploymentId), inArray(latestJobSubquery.resourceId, allIds), eq(latestJobSubquery.rank, 1), diff --git a/packages/job-dispatch/src/policies/release-sequencing.ts b/packages/job-dispatch/src/policies/release-sequencing.ts index d9fed8be4..99f4a4986 100644 --- a/packages/job-dispatch/src/policies/release-sequencing.ts +++ b/packages/job-dispatch/src/policies/release-sequencing.ts @@ -146,7 +146,7 @@ const isReleaseLatestActiveForEnvironment = async ( isNull(schema.resource.deletedAt), eq(schema.deploymentVersion.deploymentId, release.deploymentId), eq(schema.releaseJobTrigger.environmentId, environmentId), - schema.releaseMatchesCondition( + schema.deploymentVersionMatchesCondition( db, environment.release_channel?.rcReleaseFilter, ), diff --git a/packages/job-dispatch/src/policies/release-string-check.ts b/packages/job-dispatch/src/policies/release-string-check.ts index d1df28834..ab5545965 100644 --- a/packages/job-dispatch/src/policies/release-string-check.ts +++ b/packages/job-dispatch/src/policies/release-string-check.ts @@ -89,7 +89,7 @@ export const isPassingReleaseStringCheckPolicy: ReleasePolicyChecker = async ( .where( and( eq(schema.deploymentVersion.id, release.id), - schema.releaseMatchesCondition(db, releaseChannelFilter), + schema.deploymentVersionMatchesCondition(db, releaseChannelFilter), ), ) .then(takeFirstOrNull); diff --git a/packages/job-dispatch/src/resource/dispatch-resource.ts b/packages/job-dispatch/src/resource/dispatch-resource.ts index b4baf07a7..fa389cf03 100644 --- a/packages/job-dispatch/src/resource/dispatch-resource.ts +++ b/packages/job-dispatch/src/resource/dispatch-resource.ts @@ -86,7 +86,10 @@ export async function dispatchJobsForAddedResources( .where( and( eq(SCHEMA.deploymentVersion.deploymentId, id), - SCHEMA.releaseMatchesCondition(db, releaseFilter ?? undefined), + SCHEMA.deploymentVersionMatchesCondition( + db, + releaseFilter ?? undefined, + ), ), ) .orderBy(desc(SCHEMA.deploymentVersion.createdAt))