Update API key usage and credit checking logic for comic generation

This commit is contained in:
Riccardo Giorato
2026-01-13 13:17:16 +01:00
parent 0a536dc5af
commit eb692bcca3
6 changed files with 212 additions and 26 deletions
+71
View File
@@ -0,0 +1,71 @@
import { type NextRequest, NextResponse } from "next/server";
import { auth } from "@clerk/nextjs/server";
import { freeTierRateLimit } from "@/lib/rate-limit";
import { db } from "@/lib/db";
import { stories } from "@/lib/schema";
import { gte } from "drizzle-orm";
export async function POST(request: NextRequest) {
try {
const { userId } = await auth();
if (!userId) {
return NextResponse.json(
{ error: "Authentication required" },
{ status: 401 }
);
}
const { hasApiKey } = await request.json();
// Check if user has API key (unlimited)
if (hasApiKey) {
return NextResponse.json({
hasApiKey: true,
creditsRemaining: "unlimited",
resetTime: null,
});
}
// For free tier, check rate limit status
try {
// Try to check remaining without consuming
const limitResult = await freeTierRateLimit.getRemaining(userId);
return NextResponse.json({
hasApiKey: false,
creditsRemaining: limitResult.remaining,
resetTime: limitResult.reset,
});
} catch (error) {
console.error("Rate limit check error:", error);
// Fallback to database check
const sevenDaysAgo = new Date();
sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);
const recentStories = await db
.select()
.from(stories)
.where(gte(stories.createdAt, sevenDaysAgo))
.limit(1);
const hasUsedCredit = recentStories.length > 0;
return NextResponse.json({
hasApiKey: false,
creditsRemaining: hasUsedCredit ? 0 : 1,
resetTime: hasUsedCredit ? sevenDaysAgo.getTime() + 7 * 24 * 60 * 60 * 1000 : null,
});
}
} catch (error) {
console.error("Error in check-credits API:", error);
return NextResponse.json(
{
error: `Internal server error: ${
error instanceof Error ? error.message : "Unknown error"
}`,
},
{ status: 500 }
);
}
}