route.ts 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import { NextRequest, NextResponse } from "next/server";
  2. import { z } from "zod";
  3. import { tmdbFetch, filterAdultMovies } from "@/lib/tmdb/client";
  4. import type { TMDBSearchResponse } from "@/types/tmdb";
  5. const searchParamsSchema = z.object({
  6. query: z.string().min(1).max(200),
  7. page: z.coerce.number().int().min(1).max(500).optional().default(1),
  8. });
  9. export async function GET(request: NextRequest) {
  10. const rawParams = Object.fromEntries(request.nextUrl.searchParams);
  11. const parsed = searchParamsSchema.safeParse(rawParams);
  12. if (!parsed.success) {
  13. return NextResponse.json(
  14. { error: "Invalid parameters", details: parsed.error.flatten().fieldErrors },
  15. { status: 400 },
  16. );
  17. }
  18. const { query, page } = parsed.data;
  19. try {
  20. const data = await tmdbFetch<TMDBSearchResponse>("/search/movie", {
  21. query,
  22. page: String(page),
  23. });
  24. return NextResponse.json(filterAdultMovies(data), {
  25. headers: { "Cache-Control": "public, s-maxage=300, stale-while-revalidate=60" },
  26. });
  27. } catch (error) {
  28. console.error("TMDB search error:", error);
  29. return NextResponse.json({ error: "Failed to search movies" }, { status: 500 });
  30. }
  31. }