Files
amayo/src/game/core/userService.ts

90 lines
2.5 KiB
TypeScript

import { prisma } from '../../core/database/prisma';
import logger from '../../core/lib/logger';
/**
* Asegura que existan los registros de User y Guild en la base de datos.
*
* **PROBLEMA RESUELTO**: Cuando un usuario nuevo usa comandos de juego (como !inventario, !craftear, etc.),
* las funciones como getOrCreateWallet(), getOrCreatePlayerStats(), etc. intentaban crear registros
* con foreign keys a User y Guild que no existían, causando errores de constraint.
*
* **SOLUCIÓN**: Esta función garantiza que User y Guild existan ANTES de crear cualquier dato relacionado.
*
* @param userId - Discord User ID
* @param guildId - Discord Guild ID
* @param guildName - Nombre del servidor (opcional, para crear Guild si no existe)
* @returns Promise<void>
*/
export async function ensureUserAndGuildExist(
userId: string,
guildId: string,
guildName?: string
): Promise<void> {
try {
// Verificar y crear User si no existe
await prisma.user.upsert({
where: { id: userId },
update: {}, // No actualizamos nada si ya existe
create: { id: userId }
});
// Verificar y crear Guild si no existe
await prisma.guild.upsert({
where: { id: guildId },
update: {}, // No actualizamos nada si ya existe
create: {
id: guildId,
name: guildName || 'Unknown Server',
prefix: '!'
}
});
} catch (error) {
logger.error({ userId, guildId, error }, 'Error ensuring User and Guild exist');
throw error;
}
}
/**
* Asegura que un User exista en la base de datos.
* Útil cuando solo necesitas garantizar que el usuario existe.
*
* @param userId - Discord User ID
* @returns Promise<void>
*/
export async function ensureUserExists(userId: string): Promise<void> {
try {
await prisma.user.upsert({
where: { id: userId },
update: {},
create: { id: userId }
});
} catch (error) {
logger.error({ userId, error }, 'Error ensuring User exists');
throw error;
}
}
/**
* Asegura que un Guild exista en la base de datos.
*
* @param guildId - Discord Guild ID
* @param guildName - Nombre del servidor (opcional)
* @returns Promise<void>
*/
export async function ensureGuildExists(guildId: string, guildName?: string): Promise<void> {
try {
await prisma.guild.upsert({
where: { id: guildId },
update: {},
create: {
id: guildId,
name: guildName || 'Unknown Server',
prefix: '!'
}
});
} catch (error) {
logger.error({ guildId, error }, 'Error ensuring Guild exists');
throw error;
}
}