Skip to content

Commit 849c271

Browse files
authored
Merge pull request #269 from techulus/feat/show-build-server
Show build server in build details
2 parents 89403d5 + c13a7b8 commit 849c271

5 files changed

Lines changed: 85 additions & 23 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: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,30 @@
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";
5+
import { requireRequestSession } from "@/lib/api-auth";
56

67
export async function GET(
7-
_: NextRequest,
8+
request: NextRequest,
89
{ params }: { params: Promise<{ buildId: string }> },
910
) {
11+
const sessionResult = await requireRequestSession(request);
12+
if (!sessionResult.ok) return sessionResult.response;
13+
1014
const { buildId } = await params;
1115

12-
const [build] = await db.select().from(builds).where(eq(builds.id, buildId));
16+
const [buildData] = await db
17+
.select({
18+
build: builds,
19+
server: { id: servers.id, name: servers.name },
20+
})
21+
.from(builds)
22+
.leftJoin(servers, eq(builds.claimedBy, servers.id))
23+
.where(eq(builds.id, buildId));
1324

14-
if (!build) {
25+
if (!buildData) {
1526
return NextResponse.json({ error: "Build not found" }, { status: 404 });
1627
}
1728

18-
return NextResponse.json({ build });
29+
return NextResponse.json(buildData);
1930
}

‎web/app/api/services/[id]/builds/route.ts‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,25 @@
1-
import { NextRequest, NextResponse } from "next/server";
2-
import { desc, eq } from "drizzle-orm";
1+
import { desc, eq, getTableColumns } from "drizzle-orm";
2+
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";
5+
import { requireRequestSession } from "@/lib/api-auth";
56

67
export async function GET(
78
request: NextRequest,
89
{ params }: { params: Promise<{ id: string }> },
910
) {
11+
const sessionResult = await requireRequestSession(request);
12+
if (!sessionResult.ok) return sessionResult.response;
13+
1014
const { id: serviceId } = await params;
1115

1216
const buildsList = await db
13-
.select()
17+
.select({
18+
...getTableColumns(builds),
19+
server: { id: servers.id, name: servers.name },
20+
})
1421
.from(builds)
22+
.leftJoin(servers, eq(builds.claimedBy, servers.id))
1523
.where(eq(builds.serviceId, serviceId))
1624
.orderBy(desc(builds.createdAt))
1725
.limit(50);

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

Lines changed: 25 additions & 9 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

@@ -244,12 +249,23 @@ export function BuildDetails({
244249
<ItemDescription>
245250
{build.commitMessage?.split("\n")[0] || "No message"}
246251
</ItemDescription>
247-
<div className="flex items-center gap-4 text-xs text-muted-foreground mt-1">
252+
<div className="flex items-center gap-1 text-xs text-muted-foreground mt-1">
248253
<span className="flex items-center gap-1">
249254
<GitBranch className="size-3" />
250255
{build.branch}
251256
</span>
252257
{build.author && <span>by {build.author}</span>}
258+
{server && (
259+
<span>
260+
on{" "}
261+
<Link
262+
href={`/dashboard/servers/${server.id}`}
263+
className="hover:text-foreground hover:underline"
264+
>
265+
{server.name}
266+
</Link>
267+
</span>
268+
)}
253269
</div>
254270
</ItemContent>
255271
</Item>

‎web/components/builds/builds-viewer.tsx‎

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
RotateCcw,
1414
XCircle,
1515
} from "lucide-react";
16+
import Link from "next/link";
1617
import { useRouter } from "next/navigation";
1718
import { useState } from "react";
1819
import { toast } from "sonner";
@@ -61,6 +62,7 @@ type BuildListItem = Pick<
6162
createdAt: string;
6263
startedAt: string | null;
6364
completedAt: string | null;
65+
server: { id: string; name: string } | null;
6466
};
6567

6668
type Commit = {
@@ -411,10 +413,22 @@ export function BuildsViewer({
411413
{build.branch}
412414
</span>
413415
{build.author && (
414-
<span className="ml-3 max-sm:hidden">
416+
<span className="ml-1 max-sm:hidden">
415417
by {build.author}
416418
</span>
417419
)}
420+
{build.server && (
421+
<span className="ml-1 max-sm:hidden">
422+
on{" "}
423+
<Link
424+
href={`/dashboard/servers/${build.server.id}`}
425+
className="hover:text-foreground hover:underline"
426+
onClick={(event) => event.stopPropagation()}
427+
>
428+
{build.server.name}
429+
</Link>
430+
</span>
431+
)}
418432
<span className="ml-3">
419433
{formatRelativeTime(build.createdAt)}
420434
</span>

0 commit comments

Comments
 (0)