import { type NextRequest, NextResponse } from "next/server"; import { requireAuth } from "@/lib/auth/middleware"; import { isFavorite, toggleFavorite } from "@/lib/prisma/queries/favorites"; import { getListingById } from "@/lib/prisma/queries/listings"; import { secureLogger } from "@/lib/secure-logger"; /** * POST /api/listings/:id/favorite * Favoritar ou desfavoritar um anúncio */ export async function POST( request: NextRequest, { params }: { params: Promise<{ id: string }> }, ) { try { // Autenticação obrigatória const authResult = await requireAuth(request); if (authResult instanceof NextResponse) { return authResult; } const auth = authResult; const { id } = await params; const listingId = parseInt(id, 10); if (Number.isNaN(listingId)) { return NextResponse.json( { success: false, error: "ID de anúncio inválido", }, { status: 400 }, ); } // Verificar se o anúncio existe const listing = await getListingById(listingId); if (!listing) { return NextResponse.json( { success: false, error: "Anúncio não encontrado", }, { status: 404 }, ); } // Toggle favorite const favorited = await toggleFavorite(auth.userId, listingId); secureLogger.info( `✅ Anúncio ${favorited ? "favoritado" : "desfavoritado"}`, { listingId, userId: auth.userId, }, ); return NextResponse.json( { success: true, favorited, message: favorited ? "Anúncio favoritado" : "Anúncio desfavoritado", }, { status: 200 }, ); } catch (error) { secureLogger.error("❌ Erro ao favoritar/desfavoritar anúncio", { error: error instanceof Error ? error.message : "Erro desconhecido", stack: error instanceof Error ? error.stack : undefined, }); return NextResponse.json( { success: false, error: "Erro ao favoritar/desfavoritar anúncio", }, { status: 500 }, ); } } /** * GET /api/listings/:id/favorite * Verifica se o anúncio está favoritado pelo usuário */ export async function GET( request: NextRequest, { params }: { params: Promise<{ id: string }> }, ) { try { // Autenticação obrigatória const authResult = await requireAuth(request); if (authResult instanceof NextResponse) { return authResult; } const auth = authResult; const { id } = await params; const listingId = parseInt(id, 10); if (Number.isNaN(listingId)) { return NextResponse.json( { success: false, error: "ID de anúncio inválido", }, { status: 400 }, ); } const favorited = await isFavorite(auth.userId, listingId); return NextResponse.json( { success: true, favorited, }, { status: 200 }, ); } catch (error) { secureLogger.error("❌ Erro ao verificar favorito", { error: error instanceof Error ? error.message : "Erro desconhecido", }); return NextResponse.json( { success: false, error: "Erro ao verificar favorito", }, { status: 500 }, ); } }