Some checks failed
Dev Deployment (Zero Downtime) / deploy-dev (push) Failing after 10m3s
Added rate limiting to APIs, cleaned up docs, implemented fallback logic for reviews without text, and added comprehensive n8n guide.
53 lines
1.3 KiB
TypeScript
53 lines
1.3 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 dynamic = 'force-dynamic';
|
|
|
|
/**
|
|
* 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 (reviews && reviews.length > 0) {
|
|
return NextResponse.json({
|
|
bookReviews: reviews,
|
|
source: 'directus'
|
|
});
|
|
}
|
|
|
|
return NextResponse.json({
|
|
bookReviews: null,
|
|
source: 'fallback'
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('Error loading book reviews:', error);
|
|
return NextResponse.json(
|
|
{
|
|
bookReviews: null,
|
|
error: 'Failed to load book reviews',
|
|
source: 'error'
|
|
},
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|