| 12345678910111213141516171819202122232425262728293031323334353637 |
- import { NextRequest, NextResponse } from "next/server";
- import { z } from "zod";
- import { tmdbFetch, filterAdultMovies } from "@/lib/tmdb/client";
- import type { TMDBSearchResponse } from "@/types/tmdb";
- const searchParamsSchema = z.object({
- query: z.string().min(1).max(200),
- page: z.coerce.number().int().min(1).max(500).optional().default(1),
- });
- export async function GET(request: NextRequest) {
- const rawParams = Object.fromEntries(request.nextUrl.searchParams);
- const parsed = searchParamsSchema.safeParse(rawParams);
- if (!parsed.success) {
- return NextResponse.json(
- { error: "Invalid parameters", details: parsed.error.flatten().fieldErrors },
- { status: 400 },
- );
- }
- const { query, page } = parsed.data;
- try {
- const data = await tmdbFetch<TMDBSearchResponse>("/search/movie", {
- query,
- page: String(page),
- });
- return NextResponse.json(filterAdultMovies(data), {
- headers: { "Cache-Control": "public, s-maxage=300, stale-while-revalidate=60" },
- });
- } catch (error) {
- console.error("TMDB search error:", error);
- return NextResponse.json({ error: "Failed to search movies" }, { status: 500 });
- }
- }
|