fix(agent): unify frontend to canonical /api/agent-server/v1 with auth
This commit is contained in:
parent
2422c7c309
commit
ff104e94c4
37
src/app/api/agent-server/v1/nodes/route.ts
Normal file
37
src/app/api/agent-server/v1/nodes/route.ts
Normal 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 })
|
||||
}
|
||||
@ -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)]">
|
||||
|
||||
@ -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[]> = {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user