Files
octto-engenharia/frontend/src/app/api/pages/home/route.ts

171 lines
4.6 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server';
import { PrismaClient } from '@prisma/client';
import { cookies } from 'next/headers';
import jwt from 'jsonwebtoken';
const prisma = new PrismaClient();
// Middleware de autenticação
async function authenticate(request: NextRequest) {
const cookieStore = await cookies();
const token = cookieStore.get('auth_token')?.value;
if (!token) {
return null;
}
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET!) as { userId: string };
const user = await prisma.user.findUnique({
where: { id: decoded.userId },
select: { id: true, email: true, name: true }
});
return user;
} catch (error) {
return null;
}
}
/**
* GET /api/pages/home
* Busca conteúdo da página home
*/
export async function GET(request: NextRequest) {
try {
const { searchParams } = new URL(request.url);
const locale = searchParams.get('locale') || 'pt';
console.log(`[API PAGES HOME] GET locale=${locale}`);
const page = await prisma.pageContent.findUnique({
where: { slug_locale: { slug: 'home', locale } }
});
console.log(`[API PAGES HOME] Encontrado:`, page ? 'SIM' : 'NÃO');
if (page) {
console.log(`[API PAGES HOME] Conteúdo:`, JSON.stringify(page.content, null, 2));
}
if (!page) {
// Retornar página padrão vazia
return NextResponse.json({
slug: 'home',
locale,
content: {
hero: {
title: 'Engenharia de Excelência para Seus Projetos',
subtitle: 'Soluções completas em engenharia veicular, mecânica e segurança do trabalho com mais de 15 anos de experiência.',
buttonText: 'Conheça Nossos Serviços',
badge: {
text: 'Coca-Cola',
show: true
}
}
}
});
}
return NextResponse.json(page);
} catch (error) {
console.error('Erro ao buscar página home:', error);
return NextResponse.json(
{ error: 'Erro ao buscar página home' },
{ status: 500 }
);
}
}
/**
* POST /api/pages/home
* Salva conteúdo da página home (admin apenas)
*/
export async function POST(request: NextRequest) {
try {
const user = await authenticate(request);
if (!user) {
return NextResponse.json({ error: 'Não autorizado' }, { status: 401 });
}
const body = await request.json();
const locale = 'pt'; // Sempre salvar em PT primeiro
if (!body.content) {
return NextResponse.json({ error: 'Conteúdo é obrigatório' }, { status: 400 });
}
// Garantir que é um objeto, não string
const content = typeof body.content === 'string'
? JSON.parse(body.content)
: body.content;
console.log('[API PAGES HOME] POST - Salvando conteúdo:', JSON.stringify(content, null, 2));
const page = await prisma.pageContent.upsert({
where: { slug_locale: { slug: 'home', locale } },
update: { content },
create: {
slug: 'home',
locale,
content
}
});
console.log('[API PAGES HOME] POST - Salvo com sucesso');
return NextResponse.json({ success: true, page });
} catch (error) {
console.error('Erro ao salvar página home:', error);
return NextResponse.json(
{ error: 'Erro ao salvar página home: ' + (error as Error).message },
{ status: 500 }
);
}
}
/**
* PUT /api/pages/home
* Atualiza conteúdo da página home (admin apenas)
*/
export async function PUT(request: NextRequest) {
try {
const user = await authenticate(request);
if (!user) {
return NextResponse.json({ error: 'Não autorizado' }, { status: 401 });
}
const body = await request.json();
const locale = 'pt';
if (!body.content) {
return NextResponse.json({ error: 'Conteúdo é obrigatório' }, { status: 400 });
}
// Garantir que é um objeto, não string
const content = typeof body.content === 'string'
? JSON.parse(body.content)
: body.content;
console.log('[API PAGES HOME] PUT - Atualizando conteúdo:', JSON.stringify(content, null, 2));
const page = await prisma.pageContent.upsert({
where: { slug_locale: { slug: 'home', locale } },
update: { content },
create: {
slug: 'home',
locale,
content
}
});
console.log('[API PAGES HOME] PUT - Atualizado com sucesso');
return NextResponse.json({ success: true, page });
} catch (error) {
console.error('Erro ao atualizar página home:', error);
return NextResponse.json(
{ error: 'Erro ao atualizar página home: ' + (error as Error).message },
{ status: 500 }
);
}
}