import { type NextRequest } from 'next/server'; import { randomBytes } from 'node:crypto'; import { requireAdminApi } from '@/lib/auth/admin-guard'; import { getSupabaseAdmin } from '@/lib/supabase/admin'; import { logAdminAction } from '@/lib/auth/audit'; import { isUuid } from '@/lib/admin/validators'; import { jsonNoStore } from '@/lib/admin/response'; export const runtime = 'nodejs'; export const dynamic = 'force-dynamic'; export async function POST( _req: NextRequest, { params }: { params: { id: string } }, ) { const auth = await requireAdminApi(); if (!auth.ok) return auth.response; const { id } = params; if (!isUuid(id)) { return jsonNoStore({ error: 'invalid tunnel id' }, { status: 400 }); } const token = randomBytes(32).toString('hex'); const admin = getSupabaseAdmin(); const { data, error } = await admin .from('tunnels') .update({ token }) .eq('user_id', id) .select('subdomain, token') .maybeSingle<{ subdomain: string; token: string }>(); if (error) { console.error('admin tunnel.regenerate_token failed', error); return jsonNoStore({ error: 'internal error' }, { status: 500 }); } if (!data) { return jsonNoStore({ error: 'tunnel not found' }, { status: 404 }); } await logAdminAction(auth.user, { action: 'tunnel.regenerate_token', target_type: 'tunnel', target_id: id, details: { subdomain: data.subdomain }, }); return jsonNoStore({ ok: true, token: data.token }); }