Skip to content

Commit 20b7ae0

Browse files
committed
优化
1 parent 878df3d commit 20b7ae0

7 files changed

Lines changed: 101 additions & 60 deletions

File tree

‎web/app/admin/repositories/[id]/page.tsx‎

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ import {
5454
triggerRepositoryIncrementalUpdate,
5555
updateRepositoryDocumentContent,
5656
} from "@/lib/admin-api";
57+
import { getRepositorySourceTypeLabelKey, isGitRepositorySource } from "@/lib/repository-source";
5758
import { fetchProcessingLogs, fetchRepoDoc, fetchRepoTree } from "@/lib/repository-api";
5859
import type { ProcessingLogResponse, RepoDocResponse, RepoTreeNode } from "@/types/repository";
5960

@@ -133,17 +134,6 @@ function normalizeTaskStatus(status: string) {
133134
return "other";
134135
}
135136

136-
function getSourceTypeLabelKey(sourceType: AdminRepository["sourceType"]) {
137-
switch (sourceType) {
138-
case "Archive":
139-
return "sourceTypeArchive";
140-
case "LocalDirectory":
141-
return "sourceTypeLocal";
142-
default:
143-
return "sourceTypeGit";
144-
}
145-
}
146-
147137
export default function AdminRepositoryManagementPage() {
148138
const router = useRouter();
149139
const t = useTranslations();
@@ -293,7 +283,9 @@ export default function AdminRepositoryManagementPage() {
293283
);
294284
}, [selectedLanguageInfo]);
295285

296-
const supportsGitOperations = repository?.sourceType === "Git";
286+
const supportsGitOperations = repository
287+
? isGitRepositorySource(repository.sourceType, repository.sourceTypeName)
288+
: false;
297289

298290
const processingFlow = useMemo(() => {
299291
const steps = [
@@ -964,7 +956,7 @@ export default function AdminRepositoryManagementPage() {
964956
<h1 className="text-2xl font-bold">{repository.orgName}/{repository.repoName}</h1>
965957
<div className="flex flex-wrap items-center gap-2 text-sm text-muted-foreground">
966958
<span className="inline-flex rounded-full bg-secondary px-2 py-1 text-xs">
967-
{t(`admin.repositories.${getSourceTypeLabelKey(repository.sourceType)}`)}
959+
{t(`admin.repositories.${getRepositorySourceTypeLabelKey(repository.sourceType, repository.sourceTypeName)}`)}
968960
</span>
969961
<span className="break-all">{repository.sourceLocation || repository.gitUrl}</span>
970962
</div>

‎web/app/admin/repositories/page.tsx‎

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import {
4848
AdminRepository,
4949
RepositoryListResponse,
5050
} from "@/lib/admin-api";
51+
import { getRepositorySourceTypeLabelKey, isGitRepositorySource } from "@/lib/repository-source";
5152
import {
5253
Loader2,
5354
Search,
@@ -82,17 +83,6 @@ const statusBarColors: Record<number, string> = {
8283
3: "bg-red-500/90",
8384
};
8485

85-
function getSourceTypeLabelKey(sourceType: AdminRepository["sourceType"]) {
86-
switch (sourceType) {
87-
case "Archive":
88-
return "sourceTypeArchive";
89-
case "LocalDirectory":
90-
return "sourceTypeLocal";
91-
default:
92-
return "sourceTypeGit";
93-
}
94-
}
95-
9686
export default function AdminRepositoriesPage() {
9787
const router = useRouter();
9888
const [data, setData] = useState<RepositoryListResponse | null>(null);
@@ -269,7 +259,7 @@ export default function AdminRepositoriesPage() {
269259
const selectedGitRepoIds = useMemo(() => {
270260
const items = data?.items ?? [];
271261
return items
272-
.filter((item) => selectedIds.has(item.id) && item.sourceType === "Git")
262+
.filter((item) => selectedIds.has(item.id) && isGitRepositorySource(item.sourceType, item.sourceTypeName))
273263
.map((item) => item.id);
274264
}, [data, selectedIds]);
275265
const overview = useMemo(() => {
@@ -513,7 +503,7 @@ export default function AdminRepositoriesPage() {
513503
</p>
514504
<p className="mt-1">
515505
<span className="inline-flex rounded-full bg-secondary px-2 py-1 text-xs text-muted-foreground">
516-
{t(`admin.repositories.${getSourceTypeLabelKey(repo.sourceType)}`)}
506+
{t(`admin.repositories.${getRepositorySourceTypeLabelKey(repo.sourceType, repo.sourceTypeName)}`)}
517507
</span>
518508
</p>
519509
</div>
@@ -592,8 +582,8 @@ export default function AdminRepositoriesPage() {
592582
variant="ghost"
593583
size="icon"
594584
onClick={() => handleSyncStats(repo.id)}
595-
disabled={syncing === repo.id || repo.sourceType !== "Git"}
596-
title={repo.sourceType === "Git" ? t('admin.repositories.syncStats') : t('admin.repositories.syncStatsNotSupported')}
585+
disabled={syncing === repo.id || !isGitRepositorySource(repo.sourceType, repo.sourceTypeName)}
586+
title={isGitRepositorySource(repo.sourceType, repo.sourceTypeName) ? t('admin.repositories.syncStats') : t('admin.repositories.syncStatsNotSupported')}
597587
className="transition-all duration-200 hover:-translate-y-0.5"
598588
>
599589
{syncing === repo.id ? (
@@ -684,7 +674,7 @@ export default function AdminRepositoriesPage() {
684674
</div>
685675
<div>
686676
<label className="text-sm font-medium">{t('admin.repositories.sourceType')}</label>
687-
<p>{t(`admin.repositories.${getSourceTypeLabelKey(selectedRepo.sourceType)}`)}</p>
677+
<p>{t(`admin.repositories.${getRepositorySourceTypeLabelKey(selectedRepo.sourceType, selectedRepo.sourceTypeName)}`)}</p>
688678
</div>
689679
<div>
690680
<label className="text-sm font-medium">{t('admin.repositories.sourceLocation')}</label>

‎web/components/repo/public-repository-card.tsx‎

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import { useTranslations } from "@/hooks/use-translations";
88
import { useAuth } from "@/contexts/auth-context";
99
import type {
1010
RepositoryItemResponse,
11-
RepositorySourceType,
1211
RepositoryStatus,
1312
} from "@/types/repository";
13+
import { getRepositorySourceTypeLabelKey } from "@/lib/repository-source";
1414
import {
1515
Clock,
1616
Loader2,
@@ -76,18 +76,6 @@ function StatusBadge({ status }: { status: RepositoryStatus }) {
7676
);
7777
}
7878

79-
function getSourceTypeLabelKey(sourceType: RepositorySourceType) {
80-
switch (sourceType) {
81-
case "Archive":
82-
return "sourceTypeArchive";
83-
case "LocalDirectory":
84-
return "sourceTypeLocal";
85-
default:
86-
return "sourceTypeGit";
87-
}
88-
}
89-
90-
9179
interface PublicRepositoryCardProps {
9280
repository: RepositoryItemResponse;
9381
}
@@ -185,7 +173,7 @@ export function PublicRepositoryCard({ repository }: PublicRepositoryCardProps)
185173
</div>
186174
<div className="flex items-center justify-between gap-2">
187175
<span className="inline-flex rounded-full bg-secondary px-2 py-1 text-xs text-muted-foreground">
188-
{t(`home.repository.${getSourceTypeLabelKey(repository.sourceType)}`)}
176+
{t(`home.repository.${getRepositorySourceTypeLabelKey(repository.sourceType, repository.sourceTypeName)}`)}
189177
</span>
190178
<p className="truncate text-xs text-muted-foreground">
191179
{repository.sourceLocation || repository.gitUrl}

‎web/components/repo/repository-list.tsx‎

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ import { useTranslations } from "@/hooks/use-translations";
1515
import { fetchRepositoryList, regenerateRepository } from "@/lib/repository-api";
1616
import type {
1717
RepositoryItemResponse,
18-
RepositorySourceType,
1918
RepositoryStatus,
2019
} from "@/types/repository";
20+
import { getRepositorySourceTypeLabelKey } from "@/lib/repository-source";
2121
import {
2222
Clock,
2323
Loader2,
@@ -84,17 +84,6 @@ function StatusBadge({ status }: { status: RepositoryStatus }) {
8484
);
8585
}
8686

87-
function getSourceTypeLabelKey(sourceType: RepositorySourceType) {
88-
switch (sourceType) {
89-
case "Archive":
90-
return "sourceTypeArchive";
91-
case "LocalDirectory":
92-
return "sourceTypeLocal";
93-
default:
94-
return "sourceTypeGit";
95-
}
96-
}
97-
9887
function RepositoryCard({
9988
repo,
10089
onVisibilityChange,
@@ -130,7 +119,7 @@ function RepositoryCard({
130119
</div>
131120
<div className="mt-2">
132121
<span className="inline-flex rounded-full bg-secondary px-2 py-1 text-xs text-muted-foreground">
133-
{t(`home.repository.${getSourceTypeLabelKey(repo.sourceType)}`)}
122+
{t(`home.repository.${getRepositorySourceTypeLabelKey(repo.sourceType, repo.sourceTypeName)}`)}
134123
</span>
135124
</div>
136125
<p className="mt-1 text-sm text-muted-foreground truncate">

‎web/lib/admin-api.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { RepositorySourceTypeName, RepositorySourceTypeValue } from "@/lib/repository-source";
12
import { getApiProxyUrl } from "./env";
23
import { getToken } from "./auth-api";
34

@@ -224,8 +225,8 @@ export async function getMcpUsageLogs(filter: McpUsageLogFilter): Promise<PagedR
224225
export interface AdminRepository {
225226
id: string;
226227
gitUrl: string;
227-
sourceType: "Git" | "Archive" | "LocalDirectory";
228-
sourceTypeName: "Git" | "Archive" | "LocalDirectory";
228+
sourceType: RepositorySourceTypeValue;
229+
sourceTypeName: RepositorySourceTypeName;
229230
sourceLocation: string;
230231
repoName: string;
231232
orgName: string;

‎web/lib/repository-source.ts‎

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
export const REPOSITORY_SOURCE_TYPE_NAMES = ["Git", "Archive", "LocalDirectory"] as const;
2+
3+
export type RepositorySourceTypeName = (typeof REPOSITORY_SOURCE_TYPE_NAMES)[number];
4+
export type RepositorySourceTypeValue = RepositorySourceTypeName | 0 | 1 | 2;
5+
6+
function normalizeNumericRepositorySourceType(value: number): RepositorySourceTypeName | null {
7+
switch (value) {
8+
case 0:
9+
return "Git";
10+
case 1:
11+
return "Archive";
12+
case 2:
13+
return "LocalDirectory";
14+
default:
15+
return null;
16+
}
17+
}
18+
19+
function normalizeNamedRepositorySourceType(value: unknown): RepositorySourceTypeName | null {
20+
if (typeof value !== "string") return null;
21+
22+
switch (value.trim().toLowerCase()) {
23+
case "git":
24+
return "Git";
25+
case "archive":
26+
return "Archive";
27+
case "localdirectory":
28+
case "local-directory":
29+
case "local_directory":
30+
return "LocalDirectory";
31+
default:
32+
return null;
33+
}
34+
}
35+
36+
export function normalizeRepositorySourceType(
37+
sourceType: RepositorySourceTypeValue | string | number | null | undefined,
38+
sourceTypeName?: RepositorySourceTypeName | string | null
39+
): RepositorySourceTypeName {
40+
const namedSourceType = normalizeNamedRepositorySourceType(sourceTypeName);
41+
if (namedSourceType) return namedSourceType;
42+
43+
const sourceTypeNameFromValue = normalizeNamedRepositorySourceType(sourceType);
44+
if (sourceTypeNameFromValue) return sourceTypeNameFromValue;
45+
46+
if (typeof sourceType === "number") {
47+
return normalizeNumericRepositorySourceType(sourceType) ?? "Git";
48+
}
49+
50+
if (typeof sourceType === "string" && sourceType.trim() !== "") {
51+
const numericSourceType = Number(sourceType);
52+
if (Number.isInteger(numericSourceType)) {
53+
return normalizeNumericRepositorySourceType(numericSourceType) ?? "Git";
54+
}
55+
}
56+
57+
return "Git";
58+
}
59+
60+
export function isGitRepositorySource(
61+
sourceType: RepositorySourceTypeValue | string | number | null | undefined,
62+
sourceTypeName?: RepositorySourceTypeName | string | null
63+
) {
64+
return normalizeRepositorySourceType(sourceType, sourceTypeName) === "Git";
65+
}
66+
67+
export function getRepositorySourceTypeLabelKey(
68+
sourceType: RepositorySourceTypeValue | string | number | null | undefined,
69+
sourceTypeName?: RepositorySourceTypeName | string | null
70+
) {
71+
switch (normalizeRepositorySourceType(sourceType, sourceTypeName)) {
72+
case "Archive":
73+
return "sourceTypeArchive";
74+
case "LocalDirectory":
75+
return "sourceTypeLocal";
76+
default:
77+
return "sourceTypeGit";
78+
}
79+
}

‎web/types/repository.ts‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import type { RepositorySourceTypeName, RepositorySourceTypeValue } from "@/lib/repository-source";
2+
13
export interface RepoTreeNode {
24
title: string;
35
slug: string;
@@ -43,7 +45,7 @@ export interface GitBranchItem {
4345
isDefault: boolean;
4446
}
4547

46-
export type RepositorySourceType = "Git" | "Archive" | "LocalDirectory";
48+
export type RepositorySourceType = RepositorySourceTypeName;
4749

4850
export interface RepoDocResponse {
4951
exists: boolean;
@@ -98,7 +100,7 @@ export interface RepositoryItemResponse {
98100
orgName: string;
99101
repoName: string;
100102
gitUrl: string;
101-
sourceType: RepositorySourceType;
103+
sourceType: RepositorySourceTypeValue;
102104
sourceTypeName: RepositorySourceType;
103105
sourceLocation: string;
104106
status: number;

0 commit comments

Comments
 (0)