Files
amayo/prisma/schema.prisma

220 lines
6.9 KiB
Plaintext

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
/*
* -----------------------------------------------------------------------------
* Modelo para el Servidor (Guild)
* -----------------------------------------------------------------------------
*/
model Guild {
id String @id
name String
prefix String @default("!")
staff Json?
// Relaciones
alliances Alliance[]
partnerStats PartnershipStats[]
// ✅ CAMBIO: Ahora un Guild puede tener MÚLTIPLES configuraciones de embed.
embedConfigs EmbedConfig[]
BlockV2Config BlockV2Config[]
// ✅ NUEVAS RELACIONES
allianceChannels AllianceChannel[]
pointsHistory PointHistory[]
}
/*
* -----------------------------------------------------------------------------
* Modelo para el Usuario
* -----------------------------------------------------------------------------
* Representa a un usuario de Discord de manera global.
*/
model User {
id String @id
// Relaciones
partnerStats PartnershipStats[]
createdAlliances Alliance[]
// ✅ NUEVA RELACIÓN
pointsHistory PointHistory[]
}
/*
* -----------------------------------------------------------------------------
* Modelo para las Estadísticas de Alianza (Leaderboard)
* -----------------------------------------------------------------------------
* Almacena los puntos de un usuario EN UN SERVIDOR específico.
* Se gana 1 punto por mensaje en los canales registrados.
*/
model PartnershipStats {
// Puntos acumulados totales.
totalPoints Int @default(0)
// Puntos para la tabla de clasificación semanal.
weeklyPoints Int @default(0)
// Puntos para la tabla de clasificación mensual.
monthlyPoints Int @default(0)
// Fecha del último reinicio para controlar los contadores.
lastWeeklyReset DateTime @default(now())
lastMonthlyReset DateTime @default(now())
// --- Relaciones y Clave Primaria ---
user User @relation(fields: [userId], references: [id])
userId String
guild Guild @relation(fields: [guildId], references: [id])
guildId String
// Un usuario solo puede tener un registro de estadísticas por servidor.
@@id([userId, guildId])
}
/*
* -----------------------------------------------------------------------------
* Modelo para la Alianza (El mensaje publicado)
* -----------------------------------------------------------------------------
* Guarda la referencia al mensaje de alianza, pero no su contenido.
* El contenido se construye dinámicamente usando EmbedConfig y PartnershipStats.
*/
model Alliance {
id String @id @default(cuid())
channelId String
messageId String @unique
createdAt DateTime @default(now())
// --- Relaciones ---
guild Guild @relation(fields: [guildId], references: [id])
guildId String
creator User @relation(fields: [creatorId], references: [id])
creatorId String
}
/*
* -----------------------------------------------------------------------------
* Modelo para Canales de Alianza
* -----------------------------------------------------------------------------
* Gestiona qué canales están configurados para otorgar puntos y qué bloque enviar
*/
model AllianceChannel {
id String @id @default(cuid())
channelId String @unique // ID del canal de Discord
// Configuración del canal
blockConfigName String // Nombre del BlockV2Config a enviar
isActive Boolean @default(true)
// Timestamps
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// --- Relaciones ---
guild Guild @relation(fields: [guildId], references: [id])
guildId String
// Historial de puntos otorgados en este canal
pointsHistory PointHistory[]
// Un canal solo puede estar en un servidor
@@unique([guildId, channelId])
}
/*
* -----------------------------------------------------------------------------
* Modelo para Historial de Puntos
* -----------------------------------------------------------------------------
* Registra cada vez que un usuario gana puntos con fecha y hora
*/
model PointHistory {
id String @id @default(cuid())
// Información del punto otorgado
points Int @default(1)
timestamp DateTime @default(now())
messageId String // ID del mensaje que generó el punto
// --- Relaciones ---
user User @relation(fields: [userId], references: [id])
userId String
guild Guild @relation(fields: [guildId], references: [id])
guildId String
allianceChannel AllianceChannel @relation(fields: [channelId], references: [id])
channelId String
}
/*
* -----------------------------------------------------------------------------
* Modelo para la Configuración del Embed
* -----------------------------------------------------------------------------
*/
model EmbedConfig {
id String @id @default(cuid())
// ✅ NUEVO: Un nombre único para identificar este embed dentro del servidor.
// Ejemplos: "alianza", "bienvenida", "reglas"
name String
// Campos del Embed (título, descripción, color, etc.)
color String?
title String?
url String?
authorName String?
authorIconURL String?
authorURL String?
description String?
thumbnailURL String?
imageURL String?
footerText String?
footerIconURL String?
fields String? @default("[]")
// --- Relación ---
guild Guild @relation(fields: [guildId], references: [id])
// ✅ CAMBIO: Quitamos '@unique' para permitir que un guildId aparezca múltiples veces.
guildId String
// ✅ NUEVO: Asegura que el 'name' sea único por cada servidor.
// No puedes tener dos embeds llamados "alianza" en el mismo servidor.
@@unique([guildId, name])
}
/*
* -----------------------------------------------------------------------------
* Modelo para la Configuración de Bloques V2
* -----------------------------------------------------------------------------
*/
model BlockV2Config {
id String @id @default(cuid())
// ✅ Nombre único dentro de cada servidor
name String
// Configuración en JSON (embed + componentes, botones, etc.)
config Json
// Relación con el servidor
guild Guild @relation(fields: [guildId], references: [id])
guildId String
// 🔒 Asegura que un nombre no se repita dentro del mismo servidor
@@unique([guildId, name])
}