All files / web/src/app/api/admin/page-spots/generate route.ts

0% Statements 0/77
0% Branches 0/1
0% Functions 0/1
0% Lines 0/77

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78                                                                                                                                                           
import { type NextRequest, NextResponse } from 'next/server'
import { withAuth } from '@/lib/auth/withAuth'
import { getSpotDefinition } from '@/lib/page-spots/spotDefinitions'
import { loadSpotConfig } from '@/lib/page-spots/loadSpotConfig'
import { startPageSpotImageGeneration } from '@/lib/tasks/page-spot-image-generate'

const VALID_PROVIDERS = ['gemini', 'openai'] as const

/**
 * POST /api/admin/page-spots/generate
 *
 * Starts a background task to generate an image for a page spot.
 * Body: { pageId, spotId, provider?, model?, forceRegenerate? }
 */
export const POST = withAuth(
  async (request: NextRequest, { userId }) => {
    try {
      const body = await request.json()
      const { pageId, spotId, provider, model, forceRegenerate } = body

      if (!pageId || !spotId) {
        return NextResponse.json({ error: 'pageId and spotId are required' }, { status: 400 })
      }

      const def = getSpotDefinition(pageId, spotId)
      if (!def) {
        return NextResponse.json({ error: `Unknown spot: ${pageId}/${spotId}` }, { status: 404 })
      }

      const config = loadSpotConfig(pageId, spotId)
      if (!config || config.type !== 'generated') {
        return NextResponse.json(
          { error: 'Spot must be configured as "generated" type' },
          { status: 400 }
        )
      }

      if (!config.prompt) {
        return NextResponse.json({ error: 'Spot has no prompt configured' }, { status: 400 })
      }

      // Use provider/model from request or fall back to config
      const resolvedProvider = provider ?? config.provider
      const resolvedModel = model ?? config.model

      if (!resolvedProvider || !VALID_PROVIDERS.includes(resolvedProvider)) {
        return NextResponse.json(
          { error: `provider must be one of: ${VALID_PROVIDERS.join(', ')}` },
          { status: 400 }
        )
      }

      if (!resolvedModel || typeof resolvedModel !== 'string') {
        return NextResponse.json({ error: 'model must be a non-empty string' }, { status: 400 })
      }

      const taskId = await startPageSpotImageGeneration({
        pageId,
        spotId,
        provider: resolvedProvider,
        model: resolvedModel,
        prompt: config.prompt,
        forceRegenerate: !!forceRegenerate,
        _userId: userId,
      })

      return NextResponse.json({ taskId })
    } catch (error) {
      console.error('Error starting page spot generation:', error)
      return NextResponse.json(
        { error: 'Failed to start page spot image generation' },
        { status: 500 }
      )
    }
  },
  { role: 'admin' }
)