/** * Verify Video Provider API * * Lightweight endpoint that validates provider credentials without generating video. * * POST /api/verify-video-provider * * Headers: * x-video-provider: VideoProviderId (optional, server-configured default) * x-video-model: string (optional) * x-api-key: string (optional, server fallback) * x-base-url: string (optional, server fallback) * * Response: { success: boolean, message: string } */ import { NextRequest } from 'next/server'; import { testVideoConnectivity } from '@/lib/media/video-providers'; import { isServerConfiguredProvider, isServerProviderDisabled, resolveVideoApiKey, resolveVideoBaseUrl, resolveVideoModel, resolveServerVideoProviderId, } from '@/lib/server/provider-config'; import type { VideoProviderId } from '@/lib/media/types'; import { apiError, apiSuccess } from '@/lib/server/api-response'; import { createLogger } from '@/lib/logger'; import { validateUrlForSSRF } from '@/lib/server/ssrf-guard'; const log = createLogger('VerifyVideoProvider'); export async function POST(request: NextRequest) { try { const providerId = (request.headers.get('x-video-provider')?.trim() || resolveServerVideoProviderId()) as VideoProviderId; if (!providerId) { return apiError('MISSING_PROVIDER', 400, 'No video provider configured'); } // Enforce server precedence: a force-disabled provider is off for everyone, // regardless of any client key/selection — mirror the TTS contract (#665). if (isServerProviderDisabled('video', providerId)) { return apiError('PROVIDER_DISABLED', 403, 'This video provider is disabled by the server'); } const clientModel = request.headers.get('x-video-model')?.trim() || undefined; // Managed providers are admin-owned: ignore any client-sent key/baseUrl. const managed = isServerConfiguredProvider('video', providerId); const clientApiKey = managed ? undefined : request.headers.get('x-api-key') || undefined; const clientBaseUrl = managed ? undefined : request.headers.get('x-base-url') || undefined; if (clientBaseUrl && process.env.NODE_ENV === 'production') { const ssrfError = await validateUrlForSSRF(clientBaseUrl); if (ssrfError) { return apiError('INVALID_URL', 403, ssrfError); } } const apiKey = resolveVideoApiKey(providerId, clientApiKey); const baseUrl = resolveVideoBaseUrl(providerId, clientBaseUrl); if (!apiKey) { return apiError('MISSING_API_KEY', 400, 'No API key configured'); } const model = resolveVideoModel(providerId, clientModel); if (!model) { return apiError( 'MISSING_MODEL', 400, `No model configured for video provider: ${providerId}`, ); } const result = await testVideoConnectivity({ providerId, apiKey, baseUrl, model, }); if (!result.success) { return apiError('UPSTREAM_ERROR', 500, result.message); } return apiSuccess({ message: result.message }); } catch (err) { log.error(`Video provider verification failed: ${err}`, err); return apiError('INTERNAL_ERROR', 500, `Connectivity test error: ${err}`); } }