Adityahulk
Restoring repo state for deployment
6fc3143
Raw
History Blame Contribute Delete
4.58 kB
import { NextResponse } from "next/server";
import { createServerClient, type CookieOptions } from '@supabase/ssr'
import { cookies } from "next/headers";
import { supabase as supabaseAdmin } from "@/lib/supabase";
const PYTHON_API_URL = process.env.PYTHON_API_URL || "http://127.0.0.1:8000";
const SHOWCASE_KEYWORDS = [
"database sharding",
"kafka",
"transformers",
"quantum entanglement",
"netflix",
"black hole",
"sorting algorithms",
"uber",
"quicksort",
"bubble sort"
];
export async function POST(req: Request) {
try {
// Get request body first to check for demo mode
const body = await req.json();
const { input_data, input_type, category, quality } = body;
// Check for showcase prompt (Demo Mode) - Bypass Auth and Credits
const lowerInput = (input_data || "").toLowerCase();
const isShowcase = SHOWCASE_KEYWORDS.some(keyword => lowerInput.includes(keyword));
if (isShowcase) {
console.log("🎨 Demo Mode activated for prompt:", input_data);
// Return a fake job ID encoded with timestamp to track progress
const timestamp = Date.now();
return NextResponse.json({
job_id: `demo-${timestamp}`,
status: "pending",
message: "Job started (Demo)"
});
}
const cookieStore = cookies() // Removed await for Next.js 14 compatibility
// Create authenticated Supabase client
const supabase = createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
cookies: {
getAll() {
return cookieStore.getAll()
},
setAll(cookiesToSet) {
cookiesToSet.forEach(({ name, value, options }) => {
cookieStore.set(name, value, options)
})
},
},
}
)
// Get current user
const { data: { user }, error: authError } = await supabase.auth.getUser()
if (authError || !user) {
return NextResponse.json(
{ error: "Unauthorized" },
{ status: 401 }
);
}
// Check credits
const { data: userData, error: userError } = await supabaseAdmin
.from("users")
.select("credits")
.eq("id", user.id)
.single();
if (userError || !userData) {
return NextResponse.json(
{ error: "User not found" },
{ status: 404 }
);
}
if (userData.credits < 1) {
return NextResponse.json(
{ error: "Insufficient credits" },
{ status: 402 }
);
}
// Real Generation Flow
// Deduct credit
const { error: updateError } = await supabaseAdmin
.from("users")
.update({ credits: userData.credits - 1 })
.eq("id", user.id);
if (updateError) {
return NextResponse.json(
{ error: "Failed to deduct credits" },
{ status: 500 }
);
}
// Call Python API
const response = await fetch(`${PYTHON_API_URL}/api/generate`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-Key": process.env.INTERNAL_API_KEY || "",
},
body: JSON.stringify({
input_data,
input_type,
category,
quality,
user_id: user.id
}),
});
if (!response.ok) {
// Refund credit on failure
await supabaseAdmin
.from("users")
.update({ credits: userData.credits })
.eq("id", user.id);
const error = await response.json();
return NextResponse.json(
{ error: error.detail || "Generation failed" },
{ status: response.status }
);
}
const data = await response.json();
return NextResponse.json(data);
} catch (error) {
console.error("Generate error:", error);
return NextResponse.json(
{ error: "Internal server error" },
{ status: 500 }
);
}
}