route.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /**
  2. * Verify Image Provider API
  3. *
  4. * Lightweight endpoint that validates provider credentials without generating images.
  5. *
  6. * POST /api/verify-image-provider
  7. *
  8. * Headers:
  9. * x-image-provider: ImageProviderId
  10. * x-image-model: string (optional)
  11. * x-api-key: string (optional, server fallback)
  12. * x-base-url: string (optional, server fallback)
  13. *
  14. * Response: { success: boolean, message: string }
  15. */
  16. import { NextRequest } from 'next/server';
  17. import { testImageConnectivity } from '@/lib/media/image-providers';
  18. import { resolveImageApiKey, resolveImageBaseUrl } from '@/lib/server/provider-config';
  19. import type { ImageProviderId } from '@/lib/media/types';
  20. import { apiError, apiSuccess } from '@/lib/server/api-response';
  21. import { createLogger } from '@/lib/logger';
  22. import { validateUrlForSSRF } from '@/lib/server/ssrf-guard';
  23. const log = createLogger('VerifyImageProvider');
  24. export async function POST(request: NextRequest) {
  25. try {
  26. const providerId = (request.headers.get('x-image-provider') || 'seedream') as ImageProviderId;
  27. const model = request.headers.get('x-image-model') || undefined;
  28. const clientApiKey = request.headers.get('x-api-key') || undefined;
  29. const clientBaseUrl = request.headers.get('x-base-url') || undefined;
  30. if (clientBaseUrl && process.env.NODE_ENV === 'production') {
  31. const ssrfError = await validateUrlForSSRF(clientBaseUrl);
  32. if (ssrfError) {
  33. return apiError('INVALID_URL', 403, ssrfError);
  34. }
  35. }
  36. const apiKey = clientBaseUrl
  37. ? clientApiKey || ''
  38. : resolveImageApiKey(providerId, clientApiKey);
  39. const baseUrl = clientBaseUrl ? clientBaseUrl : resolveImageBaseUrl(providerId, clientBaseUrl);
  40. if (!apiKey) {
  41. return apiError('MISSING_API_KEY', 400, 'No API key configured');
  42. }
  43. const result = await testImageConnectivity({
  44. providerId,
  45. apiKey,
  46. baseUrl,
  47. model,
  48. });
  49. if (!result.success) {
  50. return apiError('UPSTREAM_ERROR', 500, result.message);
  51. }
  52. return apiSuccess({ message: result.message });
  53. } catch (err) {
  54. log.error(
  55. `Image provider verification failed [provider=${request.headers.get('x-image-provider') ?? 'seedream'}]:`,
  56. err,
  57. );
  58. return apiError('INTERNAL_ERROR', 500, `Connectivity test error: ${err}`);
  59. }
  60. }