Some checks failed
Dev Deployment (Zero Downtime) / deploy-dev (push) Has been cancelled
Stripped HTML tags from book reviews, added a grid layout for About section on desktop, and fixed hobby icon mapping.
57 lines
1.4 KiB
TypeScript
57 lines
1.4 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 (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'
|
|
});
|
|
}
|
|
|
|
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 }
|
|
);
|
|
}
|
|
}
|