);
};
@@ -200,16 +86,11 @@ export const LazyDeploymentEnvironmentCell: React.FC<
const { ref, inView } = useInView();
return (
-
- {!inView && (
-
- )}
+
+ {!inView && }
{inView && }
);
diff --git a/packages/api/src/router/system-table.ts b/packages/api/src/router/system-table.ts
new file mode 100644
index 000000000..3fb134f4c
--- /dev/null
+++ b/packages/api/src/router/system-table.ts
@@ -0,0 +1,68 @@
+import { z } from "zod";
+
+import { and, desc, eq, sql, takeFirstOrNull } from "@ctrlplane/db";
+import * as schema from "@ctrlplane/db/schema";
+import { Permission } from "@ctrlplane/validators/auth";
+
+import { createTRPCRouter, protectedProcedure } from "../trpc";
+
+export const systemTableRouter = createTRPCRouter({
+ cell: protectedProcedure
+ .input(
+ z.object({
+ environmentId: z.string().uuid(),
+ deploymentId: z.string().uuid(),
+ }),
+ )
+ .meta({
+ authorizationCheck: ({ canUser, input }) =>
+ canUser
+ .perform(Permission.DeploymentGet)
+ .on({ type: "deployment", id: input.deploymentId }),
+ })
+ .query(({ ctx, input }) => {
+ const { deploymentId, environmentId } = input;
+
+ return ctx.db
+ .select({
+ statuses: sql<
+ schema.JobStatus[]
+ >`json_agg(distinct ${schema.job.status})`,
+ versionId: schema.deploymentVersion.id,
+ versionName: schema.deploymentVersion.name,
+ versionCreatedAt: schema.deploymentVersion.createdAt,
+ versionTag: schema.deploymentVersion.tag,
+ })
+ .from(schema.job)
+ .innerJoin(
+ schema.releaseJob,
+ eq(schema.releaseJob.jobId, schema.job.id),
+ )
+ .innerJoin(
+ schema.release,
+ eq(schema.release.id, schema.releaseJob.releaseId),
+ )
+ .innerJoin(
+ schema.versionRelease,
+ eq(schema.release.versionReleaseId, schema.versionRelease.id),
+ )
+ .innerJoin(
+ schema.deploymentVersion,
+ eq(schema.versionRelease.versionId, schema.deploymentVersion.id),
+ )
+ .innerJoin(
+ schema.releaseTarget,
+ eq(schema.versionRelease.releaseTargetId, schema.releaseTarget.id),
+ )
+ .where(
+ and(
+ eq(schema.releaseTarget.deploymentId, deploymentId),
+ eq(schema.releaseTarget.environmentId, environmentId),
+ ),
+ )
+ .groupBy(schema.deploymentVersion.id)
+ .orderBy(desc(schema.deploymentVersion.createdAt))
+ .limit(1)
+ .then(takeFirstOrNull);
+ }),
+});
diff --git a/packages/api/src/router/system.ts b/packages/api/src/router/system.ts
index 6fa6bfc4b..c89391d6e 100644
--- a/packages/api/src/router/system.ts
+++ b/packages/api/src/router/system.ts
@@ -36,6 +36,7 @@ import {
import { createTRPCRouter, protectedProcedure } from "../trpc";
import { directoryRouter } from "./directory";
+import { systemTableRouter } from "./system-table";
export const systemRouter = createTRPCRouter({
list: protectedProcedure
@@ -315,4 +316,5 @@ export const systemRouter = createTRPCRouter({
}),
directory: directoryRouter,
+ table: systemTableRouter,
});