Modèle de données Convex (constats vérifiés)
Source technique principale :convex/schema.ts, complétée par les définitions
de @convex-dev/auth pour les tables Auth injectées par ...authTables.
Repères :
idest l’identifiant métier/partagé._idest l’identifiant interne Convex.- Le schéma effectif contient 71 tables : 66 tables déclarées explicitement
dans
convex/schema.tset 5 tables supplémentaires fournies par@convex-dev/auth. - Le catalogue ci-dessous est exhaustif pour les noms de tables. Les sections détaillées documentent ensuite les invariants qui nécessitent davantage de contexte.
Catalogue exhaustif
Les tables
authAccounts, authSessions, authRefreshTokens,
authVerificationCodes et authRateLimits viennent du spread authTables.
La table users et authVerifiers sont redéfinies par CEL dans le schéma
principal.
Authentification
users
- Champs clés:
id,role,accountStatus,accountStatusUpdatedAt,selfDeletedAt,username,email,userProfiles?,searchText. - Enum vérifiés:
users.role->USER,ADMIN,MODERATORusers.accountStatus->ACTIVE,DEACTIVATED,DELETED
- Index vérifiés:
by_accountStatus,by_role,by_external_id.
user_profiles
eaGamertagNormalizedreste la clé d’identité EA en minuscules.eaGamertagSearchKeyest une clé de recherche compacte (casse, accents et séparateurs ignorés), alimentée à chaque écriture et pour les profils existants par le backfill paginémigration/user_profiles_ea_identity.- Index de recherche ciblée vérifié:
by_eaGamertagSearchKey.
authTables + authVerifiers
authTablesprovient de@convex-dev/auth/serverdans le schéma (...authTables).authAccounts:provider,providerAccountId,secret?,userId,emailVerified?,phoneVerified?.- Index vérifiés:
providerAndAccountId,userIdAndProvider.
- Index vérifiés:
authSessions:userId,expirationTime.- Index vérifié:
userId.
- Index vérifié:
authRefreshTokens:expirationTime,firstUsedTime?,parentRefreshTokenId?,sessionId.- Index vérifiés:
sessionId,sessionIdAndParentRefreshTokenId.
- Index vérifiés:
authVerificationCodes:accountId,code,provider,verifier?,expirationTime,emailVerified?,phoneVerified?.- Index vérifiés:
accountId,code.
- Index vérifiés:
authRateLimits: table générée en plus d’authTables(champattemptsLeftconfirmé).authVerifiers(défini dansschema.ts) :sessionId?,signature?.- Index:
sessionId,signature.
Matchs et planification
bets
- Champs clés vérifiés:
matchId,userId,prediction,status,pointsWon,bettingWave?,settledAt?,cancelledAt?,cancelReason?. - Enum de
predictionvérifiée:HOME,DRAW,AWAY,EXACT_SCORE. - Enum de
statusvérifiée:PENDING,WON,LOST,CANCELLED. cancelReasonreprend les raisons métier:MATCH_CANCELLED,MATCH_RESCHEDULED,BETTING_DISABLED,ADMIN_INVALIDATION,ADMIN_ERROR,MATCH_FORFEITED.- Index de lifecycle vérifié:
by_matchId_bettingWave_status, utilisé pour traiter les mises à jour de paris par batch borné.
bet_lifecycle_jobs
- Table opérationnelle de reprise pour les traitements longs sur les paris d’un match.
- Champs clés vérifiés:
operation,dedupeKey,matchId,sourceWave,targetWave?,cursor?,statusIndex,processedCount,status,createdAt,updatedAt,completedAt?. - Payload opérationnel vérifié selon
operation: scores etsettledAtpourSETTLE,reopenedAtpourREOPEN,reasonetcancelledAtpourCANCEL/CANCEL_PENDING. - Enum de
operationvérifiée:SETTLE,REOPEN,CANCEL,CANCEL_PENDING. - Enum de
statusvérifiée:RUNNING,COMPLETED,FAILED. - Index vérifiés:
by_external_id,by_dedupeKey,by_matchId_operation,by_status_createdAt. - La création du job et la planification de sa continuation sont atomiques avec la mutation appelante ; le parcours des pages suivantes est asynchrone.
match_forfeits
- Table d’historique des forfaits ponctuels de match.
- Champs clés vérifiés:
matchId,leagueId,forfeitClubId,winnerClubId,homeScore,awayScore,declaredAt,declaredById,status,reason?,adminNote?,cancelledAt?,cancelledById?,cancelReason?. - Snapshots de restauration vérifiés:
previousMatchStatus?,previousHomeScore?,previousAwayScore?,previousResultOrigin?,previousForfeitClubId?,previousIsDisputed?,previousValidatedAt?,previousValidatedById?,previousWasValidated?,forfeitCreatedResult. - Résumé opérationnel vérifié:
pendingBetsCancelled,betCancellationInProgress?,betCancellationJobId?. - Enum de
statusvérifiée:ACTIVE,CANCELLED. match_results.resultOriginsupporteNORMAL,CLUB_FORFEIT,MATCH_FORFEIT.- Index vérifiés:
by_external_id,by_matchId_status,by_leagueId_status,by_leagueId_createdAt,by_status_createdAt.
Snapshots match_results des forfaits club
resultOrigin = CLUB_FORFEIT,forfeitClubIdetdoubleForfeit?portent la projection sportive courante. Les serializers exposentdoubleForfeitcomme booléen strict (trueseulement si le champ vaut explicitementtrue).clubForfeitSnapshotTaken?marque explicitement un résultat contrôlé par le lifecycle club, indépendamment d’une dérive éventuelle deresultOrigin.- Champs de restauration vérifiés :
previousHomeScore?,previousAwayScore?,previousResultOrigin?,previousForfeitClubId?,previousMatchStatus?,previousIsDisputed?,previousValidatedAt?,previousValidatedById?,previousValidatedBy?,forfeitCreatedResult?. - Le snapshot est pris lors de la première conversion en forfait club et reste
inchangé pendant les transitions simple/double forfait et les
réapplications. La restauration finale efface le marqueur et
doubleForfeit; un résultat créé par le moteur est supprimé. - Le runtime ne déduit jamais le marqueur de
resultOrigin. Les lignes historiquesCLUB_FORFEITsans marqueur doivent être traitées par le backfill paginémigration/club_forfeit_snapshot_marker, qui conserve les champs de snapshot, de création et de provenance existants.
match_reports
- Champs vérifiés:
matchId,leagueId,reportingClubId,reportedByUserId,scheduledAtBefore,scheduledAtAfter,counterProposedDate?,respondedAt?,respondedById?,status?,createdAt. - Références:
match,league,reportingClub,reportedBy,respondedBy. - Enum de statut (vérifié):
PENDING,ACCEPTED,COUNTER_PROPOSED,CANCELLED,REJECTED. - Index vérifiés:
by_matchId,by_matchId_status,by_leagueId_reportingClubId,by_reportingClubId_createdAt,by_external_id,by_league.
match_lineups
- Champs vérifiés:
matchId,clubId,formation,assignments,status,createdAt,updatedAt,submittedAt?,submittedById?. assignmentscontientslotKey,playerProfileId,positionDetailed.- Enum de
positionDetailedvérifiée:GK,DG,DC,DD,MDC,MC,MOC,MG,MD,AG,AD,BU. - Enum de
statusvérifiée:draft,submitted. - Index vérifiés:
by_matchId_clubId,by_status_submittedAt,by_clubId_status_updatedAt,by_clubId_updatedAt,by_external_id.
Rôles de club et historique
club_members
- Enum de rôle vérifié:
MANAGER,CO_MANAGER,COACH,MEMBER. - Index staff vérifié:
by_playerProfileId_status_role, utilisé pour retrouver les memberships actifsMANAGER/CO_MANAGERà partir de l’identifiant public du profil. - Index d’adhésion courante:
by_playerProfileId_status_leftAt_roleAssignedAt, utilisé par la session avecstatus = IN_CLUB,leftAtabsent, ordre décroissant deroleAssignedAtet lecture bornée à deux lignes.
role_changes
- Champs vérifiés:
clubMemberId,type,fromRole,toRole,initiatedById,reason?,createdAt,clubMember,initiatedBy. - Enum vérifiés:
type:PROMOTION,DEMOTIONfromRole/toRole:MANAGER,CO_MANAGER,COACH,MEMBER.
- Index vérifiés:
by_clubMemberId,by_createdAt,by_external_id.
Awards / TOTS / TOTW
season_awards, season_award_previews, season_award_entries
season_awards.statusest un champ statut figé enPUBLISHED(publication des récompenses).- Champs structurants:
leagueId,season,publishedAt,status,publishedByUserId,emailStatus,coverage, snapshots formule. season_awardsconservewarningCountet compteur de destinataires.season_award_previewsstocke:leagueId,season,preview,generatedAt,generatedByUserId.season_award_entries.category:CHAMPION,RUNNER_UP,SEASON_MVP,BEST_GK,TOTS.season_award_entries.recipientType:PLAYER,CLUB.
award_recipients et TOTW
awardTypevérifiés:season_champion,season_runner_up,season_mvp,best_gk,tots,totw,motm.sourceTypevérifié:season_award,team_of_the_week,match.
award_congratulations
- Champs clés:
id: identifiant métier/partagé (compat ID),seasonAwardId: identifiant métier duseason_awards,entryId: identifiant métier duseason_award_entryconcerné,congratulatorUserId: identifiant métier de l’utilisateur qui réagit,reaction: enumMERITE,QUELLE_SAISON,FIER,RENDEZVOUS,createdAt: timestamp ms,leagueId: identifiant métier de la ligue,seasonAward: référence_idversseason_awards,seasonAwardEntry: référence_idversseason_award_entries,user: référence_idversusers,league: référence_idversleagues.
- Contraintes observées par index:
by_external_idsurid,by_entrysurentryId,by_entry_usersurentryId + congratulatorUserId.
award_congratulation_counts
-
Champs clés:
id: identifiant métier/partagé (compat ID),entryId: identifiant métier deseason_award_entry,count: total des réactions sur l’entrée,byReaction: objet de compte par réaction avec clésMERITE,QUELLE_SAISON,FIER,RENDEZVOUS,seasonAwardId: identifiant métier duseason_awards,entry: référence_idversseason_award_entries,seasonAward: référence_idversseason_awards,league: référence_idversleagues.
-
Contraintes observées par index:
by_external_idsurid,by_entrysurentryId.
-
Usage B4:
award_congratulationsstocke la réaction active par utilisateur.award_congratulation_countsdénormalise les totaux pour éviter lescollect().length.
team_of_the_week, team_of_the_week_players
team_of_the_week.calcVersionvérifié:totw-v1,totw-v2,totw-v3.- Champs structurants:
leagueId,season,matchdayFrom,matchdayTo,periodStartAt,periodEndAt,selectionKey,formation,publishedAt. team_of_the_week_players.calcVersionvérifié:totw-v2,totw-v3.team_of_the_week_players.fitKindvérifié:exact,compatible,fallback.- Champs vérifiés côté joueurs:
position,positionDetailed?,selectionSlot,selectionRole,selectionPositionDetailed,candidateKey, scores bruts. team_of_the_week_playersdupliqueleagueIdetseasondepuisteam_of_the_weekpour les lectures indexées par saison; index vérifié:by_leagueId_season.
Discipline et restrictions (table sanctions)
targetTypevérifié:PERSON,CLUB(pas uniquement personne).sanctionTypevérifiés (liste observée dans le schéma):BAN_PLAYER,SUSPENSION,BAN_CLUB,PENDING_DISCIPLINARY,POINTS_DEDUCTION,FINE,FORFAIT,PERSON_BAN,PERSON_SUSPENSION,PERSON_DISCIPLINARY_REVIEW,COMPETITION_BAN.effectScopesvérifiés:APP_ACCESS,SPORT_ELIGIBILITY,VISIBILITY,CONTACT.lifecycleStatevérifiés:ACTIVE,ENDED_MANUAL,ENDED_EXPIRED,ENDED_REPLACED.endSourcevérifiés:MANUAL,AUTO_EXPIRED,REPLACED.
Limites de ce document
- Les règles métier complètes d’envoi notification (priorités, cadence de retry, templates) ne sont pas détaillées dans ce modèle de données.
- Les comportements métier de certains types de sanction (par ex. interaction exacte entre
banScopeet l’admissibilité en compétition) sont documentés côté règles métiers, pas côté modèle.
Tables internes et techniques
rate_limits: limitation applicative CEL par clé et fenêtre.email_verification_tokens: tokens pour la vérification des emails.password_reset_tokens: tokens pour la réinitialisation de mots de passe.league_calendar_snapshotsetleague_calendar_snapshot_entries: snapshots du calendrier des ligues.ea_cache_countersetea_cache_purge_lock: gestion du cache EA API.cron_executionsetsystem_settings: exécutions, configuration et déclenchement des jobs runtime.migration_runs: suivi des migrations et backfills opérés.stripe_webhook_logetstripe_customer_index: journal webhook et projection client Stripe.upload_objects: index des objets stockés dans le file storage Convex.