bookwiz.io / app / api / usage / increment / route.ts
route.ts
Raw
import { NextRequest, NextResponse } from 'next/server'
import { createRouteHandlerClient } from '@supabase/auth-helpers-nextjs'
import { cookies } from 'next/headers'
import { IncrementUsageRequest } from '@/lib/types/usage-tracking'

export async function POST(request: NextRequest) {
  try {
    const supabase = createRouteHandlerClient({ cookies })
    
    // Get current user
    const { data: { user }, error: userError } = await supabase.auth.getUser()
    if (userError || !user) {
      return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
    }

    // Parse request body
    const body: IncrementUsageRequest & { user_id?: string } = await request.json()
    
    // Validate required fields
    if (!body.feature_type) {
      return NextResponse.json({ error: 'feature_type is required' }, { status: 400 })
    }

    // Use authenticated user's ID, not the one from request body
    const userId = user.id
    const amount = body.amount || 1
    const metadata = body.metadata || {}

    // Validate amount is positive
    if (amount < 0) {
      return NextResponse.json({ error: 'Amount must be positive' }, { status: 400 })
    }

    // Call the database function to increment usage
    const { data, error } = await supabase
      .rpc('increment_usage', {
        user_uuid: userId,
        feature_type_param: body.feature_type,
        amount_param: amount,
        metadata_param: metadata,
        skip_limit_check: false
      })

    if (error) {
      console.error('Error incrementing usage:', error)
      return NextResponse.json({ error: 'Failed to increment usage' }, { status: 500 })
    }

    return NextResponse.json({ 
      success: true, 
      usage: data 
    }, { status: 200 })

  } catch (error) {
    console.error('Unexpected error in usage increment:', error)
    return NextResponse.json({ error: 'Internal server error' }, { status: 500 })
  }
}