57 lines
1.7 KiB
TypeScript
57 lines
1.7 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { getBookReviews } from '@/lib/directus';
|
|
import { checkRateLimit, getClientIp } from '@/lib/auth';
|
|
|
|
export const runtime = 'nodejs';
|
|
export const revalidate = 300;
|
|
|
|
const CACHE_TTL = 300; // 5 minutes
|
|
|
|
/**
|
|
* GET /api/book-reviews
|
|
*
|
|
* Loads Book Reviews from Directus CMS
|
|
*
|
|
* Query params:
|
|
* - locale: en or de (default: en)
|
|
*/
|
|
export async function GET(request: NextRequest) {
|
|
// Rate Limit: 60 requests per minute
|
|
const ip = getClientIp(request);
|
|
if (!checkRateLimit(ip, 60, 60000)) {
|
|
return NextResponse.json({ error: 'Rate limit exceeded' }, { status: 429 });
|
|
}
|
|
|
|
try {
|
|
const { searchParams } = new URL(request.url);
|
|
const locale = searchParams.get('locale') || 'en';
|
|
|
|
const reviews = await getBookReviews(locale);
|
|
|
|
if (process.env.NODE_ENV === 'development') {
|
|
console.log(`[API] Book Reviews geladen für ${locale}:`, reviews?.length || 0);
|
|
}
|
|
|
|
if (reviews && reviews.length > 0) {
|
|
return NextResponse.json(
|
|
{ bookReviews: reviews, source: 'directus' },
|
|
{ headers: { 'Cache-Control': `public, s-maxage=${CACHE_TTL}, stale-while-revalidate=${CACHE_TTL * 2}` } }
|
|
);
|
|
}
|
|
|
|
return NextResponse.json(
|
|
{ bookReviews: null, source: 'fallback' },
|
|
{ headers: { 'Cache-Control': `public, s-maxage=${CACHE_TTL}, stale-while-revalidate=${CACHE_TTL * 2}` } }
|
|
);
|
|
|
|
} catch (error) {
|
|
if (process.env.NODE_ENV === 'development') {
|
|
console.error('Error loading book reviews:', error);
|
|
}
|
|
return NextResponse.json(
|
|
{ bookReviews: null, error: 'Failed to load book reviews', source: 'error' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|