* Fix ActivityFeed: Remove dynamic import that was causing it to disappear in production * Fix ActivityFeed hydration error: Move localStorage read to useEffect to prevent server/client mismatch * Update Node.js version to 25 in Gitea workflows - Fix EBADENGINE error for camera-controls@3.1.2 which requires Node.js >=22 - Update production-deploy.yml, dev-deploy.yml, and ci-cd-with-gitea-vars.yml.disabled - Node.js v25 matches local development environment * Update Dockerfile to use Node.js 25 - Update base image from node:20 to node:25 - Matches Gitea workflow configuration and camera-controls@3.1.2 requirements * Fix production deployment: Start database dependencies - Remove --no-deps flag which prevented postgres and redis from starting - Remove --build flag as image is already built in previous step - This fixes 'Can't reach database server at postgres:5432' error * Fix postgres health check in production - Remove init-db.sql volume mount (not available in CI/CD environment) - Init script not needed as Prisma handles schema migrations - Postgres will initialize empty database automatically * Fix cache permission error in Docker container - Create cache directories AFTER copying standalone files - Create both fetch-cache and images subdirectories - Set proper ownership for nextjs user - Fixes EACCES permission denied errors for prerender cache * Fix German jogging fallback text * Use Directus content in production * fix: Security vulnerability - block malicious file requests * fix: Switch projects to Directus, add security fixes and example projects
40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { getProjects } from '@/lib/directus';
|
|
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const { searchParams } = new URL(request.url);
|
|
const slug = searchParams.get('slug');
|
|
const search = searchParams.get('search');
|
|
const category = searchParams.get('category');
|
|
const locale = searchParams.get('locale') || 'en';
|
|
|
|
// Use Directus instead of Prisma
|
|
const projects = await getProjects(locale, {
|
|
featured: undefined,
|
|
published: true,
|
|
category: category && category !== 'All' ? category : undefined,
|
|
search: search || undefined,
|
|
});
|
|
|
|
if (!projects) {
|
|
// Directus not available or no projects found
|
|
return NextResponse.json({ projects: [] });
|
|
}
|
|
|
|
// Filter by slug if provided (since Directus query doesn't support slug filter directly)
|
|
if (slug) {
|
|
const project = projects.find(p => p.slug === slug);
|
|
return NextResponse.json({ projects: project ? [project] : [] });
|
|
}
|
|
|
|
return NextResponse.json({ projects });
|
|
} catch (error) {
|
|
console.error('Error searching projects:', error);
|
|
return NextResponse.json(
|
|
{ error: 'Failed to search projects' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|