Files
pagodera/docs/ERRO_DECIMAL_EXPLICACAO.md
Evandro Fonseca Junior 7f42def478 feat(market): add Minha Intenções tab with panel, hook, and badge
- Introduced "Minhas Intenções" tab visible only to logged-in users.
- Integrated MyPurchaseIntentionsPanel and useMyPurchaseIntentions hook.
- Added tab badge showing count of pending intentions.
- Extended session API to include user’s main character for downstream features.
2025-11-07 17:25:51 -03:00

166 lines
4.8 KiB
Markdown

# 🔍 Análise dos Erros Encontrados
## 📋 Problemas Identificados
### 1. ❌ Erro: "Decimal objects are not supported" (Linha 77-78)
**Causa:**
- O Prisma retorna campos `Decimal` (PostgreSQL) como objetos `Prisma.Decimal`, não como números JavaScript
- O Next.js não consegue serializar objetos `Decimal` ao passar dados de Server Components para Client Components
- Apenas objetos "plain" (números, strings, arrays, objetos simples) podem ser serializados
**Campos afetados:**
- `price_pix` (Decimal)
- `current_bid_amount` (Decimal)
- `min_bid_increment` (Decimal)
- `initial_price_pix` (Decimal)
**Solução aplicada:**
✅ Converter todos os campos `Decimal` para `number` usando `Number()` antes de retornar os dados
---
### 2. ⚠️ Warning: "Package postcss can't be external" (Linhas 15-20, 85-90, etc.)
**Causa:**
- Dependência transitiva (`sanitize-html` → `postcss`) não está instalada diretamente
- Next.js/Turbopack tenta externalizar o pacote mas não consegue resolvê-lo
**Impacto:**
- ⚠️ Apenas um warning, não quebra a aplicação
- Pode causar problemas em builds de produção
**Soluções possíveis:**
1. **Instalar postcss diretamente** (recomendado):
```bash
pnpm add postcss
```
2. **Adicionar ao package.json** explicitamente:
```json
"dependencies": {
"postcss": "^8.4.0"
}
```
---
### 3. ✅ Erro resolvido: "column does not exist" (Linha 45)
**Status:** ✅ **RESOLVIDO**
- A migração 014 foi executada com sucesso
- As colunas `min_bid_increment`, `initial_price_pix`, etc. foram adicionadas
- O erro não aparece mais nos logs recentes (linhas 75-76, 115-116 mostram queries funcionando)
---
## 🔧 Correções Implementadas
### Arquivo: `lib/prisma/queries/listings.ts`
**Antes:**
```typescript
return {
...listing,
price_gold_coins: listing.price_gold_coins ? Number(listing.price_gold_coins) : null,
// ❌ Campos Decimal não eram convertidos
};
```
**Depois:**
```typescript
// Converter todos os campos Decimal e BigInt para números JavaScript
return {
...listing,
price_pix: listing.price_pix ? Number(listing.price_pix) : null,
current_bid_amount: listing.current_bid_amount ? Number(listing.current_bid_amount) : null,
min_bid_increment: listing.min_bid_increment ? Number(listing.min_bid_increment) : null,
initial_price_pix: listing.initial_price_pix ? Number(listing.initial_price_pix) : null,
price_gold_coins: listing.price_gold_coins ? Number(listing.price_gold_coins) : null,
initial_price_gold_coins: listing.initial_price_gold_coins ? Number(listing.initial_price_gold_coins) : null,
seller_character_name: character?.character_name || null,
} as Listing;
```
**Funções corrigidas:**
- ✅ `createListing()`
- ✅ `getListingById()`
- ✅ `getListings()`
- ✅ `updateListing()`
- ✅ `placeBid()`
---
## 📊 Resultado
### ✅ Resolvido:
1. Erro de coluna não existente (migração executada)
2. Erro de serialização Decimal (conversão implementada)
### ⚠️ Pendente (não crítico):
1. Warning do postcss (pode ser ignorado ou resolvido instalando postcss)
---
## 🎯 Próximos Passos Recomendados
1. **Instalar postcss** (opcional, resolve warning):
```bash
pnpm add postcss
```
2. **Testar a aplicação:**
- Verificar se a página do marketplace carrega corretamente
- Verificar se os preços são exibidos corretamente
- Testar criação de anúncios
- Testar leilões e lances
3. **Monitorar logs:**
- Verificar se o erro "Decimal objects are not supported" não aparece mais
- Verificar se as queries estão funcionando corretamente
---
## 🔍 Por que isso acontece?
### Prisma + PostgreSQL + Decimal
O Prisma usa o tipo `Decimal` do Prisma para representar valores `DECIMAL` do PostgreSQL. Isso garante precisão decimal, mas cria objetos que não são serializáveis pelo React/Next.js.
**Fluxo do problema:**
```
PostgreSQL DECIMAL → Prisma.Decimal → ❌ Não serializável → Erro no React
```
**Solução:**
```
PostgreSQL DECIMAL → Prisma.Decimal → Number() → ✅ number (serializável)
```
### Serialização no Next.js
O Next.js precisa serializar dados ao passar de Server Components para Client Components. Ele usa JSON serialization, que não suporta:
- Classes customizadas
- Objetos `Decimal` do Prisma
- Funções
- Símbolos
- etc.
Apenas tipos primitivos JSON são suportados:
- ✅ `string`, `number`, `boolean`
- ✅ `null`, `undefined`
- ✅ Arrays e objetos simples
---
## 📚 Referências
- [Prisma Decimal Type](https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-decimal-numbers)
- [Next.js Serialization](https://nextjs.org/docs/app/building-your-application/data-fetching/patterns#async-server-components)
- [React Server Components](https://react.dev/reference/rsc/server-components)