Skip to content

Commit 83df9e2

Browse files
ampagentarjunkomath
andcommitted
Show build server in build details
Amp-Thread-ID: https://ampcode.com/threads/T-019fc6e3-ac3b-77e6-928a-10b57adca428 Co-authored-by: Arjun Komath <arjunkomath@gmail.com>
1 parent 89403d5 commit 83df9e2

3 files changed

Lines changed: 52 additions & 16 deletions

File tree

‎web/app/(dashboard)/dashboard/projects/[slug]/[env]/services/[serviceId]/builds/[buildId]/page.tsx‎

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@ import { notFound } from "next/navigation";
33
import { BuildDetails } from "@/components/builds/build-details";
44
import { SetBreadcrumbs } from "@/components/core/breadcrumb-data";
55
import { db } from "@/db";
6-
import { builds, projects, serviceRevisions, services } from "@/db/schema";
6+
import {
7+
builds,
8+
projects,
9+
servers,
10+
serviceRevisions,
11+
services,
12+
} from "@/db/schema";
713
import { parseServiceRevisionSpec } from "@/lib/service-revision-changes";
814

915
async function getBuild(
@@ -27,13 +33,18 @@ async function getBuild(
2733

2834
if (!service) return null;
2935

30-
const build = await db
31-
.select()
36+
const buildData = await db
37+
.select({
38+
build: builds,
39+
server: { id: servers.id, name: servers.name },
40+
})
3241
.from(builds)
42+
.leftJoin(servers, eq(builds.claimedBy, servers.id))
3343
.where(and(eq(builds.id, buildId), eq(builds.serviceId, serviceId)))
3444
.then((r) => r[0]);
3545

36-
if (!build) return null;
46+
if (!buildData) return null;
47+
const { build, server } = buildData;
3748

3849
const revision = await db
3950
.select({ specification: serviceRevisions.specification })
@@ -63,6 +74,7 @@ async function getBuild(
6374
project,
6475
service,
6576
build,
77+
server,
6678
githubRepo,
6779
};
6880
}
@@ -108,6 +120,7 @@ export default async function BuildPage({
108120
envName={env}
109121
service={data.service}
110122
build={data.build}
123+
server={data.server}
111124
githubRepo={data.githubRepo}
112125
/>
113126
</>
Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
11
import { eq } from "drizzle-orm";
22
import { type NextRequest, NextResponse } from "next/server";
33
import { db } from "@/db";
4-
import { builds } from "@/db/schema";
4+
import { builds, servers } from "@/db/schema";
55

66
export async function GET(
77
_: NextRequest,
88
{ params }: { params: Promise<{ buildId: string }> },
99
) {
1010
const { buildId } = await params;
1111

12-
const [build] = await db.select().from(builds).where(eq(builds.id, buildId));
12+
const [buildData] = await db
13+
.select({
14+
build: builds,
15+
server: { id: servers.id, name: servers.name },
16+
})
17+
.from(builds)
18+
.leftJoin(servers, eq(builds.claimedBy, servers.id))
19+
.where(eq(builds.id, buildId));
1320

14-
if (!build) {
21+
if (!buildData) {
1522
return NextResponse.json({ error: "Build not found" }, { status: 404 });
1623
}
1724

18-
return NextResponse.json({ build });
25+
return NextResponse.json(buildData);
1926
}

‎web/components/builds/build-details.tsx‎

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ type BuildWithDates = Omit<
4242
claimedAt: string | Date | null;
4343
};
4444

45+
type BuildServer = { id: string; name: string };
46+
4547
const STATUS_CONFIG: Record<
4648
BuildStatus,
4749
{
@@ -97,28 +99,31 @@ export function BuildDetails({
9799
envName,
98100
service,
99101
build: initialBuild,
102+
server: initialServer,
100103
githubRepo,
101104
}: {
102105
projectSlug: string;
103106
envName: string;
104107
service: Pick<Service, "id" | "name">;
105108
build: BuildWithDates;
109+
server: BuildServer | null;
106110
githubRepo: { repoFullName: string } | null;
107111
}) {
108112
const router = useRouter();
109113
const [isCancelling, setIsCancelling] = useState(false);
110114
const [isRetrying, setIsRetrying] = useState(false);
111115

112-
const { data } = useSWR<{ build: BuildWithDates }>(
113-
`/api/builds/${initialBuild.id}`,
114-
fetcher,
115-
{
116-
fallbackData: { build: initialBuild },
117-
refreshInterval: isActiveBuild(initialBuild.status) ? 1500 : 0,
118-
},
119-
);
116+
const { data } = useSWR<{
117+
build: BuildWithDates;
118+
server: BuildServer | null;
119+
}>(`/api/builds/${initialBuild.id}`, fetcher, {
120+
fallbackData: { build: initialBuild, server: initialServer },
121+
refreshInterval: (latestData) =>
122+
isActiveBuild(latestData?.build.status ?? initialBuild.status) ? 1500 : 0,
123+
});
120124

121125
const build = data?.build || initialBuild;
126+
const server = data ? data.server : initialServer;
122127
const config = STATUS_CONFIG[build.status];
123128
const isAnimated = ["cloning", "building", "pushing"].includes(build.status);
124129

@@ -257,6 +262,17 @@ export function BuildDetails({
257262
<Item variant="outline">
258263
<ItemContent>
259264
<ItemDescription as="div" className="space-y-1">
265+
{server && (
266+
<div className="flex justify-between">
267+
<span>Build server</span>
268+
<Link
269+
href={`/dashboard/servers/${server.id}`}
270+
className="text-foreground hover:underline"
271+
>
272+
{server.name}
273+
</Link>
274+
</div>
275+
)}
260276
<div className="flex justify-between">
261277
<span>Created</span>
262278
<span>{formatRelativeTime(build.createdAt)}</span>

0 commit comments

Comments
 (0)