Files
amayo/README/FIX_WEAPON_ITEM_INCLUDE.md

3.1 KiB

🔧 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:

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)

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)

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:

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:

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