fix(agent): unify frontend to canonical /api/agent-server/v1 with auth

This commit is contained in:
Haitao Pan 2026-02-05 16:14:43 +08:00
parent 2422c7c309
commit ff104e94c4
3 changed files with 40 additions and 3 deletions

View File

@ -0,0 +1,37 @@
export const dynamic = 'force-dynamic'
import { NextRequest, NextResponse } from 'next/server'
import { getAccountServiceApiBaseUrl } from '@server/serviceConfig'
import { getAccountSession } from '@server/account/session'
const ACCOUNT_API_BASE = getAccountServiceApiBaseUrl()
type ErrorPayload = {
error: string
}
export async function GET(request: NextRequest) {
const session = await getAccountSession(request)
const user = session.user
if (!user || !session.token) {
return NextResponse.json<ErrorPayload>({ error: 'unauthenticated' }, { status: 401 })
}
const response = await fetch(`${ACCOUNT_API_BASE}/agent/nodes`, {
method: 'GET',
headers: {
Authorization: `Bearer ${session.token}`,
Accept: 'application/json',
},
cache: 'no-store',
})
const payload = await response.json().catch(() => null)
if (payload === null) {
return NextResponse.json<ErrorPayload>({ error: 'invalid_response' }, { status: 502 })
}
return NextResponse.json(payload, { status: response.status })
}

View File

@ -57,7 +57,7 @@ interface VlessQrCardProps {
}
export default function VlessQrCard({ uuid, copy }: VlessQrCardProps) {
const { data: nodes } = useSWR<VlessNode[]>('/api/agent/nodes', fetcher)
const { data: nodes } = useSWR<VlessNode[]>('/api/agent-server/v1/nodes', fetcher)
const [selectedNode, setSelectedNode] = useState<VlessNode | null>(null)
const [preferredTransport, setPreferredTransport] = useState<VlessTransport>('tcp')
const [isSelectorOpen, setIsSelectorOpen] = useState(false)
@ -260,7 +260,7 @@ export default function VlessQrCard({ uuid, copy }: VlessQrCardProps) {
) : !nodes || nodes.length === 0 ? (
<div className="rounded-md border border-[color:var(--color-warning-border)] bg-[var(--color-warning-muted)] p-3 text-xs text-[var(--color-warning-foreground)]">
<p className="font-semibold"> </p>
<p className="mt-1"> /api/agent/nodes </p>
<p className="mt-1"> /api/agent-server/v1/nodes </p>
</div>
) : !effectiveNode ? (
<div className="rounded-md border border-[color:var(--color-warning-border)] bg-[var(--color-warning-muted)] p-3 text-xs text-[var(--color-warning-foreground)]">

View File

@ -45,7 +45,7 @@ async function fetcher(url: string): Promise<VlessNode[]> {
export default function UserCenterAgentRoute() {
const { language } = useLanguage()
const t = translations[language].userCenter
const { data: nodes, error, isLoading, mutate } = useSWR<VlessNode[]>('/api/agent/nodes', fetcher)
const { data: nodes, error, isLoading, mutate } = useSWR<VlessNode[]>('/api/agent-server/v1/nodes', fetcher)
const groupedNodes = useMemo(() => {
const groups: Record<string, VlessNode[]> = {