31 lines
1.0 KiB
TypeScript
31 lines
1.0 KiB
TypeScript
import { NextResponse, type NextRequest } from 'next/server';
|
|
import { requireAdminApi } from '@/lib/auth/admin-guard';
|
|
import { parsePageParam, parsePerPageParam } from '@/lib/admin/validators';
|
|
import { getTunnelsList } from '@/lib/admin/list';
|
|
|
|
export const runtime = 'nodejs';
|
|
export const dynamic = 'force-dynamic';
|
|
|
|
export async function GET(req: NextRequest) {
|
|
const auth = await requireAdminApi();
|
|
if (!auth.ok) return auth.response;
|
|
|
|
const url = new URL(req.url);
|
|
const page = parsePageParam(url.searchParams.get('page'), 1);
|
|
const perPage = parsePerPageParam(url.searchParams.get('perPage'), 25, 100);
|
|
const search = url.searchParams.get('search') ?? '';
|
|
const status = url.searchParams.get('status'); // active|inactive|over_quota
|
|
|
|
try {
|
|
const { tunnels, total } = await getTunnelsList({
|
|
page,
|
|
perPage,
|
|
search,
|
|
status,
|
|
});
|
|
return NextResponse.json({ tunnels, total, page, perPage });
|
|
} catch (e) {
|
|
return NextResponse.json({ error: (e as Error).message }, { status: 500 });
|
|
}
|
|
}
|