Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
90 lines
2.5 KiB
TypeScript
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({ 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;
|
|
}
|
|
}
|