130 lines
3.1 KiB
Markdown
130 lines
3.1 KiB
Markdown
# 🔧 Fix: Error `weaponItem` en PlayerEquipment
|
|
|
|
**Fecha**: Octubre 2025
|
|
**Error**: `Unknown field 'weaponItem' for include statement on model PlayerEquipment`
|
|
|
|
---
|
|
|
|
## 🐛 Problema
|
|
|
|
Al ejecutar comandos `!pelear` y `!pescar`, aparecía el siguiente error de Prisma:
|
|
|
|
```
|
|
Invalid `prisma.playerEquipment.findUnique()` invocation:
|
|
{
|
|
where: { userId_guildId: { ... } },
|
|
include: {
|
|
weaponItem: true, // ❌ Campo desconocido
|
|
}
|
|
}
|
|
|
|
Unknown field `weaponItem` for include statement on model `PlayerEquipment`.
|
|
Available options are marked with ?: user, guild
|
|
```
|
|
|
|
### Causa Raíz
|
|
|
|
El modelo `PlayerEquipment` en el schema de Prisma **no tiene relaciones explícitas** con `EconomyItem`, solo almacena los IDs:
|
|
|
|
```prisma
|
|
model PlayerEquipment {
|
|
weaponItemId String? // Solo el ID, sin relación @relation
|
|
armorItemId String?
|
|
capeItemId String?
|
|
|
|
user User @relation(...)
|
|
guild Guild @relation(...)
|
|
}
|
|
```
|
|
|
|
El código intentaba usar `include: { weaponItem: true }` asumiendo una relación que no existe.
|
|
|
|
---
|
|
|
|
## ✅ Solución
|
|
|
|
Cambié la lógica en `validateRequirements()` para buscar el item manualmente después de obtener el `PlayerEquipment`:
|
|
|
|
### Antes (❌ Incorrecto)
|
|
```typescript
|
|
const equip = await prisma.playerEquipment.findUnique({
|
|
where: { userId_guildId: { userId, guildId } },
|
|
include: { weaponItem: true } as any, // ❌ Relación no existe
|
|
});
|
|
if (equip?.weaponItemId && equip?.weaponItem) {
|
|
const wProps = parseItemProps((equip as any).weaponItem.props);
|
|
// ...
|
|
}
|
|
```
|
|
|
|
### Después (✅ Correcto)
|
|
```typescript
|
|
const equip = await prisma.playerEquipment.findUnique({
|
|
where: { userId_guildId: { userId, guildId } },
|
|
});
|
|
if (equip?.weaponItemId) {
|
|
const weaponItem = await prisma.economyItem.findUnique({
|
|
where: { id: equip.weaponItemId },
|
|
});
|
|
if (weaponItem) {
|
|
const wProps = parseItemProps(weaponItem.props);
|
|
// ...
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 📝 Archivos Modificados
|
|
|
|
- **`src/game/minigames/service.ts`**: Función `validateRequirements()` (líneas ~145-165)
|
|
|
|
---
|
|
|
|
## 🔮 Alternativa Futura (Opcional)
|
|
|
|
Si prefieres usar relaciones de Prisma, puedes agregar al schema:
|
|
|
|
```prisma
|
|
model PlayerEquipment {
|
|
weaponItemId String?
|
|
armorItemId String?
|
|
capeItemId String?
|
|
|
|
// Relaciones explícitas (opcional)
|
|
weaponItem EconomyItem? @relation("WeaponSlot", fields: [weaponItemId], references: [id])
|
|
armorItem EconomyItem? @relation("ArmorSlot", fields: [armorItemId], references: [id])
|
|
capeItem EconomyItem? @relation("CapeSlot", fields: [capeItemId], references: [id])
|
|
|
|
// ...resto
|
|
}
|
|
|
|
model EconomyItem {
|
|
// ...campos existentes
|
|
|
|
// Relaciones inversas
|
|
weaponSlots PlayerEquipment[] @relation("WeaponSlot")
|
|
armorSlots PlayerEquipment[] @relation("ArmorSlot")
|
|
capeSlots PlayerEquipment[] @relation("CapeSlot")
|
|
}
|
|
```
|
|
|
|
Luego ejecutar:
|
|
```bash
|
|
npx prisma migrate dev --name add-equipment-relations
|
|
```
|
|
|
|
**Ventaja**: Permite usar `include` sin queries adicionales.
|
|
**Desventaja**: Requiere migración; el fix actual funciona sin cambiar el schema.
|
|
|
|
---
|
|
|
|
## ✅ Resultado
|
|
|
|
Comandos `!pelear`, `!pescar` y `!mina` ahora funcionan correctamente sin errores de Prisma.
|
|
|
|
---
|
|
|
|
**Typecheck**: ✅ Pasado
|
|
**Status**: Resuelto
|