| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- import { NextRequest, NextResponse } from "next/server";
- import { z } from "zod";
- import { tmdbFetch, filterAdultMovies } from "@/lib/tmdb/client";
- import { DISCOVER_CERT_PARAMS } from "@/lib/tmdb/certification";
- import type { TMDBSearchResponse } from "@/types/tmdb";
- const popularParamsSchema = z.object({
- 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 = popularParamsSchema.safeParse(rawParams);
- if (!parsed.success) {
- return NextResponse.json(
- { error: "Invalid parameters", details: parsed.error.flatten().fieldErrors },
- { status: 400 },
- );
- }
- const { page } = parsed.data;
- try {
- // Use /discover with sort_by=popularity.desc + cert filter so TMDB
- // pre-filters server-side; we still post-filter adult flags defensively.
- const data = await tmdbFetch<TMDBSearchResponse>("/discover/movie", {
- ...DISCOVER_CERT_PARAMS,
- sort_by: "popularity.desc",
- page: String(page),
- });
- return NextResponse.json(filterAdultMovies(data), {
- headers: { "Cache-Control": "public, s-maxage=300, stale-while-revalidate=60" },
- });
- } catch (error) {
- console.error("TMDB popular error:", error);
- return NextResponse.json({ error: "Failed to fetch popular movies" }, { status: 500 });
- }
- }
|