setReleaseId(r.id)}
className={cn(
"sticky left-0 z-10 min-w-[250px] backdrop-blur-lg",
"items-center border-b border-l px-4 text-lg",
diff --git a/packages/api/src/router/release.ts b/packages/api/src/router/release.ts
index f69449c86..9e3f32080 100644
--- a/packages/api/src/router/release.ts
+++ b/packages/api/src/router/release.ts
@@ -25,6 +25,7 @@ import {
release,
releaseDependency,
releaseJobTrigger,
+ releaseMetadata,
target,
} from "@ctrlplane/db/schema";
import {
@@ -110,7 +111,20 @@ export const releaseRouter = createTRPCRouter({
}))
.value()
.at(0),
- ),
+ )
+ .then(async (data) => {
+ if (data == null) return null;
+ return {
+ ...data,
+ metadata: Object.fromEntries(
+ await ctx.db
+ .select()
+ .from(releaseMetadata)
+ .where(eq(releaseMetadata.releaseId, data.id))
+ .then((r) => r.map((k) => [k.key, k.value])),
+ ),
+ };
+ }),
),
deploy: createTRPCRouter({
diff --git a/packages/db/src/schema/release.ts b/packages/db/src/schema/release.ts
index e19e439c8..71c4c83db 100644
--- a/packages/db/src/schema/release.ts
+++ b/packages/db/src/schema/release.ts
@@ -45,6 +45,8 @@ export const releaseDependency = pgTable(
}),
);
+export type ReleaseDependency = InferSelectModel;
+
const createReleaseDependency = createInsertSchema(releaseDependency).omit({
id: true,
});
@@ -55,7 +57,10 @@ export const release = pgTable(
id: uuid("id").primaryKey().defaultRandom(),
name: text("name").notNull(),
version: text("version").notNull(),
- config: jsonb("config").notNull().default("{}"),
+ config: jsonb("config")
+ .notNull()
+ .default("{}")
+ .$type>(),
deploymentId: uuid("deployment_id")
.notNull()
.references(() => deployment.id, { onDelete: "cascade" }),
@@ -66,7 +71,11 @@ export const release = pgTable(
export type Release = InferSelectModel;
-export const createRelease = createInsertSchema(release)
+export const createRelease = createInsertSchema(release, {
+ version: z.string().min(1),
+ name: z.string().min(1),
+ config: z.record(z.any()),
+})
.omit({ id: true })
.extend({
releaseDependencies: z
|