-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix: show latest release by deployment and environment #169
Changes from all commits
7489114
d6b1ce1
a902f04
5f50090
c7d71ac
c85f485
44f2758
0e8a50f
198fce0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,4 +1,6 @@ | ||||||||||||||||||||||||||||||||||
import type { Tx } from "@ctrlplane/db"; | ||||||||||||||||||||||||||||||||||
import _ from "lodash"; | ||||||||||||||||||||||||||||||||||
import { isPresent } from "ts-is-present"; | ||||||||||||||||||||||||||||||||||
import { z } from "zod"; | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
import { | ||||||||||||||||||||||||||||||||||
|
@@ -30,7 +32,7 @@ import { JobStatus } from "@ctrlplane/validators/jobs"; | |||||||||||||||||||||||||||||||||
import { createTRPCRouter, protectedProcedure } from "../trpc"; | ||||||||||||||||||||||||||||||||||
import { deploymentVariableRouter } from "./deployment-variable"; | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
const latestReleaseSubQuery = (db: Tx) => | ||||||||||||||||||||||||||||||||||
const latestActiveReleaseSubQuery = (db: Tx) => | ||||||||||||||||||||||||||||||||||
db | ||||||||||||||||||||||||||||||||||
.select({ | ||||||||||||||||||||||||||||||||||
id: release.id, | ||||||||||||||||||||||||||||||||||
|
@@ -39,13 +41,15 @@ const latestReleaseSubQuery = (db: Tx) => | |||||||||||||||||||||||||||||||||
createdAt: release.createdAt, | ||||||||||||||||||||||||||||||||||
name: release.name, | ||||||||||||||||||||||||||||||||||
config: release.config, | ||||||||||||||||||||||||||||||||||
environmentId: releaseJobTrigger.environmentId, | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
rank: sql<number>`ROW_NUMBER() OVER (PARTITION BY deployment_id ORDER BY created_at DESC)`.as( | ||||||||||||||||||||||||||||||||||
rank: sql<number>`ROW_NUMBER() OVER (PARTITION BY ${release.deploymentId}, ${releaseJobTrigger.environmentId} ORDER BY ${release.createdAt} DESC)`.as( | ||||||||||||||||||||||||||||||||||
"rank", | ||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||
.from(release) | ||||||||||||||||||||||||||||||||||
.as("release"); | ||||||||||||||||||||||||||||||||||
.innerJoin(releaseJobTrigger, eq(releaseJobTrigger.releaseId, release.id)) | ||||||||||||||||||||||||||||||||||
.as("active_releases"); | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
export const deploymentRouter = createTRPCRouter({ | ||||||||||||||||||||||||||||||||||
variable: deploymentVariableRouter, | ||||||||||||||||||||||||||||||||||
|
@@ -203,20 +207,26 @@ export const deploymentRouter = createTRPCRouter({ | |||||||||||||||||||||||||||||||||
.on({ type: "system", id: input }), | ||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||
.query(async ({ ctx, input }) => { | ||||||||||||||||||||||||||||||||||
const latestRelease = latestReleaseSubQuery(ctx.db); | ||||||||||||||||||||||||||||||||||
const activeRelease = latestActiveReleaseSubQuery(ctx.db); | ||||||||||||||||||||||||||||||||||
return ctx.db | ||||||||||||||||||||||||||||||||||
.select() | ||||||||||||||||||||||||||||||||||
.from(deployment) | ||||||||||||||||||||||||||||||||||
.leftJoin( | ||||||||||||||||||||||||||||||||||
latestRelease, | ||||||||||||||||||||||||||||||||||
activeRelease, | ||||||||||||||||||||||||||||||||||
and( | ||||||||||||||||||||||||||||||||||
eq(latestRelease.deploymentId, deployment.id), | ||||||||||||||||||||||||||||||||||
eq(latestRelease.rank, 1), | ||||||||||||||||||||||||||||||||||
eq(activeRelease.deploymentId, deployment.id), | ||||||||||||||||||||||||||||||||||
eq(activeRelease.rank, 1), | ||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||
.where(eq(deployment.systemId, input)) | ||||||||||||||||||||||||||||||||||
.then((r) => | ||||||||||||||||||||||||||||||||||
r.map((row) => ({ ...row.deployment, latestRelease: row.release })), | ||||||||||||||||||||||||||||||||||
.then((ts) => | ||||||||||||||||||||||||||||||||||
_.chain(ts) | ||||||||||||||||||||||||||||||||||
.groupBy((t) => t.deployment.id) | ||||||||||||||||||||||||||||||||||
.map((t) => ({ | ||||||||||||||||||||||||||||||||||
...t[0]!.deployment, | ||||||||||||||||||||||||||||||||||
activeReleases: t.map((a) => a.active_releases).filter(isPresent), | ||||||||||||||||||||||||||||||||||
})) | ||||||||||||||||||||||||||||||||||
.value(), | ||||||||||||||||||||||||||||||||||
Comment on lines
+222
to
+229
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Handle potential empty groups to prevent runtime errors The use of Apply this diff to add a null check: .groupBy((t) => t.deployment.id)
.map((t) => ({
- ...t[0]!.deployment,
+ ...(t[0]?.deployment ?? {}),
activeReleases: t.map((a) => a.active_releases).filter(isPresent),
})) 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||
}), | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
|
@@ -304,21 +314,24 @@ export const deploymentRouter = createTRPCRouter({ | |||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||
.input(z.string().uuid()) | ||||||||||||||||||||||||||||||||||
.query(async ({ ctx, input }) => { | ||||||||||||||||||||||||||||||||||
const latestRelease = latestReleaseSubQuery(ctx.db); | ||||||||||||||||||||||||||||||||||
const activeRelease = latestActiveReleaseSubQuery(ctx.db); | ||||||||||||||||||||||||||||||||||
return ctx.db | ||||||||||||||||||||||||||||||||||
.select() | ||||||||||||||||||||||||||||||||||
.from(deployment) | ||||||||||||||||||||||||||||||||||
.innerJoin(system, eq(system.id, deployment.systemId)) | ||||||||||||||||||||||||||||||||||
.leftJoin( | ||||||||||||||||||||||||||||||||||
latestRelease, | ||||||||||||||||||||||||||||||||||
activeRelease, | ||||||||||||||||||||||||||||||||||
and( | ||||||||||||||||||||||||||||||||||
eq(latestRelease.deploymentId, deployment.id), | ||||||||||||||||||||||||||||||||||
eq(latestRelease.rank, 1), | ||||||||||||||||||||||||||||||||||
eq(activeRelease.deploymentId, deployment.id), | ||||||||||||||||||||||||||||||||||
eq(activeRelease.rank, 1), | ||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||
.where(eq(system.workspaceId, input)) | ||||||||||||||||||||||||||||||||||
.then((r) => | ||||||||||||||||||||||||||||||||||
r.map((row) => ({ ...row.deployment, latestRelease: row.release })), | ||||||||||||||||||||||||||||||||||
r.map((row) => ({ | ||||||||||||||||||||||||||||||||||
...row.deployment, | ||||||||||||||||||||||||||||||||||
latestActiveReleases: row.active_releases, | ||||||||||||||||||||||||||||||||||
})), | ||||||||||||||||||||||||||||||||||
Comment on lines
+331
to
+334
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix inconsistent property naming The property name Apply this diff to maintain consistency: r.map((row) => ({
...row.deployment,
- latestActiveReleases: row.active_releases,
+ activeReleases: row.active_releases,
})), 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||
}), | ||||||||||||||||||||||||||||||||||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix incorrect condition logic for showing getting started guide.
The current condition shows the getting started guide when there ARE active releases, which seems backwards. The getting started guide should typically be shown when there are no active releases.
Apply one of these fixes:
Or alternatively:
📝 Committable suggestion