generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model Player { id Int @id @default(autoincrement()) name String rating Int @default(0) currentElo Int @default(1000) gamesPlayed Int @default(0) wins Int @default(0) losses Int @default(0) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt normalizedName String @unique eloSnapshots EloSnapshot[] eventParticipants EventParticipant[] matchesAsP1 Match[] @relation("MatchPlayer1") matchesAsP2 Match[] @relation("MatchPlayer2") matchesAsP3 Match[] @relation("MatchPlayer3") matchesAsP4 Match[] @relation("MatchPlayer4") partnershipGames PartnershipGame[] @relation("PartnershipPlayer1") partnershipGames2 PartnershipGame[] @relation("PartnershipPlayer2") partnershipStats PartnershipStat[] @relation("StatPlayer1") partnershipStats2 PartnershipStat[] @relation("StatPlayer2") teamsAsPlayer1 Team[] @relation("TeamPlayer1") teamsAsPlayer2 Team[] @relation("TeamPlayer2") user User? @@map("players") } model User { id String @id @default(cuid()) email String @unique emailVerified Boolean @default(false) name String? image String? role String @default("player") // player, tournament_admin, club_admin, site_admin playerId Int? @unique createdAt DateTime @default(now()) updatedAt DateTime @updatedAt accounts Account[] ownedTournaments Event[] @relation("TournamentOwner") createdMatches Match[] @relation("MatchCreator") sessions Session[] player Player? @relation(fields: [playerId], references: [id]) @@map("users") } model Event { id Int @id @default(autoincrement()) event_id Int? name String description String? eventDate DateTime? eventType String @default("tournament") format String @default("round_robin") status String @default("planned") maxParticipants Int? ownerId String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt bracketMatchups BracketMatchup[] participants EventParticipant[] owner User? @relation("TournamentOwner", fields: [ownerId], references: [id]) matches Match[] teams Team[] rounds TournamentRound[] @@map("events") } model EventParticipant { id Int @id @default(autoincrement()) eventId Int playerId Int teamId Int? seed Int? status String @default("registered") registrationDate DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt event Event @relation(fields: [eventId], references: [id]) player Player @relation(fields: [playerId], references: [id]) team Team? @relation(fields: [teamId], references: [id]) @@unique([eventId, playerId]) @@map("event_participants") } model Team { id Int @id @default(autoincrement()) eventId Int teamName String? player1Id Int player2Id Int createdAt DateTime @default(now()) updatedAt DateTime @updatedAt bracketMatchups1 BracketMatchup[] @relation("BracketTeam1") bracketMatchups2 BracketMatchup[] @relation("BracketTeam2") eventParticipants EventParticipant[] event Event @relation(fields: [eventId], references: [id]) player1 Player @relation("TeamPlayer1", fields: [player1Id], references: [id]) player2 Player @relation("TeamPlayer2", fields: [player2Id], references: [id]) @@map("teams") } model TournamentRound { id Int @id @default(autoincrement()) eventId Int roundNumber Int status String @default("pending") scheduledStart DateTime? actualStart DateTime? completedAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt bracketMatchups BracketMatchup[] event Event @relation(fields: [eventId], references: [id]) @@map("tournament_rounds") } model BracketMatchup { id Int @id @default(autoincrement()) roundId Int eventId Int team1Id Int? team2Id Int? matchId Int? tableNumber Int? bracketPosition Int? winnerTeamId Int? loserTeamId Int? status String @default("pending") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt event Event @relation(fields: [eventId], references: [id]) match Match? @relation(fields: [matchId], references: [id]) round TournamentRound @relation(fields: [roundId], references: [id]) team1 Team? @relation("BracketTeam1", fields: [team1Id], references: [id]) team2 Team? @relation("BracketTeam2", fields: [team2Id], references: [id]) @@map("bracket_matchups") } model Match { id Int @id @default(autoincrement()) eventId Int? playedAt DateTime? team1P1Id Int team1P2Id Int team2P1Id Int team2P2Id Int team1Score Int team2Score Int status String @default("completed") isCasual Boolean @default(false) createdById String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt bracketMatchups BracketMatchup[] eloSnapshots EloSnapshot[] createdBy User? @relation("MatchCreator", fields: [createdById], references: [id]) event Event? @relation(fields: [eventId], references: [id]) team1P1 Player @relation("MatchPlayer1", fields: [team1P1Id], references: [id]) team1P2 Player @relation("MatchPlayer2", fields: [team1P2Id], references: [id]) team2P1 Player @relation("MatchPlayer3", fields: [team2P1Id], references: [id]) team2P2 Player @relation("MatchPlayer4", fields: [team2P2Id], references: [id]) partnershipGames PartnershipGame[] @@map("matches") } model EloSnapshot { id Int @id @default(autoincrement()) playerId Int matchId Int ratingBefore Int ratingAfter Int ratingChange Int createdAt DateTime @default(now()) match Match @relation(fields: [matchId], references: [id]) player Player @relation(fields: [playerId], references: [id]) @@map("elo_snapshots") } model PartnershipGame { id Int @id @default(autoincrement()) player1Id Int player2Id Int matchId Int teamNumber Int? wonMatch Int? player1EloChange Int? player2EloChange Int? createdAt DateTime @default(now()) match Match @relation(fields: [matchId], references: [id]) player1 Player @relation("PartnershipPlayer1", fields: [player1Id], references: [id]) player2 Player @relation("PartnershipPlayer2", fields: [player2Id], references: [id]) @@map("partnership_games") } model PartnershipStat { id Int @id @default(autoincrement()) player1Id Int player2Id Int gamesPlayed Int @default(0) wins Int @default(0) losses Int @default(0) totalEloChange Int @default(0) lastPlayed DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt player1 Player @relation("StatPlayer1", fields: [player1Id], references: [id]) player2 Player @relation("StatPlayer2", fields: [player2Id], references: [id]) @@unique([player1Id, player2Id], name: "partnership_stats_player1Id_player2Id_key") @@map("partnership_stats") } model Session { id String @id expiresAt DateTime token String @unique createdAt DateTime @default(now()) updatedAt DateTime @updatedAt ipAddress String? userAgent String? userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId]) @@map("session") } model Account { id String @id accountId String providerId String userId String accessToken String? refreshToken String? idToken String? accessTokenExpiresAt DateTime? refreshTokenExpiresAt DateTime? scope String? password String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId]) @@map("account") } model Verification { id String @id identifier String value String expiresAt DateTime createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([identifier]) @@map("verification") }