82 lines
2.3 KiB
TypeScript
82 lines
2.3 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { prisma } from '@/lib/prisma';
|
|
|
|
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');
|
|
|
|
if (slug) {
|
|
// Search by slug (convert title to slug format)
|
|
const projects = await prisma.project.findMany({
|
|
where: {
|
|
published: true
|
|
},
|
|
orderBy: { createdAt: 'desc' }
|
|
});
|
|
|
|
// Find exact match by converting titles to slugs
|
|
const foundProject = projects.find(project => {
|
|
const projectSlug = project.title.toLowerCase()
|
|
.replace(/[^a-z0-9]+/g, '-')
|
|
.replace(/^-+|-+$/g, '');
|
|
return projectSlug === slug;
|
|
});
|
|
|
|
if (foundProject) {
|
|
return NextResponse.json({ projects: [foundProject] });
|
|
}
|
|
|
|
// If no exact match, return empty array
|
|
return NextResponse.json({ projects: [] });
|
|
}
|
|
|
|
if (search) {
|
|
// General search
|
|
const projects = await prisma.project.findMany({
|
|
where: {
|
|
published: true,
|
|
OR: [
|
|
{ title: { contains: search, mode: 'insensitive' } },
|
|
{ description: { contains: search, mode: 'insensitive' } },
|
|
{ tags: { hasSome: [search] } },
|
|
{ content: { contains: search, mode: 'insensitive' } }
|
|
]
|
|
},
|
|
orderBy: { createdAt: 'desc' }
|
|
});
|
|
|
|
return NextResponse.json({ projects });
|
|
}
|
|
|
|
if (category && category !== 'All') {
|
|
// Filter by category
|
|
const projects = await prisma.project.findMany({
|
|
where: {
|
|
published: true,
|
|
category: category
|
|
},
|
|
orderBy: { createdAt: 'desc' }
|
|
});
|
|
|
|
return NextResponse.json({ projects });
|
|
}
|
|
|
|
// Return all published projects if no specific search
|
|
const projects = await prisma.project.findMany({
|
|
where: { published: true },
|
|
orderBy: { createdAt: 'desc' }
|
|
});
|
|
|
|
return NextResponse.json({ projects });
|
|
} catch (error) {
|
|
console.error('Error searching projects:', error);
|
|
return NextResponse.json(
|
|
{ error: 'Failed to search projects' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|