mirror of
https://github.com/sourcebot-dev/sourcebot.git
synced 2025-12-12 12:25:22 +00:00
chore(web): Remove join on connections for getRepos (#527)
This commit is contained in:
parent
5bc8fc323a
commit
a76ae68c64
8 changed files with 20 additions and 82 deletions
|
|
@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- Improved repository query performance by adding db indices. [#526](https://github.com/sourcebot-dev/sourcebot/pull/526)
|
- Improved repository query performance by adding db indices. [#526](https://github.com/sourcebot-dev/sourcebot/pull/526)
|
||||||
|
- Improved repository query performance by removing JOIN on `Connection` table. [#527](https://github.com/sourcebot-dev/sourcebot/pull/527)
|
||||||
|
|
||||||
## [4.7.1] - 2025-09-19
|
## [4.7.1] - 2025-09-19
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -110,10 +110,6 @@ export const repositoryQuerySchema = z.object({
|
||||||
repoDisplayName: z.string().optional(),
|
repoDisplayName: z.string().optional(),
|
||||||
repoCloneUrl: z.string(),
|
repoCloneUrl: z.string(),
|
||||||
webUrl: z.string().optional(),
|
webUrl: z.string().optional(),
|
||||||
linkedConnections: z.array(z.object({
|
|
||||||
id: z.number(),
|
|
||||||
name: z.string(),
|
|
||||||
})),
|
|
||||||
imageUrl: z.string().optional(),
|
imageUrl: z.string().optional(),
|
||||||
indexedAt: z.coerce.date().optional(),
|
indexedAt: z.coerce.date().optional(),
|
||||||
repoIndexingStatus: z.nativeEnum(RepoIndexingStatus),
|
repoIndexingStatus: z.nativeEnum(RepoIndexingStatus),
|
||||||
|
|
|
||||||
|
|
@ -654,13 +654,6 @@ export const getRepos = async (filter: { status?: RepoIndexingStatus[], connecti
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} : {}),
|
} : {}),
|
||||||
},
|
|
||||||
include: {
|
|
||||||
connections: {
|
|
||||||
include: {
|
|
||||||
connection: true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -671,10 +664,6 @@ export const getRepos = async (filter: { status?: RepoIndexingStatus[], connecti
|
||||||
repoDisplayName: repo.displayName ?? undefined,
|
repoDisplayName: repo.displayName ?? undefined,
|
||||||
repoCloneUrl: repo.cloneUrl,
|
repoCloneUrl: repo.cloneUrl,
|
||||||
webUrl: repo.webUrl ?? undefined,
|
webUrl: repo.webUrl ?? undefined,
|
||||||
linkedConnections: repo.connections.map(({ connection }) => ({
|
|
||||||
id: connection.id,
|
|
||||||
name: connection.name,
|
|
||||||
})),
|
|
||||||
imageUrl: repo.imageUrl ?? undefined,
|
imageUrl: repo.imageUrl ?? undefined,
|
||||||
indexedAt: repo.indexedAt ?? undefined,
|
indexedAt: repo.indexedAt ?? undefined,
|
||||||
repoIndexingStatus: repo.repoIndexingStatus,
|
repoIndexingStatus: repo.repoIndexingStatus,
|
||||||
|
|
|
||||||
|
|
@ -106,24 +106,20 @@ export const ErrorNavIndicator = () => {
|
||||||
<TooltipProvider>
|
<TooltipProvider>
|
||||||
{repos
|
{repos
|
||||||
.slice(0, 10)
|
.slice(0, 10)
|
||||||
.filter(item => item.linkedConnections.length > 0) // edge case: don't show repos that are orphaned and awaiting gc.
|
|
||||||
.map(repo => (
|
.map(repo => (
|
||||||
// Link to the first connection for the repo
|
<div key={repo.repoId} className="flex items-center gap-2 px-3 py-2 bg-red-50 dark:bg-red-900/20
|
||||||
<Link key={repo.repoId} href={`/${domain}/connections/${repo.linkedConnections[0].id}`} onClick={() => captureEvent('wa_error_nav_job_pressed', {})}>
|
rounded-md text-sm text-red-700 dark:text-red-300
|
||||||
<div className="flex items-center gap-2 px-3 py-2 bg-red-50 dark:bg-red-900/20
|
border border-red-200/50 dark:border-red-800/50
|
||||||
rounded-md text-sm text-red-700 dark:text-red-300
|
hover:bg-red-100 dark:hover:bg-red-900/30 transition-colors">
|
||||||
border border-red-200/50 dark:border-red-800/50
|
<Tooltip>
|
||||||
hover:bg-red-100 dark:hover:bg-red-900/30 transition-colors">
|
<TooltipTrigger asChild>
|
||||||
<Tooltip>
|
<span className="text-sm font-medium truncate max-w-[200px]">{repo.repoName}</span>
|
||||||
<TooltipTrigger asChild>
|
</TooltipTrigger>
|
||||||
<span className="text-sm font-medium truncate max-w-[200px]">{repo.repoName}</span>
|
<TooltipContent>
|
||||||
</TooltipTrigger>
|
{repo.repoName}
|
||||||
<TooltipContent>
|
</TooltipContent>
|
||||||
{repo.repoName}
|
</Tooltip>
|
||||||
</TooltipContent>
|
</div>
|
||||||
</Tooltip>
|
|
||||||
</div>
|
|
||||||
</Link>
|
|
||||||
))}
|
))}
|
||||||
</TooltipProvider>
|
</TooltipProvider>
|
||||||
{repos.length > 10 && (
|
{repos.length > 10 && (
|
||||||
|
|
|
||||||
|
|
@ -50,17 +50,13 @@ export const ProgressNavIndicator = () => {
|
||||||
<div className="flex flex-col gap-2 pl-4">
|
<div className="flex flex-col gap-2 pl-4">
|
||||||
{
|
{
|
||||||
inProgressRepos.slice(0, 10)
|
inProgressRepos.slice(0, 10)
|
||||||
.filter(item => item.linkedConnections.length > 0) // edge case: don't show repos that are orphaned and awaiting gc.
|
|
||||||
.map(item => (
|
.map(item => (
|
||||||
// Link to the first connection for the repo
|
<div key={item.repoId} className="flex items-center gap-2 px-3 py-2 bg-green-50 dark:bg-green-900/20
|
||||||
<Link key={item.repoId} href={`/${domain}/connections/${item.linkedConnections[0].id}`} onClick={() => captureEvent('wa_progress_nav_job_pressed', {})}>
|
rounded-md text-sm text-green-700 dark:text-green-300
|
||||||
<div className="flex items-center gap-2 px-3 py-2 bg-green-50 dark:bg-green-900/20
|
border border-green-200/50 dark:border-green-800/50
|
||||||
rounded-md text-sm text-green-700 dark:text-green-300
|
hover:bg-green-100 dark:hover:bg-green-900/30 transition-colors">
|
||||||
border border-green-200/50 dark:border-green-800/50
|
<span className="font-medium truncate">{item.repoName}</span>
|
||||||
hover:bg-green-100 dark:hover:bg-green-900/30 transition-colors">
|
</div>
|
||||||
<span className="font-medium truncate">{item.repoName}</span>
|
|
||||||
</div>
|
|
||||||
</Link>
|
|
||||||
)
|
)
|
||||||
)}
|
)}
|
||||||
{inProgressRepos.length > 10 && (
|
{inProgressRepos.length > 10 && (
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import { Button } from "@/components/ui/button"
|
||||||
import type { ColumnDef } from "@tanstack/react-table"
|
import type { ColumnDef } from "@tanstack/react-table"
|
||||||
import { ArrowUpDown, ExternalLink, Clock, Loader2, CheckCircle2, XCircle, Trash2, Check, ListFilter } from "lucide-react"
|
import { ArrowUpDown, ExternalLink, Clock, Loader2, CheckCircle2, XCircle, Trash2, Check, ListFilter } from "lucide-react"
|
||||||
import Image from "next/image"
|
import Image from "next/image"
|
||||||
import { Badge } from "@/components/ui/badge"
|
|
||||||
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"
|
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"
|
||||||
import { cn, getRepoImageSrc } from "@/lib/utils"
|
import { cn, getRepoImageSrc } from "@/lib/utils"
|
||||||
import { RepoIndexingStatus } from "@sourcebot/db";
|
import { RepoIndexingStatus } from "@sourcebot/db";
|
||||||
|
|
@ -14,10 +13,6 @@ export type RepositoryColumnInfo = {
|
||||||
repoId: number
|
repoId: number
|
||||||
name: string
|
name: string
|
||||||
imageUrl?: string
|
imageUrl?: string
|
||||||
connections: {
|
|
||||||
id: number
|
|
||||||
name: string
|
|
||||||
}[]
|
|
||||||
repoIndexingStatus: RepoIndexingStatus
|
repoIndexingStatus: RepoIndexingStatus
|
||||||
lastIndexed: string
|
lastIndexed: string
|
||||||
url: string
|
url: string
|
||||||
|
|
@ -136,35 +131,6 @@ export const columns = (domain: string): ColumnDef<RepositoryColumnInfo>[] => [
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
accessorKey: "connections",
|
|
||||||
header: () => <div className="w-[200px]">Connections</div>,
|
|
||||||
cell: ({ row }) => {
|
|
||||||
const connections = row.original.connections
|
|
||||||
|
|
||||||
if (!connections || connections.length === 0) {
|
|
||||||
return <div className="text-muted-foreground text-sm">—</div>
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="flex flex-wrap gap-1.5">
|
|
||||||
{connections.map((connection) => (
|
|
||||||
<Badge
|
|
||||||
key={connection.id}
|
|
||||||
variant="outline"
|
|
||||||
className="text-xs px-2 py-0.5 hover:bg-muted cursor-pointer group flex items-center gap-1"
|
|
||||||
onClick={() => {
|
|
||||||
window.location.href = `/${domain}/connections/${connection.id}`
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{connection.name}
|
|
||||||
<ExternalLink className="h-3 w-3 text-muted-foreground opacity-50 group-hover:opacity-100 transition-opacity" />
|
|
||||||
</Badge>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
accessorKey: "repoIndexingStatus",
|
accessorKey: "repoIndexingStatus",
|
||||||
header: ({ column }) => {
|
header: ({ column }) => {
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,6 @@ export const RepositoryTable = ({
|
||||||
if (reposLoading) return Array(4).fill(null).map(() => ({
|
if (reposLoading) return Array(4).fill(null).map(() => ({
|
||||||
repoId: 0,
|
repoId: 0,
|
||||||
name: "",
|
name: "",
|
||||||
connections: [],
|
|
||||||
repoIndexingStatus: RepoIndexingStatus.NEW,
|
repoIndexingStatus: RepoIndexingStatus.NEW,
|
||||||
lastIndexed: "",
|
lastIndexed: "",
|
||||||
url: "",
|
url: "",
|
||||||
|
|
@ -50,7 +49,6 @@ export const RepositoryTable = ({
|
||||||
repoId: repo.repoId,
|
repoId: repo.repoId,
|
||||||
name: repo.repoDisplayName ?? repo.repoName,
|
name: repo.repoDisplayName ?? repo.repoName,
|
||||||
imageUrl: repo.imageUrl,
|
imageUrl: repo.imageUrl,
|
||||||
connections: repo.linkedConnections,
|
|
||||||
repoIndexingStatus: repo.repoIndexingStatus as RepoIndexingStatus,
|
repoIndexingStatus: repo.repoIndexingStatus as RepoIndexingStatus,
|
||||||
lastIndexed: repo.indexedAt?.toISOString() ?? "",
|
lastIndexed: repo.indexedAt?.toISOString() ?? "",
|
||||||
url: repo.webUrl ?? repo.repoCloneUrl,
|
url: repo.webUrl ?? repo.repoCloneUrl,
|
||||||
|
|
|
||||||
|
|
@ -20,10 +20,6 @@ export const repositoryQuerySchema = z.object({
|
||||||
repoDisplayName: z.string().optional(),
|
repoDisplayName: z.string().optional(),
|
||||||
repoCloneUrl: z.string(),
|
repoCloneUrl: z.string(),
|
||||||
webUrl: z.string().optional(),
|
webUrl: z.string().optional(),
|
||||||
linkedConnections: z.array(z.object({
|
|
||||||
id: z.number(),
|
|
||||||
name: z.string(),
|
|
||||||
})),
|
|
||||||
imageUrl: z.string().optional(),
|
imageUrl: z.string().optional(),
|
||||||
indexedAt: z.coerce.date().optional(),
|
indexedAt: z.coerce.date().optional(),
|
||||||
repoIndexingStatus: z.nativeEnum(RepoIndexingStatus),
|
repoIndexingStatus: z.nativeEnum(RepoIndexingStatus),
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue