Add login and register dialogs, user dropdown menu with profile link and logout option, and integrate with session management hook. Prevent hydration mismatches by conditionally rendering auth elements after mount. Update package-lock.json with new @esbuild dependencies for build tooling.
54 lines
1.2 KiB
TypeScript
54 lines
1.2 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { secureLogger } from "@/lib/secure-logger";
|
|
import { incrementViews } from "@/lib/db/queries/listings";
|
|
|
|
/**
|
|
* POST /api/listings/[id]/views
|
|
* Incrementa contador de views de um anúncio
|
|
* Não requer autenticação (público)
|
|
*/
|
|
export async function POST(
|
|
request: NextRequest,
|
|
{ params }: { params: Promise<{ id: string }> }
|
|
) {
|
|
try {
|
|
const { id } = await params;
|
|
const listingId = parseInt(id, 10);
|
|
|
|
if (isNaN(listingId)) {
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
error: "ID de anúncio inválido",
|
|
},
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
// Incrementar views
|
|
await incrementViews(listingId);
|
|
|
|
return NextResponse.json(
|
|
{
|
|
success: true,
|
|
message: "View incrementada",
|
|
},
|
|
{ status: 200 }
|
|
);
|
|
} catch (error) {
|
|
secureLogger.error("❌ Erro ao incrementar views", {
|
|
error: error instanceof Error ? error.message : "Erro desconhecido",
|
|
stack: error instanceof Error ? error.stack : undefined,
|
|
});
|
|
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
error: "Erro ao incrementar views",
|
|
},
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|
|
|