Spaces:
Sleeping
Sleeping
| import { NextResponse } from "next/server"; | |
| import { createProxyPool, getProviderConnections, getProxyPools } from "@/models"; | |
| function toBoolean(value) { | |
| if (value === "true") return true; | |
| if (value === "false") return false; | |
| return undefined; | |
| } | |
| const VALID_PROXY_TYPES = ["http", "vercel", "cloudflare", "deno"]; | |
| function normalizeProxyPoolInput(body = {}) { | |
| const name = typeof body?.name === "string" ? body.name.trim() : ""; | |
| const proxyUrl = typeof body?.proxyUrl === "string" ? body.proxyUrl.trim() : ""; | |
| const noProxy = typeof body?.noProxy === "string" ? body.noProxy.trim() : ""; | |
| const isActive = body?.isActive === undefined ? true : body.isActive === true; | |
| const strictProxy = body?.strictProxy === true; | |
| const type = VALID_PROXY_TYPES.includes(body?.type) ? body.type : "http"; | |
| if (!name) { | |
| return { error: "Name is required" }; | |
| } | |
| if (!proxyUrl) { | |
| return { error: "Proxy URL is required" }; | |
| } | |
| return { name, proxyUrl, noProxy, isActive, strictProxy, type }; | |
| } | |
| function buildUsageMap(connections = []) { | |
| const usageMap = new Map(); | |
| for (const connection of connections) { | |
| const proxyPoolId = connection?.providerSpecificData?.proxyPoolId; | |
| if (!proxyPoolId) continue; | |
| usageMap.set(proxyPoolId, (usageMap.get(proxyPoolId) || 0) + 1); | |
| } | |
| return usageMap; | |
| } | |
| // GET /api/proxy-pools - List proxy pools | |
| export async function GET(request) { | |
| try { | |
| const { searchParams } = new URL(request.url); | |
| const isActive = toBoolean(searchParams.get("isActive")); | |
| const includeUsage = searchParams.get("includeUsage") === "true"; | |
| const filter = {}; | |
| if (isActive !== undefined) { | |
| filter.isActive = isActive; | |
| } | |
| const proxyPools = await getProxyPools(filter); | |
| if (!includeUsage) { | |
| return NextResponse.json({ proxyPools }); | |
| } | |
| const connections = await getProviderConnections(); | |
| const usageMap = buildUsageMap(connections); | |
| const enrichedProxyPools = proxyPools.map((pool) => ({ | |
| ...pool, | |
| boundConnectionCount: usageMap.get(pool.id) || 0, | |
| })); | |
| return NextResponse.json({ proxyPools: enrichedProxyPools }); | |
| } catch (error) { | |
| console.log("Error fetching proxy pools:", error); | |
| return NextResponse.json({ error: "Failed to fetch proxy pools" }, { status: 500 }); | |
| } | |
| } | |
| // POST /api/proxy-pools - Create proxy pool | |
| export async function POST(request) { | |
| try { | |
| const body = await request.json(); | |
| const normalized = normalizeProxyPoolInput(body); | |
| if (normalized.error) { | |
| return NextResponse.json({ error: normalized.error }, { status: 400 }); | |
| } | |
| const proxyPool = await createProxyPool(normalized); | |
| return NextResponse.json({ proxyPool }, { status: 201 }); | |
| } catch (error) { | |
| console.log("Error creating proxy pool:", error); | |
| return NextResponse.json({ error: "Failed to create proxy pool" }, { status: 500 }); | |
| } | |
| } | |