Modeles Prisma
Toutes les tables utilisent des CUID comme cle primaire et ont des timestamps createdAt / updatedAt (sauf exceptions notees).
GuildConfig
Configuration du serveur Discord. Un seul record par serveur.
| Champ | Type | Description |
|---|---|---|
id | String | CUID |
guildId | String | ID Discord du serveur (unique) |
birthdayChannelId | String? | Salon anniversaires |
thursdayChannelId | String? | Salon jeudi |
thursdayRoleId | String? | Role jeudi |
logChannelId | String? | Salon logs admin |
welcomeChannelId | String? | Salon bienvenue |
moderationLogChannelId | String? | Salon logs moderation |
helpChannelId | String? | Salon guide public |
helpMessageId | String? | ID du message d'aide public |
staffChannelId | String? | Salon guide staff |
staffMessageId | String? | ID du message d'aide staff |
statsCategoryId | String? | Categorie stats channels |
valoCategoryId | String? | Categorie Valorant channels |
thursdayMessageId | String? | ID du message RSVP actuel |
suggestionChannelId | String? | Salon suggestions |
clipChannelId | String? | Salon clips |
birthdayRoleId | String? | Role anniversaire |
xpEnabled | Boolean | XP active (defaut true) |
xpMessageCooldownSec | Int | Cooldown messages (defaut 60) |
levelRoles | Json? | Mapping { "1": "roleId", ... } |
UserProfile
Profil de base de chaque membre.
| Champ | Type | Description |
|---|---|---|
id | String | CUID |
discordId | String | ID Discord (unique) |
guildId | String | ID du serveur |
username | String | Nom d'utilisateur |
isActive | Boolean | Actif (defaut true) |
Index : @@index([guildId])
Relations : Birthday, UserXp, VoiceSession, MessageStatDaily, WeeklyEventResponse, ModerationAction (x2), GameAccountLink, AuditLog.
Birthday
| Champ | Type | Description |
|---|---|---|
userId | String | FK vers UserProfile (unique) |
guildId | String | ID du serveur |
day | Int | Jour |
month | Int | Mois |
year | Int? | Annee (optionnel) |
timezone | String | Defaut Europe/Paris |
isPublic | Boolean | Defaut true |
lastWished | DateTime? | Dernier souhait (idempotence) |
Index : @@index([guildId, month, day])
Cascade : supprime si UserProfile supprime.
UserXp
| Champ | Type | Description |
|---|---|---|
userId | String | FK vers UserProfile (unique) |
guildId | String | ID du serveur |
totalXp | Int | XP total cumule |
level | Int | Niveau actuel |
messageXp | Int | XP gagne par messages |
voiceXp | Int | XP gagne en vocal |
weeklyXp | Int | XP de la semaine |
weeklyResetAt | DateTime? | Date du dernier reset |
lastMessageAt | DateTime? | Dernier message ayant donne XP |
Index : @@index([guildId, totalXp]), @@index([guildId, weeklyXp])
VoiceSession
| Champ | Type | Description |
|---|---|---|
userId | String | FK vers UserProfile |
guildId | String | ID du serveur |
channelId | String | ID du salon vocal |
joinedAt | DateTime | Debut de session |
leftAt | DateTime? | Fin de session |
durationSec | Int? | Duree en secondes |
xpEarned | Int | XP gagne dans la session |
Index : @@index([userId, joinedAt]), @@index([guildId, joinedAt])
MessageStatDaily
Statistiques de messages par jour, par utilisateur, par salon.
| Champ | Type | Description |
|---|---|---|
userId | String | FK vers UserProfile |
guildId | String | ID du serveur |
channelId | String | ID du salon |
date | Date | Date du jour (@db.Date) |
count | Int | Nombre de messages |
xpEarned | Int | XP gagne ce jour |
Contrainte unique : @@unique([userId, channelId, date]) Index : @@index([guildId, date])
WeeklyEventResponse
| Champ | Type | Description |
|---|---|---|
userId | String | FK vers UserProfile |
guildId | String | ID du serveur |
weekNumber | Int | Numero de semaine ISO 8601 |
year | Int | Annee |
status | Enum | PRESENT, MAYBE, ABSENT |
arrivalTime | String? | Heure d'arrivee |
comment | String? | Commentaire libre |
wantsThursdayDmReminder | Boolean | Opt-in rappel DM |
thursdayDmSentAt | DateTime? | Quand le DM a ete envoye |
Contrainte unique : @@unique([userId, weekNumber, year]) Index : @@index([guildId, weekNumber, year])
GameAccountLink
| Champ | Type | Description |
|---|---|---|
userId | String | FK vers UserProfile |
guildId | String | ID du serveur |
provider | String | riot, etc. |
accountId | String | ID du compte (PUUID) |
gameName | String? | Nom de jeu |
tagLine | String? | Tag |
isVerified | Boolean | Defaut false |
Contrainte unique : @@unique([userId, provider])
GamePerformanceSnapshot
| Champ | Type | Description |
|---|---|---|
accountId | String | FK vers GameAccountLink |
game | String | Nom du jeu |
data | Json | Donnees brutes |
capturedAt | DateTime | Horodatage |
Index : @@index([accountId, game, capturedAt])
ModerationAction
| Champ | Type | Description |
|---|---|---|
guildId | String | ID du serveur |
targetUserId | String | FK vers UserProfile (cible) |
moderatorUserId | String | FK vers UserProfile (moderateur) |
type | Enum | WARN, MUTE, KICK, BAN, UNBAN, UNMUTE |
reason | String? | Raison |
durationSec | Int? | Duree (pour mute) |
expiresAt | DateTime? | Expiration |
isActive | Boolean | Defaut true |
Index : @@index([guildId, targetUserId]), @@index([guildId, createdAt])
Pas de cascade : l'historique est preserve meme si le profil est supprime.
ValorantProfile
| Champ | Type | Description |
|---|---|---|
discordUserId | String | ID Discord (unique) |
guildId | String | ID du serveur |
riotId | String | Format Pseudo#TAG |
ValorantTrackerCache
| Champ | Type | Description |
|---|---|---|
discordUserId | String | ID Discord |
riotId | String | Riot ID |
rawData | Json | Donnees brutes (stats) |
fetchedAt | DateTime | Horodatage du fetch |
expiresAt | DateTime | Expiration du cache |
error | String? | Message d'erreur si echec |
Contrainte unique : @@unique([discordUserId, riotId]) Index : @@index([expiresAt])
Countdown
| Champ | Type | Description |
|---|---|---|
guildId | String | ID du serveur |
name | String | Nom de l'evenement |
date | DateTime | Date cible |
createdBy | String | Discord ID du createur |
Index : @@index([guildId])
AuditLog
| Champ | Type | Description |
|---|---|---|
guildId | String | ID du serveur |
userId | String? | FK vers UserProfile |
action | String | Type d'action |
details | Json? | Parametres |
Index : @@index([guildId, action, createdAt])
SystemLog
| Champ | Type | Description |
|---|---|---|
level | SystemLogLevel | DEBUG, INFO, WARN, ERROR |
source | String | Module source |
message | String | Description |
details | Json? | Donnees supplementaires |
Index : @@index([level, createdAt]), @@index([source, createdAt])
Conventions
- CUID : toutes les cles primaires utilisent
@default(cuid()). - Timestamps :
createdAtavec@default(now()),updatedAtavec@updatedAt. - Cascade : toutes les relations vers UserProfile ont
onDelete: Cascadesauf ModerationAction. - Champs JSON : types comme
anycote TypeScript (Prisma genereJsonValue). - Enums :
RsvpStatus,ModerationActionType,SystemLogLevel.
