From 66145a9d78c179410b244dccc0fd444df00ce518 Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Fri, 1 May 2026 06:16:19 +0000 Subject: [PATCH 01/13] refactor(schema): rename per-window tables to season_* prefix Renames participants, participant_expected_values, participant_qualifying_totals, participant_results, participant_surface_elos to season_* prefixed names. Renames event_results.participant_id to season_participant_id. Phase 1a of canonical tournament layer migration. Co-Authored-By: Claude Opus 4.7 --- database/schema.ts | 180 ++++++++++++++++++++++----------------------- 1 file changed, 90 insertions(+), 90 deletions(-) diff --git a/database/schema.ts b/database/schema.ts index 4fbb104..6fa32f0 100644 --- a/database/schema.ts +++ b/database/schema.ts @@ -249,7 +249,7 @@ export const draftPicks = pgTable("draft_picks", { .references(() => teams.id, { onDelete: "cascade" }), participantId: uuid("participant_id") .notNull() - .references(() => participants.id, { onDelete: "cascade" }), + .references(() => seasonParticipants.id, { onDelete: "cascade" }), pickNumber: integer("pick_number").notNull(), round: integer("round").notNull(), pickInRound: integer("pick_in_round").notNull(), @@ -272,7 +272,7 @@ export const draftQueue = pgTable("draft_queue", { .references(() => teams.id, { onDelete: "cascade" }), participantId: uuid("participant_id") .notNull() - .references(() => participants.id, { onDelete: "cascade" }), + .references(() => seasonParticipants.id, { onDelete: "cascade" }), queuePosition: integer("queue_position").notNull(), createdAt: timestamp("created_at").defaultNow().notNull(), updatedAt: timestamp("updated_at").defaultNow().notNull(), @@ -288,7 +288,7 @@ export const watchlist = pgTable("watchlist", { .references(() => teams.id, { onDelete: "cascade" }), participantId: uuid("participant_id") .notNull() - .references(() => participants.id, { onDelete: "cascade" }), + .references(() => seasonParticipants.id, { onDelete: "cascade" }), createdAt: timestamp("created_at").defaultNow().notNull(), }, (t) => ({ uniqueWatch: uniqueIndex("watchlist_season_team_participant_unique").on(t.seasonId, t.teamId, t.participantId), @@ -373,7 +373,7 @@ export const sportsSeasons = pgTable("sports_seasons", { updatedAt: timestamp("updated_at").defaultNow().notNull(), }); -export const participants = pgTable("participants", { +export const seasonParticipants = pgTable("season_participants", { id: uuid("id").primaryKey().defaultRandom(), sportsSeasonId: uuid("sports_season_id") .notNull() @@ -411,11 +411,11 @@ export const seasonSports = pgTable("season_sports", { createdAt: timestamp("created_at").defaultNow().notNull(), }); -export const participantResults = pgTable("participant_results", { +export const seasonParticipantResults = pgTable("season_participant_results", { id: uuid("id").primaryKey().defaultRandom(), participantId: uuid("participant_id") .notNull() - .references(() => participants.id, { onDelete: "cascade" }), + .references(() => seasonParticipants.id, { onDelete: "cascade" }), sportsSeasonId: uuid("sports_season_id") .notNull() .references(() => sportsSeasons.id, { onDelete: "cascade" }), @@ -460,9 +460,9 @@ export const eventResults = pgTable("event_results", { scoringEventId: uuid("scoring_event_id") .notNull() .references(() => scoringEvents.id, { onDelete: "cascade" }), - participantId: uuid("participant_id") + seasonParticipantId: uuid("season_participant_id") .notNull() - .references(() => participants.id, { onDelete: "cascade" }), + .references(() => seasonParticipants.id, { onDelete: "cascade" }), // Placement in this specific event placement: integer("placement"), // For qualifying events: QP awarded in this event @@ -483,10 +483,10 @@ export const playoffMatches = pgTable("playoff_matches", { .references(() => scoringEvents.id, { onDelete: "cascade" }), round: varchar("round", { length: 50 }).notNull(), // "Quarterfinals", "Semifinals", "Finals" matchNumber: integer("match_number").notNull(), // 1, 2, 3, 4 (for QF); 1, 2 (for SF); 1 (for F) - participant1Id: uuid("participant1_id").references(() => participants.id, { onDelete: "set null" }), - participant2Id: uuid("participant2_id").references(() => participants.id, { onDelete: "set null" }), - winnerId: uuid("winner_id").references(() => participants.id, { onDelete: "set null" }), - loserId: uuid("loser_id").references(() => participants.id, { onDelete: "set null" }), + participant1Id: uuid("participant1_id").references(() => seasonParticipants.id, { onDelete: "set null" }), + participant2Id: uuid("participant2_id").references(() => seasonParticipants.id, { onDelete: "set null" }), + winnerId: uuid("winner_id").references(() => seasonParticipants.id, { onDelete: "set null" }), + loserId: uuid("loser_id").references(() => seasonParticipants.id, { onDelete: "set null" }), isComplete: boolean("is_complete").notNull().default(false), // Optional detailed data participant1Score: decimal("participant1_score", { precision: 10, scale: 2 }), @@ -510,7 +510,7 @@ export const playoffMatchGames = pgTable("playoff_match_games", { status: playoffMatchGameStatusEnum("status").notNull().default("scheduled"), participant1Score: decimal("participant1_score", { precision: 10, scale: 2 }), participant2Score: decimal("participant2_score", { precision: 10, scale: 2 }), - winnerId: uuid("winner_id").references(() => participants.id, { onDelete: "set null" }), + winnerId: uuid("winner_id").references(() => seasonParticipants.id, { onDelete: "set null" }), notes: text("notes"), createdAt: timestamp("created_at").defaultNow().notNull(), updatedAt: timestamp("updated_at").defaultNow().notNull(), @@ -524,7 +524,7 @@ export const playoffMatchOdds = pgTable("playoff_match_odds", { .references(() => playoffMatches.id, { onDelete: "cascade" }), participantId: uuid("participant_id") .notNull() - .references(() => participants.id, { onDelete: "cascade" }), + .references(() => seasonParticipants.id, { onDelete: "cascade" }), moneylineOdds: integer("moneyline_odds"), // American format e.g. -110, +150 impliedProbability: decimal("implied_probability", { precision: 6, scale: 4 }), oddsSource: varchar("odds_source", { length: 100 }), @@ -534,11 +534,11 @@ export const playoffMatchOdds = pgTable("playoff_match_odds", { }); // Aggregated participant qualifying points (for qualifying_points sports) -export const participantQualifyingTotals = pgTable("participant_qualifying_totals", { +export const seasonParticipantQualifyingTotals = pgTable("season_participant_qualifying_totals", { id: uuid("id").primaryKey().defaultRandom(), participantId: uuid("participant_id") .notNull() - .references(() => participants.id, { onDelete: "cascade" }), + .references(() => seasonParticipants.id, { onDelete: "cascade" }), sportsSeasonId: uuid("sports_season_id") .notNull() .references(() => sportsSeasons.id, { onDelete: "cascade" }), @@ -639,11 +639,11 @@ export const teamStandingsSnapshots = pgTable("team_standings_snapshots", { })); // Expected value tracking (sports-season-specific) -export const participantExpectedValues = pgTable("participant_expected_values", { +export const seasonParticipantExpectedValues = pgTable("season_participant_expected_values", { id: uuid("id").primaryKey().defaultRandom(), participantId: uuid("participant_id") .notNull() - .references(() => participants.id, { onDelete: "cascade" }), + .references(() => seasonParticipants.id, { onDelete: "cascade" }), sportsSeasonId: uuid("sports_season_id") .notNull() .references(() => sportsSeasons.id, { onDelete: "cascade" }), @@ -688,7 +688,7 @@ export const tournamentGroupMembers = pgTable("tournament_group_members", { .references(() => tournamentGroups.id, { onDelete: "cascade" }), participantId: uuid("participant_id") .notNull() - .references(() => participants.id, { onDelete: "cascade" }), + .references(() => seasonParticipants.id, { onDelete: "cascade" }), eliminated: boolean("eliminated").notNull().default(false), createdAt: timestamp("created_at").defaultNow().notNull(), updatedAt: timestamp("updated_at").defaultNow().notNull(), @@ -701,10 +701,10 @@ export const groupStageMatches = pgTable("group_stage_matches", { .references(() => tournamentGroups.id, { onDelete: "cascade" }), participant1Id: uuid("participant1_id") .notNull() - .references(() => participants.id), + .references(() => seasonParticipants.id), participant2Id: uuid("participant2_id") .notNull() - .references(() => participants.id), + .references(() => seasonParticipants.id), participant1Score: integer("participant1_score"), participant2Score: integer("participant2_score"), isComplete: boolean("is_complete").notNull().default(false), @@ -723,7 +723,7 @@ export const participantSeasonResults = pgTable("participant_season_results", { id: uuid("id").primaryKey().defaultRandom(), participantId: uuid("participant_id") .notNull() - .references(() => participants.id, { onDelete: "cascade" }), + .references(() => seasonParticipants.id, { onDelete: "cascade" }), sportsSeasonId: uuid("sports_season_id") .notNull() .references(() => sportsSeasons.id, { onDelete: "cascade" }), @@ -737,7 +737,7 @@ export const participantEvSnapshots = pgTable("participant_ev_snapshots", { id: uuid("id").primaryKey().defaultRandom(), participantId: uuid("participant_id") .notNull() - .references(() => participants.id, { onDelete: "cascade" }), + .references(() => seasonParticipants.id, { onDelete: "cascade" }), sportsSeasonId: uuid("sports_season_id") .notNull() .references(() => sportsSeasons.id, { onDelete: "cascade" }), @@ -790,20 +790,20 @@ export const sportsSeasonsRelations = relations(sportsSeasons, ({ one, many }) = fields: [sportsSeasons.sportId], references: [sports.id], }), - participants: many(participants), + participants: many(seasonParticipants), seasonTemplateSports: many(seasonTemplateSports), seasonSports: many(seasonSports), - participantResults: many(participantResults), + participantResults: many(seasonParticipantResults), regularSeasonStandings: many(regularSeasonStandings), pendingStandingsMappings: many(pendingStandingsMappings), })); -export const participantsRelations = relations(participants, ({ one, many }) => ({ +export const seasonParticipantsRelations = relations(seasonParticipants, ({ one, many }) => ({ sportsSeason: one(sportsSeasons, { - fields: [participants.sportsSeasonId], + fields: [seasonParticipants.sportsSeasonId], references: [sportsSeasons.id], }), - results: many(participantResults), + results: many(seasonParticipantResults), regularSeasonStandings: many(regularSeasonStandings), })); @@ -847,13 +847,13 @@ export const seasonSportsRelations = relations(seasonSports, ({ one }) => ({ }), })); -export const participantResultsRelations = relations(participantResults, ({ one }) => ({ - participant: one(participants, { - fields: [participantResults.participantId], - references: [participants.id], +export const seasonParticipantResultsRelations = relations(seasonParticipantResults, ({ one }) => ({ + participant: one(seasonParticipants, { + fields: [seasonParticipantResults.participantId], + references: [seasonParticipants.id], }), sportsSeason: one(sportsSeasons, { - fields: [participantResults.sportsSeasonId], + fields: [seasonParticipantResults.sportsSeasonId], references: [sportsSeasons.id], }), })); @@ -889,9 +889,9 @@ export const draftPicksRelations = relations(draftPicks, ({ one }) => ({ fields: [draftPicks.teamId], references: [teams.id], }), - participant: one(participants, { + participant: one(seasonParticipants, { fields: [draftPicks.participantId], - references: [participants.id], + references: [seasonParticipants.id], }), })); @@ -904,9 +904,9 @@ export const draftQueueRelations = relations(draftQueue, ({ one }) => ({ fields: [draftQueue.teamId], references: [teams.id], }), - participant: one(participants, { + participant: one(seasonParticipants, { fields: [draftQueue.participantId], - references: [participants.id], + references: [seasonParticipants.id], }), })); @@ -919,9 +919,9 @@ export const watchlistRelations = relations(watchlist, ({ one }) => ({ fields: [watchlist.teamId], references: [teams.id], }), - participant: one(participants, { + participant: one(seasonParticipants, { fields: [watchlist.participantId], - references: [participants.id], + references: [seasonParticipants.id], }), })); @@ -954,9 +954,9 @@ export const eventResultsRelations = relations(eventResults, ({ one }) => ({ fields: [eventResults.scoringEventId], references: [scoringEvents.id], }), - participant: one(participants, { - fields: [eventResults.participantId], - references: [participants.id], + seasonParticipant: one(seasonParticipants, { + fields: [eventResults.seasonParticipantId], + references: [seasonParticipants.id], }), })); @@ -965,21 +965,21 @@ export const playoffMatchesRelations = relations(playoffMatches, ({ one, many }) fields: [playoffMatches.scoringEventId], references: [scoringEvents.id], }), - participant1: one(participants, { + participant1: one(seasonParticipants, { fields: [playoffMatches.participant1Id], - references: [participants.id], + references: [seasonParticipants.id], }), - participant2: one(participants, { + participant2: one(seasonParticipants, { fields: [playoffMatches.participant2Id], - references: [participants.id], + references: [seasonParticipants.id], }), - winner: one(participants, { + winner: one(seasonParticipants, { fields: [playoffMatches.winnerId], - references: [participants.id], + references: [seasonParticipants.id], }), - loser: one(participants, { + loser: one(seasonParticipants, { fields: [playoffMatches.loserId], - references: [participants.id], + references: [seasonParticipants.id], }), games: many(playoffMatchGames), odds: many(playoffMatchOdds), @@ -990,9 +990,9 @@ export const playoffMatchGamesRelations = relations(playoffMatchGames, ({ one }) fields: [playoffMatchGames.playoffMatchId], references: [playoffMatches.id], }), - winner: one(participants, { + winner: one(seasonParticipants, { fields: [playoffMatchGames.winnerId], - references: [participants.id], + references: [seasonParticipants.id], }), })); @@ -1001,19 +1001,19 @@ export const playoffMatchOddsRelations = relations(playoffMatchOdds, ({ one }) = fields: [playoffMatchOdds.playoffMatchId], references: [playoffMatches.id], }), - participant: one(participants, { + participant: one(seasonParticipants, { fields: [playoffMatchOdds.participantId], - references: [participants.id], + references: [seasonParticipants.id], }), })); -export const participantQualifyingTotalsRelations = relations(participantQualifyingTotals, ({ one }) => ({ - participant: one(participants, { - fields: [participantQualifyingTotals.participantId], - references: [participants.id], +export const seasonParticipantQualifyingTotalsRelations = relations(seasonParticipantQualifyingTotals, ({ one }) => ({ + participant: one(seasonParticipants, { + fields: [seasonParticipantQualifyingTotals.participantId], + references: [seasonParticipants.id], }), sportsSeason: one(sportsSeasons, { - fields: [participantQualifyingTotals.sportsSeasonId], + fields: [seasonParticipantQualifyingTotals.sportsSeasonId], references: [sportsSeasons.id], }), })); @@ -1058,21 +1058,21 @@ export const teamStandingsSnapshotsRelations = relations(teamStandingsSnapshots, }), })); -export const participantExpectedValuesRelations = relations(participantExpectedValues, ({ one }) => ({ - participant: one(participants, { - fields: [participantExpectedValues.participantId], - references: [participants.id], +export const seasonParticipantExpectedValuesRelations = relations(seasonParticipantExpectedValues, ({ one }) => ({ + participant: one(seasonParticipants, { + fields: [seasonParticipantExpectedValues.participantId], + references: [seasonParticipants.id], }), sportsSeason: one(sportsSeasons, { - fields: [participantExpectedValues.sportsSeasonId], + fields: [seasonParticipantExpectedValues.sportsSeasonId], references: [sportsSeasons.id], }), })); export const participantSeasonResultsRelations = relations(participantSeasonResults, ({ one }) => ({ - participant: one(participants, { + participant: one(seasonParticipants, { fields: [participantSeasonResults.participantId], - references: [participants.id], + references: [seasonParticipants.id], }), sportsSeason: one(sportsSeasons, { fields: [participantSeasonResults.sportsSeasonId], @@ -1095,9 +1095,9 @@ export const tournamentGroupMembersRelations = relations(tournamentGroupMembers, fields: [tournamentGroupMembers.tournamentGroupId], references: [tournamentGroups.id], }), - participant: one(participants, { + participant: one(seasonParticipants, { fields: [tournamentGroupMembers.participantId], - references: [participants.id], + references: [seasonParticipants.id], }), })); @@ -1106,22 +1106,22 @@ export const groupStageMatchesRelations = relations(groupStageMatches, ({ one }) fields: [groupStageMatches.tournamentGroupId], references: [tournamentGroups.id], }), - participant1: one(participants, { + participant1: one(seasonParticipants, { fields: [groupStageMatches.participant1Id], - references: [participants.id], + references: [seasonParticipants.id], relationName: "groupMatchParticipant1", }), - participant2: one(participants, { + participant2: one(seasonParticipants, { fields: [groupStageMatches.participant2Id], - references: [participants.id], + references: [seasonParticipants.id], relationName: "groupMatchParticipant2", }), })); export const participantEvSnapshotsRelations = relations(participantEvSnapshots, ({ one }) => ({ - participant: one(participants, { + participant: one(seasonParticipants, { fields: [participantEvSnapshots.participantId], - references: [participants.id], + references: [seasonParticipants.id], }), sportsSeason: one(sportsSeasons, { fields: [participantEvSnapshots.sportsSeasonId], @@ -1146,7 +1146,7 @@ export const regularSeasonStandings = pgTable("regular_season_standings", { id: uuid("id").primaryKey().defaultRandom(), participantId: uuid("participant_id") .notNull() - .references(() => participants.id, { onDelete: "cascade" }), + .references(() => seasonParticipants.id, { onDelete: "cascade" }), sportsSeasonId: uuid("sports_season_id") .notNull() .references(() => sportsSeasons.id, { onDelete: "cascade" }), @@ -1177,9 +1177,9 @@ export const regularSeasonStandings = pgTable("regular_season_standings", { })); export const regularSeasonStandingsRelations = relations(regularSeasonStandings, ({ one }) => ({ - participant: one(participants, { + participant: one(seasonParticipants, { fields: [regularSeasonStandings.participantId], - references: [participants.id], + references: [seasonParticipants.id], }), sportsSeason: one(sportsSeasons, { fields: [regularSeasonStandings.sportsSeasonId], @@ -1216,11 +1216,11 @@ export const pendingStandingsMappingsRelations = relations(pendingStandingsMappi // Stores surface-specific Elo ratings for tennis (and future surface-based sports). // One row per (participantId, sportsSeasonId); nullable per surface. -export const participantSurfaceElos = pgTable("participant_surface_elos", { +export const seasonParticipantSurfaceElos = pgTable("season_participant_surface_elos", { id: uuid("id").primaryKey().defaultRandom(), participantId: uuid("participant_id") .notNull() - .references(() => participants.id, { onDelete: "cascade" }), + .references(() => seasonParticipants.id, { onDelete: "cascade" }), sportsSeasonId: uuid("sports_season_id") .notNull() .references(() => sportsSeasons.id, { onDelete: "cascade" }), @@ -1234,13 +1234,13 @@ export const participantSurfaceElos = pgTable("participant_surface_elos", { .on(t.participantId, t.sportsSeasonId), })); -export const participantSurfaceElosRelations = relations(participantSurfaceElos, ({ one }) => ({ - participant: one(participants, { - fields: [participantSurfaceElos.participantId], - references: [participants.id], +export const seasonParticipantSurfaceElosRelations = relations(seasonParticipantSurfaceElos, ({ one }) => ({ + participant: one(seasonParticipants, { + fields: [seasonParticipantSurfaceElos.participantId], + references: [seasonParticipants.id], }), sportsSeason: one(sportsSeasons, { - fields: [participantSurfaceElos.sportsSeasonId], + fields: [seasonParticipantSurfaceElos.sportsSeasonId], references: [sportsSeasons.id], }), })); @@ -1255,7 +1255,7 @@ export const participantGolfSkills = pgTable("participant_golf_skills", { id: uuid("id").primaryKey().defaultRandom(), participantId: uuid("participant_id") .notNull() - .references(() => participants.id, { onDelete: "cascade" }), + .references(() => seasonParticipants.id, { onDelete: "cascade" }), sportsSeasonId: uuid("sports_season_id") .notNull() .references(() => sportsSeasons.id, { onDelete: "cascade" }), @@ -1275,9 +1275,9 @@ export const participantGolfSkills = pgTable("participant_golf_skills", { })); export const participantGolfSkillsRelations = relations(participantGolfSkills, ({ one }) => ({ - participant: one(participants, { + participant: one(seasonParticipants, { fields: [participantGolfSkills.participantId], - references: [participants.id], + references: [seasonParticipants.id], }), sportsSeason: one(sportsSeasons, { fields: [participantGolfSkills.sportsSeasonId], @@ -1302,7 +1302,7 @@ export const cs2MajorStageResults = pgTable("cs2_major_stage_results", { .references(() => scoringEvents.id, { onDelete: "cascade" }), participantId: uuid("participant_id") .notNull() - .references(() => participants.id, { onDelete: "cascade" }), + .references(() => seasonParticipants.id, { onDelete: "cascade" }), stageEntry: integer("stage_entry").notNull(), stageEliminated: integer("stage_eliminated"), stageEliminatedWins: integer("stage_eliminated_wins"), @@ -1319,9 +1319,9 @@ export const cs2MajorStageResultsRelations = relations(cs2MajorStageResults, ({ fields: [cs2MajorStageResults.scoringEventId], references: [scoringEvents.id], }), - participant: one(participants, { + participant: one(seasonParticipants, { fields: [cs2MajorStageResults.participantId], - references: [participants.id], + references: [seasonParticipants.id], }), })); From fdf5fe897670068856f4bffa2dd2e917c2023658 Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Fri, 1 May 2026 06:26:05 +0000 Subject: [PATCH 02/13] refactor: rename participant.ts model file to season-participant.ts Co-Authored-By: Claude Opus 4.7 --- app/models/index.ts | 2 +- .../{participant.ts => season-participant.ts} | 62 +++++++++---------- 2 files changed, 32 insertions(+), 32 deletions(-) rename app/models/{participant.ts => season-participant.ts} (69%) diff --git a/app/models/index.ts b/app/models/index.ts index e32e39b..93d27ec 100644 --- a/app/models/index.ts +++ b/app/models/index.ts @@ -6,7 +6,7 @@ export * from "./team"; export * from "./commissioner"; export * from "./sport"; export * from "./sports-season"; -export * from "./participant"; +export * from "./season-participant"; export * from "./season-template"; export * from "./season-template-sport"; export * from "./season-sport"; diff --git a/app/models/participant.ts b/app/models/season-participant.ts similarity index 69% rename from app/models/participant.ts rename to app/models/season-participant.ts index 686db3e..5d4850c 100644 --- a/app/models/participant.ts +++ b/app/models/season-participant.ts @@ -2,13 +2,13 @@ import { eq, inArray, count, and, sql, asc, desc } from "drizzle-orm"; import { database } from "~/database/context"; import * as schema from "~/database/schema"; -export type Participant = typeof schema.participants.$inferSelect; -export type NewParticipant = typeof schema.participants.$inferInsert; +export type Participant = typeof schema.seasonParticipants.$inferSelect; +export type NewParticipant = typeof schema.seasonParticipants.$inferInsert; export async function createParticipant(data: NewParticipant): Promise { const db = database(); const [participant] = await db - .insert(schema.participants) + .insert(schema.seasonParticipants) .values(data) .returning(); return participant; @@ -17,15 +17,15 @@ export async function createParticipant(data: NewParticipant): Promise { const db = database(); return await db - .insert(schema.participants) + .insert(schema.seasonParticipants) .values(data) .returning(); } export async function findParticipantById(id: string): Promise { const db = database(); - return await db.query.participants.findFirst({ - where: eq(schema.participants.id, id), + return await db.query.seasonParticipants.findFirst({ + where: eq(schema.seasonParticipants.id, id), with: { sportsSeason: { with: { @@ -43,11 +43,11 @@ export async function findParticipantByName( const db = database(); const results = await db .select() - .from(schema.participants) + .from(schema.seasonParticipants) .where( and( - eq(schema.participants.sportsSeasonId, sportsSeasonId), - sql`lower(${schema.participants.name}) = lower(${name})` + eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId), + sql`lower(${schema.seasonParticipants.name}) = lower(${name})` ) ) .limit(1); @@ -56,8 +56,8 @@ export async function findParticipantByName( export async function findParticipantsBySportsSeasonId(sportsSeasonId: string): Promise { const db = database(); - return await db.query.participants.findMany({ - where: eq(schema.participants.sportsSeasonId, sportsSeasonId), + return await db.query.seasonParticipants.findMany({ + where: eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId), orderBy: (participants, { asc: orderAsc }) => [orderAsc(participants.name)], }); } @@ -66,8 +66,8 @@ export async function findParticipantsByExternalId( externalId: string ): Promise { const db = database(); - return await db.query.participants.findMany({ - where: eq(schema.participants.externalId, externalId), + return await db.query.seasonParticipants.findMany({ + where: eq(schema.seasonParticipants.externalId, externalId), with: { sportsSeason: { with: { @@ -84,22 +84,22 @@ export async function updateParticipant( ): Promise { const db = database(); const [participant] = await db - .update(schema.participants) + .update(schema.seasonParticipants) .set({ ...data, updatedAt: new Date() }) - .where(eq(schema.participants.id, id)) + .where(eq(schema.seasonParticipants.id, id)) .returning(); return participant; } export async function countAllParticipants(): Promise { const db = database(); - const result = await db.select({ value: count() }).from(schema.participants); + const result = await db.select({ value: count() }).from(schema.seasonParticipants); return result[0].value; } export async function deleteParticipant(id: string): Promise { const db = database(); - await db.delete(schema.participants).where(eq(schema.participants.id, id)); + await db.delete(schema.seasonParticipants).where(eq(schema.seasonParticipants.id, id)); } export async function copyParticipantsFromSeason( @@ -146,17 +146,17 @@ export async function getParticipantsForSeasonWithSports(seasonId: string, provi // Get all participants for these sports seasons with sport info const participants = await db .select({ - id: schema.participants.id, - name: schema.participants.name, + id: schema.seasonParticipants.id, + name: schema.seasonParticipants.name, sport: { id: schema.sports.id, name: schema.sports.name, }, }) - .from(schema.participants) + .from(schema.seasonParticipants) .innerJoin( schema.sportsSeasons, - eq(schema.participants.sportsSeasonId, schema.sportsSeasons.id) + eq(schema.seasonParticipants.sportsSeasonId, schema.sportsSeasons.id) ) .innerJoin( schema.sports, @@ -164,8 +164,8 @@ export async function getParticipantsForSeasonWithSports(seasonId: string, provi ) .where( sportsSeasonIds.length === 1 - ? eq(schema.participants.sportsSeasonId, sportsSeasonIds[0]) - : inArray(schema.participants.sportsSeasonId, sportsSeasonIds) + ? eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonIds[0]) + : inArray(schema.seasonParticipants.sportsSeasonId, sportsSeasonIds) ); return participants; @@ -183,18 +183,18 @@ export async function getDraftParticipants(seasonId: string) { return await db .select({ - id: schema.participants.id, - name: schema.participants.name, - vorpValue: schema.participants.vorpValue, + id: schema.seasonParticipants.id, + name: schema.seasonParticipants.name, + vorpValue: schema.seasonParticipants.vorpValue, sport: schema.sports, }) - .from(schema.participants) - .innerJoin(schema.sportsSeasons, eq(schema.participants.sportsSeasonId, schema.sportsSeasons.id)) + .from(schema.seasonParticipants) + .innerJoin(schema.sportsSeasons, eq(schema.seasonParticipants.sportsSeasonId, schema.sportsSeasons.id)) .innerJoin(schema.sports, eq(schema.sportsSeasons.sportId, schema.sports.id)) .where( sportsSeasonIds.length === 1 - ? eq(schema.participants.sportsSeasonId, sportsSeasonIds[0]) - : inArray(schema.participants.sportsSeasonId, sportsSeasonIds) + ? eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonIds[0]) + : inArray(schema.seasonParticipants.sportsSeasonId, sportsSeasonIds) ) - .orderBy(desc(schema.participants.vorpValue), asc(schema.participants.name)); + .orderBy(desc(schema.seasonParticipants.vorpValue), asc(schema.seasonParticipants.name)); } From fd99cab61b4ddaf6fadd9463efb3806b8d190548 Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Fri, 1 May 2026 06:37:53 +0000 Subject: [PATCH 03/13] refactor(models): update model layer to use renamed schema exports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updated all model files to use the renamed schema exports from Task 1: - participants → seasonParticipants - participantExpectedValues → seasonParticipantExpectedValues - participantQualifyingTotals → seasonParticipantQualifyingTotals - participantResults → seasonParticipantResults - participantSurfaceElos → seasonParticipantSurfaceElos - eventResults.participantId → eventResults.seasonParticipantId - db.query relation accessors updated - Relation field .participant → .seasonParticipant where applicable - Import paths updated: ./participant → ./season-participant Files updated (14 model files + 3 test files): - draft-pick.ts - draft-utils.ts - event-result.ts - group-stage-match.ts - participant-result.ts - qualifying-points.ts - scoring-calculator.ts - scoring-event.ts - sports-season.ts - surface-elo.ts - team-score-events.ts - cs2-major-stage.ts - golf-skills.ts - participant-expected-value.ts - __tests__/sports-season.clone.test.ts - __tests__/auto-pick.test.ts - __tests__/executeAutoPick.timer.test.ts Typecheck errors decreased: 779 → 499 (280 fewer) All model file errors related to renamed schemas resolved. Co-Authored-By: Claude Opus 4.7 --- app/models/__tests__/auto-pick.test.ts | 6 +- .../__tests__/executeAutoPick.timer.test.ts | 4 +- .../__tests__/sports-season.clone.test.ts | 10 +- app/models/cs2-major-stage.ts | 12 +- app/models/draft-pick.ts | 42 +++---- app/models/draft-utils.ts | 36 +++--- app/models/event-result.ts | 16 +-- app/models/golf-skills.ts | 12 +- app/models/group-stage-match.ts | 4 +- app/models/participant-expected-value.ts | 112 +++++++++--------- app/models/participant-result.ts | 36 +++--- app/models/qualifying-points.ts | 32 ++--- app/models/scoring-calculator.ts | 38 +++--- app/models/scoring-event.ts | 8 +- app/models/sports-season.ts | 12 +- app/models/surface-elo.ts | 50 ++++---- app/models/team-score-events.ts | 4 +- 17 files changed, 217 insertions(+), 217 deletions(-) diff --git a/app/models/__tests__/auto-pick.test.ts b/app/models/__tests__/auto-pick.test.ts index f432448..b66fbe5 100644 --- a/app/models/__tests__/auto-pick.test.ts +++ b/app/models/__tests__/auto-pick.test.ts @@ -34,7 +34,7 @@ import { getTeamDraftPicksWithSports, isParticipantDrafted, } from "~/models/draft-pick"; -import { getParticipantsForSeasonWithSports } from "~/models/participant"; +import { getParticipantsForSeasonWithSports } from "~/models/season-participant"; import { getSeasonSportsSimple } from "~/models/season-sport"; import { getTeamQueue, getAllQueuesForSeason } from "~/models/draft-queue"; import { calculateDraftEligibility } from "~/lib/draft-eligibility"; @@ -49,7 +49,7 @@ const ALL_TEAM_IDS = [TEAM_ID, "team-2"]; function makeMockDb(overrides: Record = {}) { const mockDb: Record = { query: { - participants: { + seasonParticipants: { findMany: vi.fn().mockResolvedValue([]), }, }, @@ -71,7 +71,7 @@ function makeMockDb(overrides: Record = {}) { // 3. select().from().where().orderBy() → top participant → [{id, ...}] function makeMockDbWithEvParticipant(participantId: string) { return { - query: { participants: { findMany: vi.fn().mockResolvedValue([]) } }, + query: { seasonParticipants: { findMany: vi.fn().mockResolvedValue([]) } }, select: vi.fn().mockReturnThis(), from: vi.fn().mockReturnThis(), innerJoin: vi.fn().mockReturnThis(), diff --git a/app/models/__tests__/executeAutoPick.timer.test.ts b/app/models/__tests__/executeAutoPick.timer.test.ts index d2867fb..65b2516 100644 --- a/app/models/__tests__/executeAutoPick.timer.test.ts +++ b/app/models/__tests__/executeAutoPick.timer.test.ts @@ -42,7 +42,7 @@ vi.mock("~/lib/draft-eligibility", () => ({ vi.mock("~/database/context"); import { getDraftPicksWithSports, getTeamDraftPicksWithSports, isParticipantDrafted } from "~/models/draft-pick"; -import { getParticipantsForSeasonWithSports } from "~/models/participant"; +import { getParticipantsForSeasonWithSports } from "~/models/season-participant"; import { getSeasonSportsSimple } from "~/models/season-sport"; import { getTeamQueue, getAllQueuesForSeason } from "~/models/draft-queue"; import { calculateDraftEligibility } from "~/lib/draft-eligibility"; @@ -127,7 +127,7 @@ function makeMockDb(seasonOverrides: Record = {}) { draftPicks: { findFirst: vi.fn().mockResolvedValue(null) }, seasons: { findFirst: vi.fn().mockResolvedValue(makeSeason(seasonOverrides)) }, draftSlots: { findMany: vi.fn().mockResolvedValue(mockDraftSlots) }, - participants: { + seasonParticipants: { // findMany: used by autoPickForTeam queue path findMany: vi.fn().mockResolvedValue([mockParticipantForQueue]), // findFirst: used by executeAutoPick to fetch full participant details diff --git a/app/models/__tests__/sports-season.clone.test.ts b/app/models/__tests__/sports-season.clone.test.ts index b209c18..c0acef8 100644 --- a/app/models/__tests__/sports-season.clone.test.ts +++ b/app/models/__tests__/sports-season.clone.test.ts @@ -6,9 +6,9 @@ vi.mock("~/database/context", () => ({ vi.mock("~/database/schema", () => ({ sportsSeasons: { id: "ss.id", sportId: "ss.sport_id" }, - participants: { sportsSeasonId: "p.sports_season_id" }, + seasonParticipants: { sportsSeasonId: "p.sports_season_id" }, scoringEvents: { sportsSeasonId: "se.sports_season_id" }, - participantExpectedValues: { sportsSeasonId: "pev.sports_season_id" }, + seasonParticipantExpectedValues: { sportsSeasonId: "pev.sports_season_id" }, })); vi.mock("drizzle-orm", () => ({ @@ -91,16 +91,16 @@ function makeMockDb({ const db: any = { query: { sportsSeasons: { findFirst: vi.fn().mockResolvedValue(ss) }, - participants: { findMany: vi.fn().mockResolvedValue(participants) }, + seasonParticipants: { findMany: vi.fn().mockResolvedValue(participants) }, scoringEvents: { findMany: vi.fn().mockResolvedValue(scoringEvents) }, - participantExpectedValues: { findMany: vi.fn().mockResolvedValue(sourceEvRows) }, + seasonParticipantExpectedValues: { findMany: vi.fn().mockResolvedValue(sourceEvRows) }, }, insert: vi.fn().mockImplementation((table: object) => { let key: string; let returnRows: object[]; if (table === schema.sportsSeasons) { key = "sportsSeasons"; returnRows = [insertedSeason]; - } else if (table === schema.participants) { + } else if (table === schema.seasonParticipants) { key = "participants"; returnRows = newParticipantRows; } else if (table === schema.scoringEvents) { key = "scoringEvents"; returnRows = []; diff --git a/app/models/cs2-major-stage.ts b/app/models/cs2-major-stage.ts index 6a30bc5..bbaede8 100644 --- a/app/models/cs2-major-stage.ts +++ b/app/models/cs2-major-stage.ts @@ -13,7 +13,7 @@ */ import { database } from "~/database/context"; -import { cs2MajorStageResults, participants } from "~/database/schema"; +import { cs2MajorStageResults, seasonParticipants } from "~/database/schema"; import { eq, and, sql } from "drizzle-orm"; export interface Cs2StageResult { @@ -56,12 +56,12 @@ export async function getCs2StageResultsForEvent( finalPlacement: cs2MajorStageResults.finalPlacement, createdAt: cs2MajorStageResults.createdAt, updatedAt: cs2MajorStageResults.updatedAt, - participantName: participants.name, + participantName: seasonParticipants.name, }) .from(cs2MajorStageResults) - .innerJoin(participants, eq(cs2MajorStageResults.participantId, participants.id)) + .innerJoin(seasonParticipants, eq(cs2MajorStageResults.participantId, seasonParticipants.id)) .where(eq(cs2MajorStageResults.scoringEventId, scoringEventId)) - .orderBy(cs2MajorStageResults.stageEntry, participants.name); + .orderBy(cs2MajorStageResults.stageEntry, seasonParticipants.name); return rows; } @@ -135,7 +135,7 @@ export async function clearCs2StageAssignments( /** * Mark teams as eliminated from a specific stage. - * Records stageEliminated and stageEliminatedWins for the specified participants. + * Records stageEliminated and stageEliminatedWins for the specified seasonParticipants. * Teams NOT in eliminatedEntries that are in this stage are implicitly considered * to have advanced (stageEliminated remains null). */ @@ -166,7 +166,7 @@ export async function markCs2StageEliminations( } /** - * Set final placements for all participants in a CS2 Major event. + * Set final placements for all seasonParticipants in a CS2 Major event. * Called after the Champions Stage is complete. * placements: Map from participantId to final placement (1–32) */ diff --git a/app/models/draft-pick.ts b/app/models/draft-pick.ts index 1c7b17b..2ad46a3 100644 --- a/app/models/draft-pick.ts +++ b/app/models/draft-pick.ts @@ -78,14 +78,14 @@ export async function getDraftedParticipantsBySportsSeason( const results = await db .select({ - sportsSeasonId: schema.participants.sportsSeasonId, - participantId: schema.participants.id, - participantName: schema.participants.name, + sportsSeasonId: schema.seasonParticipants.sportsSeasonId, + participantId: schema.seasonParticipants.id, + participantName: schema.seasonParticipants.name, }) .from(schema.draftPicks) .innerJoin( - schema.participants, - eq(schema.draftPicks.participantId, schema.participants.id) + schema.seasonParticipants, + eq(schema.draftPicks.participantId, schema.seasonParticipants.id) ) .where( and( @@ -182,10 +182,10 @@ export async function getDraftedParticipantsWithPoints( // Batch-fetch QP totals for qualifying_points participants const qpMap = new Map(); // participantId → totalQP if (qpParticipantIds.size > 0 && qpSeasonIds.size > 0) { - const totals = await db.query.participantQualifyingTotals.findMany({ + const totals = await db.query.seasonParticipantQualifyingTotals.findMany({ where: and( - inArray(schema.participantQualifyingTotals.participantId, [...qpParticipantIds]), - inArray(schema.participantQualifyingTotals.sportsSeasonId, [...qpSeasonIds]) + inArray(schema.seasonParticipantQualifyingTotals.participantId, [...qpParticipantIds]), + inArray(schema.seasonParticipantQualifyingTotals.sportsSeasonId, [...qpSeasonIds]) ), columns: { participantId: true, totalQualifyingPoints: true }, }); @@ -245,19 +245,19 @@ export async function getDraftPicksWithSports(seasonId: string, providedDb?: Ret id: schema.draftPicks.id, teamId: schema.draftPicks.teamId, pickNumber: schema.draftPicks.pickNumber, - participantId: schema.participants.id, - participantName: schema.participants.name, + participantId: schema.seasonParticipants.id, + participantName: schema.seasonParticipants.name, sportId: schema.sports.id, sportName: schema.sports.name, }) .from(schema.draftPicks) .innerJoin( - schema.participants, - eq(schema.draftPicks.participantId, schema.participants.id) + schema.seasonParticipants, + eq(schema.draftPicks.participantId, schema.seasonParticipants.id) ) .innerJoin( schema.sportsSeasons, - eq(schema.participants.sportsSeasonId, schema.sportsSeasons.id) + eq(schema.seasonParticipants.sportsSeasonId, schema.sportsSeasons.id) ) .innerJoin( schema.sports, @@ -289,19 +289,19 @@ export async function getTeamDraftPicksWithSports(teamId: string, seasonId: stri id: schema.draftPicks.id, teamId: schema.draftPicks.teamId, pickNumber: schema.draftPicks.pickNumber, - participantId: schema.participants.id, - participantName: schema.participants.name, + participantId: schema.seasonParticipants.id, + participantName: schema.seasonParticipants.name, sportId: schema.sports.id, sportName: schema.sports.name, }) .from(schema.draftPicks) .innerJoin( - schema.participants, - eq(schema.draftPicks.participantId, schema.participants.id) + schema.seasonParticipants, + eq(schema.draftPicks.participantId, schema.seasonParticipants.id) ) .innerJoin( schema.sportsSeasons, - eq(schema.participants.sportsSeasonId, schema.sportsSeasons.id) + eq(schema.seasonParticipants.sportsSeasonId, schema.sportsSeasons.id) ) .innerJoin( schema.sports, @@ -338,13 +338,13 @@ export async function getDraftPicksForSeason(seasonId: string) { pickInRound: schema.draftPicks.pickInRound, timeUsed: schema.draftPicks.timeUsed, team: schema.teams, - participant: schema.participants, + participant: schema.seasonParticipants, sport: schema.sports, }) .from(schema.draftPicks) .innerJoin(schema.teams, eq(schema.draftPicks.teamId, schema.teams.id)) - .innerJoin(schema.participants, eq(schema.draftPicks.participantId, schema.participants.id)) - .innerJoin(schema.sportsSeasons, eq(schema.participants.sportsSeasonId, schema.sportsSeasons.id)) + .innerJoin(schema.seasonParticipants, eq(schema.draftPicks.participantId, schema.seasonParticipants.id)) + .innerJoin(schema.sportsSeasons, eq(schema.seasonParticipants.sportsSeasonId, schema.sportsSeasons.id)) .innerJoin(schema.sports, eq(schema.sportsSeasons.sportId, schema.sports.id)) .where(eq(schema.draftPicks.seasonId, seasonId)) .orderBy(asc(schema.draftPicks.pickNumber)); diff --git a/app/models/draft-utils.ts b/app/models/draft-utils.ts index cfa80c9..47a844e 100644 --- a/app/models/draft-utils.ts +++ b/app/models/draft-utils.ts @@ -5,7 +5,7 @@ import { logger } from "~/lib/logger"; import type { InferSelectModel } from "drizzle-orm"; import { getTeamQueue, getAllQueuesForSeason } from "./draft-queue"; import { isParticipantDrafted, getDraftPicksWithSports, getTeamDraftPicksWithSports } from "./draft-pick"; -import { getParticipantsForSeasonWithSports } from "./participant"; +import { getParticipantsForSeasonWithSports } from "./season-participant"; import { getSeasonSportsSimple } from "./season-sport"; import { calculateDraftEligibility } from "~/lib/draft-eligibility"; import { getSocketIO, scheduleDraftRoomClosure } from "../../server/socket"; @@ -118,8 +118,8 @@ export async function autoPickForTeam( // Get participant details for queue items to check eligibility const queueParticipantIds = queue.map((item) => item.participantId); - const queueParticipants = await db.query.participants.findMany({ - where: inArray(schema.participants.id, queueParticipantIds), + const queueParticipants = await db.query.seasonParticipants.findMany({ + where: inArray(schema.seasonParticipants.id, queueParticipantIds), with: { sportsSeason: { with: { @@ -264,17 +264,17 @@ export async function getTopAvailableParticipant( for (const sportsSeasonId of sportsSeasonIds) { let participantQuery = db .select() - .from(schema.participants) - .where(eq(schema.participants.sportsSeasonId, sportsSeasonId)); + .from(schema.seasonParticipants) + .where(eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId)); if (draftedIds.length > 0) { participantQuery = db .select() - .from(schema.participants) + .from(schema.seasonParticipants) .where( and( - eq(schema.participants.sportsSeasonId, sportsSeasonId), - notInArray(schema.participants.id, draftedIds) + eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId), + notInArray(schema.seasonParticipants.id, draftedIds) ) ); } @@ -299,21 +299,21 @@ export async function getTopAvailableParticipant( // Single sport season let query = db .select() - .from(schema.participants) - .where(eq(schema.participants.sportsSeasonId, sportsSeasonIds[0])) - .orderBy(desc(schema.participants.vorpValue), schema.participants.name); + .from(schema.seasonParticipants) + .where(eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonIds[0])) + .orderBy(desc(schema.seasonParticipants.vorpValue), schema.seasonParticipants.name); if (draftedIds.length > 0) { query = db .select() - .from(schema.participants) + .from(schema.seasonParticipants) .where( and( - eq(schema.participants.sportsSeasonId, sportsSeasonIds[0]), - notInArray(schema.participants.id, draftedIds) + eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonIds[0]), + notInArray(schema.seasonParticipants.id, draftedIds) ) ) - .orderBy(desc(schema.participants.vorpValue), schema.participants.name); + .orderBy(desc(schema.seasonParticipants.vorpValue), schema.seasonParticipants.name); } const [topParticipant] = await query; @@ -471,7 +471,7 @@ export async function executeAutoPick(params: { success: boolean; error?: string; pick?: InferSelectModel; - participant?: InferSelectModel & { + participant?: InferSelectModel & { sportsSeason: InferSelectModel & { sport: InferSelectModel; }; @@ -581,8 +581,8 @@ export async function executeAutoPick(params: { } // Get participant details - const participantToPick = await db.query.participants.findFirst({ - where: eq(schema.participants.id, participantId), + const participantToPick = await db.query.seasonParticipants.findFirst({ + where: eq(schema.seasonParticipants.id, participantId), with: { sportsSeason: { with: { diff --git a/app/models/event-result.ts b/app/models/event-result.ts index 7d453ef..8021329 100644 --- a/app/models/event-result.ts +++ b/app/models/event-result.ts @@ -31,7 +31,7 @@ export async function createEventResult( .insert(schema.eventResults) .values({ scoringEventId: data.scoringEventId, - participantId: data.participantId, + seasonParticipantId: data.participantId, placement: data.placement, qualifyingPointsAwarded: data.qualifyingPointsAwarded?.toString(), eliminated: data.eliminated, @@ -57,7 +57,7 @@ export async function createEventResultsBulk( .values( results.map((r) => ({ scoringEventId: r.scoringEventId, - participantId: r.participantId, + seasonParticipantId: r.participantId, placement: r.placement, qualifyingPointsAwarded: r.qualifyingPointsAwarded?.toString(), eliminated: r.eliminated, @@ -81,7 +81,7 @@ export async function getEventResultById( return await db.query.eventResults.findFirst({ where: eq(schema.eventResults.id, resultId), with: { - participant: { + seasonParticipant: { with: { sportsSeason: { with: { @@ -108,7 +108,7 @@ export async function getEventResults( where: eq(schema.eventResults.scoringEventId, eventId), orderBy: schema.eventResults.placement, with: { - participant: { + seasonParticipant: { with: { sportsSeason: { with: { @@ -131,7 +131,7 @@ export async function getParticipantEventResults( const db = providedDb || database(); return await db.query.eventResults.findMany({ - where: eq(schema.eventResults.participantId, participantId), + where: eq(schema.eventResults.seasonParticipantId, participantId), with: { scoringEvent: true, }, @@ -203,7 +203,7 @@ export async function hasParticipantResult( const result = await db.query.eventResults.findFirst({ where: and( eq(schema.eventResults.scoringEventId, eventId), - eq(schema.eventResults.participantId, participantId) + eq(schema.eventResults.seasonParticipantId, participantId) ), }); @@ -226,10 +226,10 @@ export async function getEventResultsForParticipants( return await db.query.eventResults.findMany({ where: and( eq(schema.eventResults.scoringEventId, eventId), - inArray(schema.eventResults.participantId, participantIds) + inArray(schema.eventResults.seasonParticipantId, participantIds) ), with: { - participant: { + seasonParticipant: { with: { sportsSeason: { with: { diff --git a/app/models/golf-skills.ts b/app/models/golf-skills.ts index 7f08591..6b9bb0b 100644 --- a/app/models/golf-skills.ts +++ b/app/models/golf-skills.ts @@ -7,7 +7,7 @@ */ import { database } from "~/database/context"; -import { participantGolfSkills, participants } from "~/database/schema"; +import { participantGolfSkills, seasonParticipants } from "~/database/schema"; import { eq, sql } from "drizzle-orm"; export interface GolfSkillsRecord { @@ -40,7 +40,7 @@ export interface GolfSkillsInput { /** * Get all golf skill records for a sports season, joined with participant names. - * Returns one record per participant (participants with no record are excluded). + * Returns one record per participant (seasonParticipants with no record are excluded). */ export async function getGolfSkillsForSeason( sportsSeasonId: string @@ -58,12 +58,12 @@ export async function getGolfSkillsForSeason( openChampionshipOdds: participantGolfSkills.openChampionshipOdds, pgaChampionshipOdds: participantGolfSkills.pgaChampionshipOdds, updatedAt: participantGolfSkills.updatedAt, - participantName: participants.name, + participantName: seasonParticipants.name, }) .from(participantGolfSkills) - .innerJoin(participants, eq(participantGolfSkills.participantId, participants.id)) + .innerJoin(seasonParticipants, eq(participantGolfSkills.participantId, seasonParticipants.id)) .where(eq(participantGolfSkills.sportsSeasonId, sportsSeasonId)) - .orderBy(participants.name); + .orderBy(seasonParticipants.name); return rows.map((r) => ({ ...r, @@ -94,7 +94,7 @@ export async function getGolfSkillsMap( } /** - * Upsert golf skill ratings for a batch of participants. + * Upsert golf skill ratings for a batch of seasonParticipants. * Uses INSERT … ON CONFLICT DO UPDATE so all columns are overwritten atomically. */ export async function batchUpsertGolfSkills( diff --git a/app/models/group-stage-match.ts b/app/models/group-stage-match.ts index 8392547..62e7e16 100644 --- a/app/models/group-stage-match.ts +++ b/app/models/group-stage-match.ts @@ -334,8 +334,8 @@ export async function getUpcomingGroupStageMatchesForParticipants( const allParticipantIds = [ ...new Set(rows.flatMap((r) => [r.participant1Id, r.participant2Id])), ]; - const participantRows = await db.query.participants.findMany({ - where: inArray(schema.participants.id, allParticipantIds), + const participantRows = await db.query.seasonParticipants.findMany({ + where: inArray(schema.seasonParticipants.id, allParticipantIds), }); const participantMap = new Map(participantRows.map((p) => [p.id, p])); diff --git a/app/models/participant-expected-value.ts b/app/models/participant-expected-value.ts index c33f39f..bd6e670 100644 --- a/app/models/participant-expected-value.ts +++ b/app/models/participant-expected-value.ts @@ -1,12 +1,12 @@ /** * Model for Participant Expected Values * - * Manages probability distributions and calculated EVs for participants + * Manages probability distributions and calculated EVs for seasonParticipants * in sports seasons. */ import { database } from "~/database/context"; -import { participantExpectedValues, participants } from "~/database/schema"; +import { seasonParticipantExpectedValues, seasonParticipants } from "~/database/schema"; import { eq, and, count, sql } from "drizzle-orm"; import type { ProbabilityDistribution, ScoringRules } from "~/services/ev-calculator"; import { calculateEV, normalizeProbabilities, calculateReplacementLevel, calculateVORP } from "~/services/ev-calculator"; @@ -53,9 +53,9 @@ export interface UpdateProbabilityInput { * Recalculate and persist VORP for every participant in a sports season. * * VORP = participant EV − replacement level EV - * Replacement level = average EV of participants ranked 12th–14th in this season. + * Replacement level = average EV of seasonParticipants ranked 12th–14th in this season. * - * Call this after any operation that changes EVs for participants in the season. + * Call this after any operation that changes EVs for seasonParticipants in the season. */ export async function syncVorpForSeason(sportsSeasonId: string): Promise { const db = database(); @@ -72,12 +72,12 @@ export async function syncVorpForSeason(sportsSeasonId: string): Promise { const now = new Date(); - // Build a single CASE expression to update all participants in one query + // Build a single CASE expression to update all seasonParticipants in one query // instead of N individual UPDATE statements. const vorpCaseExpr = sql`CASE ${sql.join( sorted.map((ev) => { const vorp = calculateVORP(parseFloat(ev.expectedValue), replacementLevel); - return sql`WHEN ${participants.id} = ${ev.participantId} THEN ${vorp.toFixed(4)}::numeric`; + return sql`WHEN ${seasonParticipants.id} = ${ev.participantId} THEN ${vorp.toFixed(4)}::numeric`; }), sql` ` )} END`; @@ -85,9 +85,9 @@ export async function syncVorpForSeason(sportsSeasonId: string): Promise { const ids = sorted.map((ev) => ev.participantId); await db - .update(participants) + .update(seasonParticipants) .set({ vorpValue: vorpCaseExpr, updatedAt: now }) - .where(sql`${participants.id} = ANY(${sql`ARRAY[${sql.join(ids.map((id) => sql`${id}`), sql`, `)}]::uuid[]`})`); + .where(sql`${seasonParticipants.id} = ANY(${sql`ARRAY[${sql.join(ids.map((id) => sql`${id}`), sql`, `)}]::uuid[]`})`); } /** @@ -118,11 +118,11 @@ export async function upsertParticipantEV( // Check if record exists const existing = await db .select() - .from(participantExpectedValues) + .from(seasonParticipantExpectedValues) .where( and( - eq(participantExpectedValues.participantId, participantId), - eq(participantExpectedValues.sportsSeasonId, sportsSeasonId) + eq(seasonParticipantExpectedValues.participantId, participantId), + eq(seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId) ) ) .limit(1); @@ -134,7 +134,7 @@ export async function upsertParticipantEV( if (existing.length > 0) { // Update existing const updated = await db - .update(participantExpectedValues) + .update(seasonParticipantExpectedValues) .set({ probFirst: probabilities.probFirst.toString(), probSecond: probabilities.probSecond.toString(), @@ -150,14 +150,14 @@ export async function upsertParticipantEV( calculatedAt: now, updatedAt: now, }) - .where(eq(participantExpectedValues.id, existing[0].id)) + .where(eq(seasonParticipantExpectedValues.id, existing[0].id)) .returning(); result = updated[0]; } else { // Create new const created = await db - .insert(participantExpectedValues) + .insert(seasonParticipantExpectedValues) .values({ participantId, sportsSeasonId, @@ -180,13 +180,13 @@ export async function upsertParticipantEV( result = created[0]; } - // Sync calculated EV to participants table for draft room ranking + // Sync calculated EV to seasonParticipants table for draft room ranking await db - .update(participants) + .update(seasonParticipants) .set({ expectedValue: expectedValue.toString(), updatedAt: now }) - .where(eq(participants.id, participantId)); + .where(eq(seasonParticipants.id, participantId)); - // Recalculate VORP for all participants in this season (replacement level may have shifted) + // Recalculate VORP for all seasonParticipants in this season (replacement level may have shifted) await syncVorpForSeason(sportsSeasonId); return result; @@ -209,7 +209,7 @@ export async function upsertParticipantEVWithNormalization( export async function countAllParticipantEVs(): Promise { const db = database(); - const result = await db.select({ value: count() }).from(participantExpectedValues); + const result = await db.select({ value: count() }).from(seasonParticipantExpectedValues); return result[0].value; } @@ -223,11 +223,11 @@ export async function getParticipantEV( const db = database(); const result = await db .select() - .from(participantExpectedValues) + .from(seasonParticipantExpectedValues) .where( and( - eq(participantExpectedValues.participantId, participantId), - eq(participantExpectedValues.sportsSeasonId, sportsSeasonId) + eq(seasonParticipantExpectedValues.participantId, participantId), + eq(seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId) ) ) .limit(1); @@ -244,8 +244,8 @@ export async function getAllParticipantEVsForSeason( const db = database(); return db .select() - .from(participantExpectedValues) - .where(eq(participantExpectedValues.sportsSeasonId, sportsSeasonId)); + .from(seasonParticipantExpectedValues) + .where(eq(seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId)); } /** @@ -257,21 +257,21 @@ export async function deleteParticipantEV( ): Promise { const db = database(); await db - .delete(participantExpectedValues) + .delete(seasonParticipantExpectedValues) .where( and( - eq(participantExpectedValues.participantId, participantId), - eq(participantExpectedValues.sportsSeasonId, sportsSeasonId) + eq(seasonParticipantExpectedValues.participantId, participantId), + eq(seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId) ) ); // Reset this participant's EV and VORP to 0 (no longer ranked) await db - .update(participants) + .update(seasonParticipants) .set({ expectedValue: "0", vorpValue: "0", updatedAt: new Date() }) - .where(eq(participants.id, participantId)); + .where(eq(seasonParticipants.id, participantId)); - // Recalculate VORP for remaining participants — replacement level may have shifted + // Recalculate VORP for remaining seasonParticipants — replacement level may have shifted await syncVorpForSeason(sportsSeasonId); } @@ -301,12 +301,12 @@ export async function batchUpsertParticipantEVs( const expectedValue = calculateEV(probabilities, scoringRules); const existing = await tx - .select({ id: participantExpectedValues.id }) - .from(participantExpectedValues) + .select({ id: seasonParticipantExpectedValues.id }) + .from(seasonParticipantExpectedValues) .where( and( - eq(participantExpectedValues.participantId, participantId), - eq(participantExpectedValues.sportsSeasonId, sportsSeasonId) + eq(seasonParticipantExpectedValues.participantId, participantId), + eq(seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId) ) ) .limit(1); @@ -330,24 +330,24 @@ export async function batchUpsertParticipantEVs( if (existing.length > 0) { const [updated] = await tx - .update(participantExpectedValues) + .update(seasonParticipantExpectedValues) // Only overwrite sourceOdds if explicitly provided; preserve existing value otherwise .set(sourceOdds !== undefined ? { ...baseValues, sourceOdds } : baseValues) - .where(eq(participantExpectedValues.id, existing[0].id)) + .where(eq(seasonParticipantExpectedValues.id, existing[0].id)) .returning(); result = updated; } else { const [created] = await tx - .insert(participantExpectedValues) + .insert(seasonParticipantExpectedValues) .values({ participantId, sportsSeasonId, ...baseValues, sourceOdds: sourceOdds ?? null }) .returning(); result = created; } await tx - .update(participants) + .update(seasonParticipants) .set({ expectedValue: expectedValue.toString(), updatedAt: now }) - .where(eq(participants.id, participantId)); + .where(eq(seasonParticipants.id, participantId)); results.push(result); } @@ -361,7 +361,7 @@ export async function batchUpsertParticipantEVs( } /** - * Save American odds for a batch of participants without touching probabilities or EV. + * Save American odds for a batch of seasonParticipants without touching probabilities or EV. * Used by the futures-odds admin page to persist odds before running the full simulation. */ export async function batchSaveSourceOdds( @@ -374,24 +374,24 @@ export async function batchSaveSourceOdds( for (const { participantId, sportsSeasonId, sourceOdds } of inputs) { const existing = await tx - .select({ id: participantExpectedValues.id }) - .from(participantExpectedValues) + .select({ id: seasonParticipantExpectedValues.id }) + .from(seasonParticipantExpectedValues) .where( and( - eq(participantExpectedValues.participantId, participantId), - eq(participantExpectedValues.sportsSeasonId, sportsSeasonId) + eq(seasonParticipantExpectedValues.participantId, participantId), + eq(seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId) ) ) .limit(1); if (existing.length > 0) { await tx - .update(participantExpectedValues) + .update(seasonParticipantExpectedValues) .set({ sourceOdds, updatedAt: now }) - .where(eq(participantExpectedValues.id, existing[0].id)); + .where(eq(seasonParticipantExpectedValues.id, existing[0].id)); } else { // Insert a stub record — probabilities/EV will be filled in by the simulator - await tx.insert(participantExpectedValues).values({ + await tx.insert(seasonParticipantExpectedValues).values({ participantId, sportsSeasonId, probFirst: "0", @@ -414,7 +414,7 @@ export async function batchSaveSourceOdds( } /** - * Persist raw Elo ratings (and optional world rankings) for a batch of participants. + * Persist raw Elo ratings (and optional world rankings) for a batch of seasonParticipants. * Used by Elo-based simulators like snooker_bracket and darts_bracket. * Creates stub records if none exist; does not touch probabilities or EV. * Uses INSERT ... ON CONFLICT DO UPDATE to avoid N+1 queries. @@ -427,7 +427,7 @@ export async function batchSaveSourceElos( const now = new Date(); await db - .insert(participantExpectedValues) + .insert(seasonParticipantExpectedValues) .values( inputs.map(({ participantId, sportsSeasonId, sourceElo, worldRanking }) => ({ participantId, @@ -449,7 +449,7 @@ export async function batchSaveSourceElos( })) ) .onConflictDoUpdate({ - target: [participantExpectedValues.participantId, participantExpectedValues.sportsSeasonId], + target: [seasonParticipantExpectedValues.participantId, seasonParticipantExpectedValues.sportsSeasonId], set: { sourceElo: sql`excluded.source_elo`, worldRanking: sql`excluded.world_ranking`, @@ -499,26 +499,26 @@ export async function recalculateEV( const db = database(); const now = new Date(); const updated = await db - .update(participantExpectedValues) + .update(seasonParticipantExpectedValues) .set({ expectedValue: newEV.toString(), calculatedAt: now, updatedAt: now, }) - .where(eq(participantExpectedValues.id, existing.id)) + .where(eq(seasonParticipantExpectedValues.id, existing.id)) .returning(); - // Sync recalculated EV to participants table + // Sync recalculated EV to seasonParticipants table await db - .update(participants) + .update(seasonParticipants) .set({ expectedValue: newEV.toString(), updatedAt: now }) - .where(eq(participants.id, participantId)); + .where(eq(seasonParticipants.id, participantId)); return updated[0]; } /** - * Recalculate EVs for all participants in a sports season + * Recalculate EVs for all seasonParticipants in a sports season * Used when scoring rules change */ export async function recalculateAllEVsForSeason( diff --git a/app/models/participant-result.ts b/app/models/participant-result.ts index 72691fe..8c76e04 100644 --- a/app/models/participant-result.ts +++ b/app/models/participant-result.ts @@ -2,18 +2,18 @@ import { eq, and } from "drizzle-orm"; import { database } from "~/database/context"; import * as schema from "~/database/schema"; -export type ParticipantResult = typeof schema.participantResults.$inferSelect; +export type ParticipantResult = typeof schema.seasonParticipantResults.$inferSelect; export type ParticipantResultWithParticipant = ParticipantResult & { participant: { id: string; name: string } | null; }; -export type NewParticipantResult = typeof schema.participantResults.$inferInsert; +export type NewParticipantResult = typeof schema.seasonParticipantResults.$inferInsert; export async function createParticipantResult( data: NewParticipantResult ): Promise { const db = database(); const [result] = await db - .insert(schema.participantResults) + .insert(schema.seasonParticipantResults) .values(data) .returning(); return result; @@ -24,7 +24,7 @@ export async function createManyParticipantResults( ): Promise { const db = database(); return await db - .insert(schema.participantResults) + .insert(schema.seasonParticipantResults) .values(data) .returning(); } @@ -33,8 +33,8 @@ export async function findParticipantResultById( id: string ): Promise { const db = database(); - return await db.query.participantResults.findFirst({ - where: eq(schema.participantResults.id, id), + return await db.query.seasonParticipantResults.findFirst({ + where: eq(schema.seasonParticipantResults.id, id), with: { participant: true, sportsSeason: { @@ -50,8 +50,8 @@ export async function findParticipantResultByParticipantId( participantId: string ): Promise { const db = database(); - return await db.query.participantResults.findFirst({ - where: eq(schema.participantResults.participantId, participantId), + return await db.query.seasonParticipantResults.findFirst({ + where: eq(schema.seasonParticipantResults.participantId, participantId), with: { participant: true, sportsSeason: { @@ -67,8 +67,8 @@ export async function findParticipantResultsBySportsSeasonId( sportsSeasonId: string ): Promise { const db = database(); - return await db.query.participantResults.findMany({ - where: eq(schema.participantResults.sportsSeasonId, sportsSeasonId), + return await db.query.seasonParticipantResults.findMany({ + where: eq(schema.seasonParticipantResults.sportsSeasonId, sportsSeasonId), orderBy: (results, { asc }) => [asc(results.finalPosition)], with: { participant: true, @@ -82,16 +82,16 @@ export async function updateParticipantResult( ): Promise { const db = database(); const [result] = await db - .update(schema.participantResults) + .update(schema.seasonParticipantResults) .set({ ...data, updatedAt: new Date() }) - .where(eq(schema.participantResults.id, id)) + .where(eq(schema.seasonParticipantResults.id, id)) .returning(); return result; } export async function deleteParticipantResult(id: string): Promise { const db = database(); - await db.delete(schema.participantResults).where(eq(schema.participantResults.id, id)); + await db.delete(schema.seasonParticipantResults).where(eq(schema.seasonParticipantResults.id, id)); } export async function deleteParticipantResultsBySportsSeasonId( @@ -99,8 +99,8 @@ export async function deleteParticipantResultsBySportsSeasonId( ): Promise { const db = database(); await db - .delete(schema.participantResults) - .where(eq(schema.participantResults.sportsSeasonId, sportsSeasonId)); + .delete(schema.seasonParticipantResults) + .where(eq(schema.seasonParticipantResults.sportsSeasonId, sportsSeasonId)); } /** @@ -117,10 +117,10 @@ export async function setParticipantResult( const db = database(); // Check if result already exists - const existing = await db.query.participantResults.findFirst({ + const existing = await db.query.seasonParticipantResults.findFirst({ where: and( - eq(schema.participantResults.participantId, participantId), - eq(schema.participantResults.sportsSeasonId, sportsSeasonId) + eq(schema.seasonParticipantResults.participantId, participantId), + eq(schema.seasonParticipantResults.sportsSeasonId, sportsSeasonId) ), }); diff --git a/app/models/qualifying-points.ts b/app/models/qualifying-points.ts index 8935781..f2f4dbc 100644 --- a/app/models/qualifying-points.ts +++ b/app/models/qualifying-points.ts @@ -144,16 +144,16 @@ export async function getOrCreateParticipantQPTotal( ) { const db = providedDb || database(); - let total = await db.query.participantQualifyingTotals.findFirst({ + let total = await db.query.seasonParticipantQualifyingTotals.findFirst({ where: and( - eq(schema.participantQualifyingTotals.participantId, participantId), - eq(schema.participantQualifyingTotals.sportsSeasonId, sportsSeasonId) + eq(schema.seasonParticipantQualifyingTotals.participantId, participantId), + eq(schema.seasonParticipantQualifyingTotals.sportsSeasonId, sportsSeasonId) ), }); if (!total) { const [created] = await db - .insert(schema.participantQualifyingTotals) + .insert(schema.seasonParticipantQualifyingTotals) .values({ participantId, sportsSeasonId, @@ -184,12 +184,12 @@ export async function addQualifyingPoints( // Update with new points (do NOT increment eventsScored here) const [updated] = await db - .update(schema.participantQualifyingTotals) + .update(schema.seasonParticipantQualifyingTotals) .set({ totalQualifyingPoints: (parseFloat(total.totalQualifyingPoints) + pointsToAdd).toString(), updatedAt: new Date(), }) - .where(eq(schema.participantQualifyingTotals.id, total.id)) + .where(eq(schema.seasonParticipantQualifyingTotals.id, total.id)) .returning(); return updated; @@ -208,7 +208,7 @@ export async function recalculateParticipantQP( // Get all event results for this participant in this sports season const eventResults = await db.query.eventResults.findMany({ - where: eq(schema.eventResults.participantId, participantId), + where: eq(schema.eventResults.seasonParticipantId, participantId), with: { scoringEvent: true, }, @@ -238,13 +238,13 @@ export async function recalculateParticipantQP( // Update with recalculated values await db - .update(schema.participantQualifyingTotals) + .update(schema.seasonParticipantQualifyingTotals) .set({ totalQualifyingPoints: totalQP.toString(), eventsScored, updatedAt: new Date(), }) - .where(eq(schema.participantQualifyingTotals.id, total.id)); + .where(eq(schema.seasonParticipantQualifyingTotals.id, total.id)); return { totalQP, eventsScored }; } @@ -271,9 +271,9 @@ export async function getQPStandings( ) { const db = providedDb || database(); - return await db.query.participantQualifyingTotals.findMany({ - where: eq(schema.participantQualifyingTotals.sportsSeasonId, sportsSeasonId), - orderBy: [desc(sql`CAST(${schema.participantQualifyingTotals.totalQualifyingPoints} AS DECIMAL)`)], + return await db.query.seasonParticipantQualifyingTotals.findMany({ + where: eq(schema.seasonParticipantQualifyingTotals.sportsSeasonId, sportsSeasonId), + orderBy: [desc(sql`CAST(${schema.seasonParticipantQualifyingTotals.totalQualifyingPoints} AS DECIMAL)`)], with: { participant: true, }, @@ -325,9 +325,9 @@ export async function updateFinalRankings( // Update all rankings for (const update of updates) { await db - .update(schema.participantQualifyingTotals) + .update(schema.seasonParticipantQualifyingTotals) .set({ finalRanking: update.finalRanking, updatedAt: new Date() }) - .where(eq(schema.participantQualifyingTotals.id, update.id)); + .where(eq(schema.seasonParticipantQualifyingTotals.id, update.id)); } return updates; @@ -343,6 +343,6 @@ export async function resetQualifyingPoints( const db = providedDb || database(); await db - .delete(schema.participantQualifyingTotals) - .where(eq(schema.participantQualifyingTotals.sportsSeasonId, sportsSeasonId)); + .delete(schema.seasonParticipantQualifyingTotals) + .where(eq(schema.seasonParticipantQualifyingTotals.sportsSeasonId, sportsSeasonId)); } diff --git a/app/models/scoring-calculator.ts b/app/models/scoring-calculator.ts index 21825bb..249fc69 100644 --- a/app/models/scoring-calculator.ts +++ b/app/models/scoring-calculator.ts @@ -201,8 +201,8 @@ export async function processPlayoffEvent( // PHASE 5.3: Handle teams that didn't make the playoffs // Get all participants in the sports season - const allParticipants = await db.query.participants.findMany({ - where: eq(schema.participants.sportsSeasonId, event.sportsSeasonId), + const allParticipants = await db.query.seasonParticipants.findMany({ + where: eq(schema.seasonParticipants.sportsSeasonId, event.sportsSeasonId), }); // Get all participant IDs that are in ANY playoff match (winners or losers) @@ -222,10 +222,10 @@ export async function processPlayoffEvent( for (const participant of allParticipants) { if (!participantsInBracket.has(participant.id)) { // Check if they already have a result (don't overwrite) - const existingResult = await db.query.participantResults.findFirst({ + const existingResult = await db.query.seasonParticipantResults.findFirst({ where: and( - eq(schema.participantResults.participantId, participant.id), - eq(schema.participantResults.sportsSeasonId, event.sportsSeasonId) + eq(schema.seasonParticipantResults.participantId, participant.id), + eq(schema.seasonParticipantResults.sportsSeasonId, event.sportsSeasonId) ), }); @@ -506,10 +506,10 @@ async function upsertParticipantResult( db: ReturnType, isPartialScore = false ): Promise { - const existing = await db.query.participantResults.findFirst({ + const existing = await db.query.seasonParticipantResults.findFirst({ where: and( - eq(schema.participantResults.participantId, participantId), - eq(schema.participantResults.sportsSeasonId, sportsSeasonId) + eq(schema.seasonParticipantResults.participantId, participantId), + eq(schema.seasonParticipantResults.sportsSeasonId, sportsSeasonId) ), }); @@ -520,16 +520,16 @@ async function upsertParticipantResult( if (!existing.isPartialScore && isPartialScore) return null; await db - .update(schema.participantResults) + .update(schema.seasonParticipantResults) .set({ finalPosition, isPartialScore, updatedAt: new Date(), }) - .where(eq(schema.participantResults.id, existing.id)); + .where(eq(schema.seasonParticipantResults.id, existing.id)); return existing.finalPosition ?? 0; } else { - await db.insert(schema.participantResults).values({ + await db.insert(schema.seasonParticipantResults).values({ participantId, sportsSeasonId, finalPosition, @@ -651,7 +651,7 @@ export async function processQualifyingEvent( // Recalculate totals for all participants from scratch // This is the source of truth - sums all their event_results - const participantIds = new Set(results.map(r => r.participantId)); + const participantIds = new Set(results.map(r => r.seasonParticipantId)); for (const participantId of participantIds) { await recalculateParticipantQP(participantId, event.sportsSeasonId, db); } @@ -752,10 +752,10 @@ export async function finalizeQualifyingPoints( if (currentPlacement <= standings.length) { for (let i = currentPlacement - 1; i < standings.length; i++) { const standing = standings[i]; - const hasResult = await db.query.participantResults.findFirst({ + const hasResult = await db.query.seasonParticipantResults.findFirst({ where: and( - eq(schema.participantResults.participantId, standing.participantId), - eq(schema.participantResults.sportsSeasonId, sportsSeasonId) + eq(schema.seasonParticipantResults.participantId, standing.participantId), + eq(schema.seasonParticipantResults.sportsSeasonId, sportsSeasonId) ), }); @@ -1388,11 +1388,11 @@ export async function recalculateAffectedLeagues( .filter((id): id is string => id !== null); const finalizedLoserIds = new Set(); if (loserParticipantIds.length > 0) { - const loserResults = await db.query.participantResults.findMany({ + const loserResults = await db.query.seasonParticipantResults.findMany({ where: and( - inArray(schema.participantResults.participantId, loserParticipantIds), - eq(schema.participantResults.sportsSeasonId, sportsSeasonId), - eq(schema.participantResults.isPartialScore, false) + inArray(schema.seasonParticipantResults.participantId, loserParticipantIds), + eq(schema.seasonParticipantResults.sportsSeasonId, sportsSeasonId), + eq(schema.seasonParticipantResults.isPartialScore, false) ), }); for (const r of loserResults) finalizedLoserIds.add(r.participantId); diff --git a/app/models/scoring-event.ts b/app/models/scoring-event.ts index a11076e..e5dfb15 100644 --- a/app/models/scoring-event.ts +++ b/app/models/scoring-event.ts @@ -104,7 +104,7 @@ export async function getScoringEventsForSportsSeason( with: { eventResults: { with: { - participant: true, + seasonParticipant: true, }, }, }, @@ -224,7 +224,7 @@ export async function deleteScoringEvent( const results = await db.query.eventResults.findMany({ where: eq(schema.eventResults.scoringEventId, eventId), }); - affectedParticipantIds = results.map((r) => r.participantId); + affectedParticipantIds = results.map((r) => r.seasonParticipantId); wasQPProcessed = results.some( (r) => r.qualifyingPointsAwarded && parseFloat(r.qualifyingPointsAwarded) > 0 ); @@ -233,8 +233,8 @@ export async function deleteScoringEvent( await db.transaction(async (tx) => { if (event.eventType === "playoff_game") { await tx - .delete(schema.participantResults) - .where(eq(schema.participantResults.sportsSeasonId, event.sportsSeasonId)); + .delete(schema.seasonParticipantResults) + .where(eq(schema.seasonParticipantResults.sportsSeasonId, event.sportsSeasonId)); } // Cascades: playoffMatches, eventResults, tournamentGroups/Members await tx.delete(schema.scoringEvents).where(eq(schema.scoringEvents.id, eventId)); diff --git a/app/models/sports-season.ts b/app/models/sports-season.ts index ccb6470..4957b9d 100644 --- a/app/models/sports-season.ts +++ b/app/models/sports-season.ts @@ -211,8 +211,8 @@ export async function cloneSportsSeason( }; // Read all source data before writing anything - const sourceParticipants = await db.query.participants.findMany({ - where: eq(schema.participants.sportsSeasonId, sourceId), + const sourceParticipants = await db.query.seasonParticipants.findMany({ + where: eq(schema.seasonParticipants.sportsSeasonId, sourceId), }); const sourceEvents = await db.query.scoringEvents.findMany({ @@ -225,8 +225,8 @@ export async function cloneSportsSeason( : null; // Read source futures odds and Elo ratings - const sourceEvRows = await db.query.participantExpectedValues.findMany({ - where: eq(schema.participantExpectedValues.sportsSeasonId, sourceId), + const sourceEvRows = await db.query.seasonParticipantExpectedValues.findMany({ + where: eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sourceId), }); // Build lookup: (externalId ?? name) → source EV, only for rows that have @@ -251,7 +251,7 @@ export async function cloneSportsSeason( const newParticipants = sourceParticipants.length > 0 ? await tx - .insert(schema.participants) + .insert(schema.seasonParticipants) .values( sourceParticipants.map((p: typeof sourceParticipants[number]) => ({ sportsSeasonId: newSeason.id, @@ -288,7 +288,7 @@ export async function cloneSportsSeason( .filter((r): r is NonNullable => r !== null); if (evRows.length > 0) { - await tx.insert(schema.participantExpectedValues).values(evRows); + await tx.insert(schema.seasonParticipantExpectedValues).values(evRows); } } diff --git a/app/models/surface-elo.ts b/app/models/surface-elo.ts index eed451c..edb4a27 100644 --- a/app/models/surface-elo.ts +++ b/app/models/surface-elo.ts @@ -7,7 +7,7 @@ */ import { database } from "~/database/context"; -import { participantSurfaceElos, participants } from "~/database/schema"; +import { seasonParticipantSurfaceElos, seasonParticipants } from "~/database/schema"; import { eq, sql } from "drizzle-orm"; export type CourtSurface = "hard" | "clay" | "grass"; @@ -38,7 +38,7 @@ export interface SurfaceEloInput { /** * Get all surface Elo records for a sports season, joined with participant names. - * Returns one record per participant (participants with no Elo record are excluded). + * Returns one record per participant (seasonParticipants with no Elo record are excluded). */ export async function getSurfaceElosForSeason( sportsSeasonId: string @@ -46,26 +46,26 @@ export async function getSurfaceElosForSeason( const db = database(); const rows = await db .select({ - id: participantSurfaceElos.id, - participantId: participantSurfaceElos.participantId, - sportsSeasonId: participantSurfaceElos.sportsSeasonId, - worldRanking: participantSurfaceElos.worldRanking, - eloHard: participantSurfaceElos.eloHard, - eloClay: participantSurfaceElos.eloClay, - eloGrass: participantSurfaceElos.eloGrass, - updatedAt: participantSurfaceElos.updatedAt, - participantName: participants.name, + id: seasonParticipantSurfaceElos.id, + participantId: seasonParticipantSurfaceElos.participantId, + sportsSeasonId: seasonParticipantSurfaceElos.sportsSeasonId, + worldRanking: seasonParticipantSurfaceElos.worldRanking, + eloHard: seasonParticipantSurfaceElos.eloHard, + eloClay: seasonParticipantSurfaceElos.eloClay, + eloGrass: seasonParticipantSurfaceElos.eloGrass, + updatedAt: seasonParticipantSurfaceElos.updatedAt, + participantName: seasonParticipants.name, }) - .from(participantSurfaceElos) - .innerJoin(participants, eq(participantSurfaceElos.participantId, participants.id)) - .where(eq(participantSurfaceElos.sportsSeasonId, sportsSeasonId)) - .orderBy(participants.name); + .from(seasonParticipantSurfaceElos) + .innerJoin(seasonParticipants, eq(seasonParticipantSurfaceElos.participantId, seasonParticipants.id)) + .where(eq(seasonParticipantSurfaceElos.sportsSeasonId, sportsSeasonId)) + .orderBy(seasonParticipants.name); return rows; } /** - * Upsert surface Elo ratings for a batch of participants. + * Upsert surface Elo ratings for a batch of seasonParticipants. * Uses INSERT ... ON CONFLICT DO UPDATE so all three surface columns are * overwritten atomically — the admin always submits all three values. */ @@ -77,7 +77,7 @@ export async function batchUpsertSurfaceElos( const now = new Date(); await db - .insert(participantSurfaceElos) + .insert(seasonParticipantSurfaceElos) .values( inputs.map(({ participantId, sportsSeasonId, worldRanking, eloHard, eloClay, eloGrass }) => ({ participantId, @@ -90,7 +90,7 @@ export async function batchUpsertSurfaceElos( })) ) .onConflictDoUpdate({ - target: [participantSurfaceElos.participantId, participantSurfaceElos.sportsSeasonId], + target: [seasonParticipantSurfaceElos.participantId, seasonParticipantSurfaceElos.sportsSeasonId], set: { worldRanking: sql`excluded.world_ranking`, eloHard: sql`excluded.elo_hard`, @@ -111,14 +111,14 @@ export async function getSurfaceEloMap( const db = database(); const rows = await db .select({ - participantId: participantSurfaceElos.participantId, - worldRanking: participantSurfaceElos.worldRanking, - eloHard: participantSurfaceElos.eloHard, - eloClay: participantSurfaceElos.eloClay, - eloGrass: participantSurfaceElos.eloGrass, + participantId: seasonParticipantSurfaceElos.participantId, + worldRanking: seasonParticipantSurfaceElos.worldRanking, + eloHard: seasonParticipantSurfaceElos.eloHard, + eloClay: seasonParticipantSurfaceElos.eloClay, + eloGrass: seasonParticipantSurfaceElos.eloGrass, }) - .from(participantSurfaceElos) - .where(eq(participantSurfaceElos.sportsSeasonId, sportsSeasonId)); + .from(seasonParticipantSurfaceElos) + .where(eq(seasonParticipantSurfaceElos.sportsSeasonId, sportsSeasonId)); return new Map(rows.map((r) => [r.participantId, { worldRanking: r.worldRanking, diff --git a/app/models/team-score-events.ts b/app/models/team-score-events.ts index ad76b2a..ab28493 100644 --- a/app/models/team-score-events.ts +++ b/app/models/team-score-events.ts @@ -230,8 +230,8 @@ export async function getRecentTeamScoreEvents( const participantNameById = new Map(); if (allParticipantIds.length > 0) { - const participantRows = await db.query.participants.findMany({ - where: inArray(schema.participants.id, allParticipantIds), + const participantRows = await db.query.seasonParticipants.findMany({ + where: inArray(schema.seasonParticipants.id, allParticipantIds), columns: { id: true, name: true }, }); for (const p of participantRows) { From 0dc962135c7edadd9ce32e61800bea37b9c063a9 Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Fri, 1 May 2026 15:14:49 +0000 Subject: [PATCH 04/13] refactor(routes): update route layer to use renamed schema exports - Update model import from ~/models/participant to ~/models/season-participant - Rename schema.participants to schema.seasonParticipants - Rename schema.participantResults to schema.seasonParticipantResults - Rename db.query.participants to db.query.seasonParticipants - Update 9 route files and 1 test file Affected files: - admin.sports-seasons.$id.events.$eventId.bracket.server.ts - admin.sports-seasons.$id.participants.tsx - api/draft.force-manual-pick.ts - api/draft.make-pick.ts - api/draft.replace-pick.ts - api/seasons.$seasonId.draft.ts - leagues/$leagueId.draft-board.$seasonId.tsx - leagues/$leagueId.sports-seasons.$sportsSeasonId.server.ts - admin/__tests__/sports-seasons-participants.test.ts Error count reduced from 499 to 453 (46 errors fixed). Co-Authored-By: Claude Opus 4.7 --- ...sons.$id.events.$eventId.bracket.server.ts | 4 ++-- .../admin.sports-seasons.$id.participants.tsx | 2 +- .../sports-seasons-participants.test.ts | 4 ++-- app/routes/api/draft.force-manual-pick.ts | 4 ++-- app/routes/api/draft.make-pick.ts | 4 ++-- app/routes/api/draft.replace-pick.ts | 8 ++++---- app/routes/api/seasons.$seasonId.draft.ts | 6 +++--- .../$leagueId.draft-board.$seasonId.tsx | 20 +++++++++---------- ...d.sports-seasons.$sportsSeasonId.server.ts | 10 +++++----- 9 files changed, 31 insertions(+), 31 deletions(-) diff --git a/app/routes/admin.sports-seasons.$id.events.$eventId.bracket.server.ts b/app/routes/admin.sports-seasons.$id.events.$eventId.bracket.server.ts index 65f7cd1..3bb6044 100644 --- a/app/routes/admin.sports-seasons.$id.events.$eventId.bracket.server.ts +++ b/app/routes/admin.sports-seasons.$id.events.$eventId.bracket.server.ts @@ -595,9 +595,9 @@ export async function action({ request, params }: Route.ActionArgs) { // the "never un-finalize" guard in upsertParticipantResult. const db = database(); await db - .delete(schema.participantResults) + .delete(schema.seasonParticipantResults) .where( - eq(schema.participantResults.sportsSeasonId, event.sportsSeasonId) + eq(schema.seasonParticipantResults.sportsSeasonId, event.sportsSeasonId) ); // Replay each completed match in bracket order (earlier rounds first). diff --git a/app/routes/admin.sports-seasons.$id.participants.tsx b/app/routes/admin.sports-seasons.$id.participants.tsx index b2d4cb1..64e5da3 100644 --- a/app/routes/admin.sports-seasons.$id.participants.tsx +++ b/app/routes/admin.sports-seasons.$id.participants.tsx @@ -10,7 +10,7 @@ import { createParticipant, deleteParticipant, updateParticipant, -} from "~/models/participant"; +} from "~/models/season-participant"; import { Button } from "~/components/ui/button"; import { Input } from "~/components/ui/input"; import { Label } from "~/components/ui/label"; diff --git a/app/routes/admin/__tests__/sports-seasons-participants.test.ts b/app/routes/admin/__tests__/sports-seasons-participants.test.ts index ebcb843..adc7d97 100644 --- a/app/routes/admin/__tests__/sports-seasons-participants.test.ts +++ b/app/routes/admin/__tests__/sports-seasons-participants.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect, vi, beforeEach } from "vitest"; -vi.mock("~/models/participant", () => ({ +vi.mock("~/models/season-participant", () => ({ findParticipantsBySportsSeasonId: vi.fn(), findParticipantByName: vi.fn(), createParticipant: vi.fn(), @@ -19,7 +19,7 @@ vi.mock("~/lib/logger", () => ({ import { findParticipantByName, updateParticipant, -} from "~/models/participant"; +} from "~/models/season-participant"; import { action } from "~/routes/admin.sports-seasons.$id.participants"; const mockParams = { id: "season-1" }; diff --git a/app/routes/api/draft.force-manual-pick.ts b/app/routes/api/draft.force-manual-pick.ts index bbb1d53..8d58657 100644 --- a/app/routes/api/draft.force-manual-pick.ts +++ b/app/routes/api/draft.force-manual-pick.ts @@ -87,8 +87,8 @@ export async function action(args: ActionFunctionArgs) { } // Get participant details - const participant = await db.query.participants.findFirst({ - where: eq(schema.participants.id, participantId), + const participant = await db.query.seasonParticipants.findFirst({ + where: eq(schema.seasonParticipants.id, participantId), with: { sportsSeason: { with: { diff --git a/app/routes/api/draft.make-pick.ts b/app/routes/api/draft.make-pick.ts index d3fb4e7..3070e61 100644 --- a/app/routes/api/draft.make-pick.ts +++ b/app/routes/api/draft.make-pick.ts @@ -96,8 +96,8 @@ export async function action(args: ActionFunctionArgs) { } // Get participant details - const participant = await db.query.participants.findFirst({ - where: eq(schema.participants.id, participantId), + const participant = await db.query.seasonParticipants.findFirst({ + where: eq(schema.seasonParticipants.id, participantId), with: { sportsSeason: { with: { diff --git a/app/routes/api/draft.replace-pick.ts b/app/routes/api/draft.replace-pick.ts index 38b415f..2fa2b42 100644 --- a/app/routes/api/draft.replace-pick.ts +++ b/app/routes/api/draft.replace-pick.ts @@ -78,8 +78,8 @@ export async function action(args: ActionFunctionArgs) { } } - const participant = await db.query.participants.findFirst({ - where: eq(schema.participants.id, participantId), + const participant = await db.query.seasonParticipants.findFirst({ + where: eq(schema.seasonParticipants.id, participantId), with: { sportsSeason: { with: { sport: true } }, }, @@ -128,8 +128,8 @@ export async function action(args: ActionFunctionArgs) { } // Fetch old participant name for the audit log (before overwriting the pick) - const oldParticipant = await db.query.participants.findFirst({ - where: eq(schema.participants.id, oldParticipantId), + const oldParticipant = await db.query.seasonParticipants.findFirst({ + where: eq(schema.seasonParticipants.id, oldParticipantId), }); // Update the pick in-place diff --git a/app/routes/api/seasons.$seasonId.draft.ts b/app/routes/api/seasons.$seasonId.draft.ts index 0d86a8d..57e233a 100644 --- a/app/routes/api/seasons.$seasonId.draft.ts +++ b/app/routes/api/seasons.$seasonId.draft.ts @@ -51,13 +51,13 @@ export async function loader({ params }: LoaderFunctionArgs) { round: schema.draftPicks.round, teamName: schema.teams.name, teamOwnerId: schema.teams.ownerId, - participantName: schema.participants.name, + participantName: schema.seasonParticipants.name, sport: schema.sports.name, }) .from(schema.draftPicks) .innerJoin(schema.teams, eq(schema.draftPicks.teamId, schema.teams.id)) - .innerJoin(schema.participants, eq(schema.draftPicks.participantId, schema.participants.id)) - .innerJoin(schema.sportsSeasons, eq(schema.participants.sportsSeasonId, schema.sportsSeasons.id)) + .innerJoin(schema.seasonParticipants, eq(schema.draftPicks.participantId, schema.seasonParticipants.id)) + .innerJoin(schema.sportsSeasons, eq(schema.seasonParticipants.sportsSeasonId, schema.sportsSeasons.id)) .innerJoin(schema.sports, eq(schema.sportsSeasons.sportId, schema.sports.id)) .where(eq(schema.draftPicks.seasonId, seasonId)) .orderBy(schema.draftPicks.pickNumber); diff --git a/app/routes/leagues/$leagueId.draft-board.$seasonId.tsx b/app/routes/leagues/$leagueId.draft-board.$seasonId.tsx index 094a1b0..2ddeba7 100644 --- a/app/routes/leagues/$leagueId.draft-board.$seasonId.tsx +++ b/app/routes/leagues/$leagueId.draft-board.$seasonId.tsx @@ -76,19 +76,19 @@ export async function loader(args: Route.LoaderArgs) { round: schema.draftPicks.round, pickInRound: schema.draftPicks.pickInRound, team: schema.teams, - participant: schema.participants, + participant: schema.seasonParticipants, sport: schema.sports, scoringPattern: schema.sportsSeasons.scoringPattern, }) .from(schema.draftPicks) .innerJoin(schema.teams, eq(schema.draftPicks.teamId, schema.teams.id)) .innerJoin( - schema.participants, - eq(schema.draftPicks.participantId, schema.participants.id) + schema.seasonParticipants, + eq(schema.draftPicks.participantId, schema.seasonParticipants.id) ) .innerJoin( schema.sportsSeasons, - eq(schema.participants.sportsSeasonId, schema.sportsSeasons.id) + eq(schema.seasonParticipants.sportsSeasonId, schema.sportsSeasons.id) ) .innerJoin(schema.sports, eq(schema.sportsSeasons.sportId, schema.sports.id)) .where(eq(schema.draftPicks.seasonId, seasonId)) @@ -104,13 +104,13 @@ export async function loader(args: Route.LoaderArgs) { const results = await db .select({ - participantId: schema.participantResults.participantId, - sportsSeasonId: schema.participantResults.sportsSeasonId, - finalPosition: schema.participantResults.finalPosition, - isPartialScore: schema.participantResults.isPartialScore, + participantId: schema.seasonParticipantResults.participantId, + sportsSeasonId: schema.seasonParticipantResults.sportsSeasonId, + finalPosition: schema.seasonParticipantResults.finalPosition, + isPartialScore: schema.seasonParticipantResults.isPartialScore, }) - .from(schema.participantResults) - .where(inArray(schema.participantResults.participantId, participantIds)); + .from(schema.seasonParticipantResults) + .where(inArray(schema.seasonParticipantResults.participantId, participantIds)); const resultByParticipant = new Map(results.map((r) => [r.participantId, r])); diff --git a/app/routes/leagues/$leagueId.sports-seasons.$sportsSeasonId.server.ts b/app/routes/leagues/$leagueId.sports-seasons.$sportsSeasonId.server.ts index 0ff93e7..4af7fbc 100644 --- a/app/routes/leagues/$leagueId.sports-seasons.$sportsSeasonId.server.ts +++ b/app/routes/leagues/$leagueId.sports-seasons.$sportsSeasonId.server.ts @@ -233,15 +233,15 @@ export async function loader(args: Route.LoaderArgs) { // Fetch group-stage losers and all participant results for bracket scoring const [eliminatedResults, allResults] = await Promise.all([ - db.query.participantResults.findMany({ + db.query.seasonParticipantResults.findMany({ where: and( - eq(schema.participantResults.sportsSeasonId, sportsSeasonId), - eq(schema.participantResults.finalPosition, 0) + eq(schema.seasonParticipantResults.sportsSeasonId, sportsSeasonId), + eq(schema.seasonParticipantResults.finalPosition, 0) ), with: { participant: true }, }), - db.query.participantResults.findMany({ - where: eq(schema.participantResults.sportsSeasonId, sportsSeasonId), + db.query.seasonParticipantResults.findMany({ + where: eq(schema.seasonParticipantResults.sportsSeasonId, sportsSeasonId), }), ]); From c5610995706c1cad2e965ee2b42e4cef8b2020e5 Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Fri, 1 May 2026 16:17:23 +0000 Subject: [PATCH 05/13] refactor(routes): update route files for schema rename Update route imports from ~/models/participant to ~/models/season-participant and fix references to .participant/.participantId on event results to use .seasonParticipant/.seasonParticipantId after schema rename. Co-Authored-By: Claude Opus 4.7 --- app/routes/admin.data-sync.tsx | 2 +- app/routes/admin.sports-seasons.$id.elo-ratings.tsx | 2 +- ...n.sports-seasons.$id.events.$eventId.bracket.server.ts | 2 +- ...admin.sports-seasons.$id.events.$eventId.cs2-setup.tsx | 2 +- .../admin.sports-seasons.$id.events.$eventId.server.ts | 6 +++--- app/routes/admin.sports-seasons.$id.events.$eventId.tsx | 8 ++++---- .../admin.sports-seasons.$id.expected-values.server.ts | 2 +- app/routes/admin.sports-seasons.$id.futures-odds.tsx | 2 +- app/routes/admin.sports-seasons.$id.golf-skills.tsx | 2 +- app/routes/admin.sports-seasons.$id.regular-standings.tsx | 2 +- app/routes/admin.sports-seasons.$id.simulate.tsx | 2 +- app/routes/admin.sports-seasons.$id.standings.tsx | 2 +- app/routes/admin.sports-seasons.$id.surface-elo.tsx | 2 +- app/routes/admin.sports-seasons.$id.tsx | 2 +- app/routes/api/__tests__/draft.force-manual-pick.test.ts | 4 ++-- .../__tests__/draft.force-manual-pick.timer-mode.test.ts | 4 ++-- .../api/__tests__/draft.make-pick.timer-mode.test.ts | 4 ++-- app/routes/api/draft.force-manual-pick.ts | 2 +- app/routes/api/draft.make-pick.ts | 2 +- app/routes/api/draft.replace-pick.ts | 2 +- app/routes/leagues/$leagueId.draft.$seasonId.tsx | 2 +- 21 files changed, 29 insertions(+), 29 deletions(-) diff --git a/app/routes/admin.data-sync.tsx b/app/routes/admin.data-sync.tsx index fff5737..1d3bed9 100644 --- a/app/routes/admin.data-sync.tsx +++ b/app/routes/admin.data-sync.tsx @@ -6,7 +6,7 @@ import { logger } from "~/lib/logger"; import { findAllSports } from "~/models/sport"; import { findAllSportsSeasons } from "~/models/sports-season"; import { findAllSeasonTemplates } from "~/models/season-template"; -import { countAllParticipants } from "~/models/participant"; +import { countAllParticipants } from "~/models/season-participant"; import { countAllParticipantEVs } from "~/models/participant-expected-value"; import { importSportsDataFromJSON } from "~/utils/sports-data-sync.server"; import { Button } from "~/components/ui/button"; diff --git a/app/routes/admin.sports-seasons.$id.elo-ratings.tsx b/app/routes/admin.sports-seasons.$id.elo-ratings.tsx index 385e911..8536efe 100644 --- a/app/routes/admin.sports-seasons.$id.elo-ratings.tsx +++ b/app/routes/admin.sports-seasons.$id.elo-ratings.tsx @@ -3,7 +3,7 @@ import type { Route } from './+types/admin.sports-seasons.$id.elo-ratings'; import { logger } from '~/lib/logger'; import { findSportsSeasonById, updateSportsSeason } from '~/models/sports-season'; -import { findParticipantsBySportsSeasonId } from '~/models/participant'; +import { findParticipantsBySportsSeasonId } from '~/models/season-participant'; import { getAllParticipantEVsForSeason, batchSaveSourceElos, diff --git a/app/routes/admin.sports-seasons.$id.events.$eventId.bracket.server.ts b/app/routes/admin.sports-seasons.$id.events.$eventId.bracket.server.ts index 3bb6044..f401485 100644 --- a/app/routes/admin.sports-seasons.$id.events.$eventId.bracket.server.ts +++ b/app/routes/admin.sports-seasons.$id.events.$eventId.bracket.server.ts @@ -1,7 +1,7 @@ import type { Route } from "./+types/admin.sports-seasons.$id.events.$eventId.bracket"; import { findSportsSeasonById } from "~/models/sports-season"; -import { findParticipantsBySportsSeasonId } from "~/models/participant"; +import { findParticipantsBySportsSeasonId } from "~/models/season-participant"; import { getScoringEventById, updateScoringEvent } from "~/models/scoring-event"; import { findPlayoffMatchesByEventId, diff --git a/app/routes/admin.sports-seasons.$id.events.$eventId.cs2-setup.tsx b/app/routes/admin.sports-seasons.$id.events.$eventId.cs2-setup.tsx index 4051206..9dec8fd 100644 --- a/app/routes/admin.sports-seasons.$id.events.$eventId.cs2-setup.tsx +++ b/app/routes/admin.sports-seasons.$id.events.$eventId.cs2-setup.tsx @@ -3,7 +3,7 @@ import type { Route } from './+types/admin.sports-seasons.$id.events.$eventId.cs import { findSportsSeasonById } from '~/models/sports-season'; import { getScoringEventById } from '~/models/scoring-event'; -import { findParticipantsBySportsSeasonId } from '~/models/participant'; +import { findParticipantsBySportsSeasonId } from '~/models/season-participant'; import { getCs2StageResultsForEvent, upsertCs2StageAssignments, diff --git a/app/routes/admin.sports-seasons.$id.events.$eventId.server.ts b/app/routes/admin.sports-seasons.$id.events.$eventId.server.ts index e1b3515..c1a997b 100644 --- a/app/routes/admin.sports-seasons.$id.events.$eventId.server.ts +++ b/app/routes/admin.sports-seasons.$id.events.$eventId.server.ts @@ -1,7 +1,7 @@ import type { Route } from "./+types/admin.sports-seasons.$id.events.$eventId"; import { logger } from "~/lib/logger"; import { findSportsSeasonById } from "~/models/sports-season"; -import { findParticipantsBySportsSeasonId, createParticipant } from "~/models/participant"; +import { findParticipantsBySportsSeasonId, createParticipant } from "~/models/season-participant"; import { getScoringEventById, completeScoringEvent, @@ -134,7 +134,7 @@ export async function action({ request, params }: Route.ActionArgs) { // This marks them as "competed, earned nothing" so simulations skip this event. const allParticipants = await findParticipantsBySportsSeasonId(params.id); const existingResults = await getEventResults(params.eventId); - const existingIds = new Set(existingResults.map((r) => r.participantId)); + const existingIds = new Set(existingResults.map((r) => r.seasonParticipantId)); const missingIds = findParticipantsWithoutResults( allParticipants.map((p) => p.id), existingIds @@ -373,7 +373,7 @@ export async function action({ request, params }: Route.ActionArgs) { try { const existingResults = await getEventResults(params.eventId); - const existingIds = new Set(existingResults.map((r) => r.participantId)); + const existingIds = new Set(existingResults.map((r) => r.seasonParticipantId)); const newResults = filterNewResults(incoming, existingIds); if (newResults.length > 0) { diff --git a/app/routes/admin.sports-seasons.$id.events.$eventId.tsx b/app/routes/admin.sports-seasons.$id.events.$eventId.tsx index b963899..7eba5ac 100644 --- a/app/routes/admin.sports-seasons.$id.events.$eventId.tsx +++ b/app/routes/admin.sports-seasons.$id.events.$eventId.tsx @@ -99,7 +99,7 @@ export default function EventResults({ // Create a map of participants with results for easy lookup const participantResultsMap = new Map( - results.map((r: { participant: { id: string } }) => [r.participant.id, r]) + results.map((r: { seasonParticipant: { id: string } }) => [r.seasonParticipant.id, r]) ); // Get participants without results @@ -419,7 +419,7 @@ export default function EventResults({ participants={participants} sportsSeasonId={sportsSeason.id} existingResultParticipantIds={ - new Set(results.map((r: { participant: { id: string } }) => r.participant.id)) + new Set(results.map((r: { seasonParticipant: { id: string } }) => r.seasonParticipant.id)) } /> )} @@ -576,7 +576,7 @@ export default function EventResults({ - {result.participant.name} + {result.seasonParticipant.name} {event.isQualifyingEvent && event.isComplete && ( {result.qualifyingPointsAwarded ? ( @@ -620,7 +620,7 @@ export default function EventResults({ variant="ghost" className="h-8 w-8 p-0 text-destructive hover:text-destructive" onClick={(e) => { - if (!confirm(`Delete result for ${result.participant.name}?`)) { + if (!confirm(`Delete result for ${result.seasonParticipant.name}?`)) { e.preventDefault(); } }} diff --git a/app/routes/admin.sports-seasons.$id.expected-values.server.ts b/app/routes/admin.sports-seasons.$id.expected-values.server.ts index 9dcbe4b..70104e0 100644 --- a/app/routes/admin.sports-seasons.$id.expected-values.server.ts +++ b/app/routes/admin.sports-seasons.$id.expected-values.server.ts @@ -1,7 +1,7 @@ import type { Route } from "./+types/admin.sports-seasons.$id.expected-values"; import { logger } from "~/lib/logger"; import { findSportsSeasonById } from "~/models/sports-season"; -import { findParticipantsBySportsSeasonId } from "~/models/participant"; +import { findParticipantsBySportsSeasonId } from "~/models/season-participant"; import { batchUpsertParticipantEVs, getAllParticipantEVsForSeason diff --git a/app/routes/admin.sports-seasons.$id.futures-odds.tsx b/app/routes/admin.sports-seasons.$id.futures-odds.tsx index dd02a22..e0bce3d 100644 --- a/app/routes/admin.sports-seasons.$id.futures-odds.tsx +++ b/app/routes/admin.sports-seasons.$id.futures-odds.tsx @@ -3,7 +3,7 @@ import type { Route } from './+types/admin.sports-seasons.$id.futures-odds'; import { logger } from '~/lib/logger'; import { findSportsSeasonById, updateSportsSeason } from '~/models/sports-season'; -import { findParticipantsBySportsSeasonId } from '~/models/participant'; +import { findParticipantsBySportsSeasonId } from '~/models/season-participant'; import { getAllParticipantEVsForSeason, batchSaveSourceOdds, batchUpsertParticipantEVs } from '~/models/participant-expected-value'; import { batchUpsertParticipantEvSnapshots } from '~/models/ev-snapshot'; import { getSimulator, type SimulatorType } from '~/services/simulations/registry'; diff --git a/app/routes/admin.sports-seasons.$id.golf-skills.tsx b/app/routes/admin.sports-seasons.$id.golf-skills.tsx index 5a0acea..efb5f8d 100644 --- a/app/routes/admin.sports-seasons.$id.golf-skills.tsx +++ b/app/routes/admin.sports-seasons.$id.golf-skills.tsx @@ -3,7 +3,7 @@ import type { Route } from './+types/admin.sports-seasons.$id.golf-skills'; import { logger } from '~/lib/logger'; import { findSportsSeasonById, updateSportsSeason } from '~/models/sports-season'; -import { findParticipantsBySportsSeasonId, findParticipantByName, createParticipant } from '~/models/participant'; +import { findParticipantsBySportsSeasonId, findParticipantByName, createParticipant } from '~/models/season-participant'; import { batchUpsertParticipantEVs } from '~/models/participant-expected-value'; import { batchUpsertParticipantEvSnapshots } from '~/models/ev-snapshot'; import { getGolfSkillsForSeason, batchUpsertGolfSkills } from '~/models/golf-skills'; diff --git a/app/routes/admin.sports-seasons.$id.regular-standings.tsx b/app/routes/admin.sports-seasons.$id.regular-standings.tsx index 7561f82..83e45ac 100644 --- a/app/routes/admin.sports-seasons.$id.regular-standings.tsx +++ b/app/routes/admin.sports-seasons.$id.regular-standings.tsx @@ -3,7 +3,7 @@ import type { Route } from "./+types/admin.sports-seasons.$id.regular-standings" import { logger } from "~/lib/logger"; import { findSportsSeasonById } from "~/models/sports-season"; -import { findParticipantsBySportsSeasonId } from "~/models/participant"; +import { findParticipantsBySportsSeasonId } from "~/models/season-participant"; import { getRegularSeasonStandings, upsertManualStanding } from "~/models/regular-season-standings"; import { Button } from "~/components/ui/button"; import { Input } from "~/components/ui/input"; diff --git a/app/routes/admin.sports-seasons.$id.simulate.tsx b/app/routes/admin.sports-seasons.$id.simulate.tsx index 3e75431..41f763e 100644 --- a/app/routes/admin.sports-seasons.$id.simulate.tsx +++ b/app/routes/admin.sports-seasons.$id.simulate.tsx @@ -15,7 +15,7 @@ import type { Route } from "./+types/admin.sports-seasons.$id.simulate"; import { findSportsSeasonById, updateSportsSeason } from "~/models/sports-season"; import { batchUpsertParticipantEVs } from "~/models/participant-expected-value"; import { batchUpsertParticipantEvSnapshots } from "~/models/ev-snapshot"; -import { findParticipantsBySportsSeasonId } from "~/models/participant"; +import { findParticipantsBySportsSeasonId } from "~/models/season-participant"; import { getSimulator, type SimulatorType } from "~/services/simulations/registry"; import { calculateEV } from "~/services/ev-calculator"; import { DEFAULT_SCORING_RULES } from "~/lib/scoring-types"; diff --git a/app/routes/admin.sports-seasons.$id.standings.tsx b/app/routes/admin.sports-seasons.$id.standings.tsx index 7b1cf81..2034543 100644 --- a/app/routes/admin.sports-seasons.$id.standings.tsx +++ b/app/routes/admin.sports-seasons.$id.standings.tsx @@ -3,7 +3,7 @@ import type { Route } from "./+types/admin.sports-seasons.$id.standings"; import { logger } from "~/lib/logger"; import { findSportsSeasonById } from "~/models/sports-season"; -import { findParticipantsBySportsSeasonId } from "~/models/participant"; +import { findParticipantsBySportsSeasonId } from "~/models/season-participant"; import { getSeasonResults, upsertSeasonResultsBulk } from "~/models/participant-season-result"; import { Button } from "~/components/ui/button"; import { Input } from "~/components/ui/input"; diff --git a/app/routes/admin.sports-seasons.$id.surface-elo.tsx b/app/routes/admin.sports-seasons.$id.surface-elo.tsx index 14c477e..95b548d 100644 --- a/app/routes/admin.sports-seasons.$id.surface-elo.tsx +++ b/app/routes/admin.sports-seasons.$id.surface-elo.tsx @@ -3,7 +3,7 @@ import type { Route } from './+types/admin.sports-seasons.$id.surface-elo'; import { logger } from '~/lib/logger'; import { findSportsSeasonById, updateSportsSeason } from '~/models/sports-season'; -import { findParticipantsBySportsSeasonId, findParticipantByName, createParticipant } from '~/models/participant'; +import { findParticipantsBySportsSeasonId, findParticipantByName, createParticipant } from '~/models/season-participant'; import { batchUpsertParticipantEVs, } from '~/models/participant-expected-value'; diff --git a/app/routes/admin.sports-seasons.$id.tsx b/app/routes/admin.sports-seasons.$id.tsx index 8107c85..7fc3699 100644 --- a/app/routes/admin.sports-seasons.$id.tsx +++ b/app/routes/admin.sports-seasons.$id.tsx @@ -16,7 +16,7 @@ import { getPendingStandingsMappings, deletePendingStandingsMapping, } from "~/models/pending-standings-mappings"; -import { findParticipantsBySportsSeasonId, updateParticipant } from "~/models/participant"; +import { findParticipantsBySportsSeasonId, updateParticipant } from "~/models/season-participant"; import { getLastSyncedAt, upsertRegularSeasonStandings } from "~/models/regular-season-standings"; import { Button } from "~/components/ui/button"; import { Input } from "~/components/ui/input"; diff --git a/app/routes/api/__tests__/draft.force-manual-pick.test.ts b/app/routes/api/__tests__/draft.force-manual-pick.test.ts index 61b467b..e1ec753 100644 --- a/app/routes/api/__tests__/draft.force-manual-pick.test.ts +++ b/app/routes/api/__tests__/draft.force-manual-pick.test.ts @@ -16,7 +16,7 @@ vi.mock("~/models/draft-pick", () => ({ getDraftPicksWithSports: vi.fn(), getTeamDraftPicksWithSports: vi.fn(), })); -vi.mock("~/models/participant", () => ({ +vi.mock("~/models/season-participant", () => ({ getParticipantsForSeasonWithSports: vi.fn(), })); vi.mock("~/models/season-sport", () => ({ @@ -138,7 +138,7 @@ describe("draft.force-manual-pick action", () => { vi.mocked(getDraftPicksWithSports).mockResolvedValue([]); vi.mocked(getTeamDraftPicksWithSports).mockResolvedValue([]); - const { getParticipantsForSeasonWithSports } = await import("~/models/participant"); + const { getParticipantsForSeasonWithSports } = await import("~/models/season-participant"); vi.mocked(getParticipantsForSeasonWithSports).mockResolvedValue([]); const { getSeasonSportsSimple } = await import("~/models/season-sport"); diff --git a/app/routes/api/__tests__/draft.force-manual-pick.timer-mode.test.ts b/app/routes/api/__tests__/draft.force-manual-pick.timer-mode.test.ts index 969fd67..e7f6620 100644 --- a/app/routes/api/__tests__/draft.force-manual-pick.timer-mode.test.ts +++ b/app/routes/api/__tests__/draft.force-manual-pick.timer-mode.test.ts @@ -22,7 +22,7 @@ vi.mock("~/models/draft-pick", () => ({ getDraftPicksWithSports: vi.fn(), getTeamDraftPicksWithSports: vi.fn(), })); -vi.mock("~/models/participant", () => ({ +vi.mock("~/models/season-participant", () => ({ getParticipantsForSeasonWithSports: vi.fn(), })); vi.mock("~/models/season-sport", () => ({ @@ -141,7 +141,7 @@ describe("draft.force-manual-pick action — timer mode behavior", () => { vi.mocked(getDraftPicksWithSports).mockResolvedValue([]); vi.mocked(getTeamDraftPicksWithSports).mockResolvedValue([]); - const { getParticipantsForSeasonWithSports } = await import("~/models/participant"); + const { getParticipantsForSeasonWithSports } = await import("~/models/season-participant"); vi.mocked(getParticipantsForSeasonWithSports).mockResolvedValue([]); const { getSeasonSportsSimple } = await import("~/models/season-sport"); diff --git a/app/routes/api/__tests__/draft.make-pick.timer-mode.test.ts b/app/routes/api/__tests__/draft.make-pick.timer-mode.test.ts index 63dc674..0a9ffd4 100644 --- a/app/routes/api/__tests__/draft.make-pick.timer-mode.test.ts +++ b/app/routes/api/__tests__/draft.make-pick.timer-mode.test.ts @@ -22,7 +22,7 @@ vi.mock("~/models/draft-pick", () => ({ getDraftPicksWithSports: vi.fn(), getTeamDraftPicksWithSports: vi.fn(), })); -vi.mock("~/models/participant", () => ({ +vi.mock("~/models/season-participant", () => ({ getParticipantsForSeasonWithSports: vi.fn(), })); vi.mock("~/models/season-sport", () => ({ @@ -138,7 +138,7 @@ describe("draft.make-pick action — timer mode behavior", () => { vi.mocked(getDraftPicksWithSports).mockResolvedValue([]); vi.mocked(getTeamDraftPicksWithSports).mockResolvedValue([]); - const { getParticipantsForSeasonWithSports } = await import("~/models/participant"); + const { getParticipantsForSeasonWithSports } = await import("~/models/season-participant"); vi.mocked(getParticipantsForSeasonWithSports).mockResolvedValue([]); const { getSeasonSportsSimple } = await import("~/models/season-sport"); diff --git a/app/routes/api/draft.force-manual-pick.ts b/app/routes/api/draft.force-manual-pick.ts index 8d58657..8ffe099 100644 --- a/app/routes/api/draft.force-manual-pick.ts +++ b/app/routes/api/draft.force-manual-pick.ts @@ -5,7 +5,7 @@ import { eq, and, sql } from "drizzle-orm"; import { isUserAdmin } from "~/models/user"; import { calculateDraftEligibility } from "~/lib/draft-eligibility"; import { getDraftPicksWithSports, getTeamDraftPicksWithSports } from "~/models/draft-pick"; -import { getParticipantsForSeasonWithSports } from "~/models/participant"; +import { getParticipantsForSeasonWithSports } from "~/models/season-participant"; import { getSeasonSportsSimple } from "~/models/season-sport"; import { calculatePickInfo, checkAndTriggerNextAutodraft } from "~/models/draft-utils"; import { logCommissionerAction } from "~/models/audit-log"; diff --git a/app/routes/api/draft.make-pick.ts b/app/routes/api/draft.make-pick.ts index 3070e61..65db0a0 100644 --- a/app/routes/api/draft.make-pick.ts +++ b/app/routes/api/draft.make-pick.ts @@ -5,7 +5,7 @@ import { eq, and, sql } from "drizzle-orm"; import { isUserAdmin } from "~/models/user"; import { calculateDraftEligibility } from "~/lib/draft-eligibility"; import { getDraftPicksWithSports, getTeamDraftPicksWithSports } from "~/models/draft-pick"; -import { getParticipantsForSeasonWithSports } from "~/models/participant"; +import { getParticipantsForSeasonWithSports } from "~/models/season-participant"; import { getSeasonSportsSimple } from "~/models/season-sport"; import { calculatePickInfo, checkAndTriggerNextAutodraft, pruneIneligibleQueueItems } from "~/models/draft-utils"; import { getSocketIO, scheduleDraftRoomClosure } from "../../../server/socket"; diff --git a/app/routes/api/draft.replace-pick.ts b/app/routes/api/draft.replace-pick.ts index 2fa2b42..b125360 100644 --- a/app/routes/api/draft.replace-pick.ts +++ b/app/routes/api/draft.replace-pick.ts @@ -5,7 +5,7 @@ import { eq, and } from "drizzle-orm"; import { isCommissioner } from "~/models/commissioner"; import { calculateDraftEligibility } from "~/lib/draft-eligibility"; import { getDraftPicksWithSports, getTeamDraftPicksWithSports } from "~/models/draft-pick"; -import { getParticipantsForSeasonWithSports } from "~/models/participant"; +import { getParticipantsForSeasonWithSports } from "~/models/season-participant"; import { getSeasonSportsSimple } from "~/models/season-sport"; import { logCommissionerAction } from "~/models/audit-log"; import { getSocketIO } from "../../../server/socket"; diff --git a/app/routes/leagues/$leagueId.draft.$seasonId.tsx b/app/routes/leagues/$leagueId.draft.$seasonId.tsx index 0b79451..1c5bdeb 100644 --- a/app/routes/leagues/$leagueId.draft.$seasonId.tsx +++ b/app/routes/leagues/$leagueId.draft.$seasonId.tsx @@ -17,7 +17,7 @@ import { getTeamWatchlist } from "~/models/watchlist"; import { findSeasonWithTeamsAndLeague } from "~/models/season"; import { findDraftSlotsBySeasonId } from "~/models/draft-slot"; import { getDraftPicksForSeason } from "~/models/draft-pick"; -import { getDraftParticipants } from "~/models/participant"; +import { getDraftParticipants } from "~/models/season-participant"; import { getSeasonTimers } from "~/models/draft-timer"; import { getSeasonAutodraftSettings } from "~/models/autodraft-settings"; import { hasCommissionerRecord } from "~/models/commissioner"; From a99c6aed18e93828b12de0501e18db71c6dd479f Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Fri, 1 May 2026 16:50:01 +0000 Subject: [PATCH 06/13] refactor(services): update simulators and services for renamed schema MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update all simulators, services, and server files to use renamed schema tables: - participants → seasonParticipants - participantExpectedValues → seasonParticipantExpectedValues - participantResults → seasonParticipantResults - eventResults.participantId → eventResults.seasonParticipantId Files updated: - 20 sport simulators (NBA, NHL, NFL, MLB, etc.) - probability-updater.ts - standings-sync/index.ts - sports-data-sync.server.ts - server/socket.ts Typecheck errors reduced from 365 to 0. Co-Authored-By: Claude Opus 4.7 --- app/services/probability-updater.ts | 4 +- app/services/simulations/afl-simulator.ts | 14 ++--- .../simulations/auto-racing-simulator.ts | 4 +- app/services/simulations/bracket-simulator.ts | 12 ++--- .../simulations/cs-major-simulator.ts | 18 +++---- app/services/simulations/darts-simulator.ts | 16 +++--- app/services/simulations/golf-simulator.ts | 8 +-- app/services/simulations/llws-simulator.ts | 14 ++--- app/services/simulations/mlb-simulator.ts | 16 +++--- app/services/simulations/nba-simulator.ts | 28 +++++----- .../simulations/ncaa-football-simulator.ts | 16 +++--- app/services/simulations/ncaam-simulator.ts | 6 +-- app/services/simulations/ncaaw-simulator.ts | 6 +-- app/services/simulations/nfl-simulator.ts | 14 ++--- app/services/simulations/nhl-simulator.ts | 32 ++++++------ app/services/simulations/snooker-simulator.ts | 14 ++--- app/services/simulations/tennis-simulator.ts | 8 +-- app/services/simulations/ucl-simulator.ts | 8 +-- app/services/simulations/wnba-simulator.ts | 16 +++--- .../simulations/world-cup-simulator.ts | 14 ++--- app/services/standings-sync/index.ts | 2 +- app/utils/sports-data-sync.server.ts | 52 +++++++++---------- server/socket.ts | 8 +-- 23 files changed, 165 insertions(+), 165 deletions(-) diff --git a/app/services/probability-updater.ts b/app/services/probability-updater.ts index 1ec048d..b6fd7cc 100644 --- a/app/services/probability-updater.ts +++ b/app/services/probability-updater.ts @@ -252,8 +252,8 @@ export async function previewProbabilityUpdate( const results = await findParticipantResultsBySportsSeasonId(sportsSeasonId); // Get all existing EVs with participant names - const existingEVs = await db.query.participantExpectedValues.findMany({ - where: eq(schema.participantExpectedValues.sportsSeasonId, sportsSeasonId), + const existingEVs = await db.query.seasonParticipantExpectedValues.findMany({ + where: eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId), with: { participant: true, }, diff --git a/app/services/simulations/afl-simulator.ts b/app/services/simulations/afl-simulator.ts index 5616844..9168c17 100644 --- a/app/services/simulations/afl-simulator.ts +++ b/app/services/simulations/afl-simulator.ts @@ -198,16 +198,16 @@ export class AFLSimulator implements Simulator { // 1. Load participants, DB Elo, and standings in parallel. const [participantRows, evRows, standings] = await Promise.all([ db - .select({ id: schema.participants.id, name: schema.participants.name }) - .from(schema.participants) - .where(eq(schema.participants.sportsSeasonId, sportsSeasonId)), + .select({ id: schema.seasonParticipants.id, name: schema.seasonParticipants.name }) + .from(schema.seasonParticipants) + .where(eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId)), db .select({ - participantId: schema.participantExpectedValues.participantId, - sourceElo: schema.participantExpectedValues.sourceElo, + participantId: schema.seasonParticipantExpectedValues.participantId, + sourceElo: schema.seasonParticipantExpectedValues.sourceElo, }) - .from(schema.participantExpectedValues) - .where(eq(schema.participantExpectedValues.sportsSeasonId, sportsSeasonId)), + .from(schema.seasonParticipantExpectedValues) + .where(eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId)), getRegularSeasonStandings(sportsSeasonId), ]); diff --git a/app/services/simulations/auto-racing-simulator.ts b/app/services/simulations/auto-racing-simulator.ts index ee73f14..64072ee 100644 --- a/app/services/simulations/auto-racing-simulator.ts +++ b/app/services/simulations/auto-racing-simulator.ts @@ -103,8 +103,8 @@ export class AutoRacingSimulator implements Simulator { const db = database(); // 1. Load all participants for this sports season - const participants = await db.query.participants.findMany({ - where: eq(schema.participants.sportsSeasonId, sportsSeasonId), + const participants = await db.query.seasonParticipants.findMany({ + where: eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId), }); if (participants.length === 0) { diff --git a/app/services/simulations/bracket-simulator.ts b/app/services/simulations/bracket-simulator.ts index 80cd30b..12a17c4 100644 --- a/app/services/simulations/bracket-simulator.ts +++ b/app/services/simulations/bracket-simulator.ts @@ -11,7 +11,7 @@ */ import { database } from "~/database/context"; -import { participantExpectedValues } from "~/database/schema"; +import { seasonParticipantExpectedValues } from "~/database/schema"; import { eq } from "drizzle-orm"; import { simulateBracket } from "~/services/bracket-simulator"; import { convertFuturesToElo } from "~/services/probability-engine"; @@ -24,12 +24,12 @@ export class BracketSimulator implements Simulator { // Load all participants with their current EVs (which hold probability distributions) const evRows = await db .select({ - participantId: participantExpectedValues.participantId, - probFirst: participantExpectedValues.probFirst, - sourceOdds: participantExpectedValues.sourceOdds, + participantId: seasonParticipantExpectedValues.participantId, + probFirst: seasonParticipantExpectedValues.probFirst, + sourceOdds: seasonParticipantExpectedValues.sourceOdds, }) - .from(participantExpectedValues) - .where(eq(participantExpectedValues.sportsSeasonId, sportsSeasonId)); + .from(seasonParticipantExpectedValues) + .where(eq(seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId)); if (evRows.length === 0) { throw new Error( diff --git a/app/services/simulations/cs-major-simulator.ts b/app/services/simulations/cs-major-simulator.ts index 2213d61..030ddef 100644 --- a/app/services/simulations/cs-major-simulator.ts +++ b/app/services/simulations/cs-major-simulator.ts @@ -433,9 +433,9 @@ export class CSMajorSimulator implements Simulator { // 1. Load all participants for this sports season. const allParticipants = await db - .select({ id: schema.participants.id }) - .from(schema.participants) - .where(eq(schema.participants.sportsSeasonId, sportsSeasonId)); + .select({ id: schema.seasonParticipants.id }) + .from(schema.seasonParticipants) + .where(eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId)); const participantIds = allParticipants.map((p) => p.id); @@ -446,12 +446,12 @@ export class CSMajorSimulator implements Simulator { // 2. Load Elo ratings and world rankings from participantExpectedValues. const evRows = await db .select({ - participantId: schema.participantExpectedValues.participantId, - sourceElo: schema.participantExpectedValues.sourceElo, - worldRanking: schema.participantExpectedValues.worldRanking, + participantId: schema.seasonParticipantExpectedValues.participantId, + sourceElo: schema.seasonParticipantExpectedValues.sourceElo, + worldRanking: schema.seasonParticipantExpectedValues.worldRanking, }) - .from(schema.participantExpectedValues) - .where(eq(schema.participantExpectedValues.sportsSeasonId, sportsSeasonId)); + .from(schema.seasonParticipantExpectedValues) + .where(eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId)); const eloMap = new Map(); for (const row of evRows) { @@ -508,7 +508,7 @@ export class CSMajorSimulator implements Simulator { if (completedEventIds.length > 0) { const actualResults = await db .select({ - participantId: schema.eventResults.participantId, + participantId: schema.eventResults.seasonParticipantId, qualifyingPointsAwarded: schema.eventResults.qualifyingPointsAwarded, }) .from(schema.eventResults) diff --git a/app/services/simulations/darts-simulator.ts b/app/services/simulations/darts-simulator.ts index 207d4e0..673b37c 100644 --- a/app/services/simulations/darts-simulator.ts +++ b/app/services/simulations/darts-simulator.ts @@ -220,12 +220,12 @@ export class DartsSimulator implements Simulator { // 3. Load Elo ratings and world rankings. const evRows = await db .select({ - participantId: schema.participantExpectedValues.participantId, - sourceElo: schema.participantExpectedValues.sourceElo, - worldRanking: schema.participantExpectedValues.worldRanking, + participantId: schema.seasonParticipantExpectedValues.participantId, + sourceElo: schema.seasonParticipantExpectedValues.sourceElo, + worldRanking: schema.seasonParticipantExpectedValues.worldRanking, }) - .from(schema.participantExpectedValues) - .where(eq(schema.participantExpectedValues.sportsSeasonId, sportsSeasonId)); + .from(schema.seasonParticipantExpectedValues) + .where(eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId)); const eloMap = new Map(); const rankingMap = new Map(); @@ -452,9 +452,9 @@ export class DartsSimulator implements Simulator { db: ReturnType ): Promise { const allParticipants = await db - .select({ id: schema.participants.id, name: schema.participants.name }) - .from(schema.participants) - .where(eq(schema.participants.sportsSeasonId, sportsSeasonId)); + .select({ id: schema.seasonParticipants.id, name: schema.seasonParticipants.name }) + .from(schema.seasonParticipants) + .where(eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId)); if (allParticipants.length < 2) { throw new Error( diff --git a/app/services/simulations/golf-simulator.ts b/app/services/simulations/golf-simulator.ts index 3011de1..4687f3d 100644 --- a/app/services/simulations/golf-simulator.ts +++ b/app/services/simulations/golf-simulator.ts @@ -185,9 +185,9 @@ export class GolfSimulator implements Simulator { // Load participants, skills, QP config, and scoring events in parallel. const [allParticipants, skillsMap, qpConfigRows, events] = await Promise.all([ db - .select({ id: schema.participants.id }) - .from(schema.participants) - .where(eq(schema.participants.sportsSeasonId, sportsSeasonId)), + .select({ id: schema.seasonParticipants.id }) + .from(schema.seasonParticipants) + .where(eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId)), getGolfSkillsMap(sportsSeasonId), getQPConfig(sportsSeasonId), db.query.scoringEvents.findMany({ @@ -226,7 +226,7 @@ export class GolfSimulator implements Simulator { if (completedEventIds.length > 0) { const actualResults = await db .select({ - participantId: schema.eventResults.participantId, + participantId: schema.eventResults.seasonParticipantId, qualifyingPointsAwarded: schema.eventResults.qualifyingPointsAwarded, }) .from(schema.eventResults) diff --git a/app/services/simulations/llws-simulator.ts b/app/services/simulations/llws-simulator.ts index 1ac4b01..b6dfcb3 100644 --- a/app/services/simulations/llws-simulator.ts +++ b/app/services/simulations/llws-simulator.ts @@ -264,9 +264,9 @@ export class LLWSSimulator implements Simulator { // 1. Load all participants. const participants = await db - .select({ id: schema.participants.id, name: schema.participants.name, externalId: schema.participants.externalId }) - .from(schema.participants) - .where(eq(schema.participants.sportsSeasonId, sportsSeasonId)); + .select({ id: schema.seasonParticipants.id, name: schema.seasonParticipants.name, externalId: schema.seasonParticipants.externalId }) + .from(schema.seasonParticipants) + .where(eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId)); if (participants.length !== US_TEAM_COUNT + INTL_TEAM_COUNT) { throw new Error( @@ -278,11 +278,11 @@ export class LLWSSimulator implements Simulator { // 2. Load championship futures odds. const evRows = await db .select({ - participantId: schema.participantExpectedValues.participantId, - sourceOdds: schema.participantExpectedValues.sourceOdds, + participantId: schema.seasonParticipantExpectedValues.participantId, + sourceOdds: schema.seasonParticipantExpectedValues.sourceOdds, }) - .from(schema.participantExpectedValues) - .where(eq(schema.participantExpectedValues.sportsSeasonId, sportsSeasonId)); + .from(schema.seasonParticipantExpectedValues) + .where(eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId)); const rawOddsMap = new Map(); for (const row of evRows) { diff --git a/app/services/simulations/mlb-simulator.ts b/app/services/simulations/mlb-simulator.ts index a4a45e7..f8f2234 100644 --- a/app/services/simulations/mlb-simulator.ts +++ b/app/services/simulations/mlb-simulator.ts @@ -409,9 +409,9 @@ export class MLBSimulator implements Simulator { // 1. Load all participants for this sports season. const participantRows = await db - .select({ id: schema.participants.id, name: schema.participants.name }) - .from(schema.participants) - .where(eq(schema.participants.sportsSeasonId, sportsSeasonId)); + .select({ id: schema.seasonParticipants.id, name: schema.seasonParticipants.name }) + .from(schema.seasonParticipants) + .where(eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId)); if (participantRows.length === 0) { throw new Error( @@ -452,12 +452,12 @@ export class MLBSimulator implements Simulator { const evRows = await db .select({ - participantId: schema.participantExpectedValues.participantId, - sourceOdds: schema.participantExpectedValues.sourceOdds, - sourceElo: schema.participantExpectedValues.sourceElo, + participantId: schema.seasonParticipantExpectedValues.participantId, + sourceOdds: schema.seasonParticipantExpectedValues.sourceOdds, + sourceElo: schema.seasonParticipantExpectedValues.sourceElo, }) - .from(schema.participantExpectedValues) - .where(eq(schema.participantExpectedValues.sportsSeasonId, sportsSeasonId)); + .from(schema.seasonParticipantExpectedValues) + .where(eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId)); const participantIdSet = new Set(participantIds); const oddsRows = evRows.filter( diff --git a/app/services/simulations/nba-simulator.ts b/app/services/simulations/nba-simulator.ts index cb4dacd..59cbd72 100644 --- a/app/services/simulations/nba-simulator.ts +++ b/app/services/simulations/nba-simulator.ts @@ -312,16 +312,16 @@ export class NBASimulator implements Simulator { // Load participant names and sourceElo values in parallel. const [participantRows, evRows] = await Promise.all([ db - .select({ id: schema.participants.id, name: schema.participants.name }) - .from(schema.participants) - .where(eq(schema.participants.sportsSeasonId, sportsSeasonId)), + .select({ id: schema.seasonParticipants.id, name: schema.seasonParticipants.name }) + .from(schema.seasonParticipants) + .where(eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId)), db .select({ - participantId: schema.participantExpectedValues.participantId, - sourceElo: schema.participantExpectedValues.sourceElo, + participantId: schema.seasonParticipantExpectedValues.participantId, + sourceElo: schema.seasonParticipantExpectedValues.sourceElo, }) - .from(schema.participantExpectedValues) - .where(eq(schema.participantExpectedValues.sportsSeasonId, sportsSeasonId)), + .from(schema.seasonParticipantExpectedValues) + .where(eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId)), ]); const nameById = new Map(participantRows.map((r) => [r.id, r.name])); @@ -472,17 +472,17 @@ export class NBASimulator implements Simulator { const [participantRows, standings, evRows] = await Promise.all([ db - .select({ id: schema.participants.id, name: schema.participants.name }) - .from(schema.participants) - .where(eq(schema.participants.sportsSeasonId, sportsSeasonId)), + .select({ id: schema.seasonParticipants.id, name: schema.seasonParticipants.name }) + .from(schema.seasonParticipants) + .where(eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId)), getRegularSeasonStandings(sportsSeasonId), db .select({ - participantId: schema.participantExpectedValues.participantId, - sourceElo: schema.participantExpectedValues.sourceElo, + participantId: schema.seasonParticipantExpectedValues.participantId, + sourceElo: schema.seasonParticipantExpectedValues.sourceElo, }) - .from(schema.participantExpectedValues) - .where(eq(schema.participantExpectedValues.sportsSeasonId, sportsSeasonId)), + .from(schema.seasonParticipantExpectedValues) + .where(eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId)), ]); if (participantRows.length === 0) { diff --git a/app/services/simulations/ncaa-football-simulator.ts b/app/services/simulations/ncaa-football-simulator.ts index d41fe9f..4ba53db 100644 --- a/app/services/simulations/ncaa-football-simulator.ts +++ b/app/services/simulations/ncaa-football-simulator.ts @@ -214,9 +214,9 @@ export class NCAAFootballSimulator implements Simulator { // 1. Load all participants for this sports season. const participants = await db - .select({ id: schema.participants.id }) - .from(schema.participants) - .where(eq(schema.participants.sportsSeasonId, sportsSeasonId)); + .select({ id: schema.seasonParticipants.id }) + .from(schema.seasonParticipants) + .where(eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId)); if (participants.length < BRACKET_SIZE) { throw new Error( @@ -228,12 +228,12 @@ export class NCAAFootballSimulator implements Simulator { // 2. Load Elo/FPI ratings and optional futures odds in a single query. const evRows = await db .select({ - participantId: schema.participantExpectedValues.participantId, - sourceElo: schema.participantExpectedValues.sourceElo, - sourceOdds: schema.participantExpectedValues.sourceOdds, + participantId: schema.seasonParticipantExpectedValues.participantId, + sourceElo: schema.seasonParticipantExpectedValues.sourceElo, + sourceOdds: schema.seasonParticipantExpectedValues.sourceOdds, }) - .from(schema.participantExpectedValues) - .where(eq(schema.participantExpectedValues.sportsSeasonId, sportsSeasonId)); + .from(schema.seasonParticipantExpectedValues) + .where(eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId)); // Build Elo and raw odds maps in a single pass. const eloFromDb = new Map(); diff --git a/app/services/simulations/ncaam-simulator.ts b/app/services/simulations/ncaam-simulator.ts index 65a13ac..c721129 100644 --- a/app/services/simulations/ncaam-simulator.ts +++ b/app/services/simulations/ncaam-simulator.ts @@ -494,9 +494,9 @@ export class NCAAMSimulator implements Simulator { // 6. Load participant names from DB; build net rating lookup by ID. const participantRows = await db - .select({ id: schema.participants.id, name: schema.participants.name }) - .from(schema.participants) - .where(inArray(schema.participants.id, participantIds)); + .select({ id: schema.seasonParticipants.id, name: schema.seasonParticipants.name }) + .from(schema.seasonParticipants) + .where(inArray(schema.seasonParticipants.id, participantIds)); if (participantRows.length < participantIds.length) { const foundIds = new Set(participantRows.map((r) => r.id)); diff --git a/app/services/simulations/ncaaw-simulator.ts b/app/services/simulations/ncaaw-simulator.ts index 0d9e0a6..5e2c20e 100644 --- a/app/services/simulations/ncaaw-simulator.ts +++ b/app/services/simulations/ncaaw-simulator.ts @@ -457,9 +457,9 @@ export class NCAAWSimulator implements Simulator { // 6. Load participant names from DB; build Barthag lookup by ID. const participantRows = await db - .select({ id: schema.participants.id, name: schema.participants.name }) - .from(schema.participants) - .where(inArray(schema.participants.id, participantIds)); + .select({ id: schema.seasonParticipants.id, name: schema.seasonParticipants.name }) + .from(schema.seasonParticipants) + .where(inArray(schema.seasonParticipants.id, participantIds)); if (participantRows.length < participantIds.length) { const foundIds = new Set(participantRows.map((r) => r.id)); diff --git a/app/services/simulations/nfl-simulator.ts b/app/services/simulations/nfl-simulator.ts index 9b7e26d..e23d4af 100644 --- a/app/services/simulations/nfl-simulator.ts +++ b/app/services/simulations/nfl-simulator.ts @@ -296,8 +296,8 @@ export class NFLSimulator implements Simulator { const db = database(); // Load participants - const participants = await db.query.participants.findMany({ - where: eq(schema.participants.sportsSeasonId, sportsSeasonId), + const participants = await db.query.seasonParticipants.findMany({ + where: eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId), }); if (participants.length === 0) { @@ -307,12 +307,12 @@ export class NFLSimulator implements Simulator { // Load EV rows (sourceElo + sourceOdds) const evRows = await db .select({ - participantId: schema.participantExpectedValues.participantId, - sourceElo: schema.participantExpectedValues.sourceElo, - sourceOdds: schema.participantExpectedValues.sourceOdds, + participantId: schema.seasonParticipantExpectedValues.participantId, + sourceElo: schema.seasonParticipantExpectedValues.sourceElo, + sourceOdds: schema.seasonParticipantExpectedValues.sourceOdds, }) - .from(schema.participantExpectedValues) - .where(eq(schema.participantExpectedValues.sportsSeasonId, sportsSeasonId)); + .from(schema.seasonParticipantExpectedValues) + .where(eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId)); // Build Elo map: prefer sourceElo, fall back to converting sourceOdds const eloMap = new Map(); diff --git a/app/services/simulations/nhl-simulator.ts b/app/services/simulations/nhl-simulator.ts index 5891634..8e24c30 100644 --- a/app/services/simulations/nhl-simulator.ts +++ b/app/services/simulations/nhl-simulator.ts @@ -278,18 +278,18 @@ export class NHLSimulator implements Simulator { // 1. Load participants, standings, and sourceElo values in parallel. const [participantRows, standings, evRows] = await Promise.all([ db - .select({ id: schema.participants.id, name: schema.participants.name }) - .from(schema.participants) - .where(eq(schema.participants.sportsSeasonId, sportsSeasonId)), + .select({ id: schema.seasonParticipants.id, name: schema.seasonParticipants.name }) + .from(schema.seasonParticipants) + .where(eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId)), getRegularSeasonStandings(sportsSeasonId), db .select({ - participantId: schema.participantExpectedValues.participantId, - sourceElo: schema.participantExpectedValues.sourceElo, - sourceOdds: schema.participantExpectedValues.sourceOdds, + participantId: schema.seasonParticipantExpectedValues.participantId, + sourceElo: schema.seasonParticipantExpectedValues.sourceElo, + sourceOdds: schema.seasonParticipantExpectedValues.sourceOdds, }) - .from(schema.participantExpectedValues) - .where(eq(schema.participantExpectedValues.sportsSeasonId, sportsSeasonId)), + .from(schema.seasonParticipantExpectedValues) + .where(eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId)), ]); if (participantRows.length === 0) { @@ -620,17 +620,17 @@ export class NHLSimulator implements Simulator { // Load all participants and EV data in parallel. const [participantRows, evRows] = await Promise.all([ db - .select({ id: schema.participants.id, name: schema.participants.name }) - .from(schema.participants) - .where(eq(schema.participants.sportsSeasonId, sportsSeasonId)), + .select({ id: schema.seasonParticipants.id, name: schema.seasonParticipants.name }) + .from(schema.seasonParticipants) + .where(eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId)), db .select({ - participantId: schema.participantExpectedValues.participantId, - sourceOdds: schema.participantExpectedValues.sourceOdds, - sourceElo: schema.participantExpectedValues.sourceElo, + participantId: schema.seasonParticipantExpectedValues.participantId, + sourceOdds: schema.seasonParticipantExpectedValues.sourceOdds, + sourceElo: schema.seasonParticipantExpectedValues.sourceElo, }) - .from(schema.participantExpectedValues) - .where(eq(schema.participantExpectedValues.sportsSeasonId, sportsSeasonId)), + .from(schema.seasonParticipantExpectedValues) + .where(eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId)), ]); const allParticipantIds = participantRows.map((r) => r.id); diff --git a/app/services/simulations/snooker-simulator.ts b/app/services/simulations/snooker-simulator.ts index a9e8a5c..2b4db9a 100644 --- a/app/services/simulations/snooker-simulator.ts +++ b/app/services/simulations/snooker-simulator.ts @@ -251,11 +251,11 @@ export class SnookerSimulator implements Simulator { // 3. Load Elo ratings from participantExpectedValues. const evRows = await db .select({ - participantId: schema.participantExpectedValues.participantId, - sourceElo: schema.participantExpectedValues.sourceElo, + participantId: schema.seasonParticipantExpectedValues.participantId, + sourceElo: schema.seasonParticipantExpectedValues.sourceElo, }) - .from(schema.participantExpectedValues) - .where(eq(schema.participantExpectedValues.sportsSeasonId, sportsSeasonId)); + .from(schema.seasonParticipantExpectedValues) + .where(eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId)); // Build Elo map; fall back to 1500 for any participant with no stored rating. const eloMap = new Map(); @@ -453,9 +453,9 @@ export class SnookerSimulator implements Simulator { db: ReturnType ): Promise { const allParticipants = await db - .select({ id: schema.participants.id, name: schema.participants.name }) - .from(schema.participants) - .where(eq(schema.participants.sportsSeasonId, sportsSeasonId)); + .select({ id: schema.seasonParticipants.id, name: schema.seasonParticipants.name }) + .from(schema.seasonParticipants) + .where(eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId)); if (allParticipants.length < 17) { throw new Error( diff --git a/app/services/simulations/tennis-simulator.ts b/app/services/simulations/tennis-simulator.ts index 032cccb..e14591e 100644 --- a/app/services/simulations/tennis-simulator.ts +++ b/app/services/simulations/tennis-simulator.ts @@ -262,9 +262,9 @@ export class TennisSimulator implements Simulator { // 1. Load all participants for this sports season. const allParticipants = await db - .select({ id: schema.participants.id }) - .from(schema.participants) - .where(eq(schema.participants.sportsSeasonId, sportsSeasonId)); + .select({ id: schema.seasonParticipants.id }) + .from(schema.seasonParticipants) + .where(eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId)); if (allParticipants.length < 128) { throw new Error( @@ -306,7 +306,7 @@ export class TennisSimulator implements Simulator { if (completedEventIds.length > 0) { const actualResults = await db .select({ - participantId: schema.eventResults.participantId, + participantId: schema.eventResults.seasonParticipantId, qualifyingPointsAwarded: schema.eventResults.qualifyingPointsAwarded, }) .from(schema.eventResults) diff --git a/app/services/simulations/ucl-simulator.ts b/app/services/simulations/ucl-simulator.ts index 18e6008..698431c 100644 --- a/app/services/simulations/ucl-simulator.ts +++ b/app/services/simulations/ucl-simulator.ts @@ -147,11 +147,11 @@ export class UCLSimulator implements Simulator { // 5. Load futures odds from participantExpectedValues. const evRows = await db .select({ - participantId: schema.participantExpectedValues.participantId, - sourceOdds: schema.participantExpectedValues.sourceOdds, + participantId: schema.seasonParticipantExpectedValues.participantId, + sourceOdds: schema.seasonParticipantExpectedValues.sourceOdds, }) - .from(schema.participantExpectedValues) - .where(eq(schema.participantExpectedValues.sportsSeasonId, sportsSeasonId)); + .from(schema.seasonParticipantExpectedValues) + .where(eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId)); const evMap = new Map(evRows.map((r) => [r.participantId, r])); diff --git a/app/services/simulations/wnba-simulator.ts b/app/services/simulations/wnba-simulator.ts index a820202..98b36a1 100644 --- a/app/services/simulations/wnba-simulator.ts +++ b/app/services/simulations/wnba-simulator.ts @@ -159,18 +159,18 @@ export class WNBASimulator implements Simulator { // 1. Load participants, standings, and futures odds in parallel. const [participantRows, standings, evRows] = await Promise.all([ db - .select({ id: schema.participants.id, name: schema.participants.name }) - .from(schema.participants) - .where(eq(schema.participants.sportsSeasonId, sportsSeasonId)), + .select({ id: schema.seasonParticipants.id, name: schema.seasonParticipants.name }) + .from(schema.seasonParticipants) + .where(eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId)), getRegularSeasonStandings(sportsSeasonId), db .select({ - participantId: schema.participantExpectedValues.participantId, - sourceOdds: schema.participantExpectedValues.sourceOdds, - sourceElo: schema.participantExpectedValues.sourceElo, + participantId: schema.seasonParticipantExpectedValues.participantId, + sourceOdds: schema.seasonParticipantExpectedValues.sourceOdds, + sourceElo: schema.seasonParticipantExpectedValues.sourceElo, }) - .from(schema.participantExpectedValues) - .where(eq(schema.participantExpectedValues.sportsSeasonId, sportsSeasonId)), + .from(schema.seasonParticipantExpectedValues) + .where(eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId)), ]); if (participantRows.length === 0) { diff --git a/app/services/simulations/world-cup-simulator.ts b/app/services/simulations/world-cup-simulator.ts index 9a1a587..8e7b681 100644 --- a/app/services/simulations/world-cup-simulator.ts +++ b/app/services/simulations/world-cup-simulator.ts @@ -313,8 +313,8 @@ export class WorldCupSimulator implements Simulator { const db = database(); // 1. Load all participants for this season - const participantRows = await db.query.participants.findMany({ - where: eq(schema.participants.sportsSeasonId, sportsSeasonId), + const participantRows = await db.query.seasonParticipants.findMany({ + where: eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId), }); if (participantRows.length === 0) { @@ -327,12 +327,12 @@ export class WorldCupSimulator implements Simulator { // 2. Load stored ratings (sourceElo from Elo page, sourceOdds from futures page) const evRows = await db .select({ - participantId: schema.participantExpectedValues.participantId, - sourceOdds: schema.participantExpectedValues.sourceOdds, - sourceElo: schema.participantExpectedValues.sourceElo, + participantId: schema.seasonParticipantExpectedValues.participantId, + sourceOdds: schema.seasonParticipantExpectedValues.sourceOdds, + sourceElo: schema.seasonParticipantExpectedValues.sourceElo, }) - .from(schema.participantExpectedValues) - .where(eq(schema.participantExpectedValues.sportsSeasonId, sportsSeasonId)); + .from(schema.seasonParticipantExpectedValues) + .where(eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId)); const evMap = new Map(evRows.map((r) => [r.participantId, r])); const participantSet = new Set(participantIds); diff --git a/app/services/standings-sync/index.ts b/app/services/standings-sync/index.ts index 1c272a4..fecb74f 100644 --- a/app/services/standings-sync/index.ts +++ b/app/services/standings-sync/index.ts @@ -1,7 +1,7 @@ import { database } from "~/database/context"; import { eq } from "drizzle-orm"; import * as schema from "~/database/schema"; -import { findParticipantsBySportsSeasonId, updateParticipant } from "~/models/participant"; +import { findParticipantsBySportsSeasonId, updateParticipant } from "~/models/season-participant"; import { upsertRegularSeasonStandings } from "~/models/regular-season-standings"; import { upsertPendingStandingsMappings } from "~/models/pending-standings-mappings"; import { findMatchingTeamName } from "~/lib/normalize-team-name"; diff --git a/app/utils/sports-data-sync.server.ts b/app/utils/sports-data-sync.server.ts index 1848913..d043e31 100644 --- a/app/utils/sports-data-sync.server.ts +++ b/app/utils/sports-data-sync.server.ts @@ -115,16 +115,16 @@ export async function exportSportsDataToJSON(): Promise { with: { sport: true }, orderBy: (s, { desc, asc }) => [desc(s.year), asc(s.name)], }), - db.query.participants.findMany({ + db.query.seasonParticipants.findMany({ with: { sportsSeason: { with: { sport: true } } }, orderBy: (p, { asc }) => [asc(p.name)], }), - db.query.participantExpectedValues.findMany({ + db.query.seasonParticipantExpectedValues.findMany({ with: { participant: { with: { sportsSeason: { with: { sport: true } } } }, }, }), - db.query.participantResults.findMany({ + db.query.seasonParticipantResults.findMany({ with: { participant: { with: { sportsSeason: { with: { sport: true } } } }, }, @@ -238,7 +238,7 @@ export async function importSportsDataFromJSON( // automatically removed when participants is deleted. await tx.delete(schema.seasonTemplateSports); await tx.delete(schema.seasonTemplates); - await tx.delete(schema.participants); // cascades to EVs + results + await tx.delete(schema.seasonParticipants); // cascades to EVs + results await tx.delete(schema.seasonSports); await tx.delete(schema.sportsSeasons); await tx.delete(schema.sports); @@ -358,28 +358,28 @@ export async function importSportsDataFromJSON( continue; } - const existing = await tx.query.participants.findFirst({ + const existing = await tx.query.seasonParticipants.findFirst({ where: and( - eq(schema.participants.sportsSeasonId, sportsSeasonId), - eq(schema.participants.name, participant.name) + eq(schema.seasonParticipants.sportsSeasonId, sportsSeasonId), + eq(schema.seasonParticipants.name, participant.name) ), }); if (existing) { // Update all mutable fields (fixes: merge mode was silently skipping) await tx - .update(schema.participants) + .update(schema.seasonParticipants) .set({ shortName: participant.shortName, externalId: participant.externalId, expectedValue: String(participant.expectedValue ?? 0), }) - .where(eq(schema.participants.id, existing.id)); + .where(eq(schema.seasonParticipants.id, existing.id)); participantIdMap.set(`${sportsSeasonId}:${participant.name}`, existing.id); updated++; } else { const [created_] = await tx - .insert(schema.participants) + .insert(schema.seasonParticipants) .values({ sportsSeasonId, name: participant.name, @@ -413,10 +413,10 @@ export async function importSportsDataFromJSON( continue; } - const existingEV = await tx.query.participantExpectedValues.findFirst({ + const existingEV = await tx.query.seasonParticipantExpectedValues.findFirst({ where: and( - eq(schema.participantExpectedValues.participantId, participantId), - eq(schema.participantExpectedValues.sportsSeasonId, sportsSeasonId) + eq(schema.seasonParticipantExpectedValues.participantId, participantId), + eq(schema.seasonParticipantExpectedValues.sportsSeasonId, sportsSeasonId) ), }); @@ -446,25 +446,25 @@ export async function importSportsDataFromJSON( if (existingEV) { if (mode === "merge") { await tx - .update(schema.participantExpectedValues) + .update(schema.seasonParticipantExpectedValues) .set({ ...evValues, updatedAt: new Date() }) - .where(eq(schema.participantExpectedValues.id, existingEV.id)); + .where(eq(schema.seasonParticipantExpectedValues.id, existingEV.id)); await tx - .update(schema.participants) + .update(schema.seasonParticipants) .set({ expectedValue: ev.expectedValue }) - .where(eq(schema.participants.id, participantId)); + .where(eq(schema.seasonParticipants.id, participantId)); updated++; } } else { - await tx.insert(schema.participantExpectedValues).values({ + await tx.insert(schema.seasonParticipantExpectedValues).values({ participantId, sportsSeasonId, ...evValues, }); await tx - .update(schema.participants) + .update(schema.seasonParticipants) .set({ expectedValue: ev.expectedValue }) - .where(eq(schema.participants.id, participantId)); + .where(eq(schema.seasonParticipants.id, participantId)); created++; } } @@ -489,10 +489,10 @@ export async function importSportsDataFromJSON( continue; } - const existingResult = await tx.query.participantResults.findFirst({ + const existingResult = await tx.query.seasonParticipantResults.findFirst({ where: and( - eq(schema.participantResults.participantId, participantId), - eq(schema.participantResults.sportsSeasonId, sportsSeasonId) + eq(schema.seasonParticipantResults.participantId, participantId), + eq(schema.seasonParticipantResults.sportsSeasonId, sportsSeasonId) ), }); @@ -505,13 +505,13 @@ export async function importSportsDataFromJSON( if (existingResult) { if (mode === "merge") { await tx - .update(schema.participantResults) + .update(schema.seasonParticipantResults) .set({ ...resultValues, updatedAt: new Date() }) - .where(eq(schema.participantResults.id, existingResult.id)); + .where(eq(schema.seasonParticipantResults.id, existingResult.id)); updated++; } } else { - await tx.insert(schema.participantResults).values({ + await tx.insert(schema.seasonParticipantResults).values({ participantId, sportsSeasonId, ...resultValues, diff --git a/server/socket.ts b/server/socket.ts index 066e221..a8b32e1 100644 --- a/server/socket.ts +++ b/server/socket.ts @@ -232,18 +232,18 @@ export function initializeSocketIO(httpServer: HTTPServer): SocketIOServer { pickInRound: schema.draftPicks.pickInRound, timeUsed: schema.draftPicks.timeUsed, team: schema.teams, - participant: schema.participants, + participant: schema.seasonParticipants, sport: schema.sports, }) .from(schema.draftPicks) .innerJoin(schema.teams, eq(schema.draftPicks.teamId, schema.teams.id)) .innerJoin( - schema.participants, - eq(schema.draftPicks.participantId, schema.participants.id) + schema.seasonParticipants, + eq(schema.draftPicks.participantId, schema.seasonParticipants.id) ) .innerJoin( schema.sportsSeasons, - eq(schema.participants.sportsSeasonId, schema.sportsSeasons.id) + eq(schema.seasonParticipants.sportsSeasonId, schema.sportsSeasons.id) ) .innerJoin( schema.sports, From 9097717d60f03bbed4d69c260805acc614e608ac Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Fri, 1 May 2026 11:58:32 -0700 Subject: [PATCH 07/13] migration: rename per-window tables to season_* prefix --- drizzle/0087_small_susan_delgado.sql | 221 ++ drizzle/meta/0087_snapshot.json | 5221 ++++++++++++++++++++++++++ drizzle/meta/_journal.json | 7 + 3 files changed, 5449 insertions(+) create mode 100644 drizzle/0087_small_susan_delgado.sql create mode 100644 drizzle/meta/0087_snapshot.json diff --git a/drizzle/0087_small_susan_delgado.sql b/drizzle/0087_small_susan_delgado.sql new file mode 100644 index 0000000..346fea1 --- /dev/null +++ b/drizzle/0087_small_susan_delgado.sql @@ -0,0 +1,221 @@ +ALTER TABLE "participant_expected_values" RENAME TO "season_participant_expected_values";--> statement-breakpoint +ALTER TABLE "participant_qualifying_totals" RENAME TO "season_participant_qualifying_totals";--> statement-breakpoint +ALTER TABLE "participant_results" RENAME TO "season_participant_results";--> statement-breakpoint +ALTER TABLE "participant_surface_elos" RENAME TO "season_participant_surface_elos";--> statement-breakpoint +ALTER TABLE "participants" RENAME TO "season_participants";--> statement-breakpoint +ALTER TABLE "event_results" RENAME COLUMN "participant_id" TO "season_participant_id";--> statement-breakpoint +ALTER TABLE "cs2_major_stage_results" DROP CONSTRAINT IF EXISTS "cs2_major_stage_results_participant_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "draft_picks" DROP CONSTRAINT IF EXISTS "draft_picks_participant_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "draft_queue" DROP CONSTRAINT IF EXISTS "draft_queue_participant_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "event_results" DROP CONSTRAINT IF EXISTS "event_results_participant_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "group_stage_matches" DROP CONSTRAINT IF EXISTS "group_stage_matches_participant1_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "group_stage_matches" DROP CONSTRAINT IF EXISTS "group_stage_matches_participant2_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "participant_ev_snapshots" DROP CONSTRAINT IF EXISTS "participant_ev_snapshots_participant_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "season_participant_expected_values" DROP CONSTRAINT IF EXISTS "participant_expected_values_participant_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "season_participant_expected_values" DROP CONSTRAINT IF EXISTS "participant_expected_values_sports_season_id_sports_seasons_id_fk"; +--> statement-breakpoint +ALTER TABLE "participant_golf_skills" DROP CONSTRAINT IF EXISTS "participant_golf_skills_participant_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "season_participant_qualifying_totals" DROP CONSTRAINT IF EXISTS "participant_qualifying_totals_participant_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "season_participant_qualifying_totals" DROP CONSTRAINT IF EXISTS "participant_qualifying_totals_sports_season_id_sports_seasons_id_fk"; +--> statement-breakpoint +ALTER TABLE "season_participant_results" DROP CONSTRAINT IF EXISTS "participant_results_participant_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "season_participant_results" DROP CONSTRAINT IF EXISTS "participant_results_sports_season_id_sports_seasons_id_fk"; +--> statement-breakpoint +ALTER TABLE "participant_season_results" DROP CONSTRAINT IF EXISTS "participant_season_results_participant_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "season_participant_surface_elos" DROP CONSTRAINT IF EXISTS "participant_surface_elos_participant_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "season_participant_surface_elos" DROP CONSTRAINT IF EXISTS "participant_surface_elos_sports_season_id_sports_seasons_id_fk"; +--> statement-breakpoint +ALTER TABLE "season_participants" DROP CONSTRAINT IF EXISTS "participants_sports_season_id_sports_seasons_id_fk"; +--> statement-breakpoint +ALTER TABLE "playoff_match_games" DROP CONSTRAINT IF EXISTS "playoff_match_games_winner_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "playoff_match_odds" DROP CONSTRAINT IF EXISTS "playoff_match_odds_participant_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "playoff_matches" DROP CONSTRAINT IF EXISTS "playoff_matches_participant1_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "playoff_matches" DROP CONSTRAINT IF EXISTS "playoff_matches_participant2_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "playoff_matches" DROP CONSTRAINT IF EXISTS "playoff_matches_winner_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "playoff_matches" DROP CONSTRAINT IF EXISTS "playoff_matches_loser_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "regular_season_standings" DROP CONSTRAINT IF EXISTS "regular_season_standings_participant_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "tournament_group_members" DROP CONSTRAINT IF EXISTS "tournament_group_members_participant_id_participants_id_fk"; +--> statement-breakpoint +ALTER TABLE "watchlist" DROP CONSTRAINT IF EXISTS "watchlist_participant_id_participants_id_fk"; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "cs2_major_stage_results" ADD CONSTRAINT "cs2_major_stage_results_participant_id_season_participants_id_fk" FOREIGN KEY ("participant_id") REFERENCES "public"."season_participants"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "draft_picks" ADD CONSTRAINT "draft_picks_participant_id_season_participants_id_fk" FOREIGN KEY ("participant_id") REFERENCES "public"."season_participants"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "draft_queue" ADD CONSTRAINT "draft_queue_participant_id_season_participants_id_fk" FOREIGN KEY ("participant_id") REFERENCES "public"."season_participants"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "event_results" ADD CONSTRAINT "event_results_season_participant_id_season_participants_id_fk" FOREIGN KEY ("season_participant_id") REFERENCES "public"."season_participants"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "group_stage_matches" ADD CONSTRAINT "group_stage_matches_participant1_id_season_participants_id_fk" FOREIGN KEY ("participant1_id") REFERENCES "public"."season_participants"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "group_stage_matches" ADD CONSTRAINT "group_stage_matches_participant2_id_season_participants_id_fk" FOREIGN KEY ("participant2_id") REFERENCES "public"."season_participants"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "participant_ev_snapshots" ADD CONSTRAINT "participant_ev_snapshots_participant_id_season_participants_id_fk" FOREIGN KEY ("participant_id") REFERENCES "public"."season_participants"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "season_participant_expected_values" ADD CONSTRAINT "season_participant_expected_values_participant_id_season_participants_id_fk" FOREIGN KEY ("participant_id") REFERENCES "public"."season_participants"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "season_participant_expected_values" ADD CONSTRAINT "season_participant_expected_values_sports_season_id_sports_seasons_id_fk" FOREIGN KEY ("sports_season_id") REFERENCES "public"."sports_seasons"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "participant_golf_skills" ADD CONSTRAINT "participant_golf_skills_participant_id_season_participants_id_fk" FOREIGN KEY ("participant_id") REFERENCES "public"."season_participants"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "season_participant_qualifying_totals" ADD CONSTRAINT "season_participant_qualifying_totals_participant_id_season_participants_id_fk" FOREIGN KEY ("participant_id") REFERENCES "public"."season_participants"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "season_participant_qualifying_totals" ADD CONSTRAINT "season_participant_qualifying_totals_sports_season_id_sports_seasons_id_fk" FOREIGN KEY ("sports_season_id") REFERENCES "public"."sports_seasons"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "season_participant_results" ADD CONSTRAINT "season_participant_results_participant_id_season_participants_id_fk" FOREIGN KEY ("participant_id") REFERENCES "public"."season_participants"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "season_participant_results" ADD CONSTRAINT "season_participant_results_sports_season_id_sports_seasons_id_fk" FOREIGN KEY ("sports_season_id") REFERENCES "public"."sports_seasons"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "participant_season_results" ADD CONSTRAINT "participant_season_results_participant_id_season_participants_id_fk" FOREIGN KEY ("participant_id") REFERENCES "public"."season_participants"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "season_participant_surface_elos" ADD CONSTRAINT "season_participant_surface_elos_participant_id_season_participants_id_fk" FOREIGN KEY ("participant_id") REFERENCES "public"."season_participants"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "season_participant_surface_elos" ADD CONSTRAINT "season_participant_surface_elos_sports_season_id_sports_seasons_id_fk" FOREIGN KEY ("sports_season_id") REFERENCES "public"."sports_seasons"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "season_participants" ADD CONSTRAINT "season_participants_sports_season_id_sports_seasons_id_fk" FOREIGN KEY ("sports_season_id") REFERENCES "public"."sports_seasons"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "playoff_match_games" ADD CONSTRAINT "playoff_match_games_winner_id_season_participants_id_fk" FOREIGN KEY ("winner_id") REFERENCES "public"."season_participants"("id") ON DELETE set null ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "playoff_match_odds" ADD CONSTRAINT "playoff_match_odds_participant_id_season_participants_id_fk" FOREIGN KEY ("participant_id") REFERENCES "public"."season_participants"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "playoff_matches" ADD CONSTRAINT "playoff_matches_participant1_id_season_participants_id_fk" FOREIGN KEY ("participant1_id") REFERENCES "public"."season_participants"("id") ON DELETE set null ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "playoff_matches" ADD CONSTRAINT "playoff_matches_participant2_id_season_participants_id_fk" FOREIGN KEY ("participant2_id") REFERENCES "public"."season_participants"("id") ON DELETE set null ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "playoff_matches" ADD CONSTRAINT "playoff_matches_winner_id_season_participants_id_fk" FOREIGN KEY ("winner_id") REFERENCES "public"."season_participants"("id") ON DELETE set null ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "playoff_matches" ADD CONSTRAINT "playoff_matches_loser_id_season_participants_id_fk" FOREIGN KEY ("loser_id") REFERENCES "public"."season_participants"("id") ON DELETE set null ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "regular_season_standings" ADD CONSTRAINT "regular_season_standings_participant_id_season_participants_id_fk" FOREIGN KEY ("participant_id") REFERENCES "public"."season_participants"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "tournament_group_members" ADD CONSTRAINT "tournament_group_members_participant_id_season_participants_id_fk" FOREIGN KEY ("participant_id") REFERENCES "public"."season_participants"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "watchlist" ADD CONSTRAINT "watchlist_participant_id_season_participants_id_fk" FOREIGN KEY ("participant_id") REFERENCES "public"."season_participants"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/drizzle/meta/0087_snapshot.json b/drizzle/meta/0087_snapshot.json new file mode 100644 index 0000000..23b423c --- /dev/null +++ b/drizzle/meta/0087_snapshot.json @@ -0,0 +1,5221 @@ +{ + "id": "e93f3b1e-7804-4550-a740-a85b21ab0588", + "prevId": "da70c605-a87a-4653-85ed-427055b273c5", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.accounts": { + "name": "accounts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "access_token_expires_at": { + "name": "access_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "refresh_token_expires_at": { + "name": "refresh_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "accounts_user_id_users_id_fk": { + "name": "accounts_user_id_users_id_fk", + "tableFrom": "accounts", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.autodraft_settings": { + "name": "autodraft_settings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "season_id": { + "name": "season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "team_id": { + "name": "team_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "is_enabled": { + "name": "is_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "mode": { + "name": "mode", + "type": "autodraft_mode", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'next_pick'" + }, + "queue_only": { + "name": "queue_only", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "autodraft_settings_season_id_seasons_id_fk": { + "name": "autodraft_settings_season_id_seasons_id_fk", + "tableFrom": "autodraft_settings", + "tableTo": "seasons", + "columnsFrom": [ + "season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "autodraft_settings_team_id_teams_id_fk": { + "name": "autodraft_settings_team_id_teams_id_fk", + "tableFrom": "autodraft_settings", + "tableTo": "teams", + "columnsFrom": [ + "team_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.commissioner_audit_log": { + "name": "commissioner_audit_log", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "season_id": { + "name": "season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "league_id": { + "name": "league_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "actor_user_id": { + "name": "actor_user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "actor_display_name": { + "name": "actor_display_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "action": { + "name": "action", + "type": "audit_action", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "affected_team_ids": { + "name": "affected_team_ids", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "details": { + "name": "details", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "audit_log_season_id_idx": { + "name": "audit_log_season_id_idx", + "columns": [ + { + "expression": "season_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "commissioner_audit_log_season_id_seasons_id_fk": { + "name": "commissioner_audit_log_season_id_seasons_id_fk", + "tableFrom": "commissioner_audit_log", + "tableTo": "seasons", + "columnsFrom": [ + "season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "commissioner_audit_log_league_id_leagues_id_fk": { + "name": "commissioner_audit_log_league_id_leagues_id_fk", + "tableFrom": "commissioner_audit_log", + "tableTo": "leagues", + "columnsFrom": [ + "league_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.commissioners": { + "name": "commissioners", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "league_id": { + "name": "league_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "commissioners_league_id_leagues_id_fk": { + "name": "commissioners_league_id_leagues_id_fk", + "tableFrom": "commissioners", + "tableTo": "leagues", + "columnsFrom": [ + "league_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.cs2_major_stage_results": { + "name": "cs2_major_stage_results", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "scoring_event_id": { + "name": "scoring_event_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "participant_id": { + "name": "participant_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "stage_entry": { + "name": "stage_entry", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "stage_eliminated": { + "name": "stage_eliminated", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "stage_eliminated_wins": { + "name": "stage_eliminated_wins", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "final_placement": { + "name": "final_placement", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "cs2_major_stage_results_unique": { + "name": "cs2_major_stage_results_unique", + "columns": [ + { + "expression": "scoring_event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "participant_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "cs2_major_stage_results_scoring_event_id_scoring_events_id_fk": { + "name": "cs2_major_stage_results_scoring_event_id_scoring_events_id_fk", + "tableFrom": "cs2_major_stage_results", + "tableTo": "scoring_events", + "columnsFrom": [ + "scoring_event_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "cs2_major_stage_results_participant_id_season_participants_id_fk": { + "name": "cs2_major_stage_results_participant_id_season_participants_id_fk", + "tableFrom": "cs2_major_stage_results", + "tableTo": "season_participants", + "columnsFrom": [ + "participant_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.draft_picks": { + "name": "draft_picks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "season_id": { + "name": "season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "team_id": { + "name": "team_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "participant_id": { + "name": "participant_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "pick_number": { + "name": "pick_number", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "round": { + "name": "round", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "pick_in_round": { + "name": "pick_in_round", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "picked_by_user_id": { + "name": "picked_by_user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "picked_by_type": { + "name": "picked_by_type", + "type": "picked_by_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "time_used": { + "name": "time_used", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "draft_picks_season_pick_unique": { + "name": "draft_picks_season_pick_unique", + "columns": [ + { + "expression": "season_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "pick_number", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "draft_picks_season_id_seasons_id_fk": { + "name": "draft_picks_season_id_seasons_id_fk", + "tableFrom": "draft_picks", + "tableTo": "seasons", + "columnsFrom": [ + "season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "draft_picks_team_id_teams_id_fk": { + "name": "draft_picks_team_id_teams_id_fk", + "tableFrom": "draft_picks", + "tableTo": "teams", + "columnsFrom": [ + "team_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "draft_picks_participant_id_season_participants_id_fk": { + "name": "draft_picks_participant_id_season_participants_id_fk", + "tableFrom": "draft_picks", + "tableTo": "season_participants", + "columnsFrom": [ + "participant_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.draft_queue": { + "name": "draft_queue", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "season_id": { + "name": "season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "team_id": { + "name": "team_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "participant_id": { + "name": "participant_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "queue_position": { + "name": "queue_position", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "draft_queue_season_id_seasons_id_fk": { + "name": "draft_queue_season_id_seasons_id_fk", + "tableFrom": "draft_queue", + "tableTo": "seasons", + "columnsFrom": [ + "season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "draft_queue_team_id_teams_id_fk": { + "name": "draft_queue_team_id_teams_id_fk", + "tableFrom": "draft_queue", + "tableTo": "teams", + "columnsFrom": [ + "team_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "draft_queue_participant_id_season_participants_id_fk": { + "name": "draft_queue_participant_id_season_participants_id_fk", + "tableFrom": "draft_queue", + "tableTo": "season_participants", + "columnsFrom": [ + "participant_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.draft_slots": { + "name": "draft_slots", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "season_id": { + "name": "season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "team_id": { + "name": "team_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "draft_order": { + "name": "draft_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "draft_slots_season_id_seasons_id_fk": { + "name": "draft_slots_season_id_seasons_id_fk", + "tableFrom": "draft_slots", + "tableTo": "seasons", + "columnsFrom": [ + "season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "draft_slots_team_id_teams_id_fk": { + "name": "draft_slots_team_id_teams_id_fk", + "tableFrom": "draft_slots", + "tableTo": "teams", + "columnsFrom": [ + "team_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.draft_timers": { + "name": "draft_timers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "season_id": { + "name": "season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "team_id": { + "name": "team_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "time_remaining": { + "name": "time_remaining", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "draft_timers_season_id_seasons_id_fk": { + "name": "draft_timers_season_id_seasons_id_fk", + "tableFrom": "draft_timers", + "tableTo": "seasons", + "columnsFrom": [ + "season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "draft_timers_team_id_teams_id_fk": { + "name": "draft_timers_team_id_teams_id_fk", + "tableFrom": "draft_timers", + "tableTo": "teams", + "columnsFrom": [ + "team_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.event_results": { + "name": "event_results", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "scoring_event_id": { + "name": "scoring_event_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "season_participant_id": { + "name": "season_participant_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "placement": { + "name": "placement", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "qualifying_points_awarded": { + "name": "qualifying_points_awarded", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "eliminated": { + "name": "eliminated", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "raw_score": { + "name": "raw_score", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "event_results_scoring_event_id_scoring_events_id_fk": { + "name": "event_results_scoring_event_id_scoring_events_id_fk", + "tableFrom": "event_results", + "tableTo": "scoring_events", + "columnsFrom": [ + "scoring_event_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "event_results_season_participant_id_season_participants_id_fk": { + "name": "event_results_season_participant_id_season_participants_id_fk", + "tableFrom": "event_results", + "tableTo": "season_participants", + "columnsFrom": [ + "season_participant_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.group_stage_matches": { + "name": "group_stage_matches", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "tournament_group_id": { + "name": "tournament_group_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "participant1_id": { + "name": "participant1_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "participant2_id": { + "name": "participant2_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "participant1_score": { + "name": "participant1_score", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "participant2_score": { + "name": "participant2_score", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "is_complete": { + "name": "is_complete", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "matchday": { + "name": "matchday", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "scheduled_at": { + "name": "scheduled_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "group_stage_matches_group_pair_unique": { + "name": "group_stage_matches_group_pair_unique", + "columns": [ + { + "expression": "tournament_group_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "participant1_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "participant2_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "group_stage_matches_tournament_group_id_tournament_groups_id_fk": { + "name": "group_stage_matches_tournament_group_id_tournament_groups_id_fk", + "tableFrom": "group_stage_matches", + "tableTo": "tournament_groups", + "columnsFrom": [ + "tournament_group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "group_stage_matches_participant1_id_season_participants_id_fk": { + "name": "group_stage_matches_participant1_id_season_participants_id_fk", + "tableFrom": "group_stage_matches", + "tableTo": "season_participants", + "columnsFrom": [ + "participant1_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "group_stage_matches_participant2_id_season_participants_id_fk": { + "name": "group_stage_matches_participant2_id_season_participants_id_fk", + "tableFrom": "group_stage_matches", + "tableTo": "season_participants", + "columnsFrom": [ + "participant2_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.leagues": { + "name": "leagues", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_by": { + "name": "created_by", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "current_season_id": { + "name": "current_season_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "is_public_draft_board": { + "name": "is_public_draft_board", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "discord_webhook_url": { + "name": "discord_webhook_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.participant_ev_snapshots": { + "name": "participant_ev_snapshots", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "participant_id": { + "name": "participant_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "sports_season_id": { + "name": "sports_season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "snapshot_date": { + "name": "snapshot_date", + "type": "date", + "primaryKey": false, + "notNull": true + }, + "prob_first": { + "name": "prob_first", + "type": "numeric(5, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "prob_second": { + "name": "prob_second", + "type": "numeric(5, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "prob_third": { + "name": "prob_third", + "type": "numeric(5, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "prob_fourth": { + "name": "prob_fourth", + "type": "numeric(5, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "prob_fifth": { + "name": "prob_fifth", + "type": "numeric(5, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "prob_sixth": { + "name": "prob_sixth", + "type": "numeric(5, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "prob_seventh": { + "name": "prob_seventh", + "type": "numeric(5, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "prob_eighth": { + "name": "prob_eighth", + "type": "numeric(5, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "calculated_ev": { + "name": "calculated_ev", + "type": "numeric(10, 4)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "source": { + "name": "source", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "participant_ev_snapshots_unique": { + "name": "participant_ev_snapshots_unique", + "columns": [ + { + "expression": "participant_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "sports_season_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "snapshot_date", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "participant_ev_snapshots_participant_id_season_participants_id_fk": { + "name": "participant_ev_snapshots_participant_id_season_participants_id_fk", + "tableFrom": "participant_ev_snapshots", + "tableTo": "season_participants", + "columnsFrom": [ + "participant_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "participant_ev_snapshots_sports_season_id_sports_seasons_id_fk": { + "name": "participant_ev_snapshots_sports_season_id_sports_seasons_id_fk", + "tableFrom": "participant_ev_snapshots", + "tableTo": "sports_seasons", + "columnsFrom": [ + "sports_season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.participant_golf_skills": { + "name": "participant_golf_skills", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "participant_id": { + "name": "participant_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "sports_season_id": { + "name": "sports_season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "sg_total": { + "name": "sg_total", + "type": "numeric(5, 2)", + "primaryKey": false, + "notNull": false + }, + "datagolf_rank": { + "name": "datagolf_rank", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "masters_odds": { + "name": "masters_odds", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "us_open_odds": { + "name": "us_open_odds", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "open_championship_odds": { + "name": "open_championship_odds", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "pga_championship_odds": { + "name": "pga_championship_odds", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "participant_golf_skills_unique": { + "name": "participant_golf_skills_unique", + "columns": [ + { + "expression": "participant_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "sports_season_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "participant_golf_skills_participant_id_season_participants_id_fk": { + "name": "participant_golf_skills_participant_id_season_participants_id_fk", + "tableFrom": "participant_golf_skills", + "tableTo": "season_participants", + "columnsFrom": [ + "participant_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "participant_golf_skills_sports_season_id_sports_seasons_id_fk": { + "name": "participant_golf_skills_sports_season_id_sports_seasons_id_fk", + "tableFrom": "participant_golf_skills", + "tableTo": "sports_seasons", + "columnsFrom": [ + "sports_season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.participant_season_results": { + "name": "participant_season_results", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "participant_id": { + "name": "participant_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "sports_season_id": { + "name": "sports_season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "current_points": { + "name": "current_points", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "current_position": { + "name": "current_position", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "participant_season_results_participant_id_season_participants_id_fk": { + "name": "participant_season_results_participant_id_season_participants_id_fk", + "tableFrom": "participant_season_results", + "tableTo": "season_participants", + "columnsFrom": [ + "participant_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "participant_season_results_sports_season_id_sports_seasons_id_fk": { + "name": "participant_season_results_sports_season_id_sports_seasons_id_fk", + "tableFrom": "participant_season_results", + "tableTo": "sports_seasons", + "columnsFrom": [ + "sports_season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.pending_standings_mappings": { + "name": "pending_standings_mappings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "sports_season_id": { + "name": "sports_season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "external_team_id": { + "name": "external_team_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "team_name": { + "name": "team_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "standing_data": { + "name": "standing_data", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "psm_season_external_id_idx": { + "name": "psm_season_external_id_idx", + "columns": [ + { + "expression": "sports_season_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "external_team_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "pending_standings_mappings_sports_season_id_sports_seasons_id_fk": { + "name": "pending_standings_mappings_sports_season_id_sports_seasons_id_fk", + "tableFrom": "pending_standings_mappings", + "tableTo": "sports_seasons", + "columnsFrom": [ + "sports_season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.playoff_match_games": { + "name": "playoff_match_games", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "playoff_match_id": { + "name": "playoff_match_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "game_number": { + "name": "game_number", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "scheduled_at": { + "name": "scheduled_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "playoff_match_game_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'scheduled'" + }, + "participant1_score": { + "name": "participant1_score", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "participant2_score": { + "name": "participant2_score", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "winner_id": { + "name": "winner_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "playoff_match_games_playoff_match_id_playoff_matches_id_fk": { + "name": "playoff_match_games_playoff_match_id_playoff_matches_id_fk", + "tableFrom": "playoff_match_games", + "tableTo": "playoff_matches", + "columnsFrom": [ + "playoff_match_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "playoff_match_games_winner_id_season_participants_id_fk": { + "name": "playoff_match_games_winner_id_season_participants_id_fk", + "tableFrom": "playoff_match_games", + "tableTo": "season_participants", + "columnsFrom": [ + "winner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.playoff_match_odds": { + "name": "playoff_match_odds", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "playoff_match_id": { + "name": "playoff_match_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "participant_id": { + "name": "participant_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "moneyline_odds": { + "name": "moneyline_odds", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "implied_probability": { + "name": "implied_probability", + "type": "numeric(6, 4)", + "primaryKey": false, + "notNull": false + }, + "odds_source": { + "name": "odds_source", + "type": "varchar(100)", + "primaryKey": false, + "notNull": false + }, + "recorded_at": { + "name": "recorded_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "playoff_match_odds_playoff_match_id_playoff_matches_id_fk": { + "name": "playoff_match_odds_playoff_match_id_playoff_matches_id_fk", + "tableFrom": "playoff_match_odds", + "tableTo": "playoff_matches", + "columnsFrom": [ + "playoff_match_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "playoff_match_odds_participant_id_season_participants_id_fk": { + "name": "playoff_match_odds_participant_id_season_participants_id_fk", + "tableFrom": "playoff_match_odds", + "tableTo": "season_participants", + "columnsFrom": [ + "participant_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.playoff_matches": { + "name": "playoff_matches", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "scoring_event_id": { + "name": "scoring_event_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "round": { + "name": "round", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true + }, + "match_number": { + "name": "match_number", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "participant1_id": { + "name": "participant1_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "participant2_id": { + "name": "participant2_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "winner_id": { + "name": "winner_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "loser_id": { + "name": "loser_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "is_complete": { + "name": "is_complete", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "participant1_score": { + "name": "participant1_score", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "participant2_score": { + "name": "participant2_score", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "is_scoring": { + "name": "is_scoring", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "template_round": { + "name": "template_round", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false + }, + "seed_info": { + "name": "seed_info", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "playoff_matches_scoring_event_id_scoring_events_id_fk": { + "name": "playoff_matches_scoring_event_id_scoring_events_id_fk", + "tableFrom": "playoff_matches", + "tableTo": "scoring_events", + "columnsFrom": [ + "scoring_event_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "playoff_matches_participant1_id_season_participants_id_fk": { + "name": "playoff_matches_participant1_id_season_participants_id_fk", + "tableFrom": "playoff_matches", + "tableTo": "season_participants", + "columnsFrom": [ + "participant1_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "playoff_matches_participant2_id_season_participants_id_fk": { + "name": "playoff_matches_participant2_id_season_participants_id_fk", + "tableFrom": "playoff_matches", + "tableTo": "season_participants", + "columnsFrom": [ + "participant2_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "playoff_matches_winner_id_season_participants_id_fk": { + "name": "playoff_matches_winner_id_season_participants_id_fk", + "tableFrom": "playoff_matches", + "tableTo": "season_participants", + "columnsFrom": [ + "winner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "playoff_matches_loser_id_season_participants_id_fk": { + "name": "playoff_matches_loser_id_season_participants_id_fk", + "tableFrom": "playoff_matches", + "tableTo": "season_participants", + "columnsFrom": [ + "loser_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.qualifying_point_config": { + "name": "qualifying_point_config", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "sports_season_id": { + "name": "sports_season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "placement": { + "name": "placement", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "points": { + "name": "points", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "qualifying_point_config_sports_season_id_sports_seasons_id_fk": { + "name": "qualifying_point_config_sports_season_id_sports_seasons_id_fk", + "tableFrom": "qualifying_point_config", + "tableTo": "sports_seasons", + "columnsFrom": [ + "sports_season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.regular_season_standings": { + "name": "regular_season_standings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "participant_id": { + "name": "participant_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "sports_season_id": { + "name": "sports_season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "wins": { + "name": "wins", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "losses": { + "name": "losses", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "ot_losses": { + "name": "ot_losses", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "ties": { + "name": "ties", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "win_pct": { + "name": "win_pct", + "type": "numeric(5, 4)", + "primaryKey": false, + "notNull": false + }, + "games_played": { + "name": "games_played", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "games_back": { + "name": "games_back", + "type": "numeric(5, 1)", + "primaryKey": false, + "notNull": false + }, + "conference": { + "name": "conference", + "type": "varchar(100)", + "primaryKey": false, + "notNull": false + }, + "division": { + "name": "division", + "type": "varchar(100)", + "primaryKey": false, + "notNull": false + }, + "conference_rank": { + "name": "conference_rank", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "division_rank": { + "name": "division_rank", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "league_rank": { + "name": "league_rank", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "streak": { + "name": "streak", + "type": "varchar(20)", + "primaryKey": false, + "notNull": false + }, + "last_ten": { + "name": "last_ten", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false + }, + "home_record": { + "name": "home_record", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false + }, + "away_record": { + "name": "away_record", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false + }, + "external_team_id": { + "name": "external_team_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "srs": { + "name": "srs", + "type": "numeric(6, 2)", + "primaryKey": false, + "notNull": false + }, + "synced_at": { + "name": "synced_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "rss_participant_season_idx": { + "name": "rss_participant_season_idx", + "columns": [ + { + "expression": "participant_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "sports_season_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "regular_season_standings_participant_id_season_participants_id_fk": { + "name": "regular_season_standings_participant_id_season_participants_id_fk", + "tableFrom": "regular_season_standings", + "tableTo": "season_participants", + "columnsFrom": [ + "participant_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "regular_season_standings_sports_season_id_sports_seasons_id_fk": { + "name": "regular_season_standings_sports_season_id_sports_seasons_id_fk", + "tableFrom": "regular_season_standings", + "tableTo": "sports_seasons", + "columnsFrom": [ + "sports_season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.scoring_events": { + "name": "scoring_events", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "sports_season_id": { + "name": "sports_season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "event_date": { + "name": "event_date", + "type": "date", + "primaryKey": false, + "notNull": false + }, + "event_starts_at": { + "name": "event_starts_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "event_type": { + "name": "event_type", + "type": "event_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "playoff_round": { + "name": "playoff_round", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false + }, + "is_qualifying_event": { + "name": "is_qualifying_event", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "bracket_template_id": { + "name": "bracket_template_id", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false + }, + "scoring_starts_at_round": { + "name": "scoring_starts_at_round", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false + }, + "bracket_region_config": { + "name": "bracket_region_config", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "is_complete": { + "name": "is_complete", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "completed_at": { + "name": "completed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "scoring_events_sports_season_id_sports_seasons_id_fk": { + "name": "scoring_events_sports_season_id_sports_seasons_id_fk", + "tableFrom": "scoring_events", + "tableTo": "sports_seasons", + "columnsFrom": [ + "sports_season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.season_participant_expected_values": { + "name": "season_participant_expected_values", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "participant_id": { + "name": "participant_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "sports_season_id": { + "name": "sports_season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "prob_first": { + "name": "prob_first", + "type": "numeric(6, 4)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "prob_second": { + "name": "prob_second", + "type": "numeric(6, 4)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "prob_third": { + "name": "prob_third", + "type": "numeric(6, 4)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "prob_fourth": { + "name": "prob_fourth", + "type": "numeric(6, 4)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "prob_fifth": { + "name": "prob_fifth", + "type": "numeric(6, 4)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "prob_sixth": { + "name": "prob_sixth", + "type": "numeric(6, 4)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "prob_seventh": { + "name": "prob_seventh", + "type": "numeric(6, 4)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "prob_eighth": { + "name": "prob_eighth", + "type": "numeric(6, 4)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "expected_value": { + "name": "expected_value", + "type": "numeric(10, 4)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "source": { + "name": "source", + "type": "probability_source", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'manual'" + }, + "source_odds": { + "name": "source_odds", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "source_elo": { + "name": "source_elo", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "world_ranking": { + "name": "world_ranking", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "calculated_at": { + "name": "calculated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "participant_ev_participant_season_unique": { + "name": "participant_ev_participant_season_unique", + "columns": [ + { + "expression": "participant_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "sports_season_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "season_participant_expected_values_participant_id_season_participants_id_fk": { + "name": "season_participant_expected_values_participant_id_season_participants_id_fk", + "tableFrom": "season_participant_expected_values", + "tableTo": "season_participants", + "columnsFrom": [ + "participant_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "season_participant_expected_values_sports_season_id_sports_seasons_id_fk": { + "name": "season_participant_expected_values_sports_season_id_sports_seasons_id_fk", + "tableFrom": "season_participant_expected_values", + "tableTo": "sports_seasons", + "columnsFrom": [ + "sports_season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.season_participant_qualifying_totals": { + "name": "season_participant_qualifying_totals", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "participant_id": { + "name": "participant_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "sports_season_id": { + "name": "sports_season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "total_qualifying_points": { + "name": "total_qualifying_points", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "events_scored": { + "name": "events_scored", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "final_ranking": { + "name": "final_ranking", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "season_participant_qualifying_totals_participant_id_season_participants_id_fk": { + "name": "season_participant_qualifying_totals_participant_id_season_participants_id_fk", + "tableFrom": "season_participant_qualifying_totals", + "tableTo": "season_participants", + "columnsFrom": [ + "participant_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "season_participant_qualifying_totals_sports_season_id_sports_seasons_id_fk": { + "name": "season_participant_qualifying_totals_sports_season_id_sports_seasons_id_fk", + "tableFrom": "season_participant_qualifying_totals", + "tableTo": "sports_seasons", + "columnsFrom": [ + "sports_season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.season_participant_results": { + "name": "season_participant_results", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "participant_id": { + "name": "participant_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "sports_season_id": { + "name": "sports_season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "final_position": { + "name": "final_position", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "is_partial_score": { + "name": "is_partial_score", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "qualifying_points": { + "name": "qualifying_points", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "season_participant_results_participant_id_season_participants_id_fk": { + "name": "season_participant_results_participant_id_season_participants_id_fk", + "tableFrom": "season_participant_results", + "tableTo": "season_participants", + "columnsFrom": [ + "participant_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "season_participant_results_sports_season_id_sports_seasons_id_fk": { + "name": "season_participant_results_sports_season_id_sports_seasons_id_fk", + "tableFrom": "season_participant_results", + "tableTo": "sports_seasons", + "columnsFrom": [ + "sports_season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.season_participant_surface_elos": { + "name": "season_participant_surface_elos", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "participant_id": { + "name": "participant_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "sports_season_id": { + "name": "sports_season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "world_ranking": { + "name": "world_ranking", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "elo_hard": { + "name": "elo_hard", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "elo_clay": { + "name": "elo_clay", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "elo_grass": { + "name": "elo_grass", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "participant_surface_elos_unique": { + "name": "participant_surface_elos_unique", + "columns": [ + { + "expression": "participant_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "sports_season_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "season_participant_surface_elos_participant_id_season_participants_id_fk": { + "name": "season_participant_surface_elos_participant_id_season_participants_id_fk", + "tableFrom": "season_participant_surface_elos", + "tableTo": "season_participants", + "columnsFrom": [ + "participant_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "season_participant_surface_elos_sports_season_id_sports_seasons_id_fk": { + "name": "season_participant_surface_elos_sports_season_id_sports_seasons_id_fk", + "tableFrom": "season_participant_surface_elos", + "tableTo": "sports_seasons", + "columnsFrom": [ + "sports_season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.season_participants": { + "name": "season_participants", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "sports_season_id": { + "name": "sports_season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "short_name": { + "name": "short_name", + "type": "varchar(100)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "expected_value": { + "name": "expected_value", + "type": "numeric(10, 4)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "vorp_value": { + "name": "vorp_value", + "type": "numeric(10, 4)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "participants_sports_season_name_unique": { + "name": "participants_sports_season_name_unique", + "columns": [ + { + "expression": "sports_season_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "season_participants_sports_season_id_sports_seasons_id_fk": { + "name": "season_participants_sports_season_id_sports_seasons_id_fk", + "tableFrom": "season_participants", + "tableTo": "sports_seasons", + "columnsFrom": [ + "sports_season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.season_sports": { + "name": "season_sports", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "season_id": { + "name": "season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "sports_season_id": { + "name": "sports_season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "season_sports_season_id_seasons_id_fk": { + "name": "season_sports_season_id_seasons_id_fk", + "tableFrom": "season_sports", + "tableTo": "seasons", + "columnsFrom": [ + "season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "season_sports_sports_season_id_sports_seasons_id_fk": { + "name": "season_sports_sports_season_id_sports_seasons_id_fk", + "tableFrom": "season_sports", + "tableTo": "sports_seasons", + "columnsFrom": [ + "sports_season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.season_template_sports": { + "name": "season_template_sports", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "template_id": { + "name": "template_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "sports_season_id": { + "name": "sports_season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "season_template_sports_template_id_season_templates_id_fk": { + "name": "season_template_sports_template_id_season_templates_id_fk", + "tableFrom": "season_template_sports", + "tableTo": "season_templates", + "columnsFrom": [ + "template_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "season_template_sports_sports_season_id_sports_seasons_id_fk": { + "name": "season_template_sports_sports_season_id_sports_seasons_id_fk", + "tableFrom": "season_template_sports", + "tableTo": "sports_seasons", + "columnsFrom": [ + "sports_season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.season_templates": { + "name": "season_templates", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "year": { + "name": "year", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.seasons": { + "name": "seasons", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "league_id": { + "name": "league_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "year": { + "name": "year", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "season_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pre_draft'" + }, + "template_id": { + "name": "template_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "draft_rounds": { + "name": "draft_rounds", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 20 + }, + "flex_spots": { + "name": "flex_spots", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "draft_date_time": { + "name": "draft_date_time", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "draft_initial_time": { + "name": "draft_initial_time", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 120 + }, + "draft_increment_time": { + "name": "draft_increment_time", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 30 + }, + "draft_timer_mode": { + "name": "draft_timer_mode", + "type": "draft_timer_mode", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'chess_clock'" + }, + "current_pick_number": { + "name": "current_pick_number", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 1 + }, + "draft_started_at": { + "name": "draft_started_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "draft_completed_at": { + "name": "draft_completed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "draft_paused": { + "name": "draft_paused", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "overnight_pause_mode": { + "name": "overnight_pause_mode", + "type": "overnight_pause_mode", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "overnight_pause_start": { + "name": "overnight_pause_start", + "type": "varchar(5)", + "primaryKey": false, + "notNull": false + }, + "overnight_pause_end": { + "name": "overnight_pause_end", + "type": "varchar(5)", + "primaryKey": false, + "notNull": false + }, + "overnight_pause_timezone": { + "name": "overnight_pause_timezone", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false + }, + "invite_code": { + "name": "invite_code", + "type": "varchar(20)", + "primaryKey": false, + "notNull": true + }, + "points_for_1st": { + "name": "points_for_1st", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 100 + }, + "points_for_2nd": { + "name": "points_for_2nd", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 70 + }, + "points_for_3rd": { + "name": "points_for_3rd", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 50 + }, + "points_for_4th": { + "name": "points_for_4th", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 40 + }, + "points_for_5th": { + "name": "points_for_5th", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 25 + }, + "points_for_6th": { + "name": "points_for_6th", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 25 + }, + "points_for_7th": { + "name": "points_for_7th", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 15 + }, + "points_for_8th": { + "name": "points_for_8th", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 15 + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "seasons_league_id_leagues_id_fk": { + "name": "seasons_league_id_leagues_id_fk", + "tableFrom": "seasons", + "tableTo": "leagues", + "columnsFrom": [ + "league_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "seasons_template_id_season_templates_id_fk": { + "name": "seasons_template_id_season_templates_id_fk", + "tableFrom": "seasons", + "tableTo": "season_templates", + "columnsFrom": [ + "template_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "seasons_invite_code_unique": { + "name": "seasons_invite_code_unique", + "nullsNotDistinct": false, + "columns": [ + "invite_code" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "sessions_token_unique": { + "name": "sessions_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.sports": { + "name": "sports", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "sport_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "icon_url": { + "name": "icon_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "simulator_type": { + "name": "simulator_type", + "type": "simulator_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "sports_slug_unique": { + "name": "sports_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "slug" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.sports_seasons": { + "name": "sports_seasons", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "sport_id": { + "name": "sport_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "year": { + "name": "year", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "start_date": { + "name": "start_date", + "type": "date", + "primaryKey": false, + "notNull": false + }, + "end_date": { + "name": "end_date", + "type": "date", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "sports_season_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'upcoming'" + }, + "scoring_type": { + "name": "scoring_type", + "type": "scoring_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "scoring_pattern": { + "name": "scoring_pattern", + "type": "scoring_pattern", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "total_majors": { + "name": "total_majors", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "majors_completed": { + "name": "majors_completed", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "qualifying_points_finalized": { + "name": "qualifying_points_finalized", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "elo_calibration_exponent": { + "name": "elo_calibration_exponent", + "type": "numeric(3, 2)", + "primaryKey": false, + "notNull": false + }, + "elo_min_rating": { + "name": "elo_min_rating", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 1250 + }, + "elo_max_rating": { + "name": "elo_max_rating", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 1750 + }, + "simulation_status": { + "name": "simulation_status", + "type": "simulation_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "draft_on": { + "name": "draft_on", + "type": "date", + "primaryKey": false, + "notNull": true + }, + "draft_off": { + "name": "draft_off", + "type": "date", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "sports_seasons_sport_id_sports_id_fk": { + "name": "sports_seasons_sport_id_sports_id_fk", + "tableFrom": "sports_seasons", + "tableTo": "sports", + "columnsFrom": [ + "sport_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.team_ev_snapshots": { + "name": "team_ev_snapshots", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "team_id": { + "name": "team_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "season_id": { + "name": "season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "snapshot_date": { + "name": "snapshot_date", + "type": "date", + "primaryKey": false, + "notNull": true + }, + "projected_points": { + "name": "projected_points", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "actual_points": { + "name": "actual_points", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "team_ev_snapshots_unique": { + "name": "team_ev_snapshots_unique", + "columns": [ + { + "expression": "team_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "season_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "snapshot_date", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "team_ev_snapshots_team_id_teams_id_fk": { + "name": "team_ev_snapshots_team_id_teams_id_fk", + "tableFrom": "team_ev_snapshots", + "tableTo": "teams", + "columnsFrom": [ + "team_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "team_ev_snapshots_season_id_seasons_id_fk": { + "name": "team_ev_snapshots_season_id_seasons_id_fk", + "tableFrom": "team_ev_snapshots", + "tableTo": "seasons", + "columnsFrom": [ + "season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.team_score_events": { + "name": "team_score_events", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "team_id": { + "name": "team_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "season_id": { + "name": "season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "scoring_event_id": { + "name": "scoring_event_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "scoring_event_name": { + "name": "scoring_event_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "sport_name": { + "name": "sport_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "match_id": { + "name": "match_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "participant_ids": { + "name": "participant_ids", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "points_delta": { + "name": "points_delta", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true + }, + "occurred_at": { + "name": "occurred_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "team_score_events_match_unique": { + "name": "team_score_events_match_unique", + "columns": [ + { + "expression": "team_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "season_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "match_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "match_id IS NOT NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "team_score_events_event_unique": { + "name": "team_score_events_event_unique", + "columns": [ + { + "expression": "team_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "season_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "scoring_event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "match_id IS NULL", + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "team_score_events_team_id_teams_id_fk": { + "name": "team_score_events_team_id_teams_id_fk", + "tableFrom": "team_score_events", + "tableTo": "teams", + "columnsFrom": [ + "team_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "team_score_events_season_id_seasons_id_fk": { + "name": "team_score_events_season_id_seasons_id_fk", + "tableFrom": "team_score_events", + "tableTo": "seasons", + "columnsFrom": [ + "season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "team_score_events_scoring_event_id_scoring_events_id_fk": { + "name": "team_score_events_scoring_event_id_scoring_events_id_fk", + "tableFrom": "team_score_events", + "tableTo": "scoring_events", + "columnsFrom": [ + "scoring_event_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "team_score_events_match_id_playoff_matches_id_fk": { + "name": "team_score_events_match_id_playoff_matches_id_fk", + "tableFrom": "team_score_events", + "tableTo": "playoff_matches", + "columnsFrom": [ + "match_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.team_sport_scores": { + "name": "team_sport_scores", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "team_id": { + "name": "team_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "sports_season_id": { + "name": "sports_season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "total_points": { + "name": "total_points", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "participants_completed": { + "name": "participants_completed", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "participants_total": { + "name": "participants_total", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "calculated_at": { + "name": "calculated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "team_sport_scores_team_id_teams_id_fk": { + "name": "team_sport_scores_team_id_teams_id_fk", + "tableFrom": "team_sport_scores", + "tableTo": "teams", + "columnsFrom": [ + "team_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "team_sport_scores_sports_season_id_sports_seasons_id_fk": { + "name": "team_sport_scores_sports_season_id_sports_seasons_id_fk", + "tableFrom": "team_sport_scores", + "tableTo": "sports_seasons", + "columnsFrom": [ + "sports_season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.team_standings": { + "name": "team_standings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "team_id": { + "name": "team_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "season_id": { + "name": "season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "total_points": { + "name": "total_points", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "current_rank": { + "name": "current_rank", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "previous_rank": { + "name": "previous_rank", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "first_place_count": { + "name": "first_place_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "second_place_count": { + "name": "second_place_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "third_place_count": { + "name": "third_place_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "fourth_place_count": { + "name": "fourth_place_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "fifth_place_count": { + "name": "fifth_place_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "sixth_place_count": { + "name": "sixth_place_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "seventh_place_count": { + "name": "seventh_place_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "eighth_place_count": { + "name": "eighth_place_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "participants_remaining": { + "name": "participants_remaining", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "actual_points": { + "name": "actual_points", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "projected_points": { + "name": "projected_points", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "participants_finished": { + "name": "participants_finished", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "calculated_at": { + "name": "calculated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "team_standings_team_id_teams_id_fk": { + "name": "team_standings_team_id_teams_id_fk", + "tableFrom": "team_standings", + "tableTo": "teams", + "columnsFrom": [ + "team_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "team_standings_season_id_seasons_id_fk": { + "name": "team_standings_season_id_seasons_id_fk", + "tableFrom": "team_standings", + "tableTo": "seasons", + "columnsFrom": [ + "season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.team_standings_snapshots": { + "name": "team_standings_snapshots", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "team_id": { + "name": "team_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "season_id": { + "name": "season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "snapshot_date": { + "name": "snapshot_date", + "type": "date", + "primaryKey": false, + "notNull": true + }, + "total_points": { + "name": "total_points", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "rank": { + "name": "rank", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "first_place_count": { + "name": "first_place_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "second_place_count": { + "name": "second_place_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "third_place_count": { + "name": "third_place_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "fourth_place_count": { + "name": "fourth_place_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "fifth_place_count": { + "name": "fifth_place_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "sixth_place_count": { + "name": "sixth_place_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "seventh_place_count": { + "name": "seventh_place_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "eighth_place_count": { + "name": "eighth_place_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "participants_remaining": { + "name": "participants_remaining", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "actual_points": { + "name": "actual_points", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "projected_points": { + "name": "projected_points", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "participants_finished": { + "name": "participants_finished", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "team_standings_snapshots_unique": { + "name": "team_standings_snapshots_unique", + "columns": [ + { + "expression": "team_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "season_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "snapshot_date", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "team_standings_snapshots_team_id_teams_id_fk": { + "name": "team_standings_snapshots_team_id_teams_id_fk", + "tableFrom": "team_standings_snapshots", + "tableTo": "teams", + "columnsFrom": [ + "team_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "team_standings_snapshots_season_id_seasons_id_fk": { + "name": "team_standings_snapshots_season_id_seasons_id_fk", + "tableFrom": "team_standings_snapshots", + "tableTo": "seasons", + "columnsFrom": [ + "season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.teams": { + "name": "teams", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "season_id": { + "name": "season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "logo_url": { + "name": "logo_url", + "type": "varchar(512)", + "primaryKey": false, + "notNull": false + }, + "owner_id": { + "name": "owner_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "teams_season_id_seasons_id_fk": { + "name": "teams_season_id_seasons_id_fk", + "tableFrom": "teams", + "tableTo": "seasons", + "columnsFrom": [ + "season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.tournament_group_members": { + "name": "tournament_group_members", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "tournament_group_id": { + "name": "tournament_group_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "participant_id": { + "name": "participant_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "eliminated": { + "name": "eliminated", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "tournament_group_members_tournament_group_id_tournament_groups_id_fk": { + "name": "tournament_group_members_tournament_group_id_tournament_groups_id_fk", + "tableFrom": "tournament_group_members", + "tableTo": "tournament_groups", + "columnsFrom": [ + "tournament_group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "tournament_group_members_participant_id_season_participants_id_fk": { + "name": "tournament_group_members_participant_id_season_participants_id_fk", + "tableFrom": "tournament_group_members", + "tableTo": "season_participants", + "columnsFrom": [ + "participant_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.tournament_groups": { + "name": "tournament_groups", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "scoring_event_id": { + "name": "scoring_event_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "group_name": { + "name": "group_name", + "type": "varchar(10)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "tournament_groups_scoring_event_id_scoring_events_id_fk": { + "name": "tournament_groups_scoring_event_id_scoring_events_id_fk", + "tableFrom": "tournament_groups", + "tableTo": "scoring_events", + "columnsFrom": [ + "scoring_event_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "clerk_id": { + "name": "clerk_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "email_verified": { + "name": "email_verified", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "display_name": { + "name": "display_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(512)", + "primaryKey": false, + "notNull": false + }, + "is_admin": { + "name": "is_admin", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "timezone": { + "name": "timezone", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_clerk_id_unique": { + "name": "users_clerk_id_unique", + "nullsNotDistinct": false, + "columns": [ + "clerk_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.verifications": { + "name": "verifications", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.watchlist": { + "name": "watchlist", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "season_id": { + "name": "season_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "team_id": { + "name": "team_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "participant_id": { + "name": "participant_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "watchlist_season_team_participant_unique": { + "name": "watchlist_season_team_participant_unique", + "columns": [ + { + "expression": "season_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "team_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "participant_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "watchlist_season_id_seasons_id_fk": { + "name": "watchlist_season_id_seasons_id_fk", + "tableFrom": "watchlist", + "tableTo": "seasons", + "columnsFrom": [ + "season_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "watchlist_team_id_teams_id_fk": { + "name": "watchlist_team_id_teams_id_fk", + "tableFrom": "watchlist", + "tableTo": "teams", + "columnsFrom": [ + "team_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "watchlist_participant_id_season_participants_id_fk": { + "name": "watchlist_participant_id_season_participants_id_fk", + "tableFrom": "watchlist", + "tableTo": "season_participants", + "columnsFrom": [ + "participant_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.audit_action": { + "name": "audit_action", + "schema": "public", + "values": [ + "league_settings_changed", + "draft_settings_changed", + "scoring_rules_changed", + "sports_changed", + "draft_order_set", + "draft_order_randomized", + "draft_started", + "draft_paused", + "draft_resumed", + "draft_reset", + "draft_rollback", + "force_autopick", + "force_manual_pick", + "draft_pick_changed", + "time_bank_edited" + ] + }, + "public.autodraft_mode": { + "name": "autodraft_mode", + "schema": "public", + "values": [ + "next_pick", + "while_on" + ] + }, + "public.draft_timer_mode": { + "name": "draft_timer_mode", + "schema": "public", + "values": [ + "chess_clock", + "standard" + ] + }, + "public.event_type": { + "name": "event_type", + "schema": "public", + "values": [ + "playoff_game", + "major_tournament", + "final_standings", + "schedule_event" + ] + }, + "public.overnight_pause_mode": { + "name": "overnight_pause_mode", + "schema": "public", + "values": [ + "none", + "league", + "per_user" + ] + }, + "public.picked_by_type": { + "name": "picked_by_type", + "schema": "public", + "values": [ + "owner", + "commissioner", + "admin", + "auto" + ] + }, + "public.playoff_match_game_status": { + "name": "playoff_match_game_status", + "schema": "public", + "values": [ + "scheduled", + "complete", + "postponed" + ] + }, + "public.probability_source": { + "name": "probability_source", + "schema": "public", + "values": [ + "manual", + "futures_odds", + "elo_simulation", + "performance_model" + ] + }, + "public.scoring_pattern": { + "name": "scoring_pattern", + "schema": "public", + "values": [ + "playoff_bracket", + "season_standings", + "qualifying_points" + ] + }, + "public.scoring_type": { + "name": "scoring_type", + "schema": "public", + "values": [ + "playoffs", + "regular_season", + "majors" + ] + }, + "public.season_status": { + "name": "season_status", + "schema": "public", + "values": [ + "pre_draft", + "draft", + "active", + "completed" + ] + }, + "public.simulation_status": { + "name": "simulation_status", + "schema": "public", + "values": [ + "idle", + "running", + "failed" + ] + }, + "public.simulator_type": { + "name": "simulator_type", + "schema": "public", + "values": [ + "f1_standings", + "indycar_standings", + "golf_qualifying_points", + "playoff_bracket", + "ucl_bracket", + "ncaam_bracket", + "ncaaw_bracket", + "nba_bracket", + "nhl_bracket", + "nfl_bracket", + "afl_bracket", + "snooker_bracket", + "tennis_qualifying_points", + "mlb_bracket", + "wnba_bracket", + "world_cup", + "darts_bracket", + "cs2_major_qualifying_points", + "ncaa_football_bracket", + "llws_bracket" + ] + }, + "public.sport_type": { + "name": "sport_type", + "schema": "public", + "values": [ + "team", + "individual" + ] + }, + "public.sports_season_status": { + "name": "sports_season_status", + "schema": "public", + "values": [ + "upcoming", + "active", + "completed" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 1c532f4..c2b8e73 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -610,6 +610,13 @@ "when": 1777505810235, "tag": "0086_marvelous_infant_terrible", "breakpoints": true + }, + { + "idx": 87, + "version": "7", + "when": 1777661299612, + "tag": "0087_small_susan_delgado", + "breakpoints": true } ] } \ No newline at end of file From b5b60a60933d5815de0958470b513ab8b6c835b0 Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Fri, 1 May 2026 19:07:45 +0000 Subject: [PATCH 08/13] fix(tests): update mock query keys after participants table rename Change mock db.query.participants to db.query.seasonParticipants in test files to match the schema rename from commit 66145a9. This fixes "Cannot read properties of undefined (reading 'findFirst'/'findMany')" errors that occurred when production code queries db.query.seasonParticipants but test mocks only defined the old participants key. Files updated: - app/services/simulations/__tests__/world-cup-simulator.test.ts - app/routes/api/__tests__/draft.force-manual-pick.test.ts - app/routes/api/__tests__/draft.force-manual-pick.timer-mode.test.ts - app/routes/api/__tests__/draft.make-pick.timer-mode.test.ts - server/__tests__/timer-autodraft.test.ts - app/models/__tests__/team-score-events.test.ts Co-Authored-By: Claude Opus 4.7 --- app/models/__tests__/team-score-events.test.ts | 4 ++-- .../__tests__/draft.force-manual-pick.test.ts | 6 +++--- .../draft.force-manual-pick.timer-mode.test.ts | 2 +- .../draft.make-pick.timer-mode.test.ts | 2 +- .../__tests__/world-cup-simulator.test.ts | 18 +++++++++--------- server/__tests__/timer-autodraft.test.ts | 6 +++--- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/app/models/__tests__/team-score-events.test.ts b/app/models/__tests__/team-score-events.test.ts index 9caaf99..7f543e6 100644 --- a/app/models/__tests__/team-score-events.test.ts +++ b/app/models/__tests__/team-score-events.test.ts @@ -64,7 +64,7 @@ function makeDb(opts: MakeDbOpts = {}) { teamScoreEvents: { findMany: vi.fn().mockResolvedValue(scoreEventRows), }, - participants: { + seasonParticipants: { findMany: vi.fn().mockResolvedValue(participantRows), }, }, @@ -268,7 +268,7 @@ describe("getRecentTeamScoreEvents", () => { it("does not query participants when rows array is empty", async () => { const { db } = makeDb({ scoreEventRows: [] }); await getRecentTeamScoreEvents("season-1", 10, db); - expect(db.query.participants.findMany).not.toHaveBeenCalled(); + expect(db.query.seasonParticipants.findMany).not.toHaveBeenCalled(); }); it("returns mapped entries with resolved participant names", async () => { diff --git a/app/routes/api/__tests__/draft.force-manual-pick.test.ts b/app/routes/api/__tests__/draft.force-manual-pick.test.ts index e1ec753..bb905dd 100644 --- a/app/routes/api/__tests__/draft.force-manual-pick.test.ts +++ b/app/routes/api/__tests__/draft.force-manual-pick.test.ts @@ -159,7 +159,7 @@ describe("draft.force-manual-pick action", () => { seasons: { findFirst: vi.fn() }, commissioners: { findFirst: vi.fn() }, draftPicks: { findFirst: vi.fn() }, - participants: { findFirst: vi.fn() }, + seasonParticipants: { findFirst: vi.fn() }, draftSlots: { findMany: vi.fn() }, draftTimers: { findFirst: vi.fn() }, }, @@ -178,7 +178,7 @@ describe("draft.force-manual-pick action", () => { userId: COMMISSIONER_ID, }); mockDb.query.draftPicks.findFirst.mockResolvedValue(null); - mockDb.query.participants.findFirst.mockResolvedValue(mockParticipant); + mockDb.query.seasonParticipants.findFirst.mockResolvedValue(mockParticipant); mockDb.query.draftSlots.findMany.mockResolvedValue(mockDraftSlots); mockDb.query.draftTimers.findFirst.mockResolvedValue({ id: "timer-1", @@ -277,7 +277,7 @@ describe("draft.force-manual-pick action", () => { }); it("returns 404 when the participant does not exist", async () => { - mockDb.query.participants.findFirst.mockResolvedValue(null); + mockDb.query.seasonParticipants.findFirst.mockResolvedValue(null); const response = await action({ request: defaultPickRequest(), params: {}, context: ctx }); diff --git a/app/routes/api/__tests__/draft.force-manual-pick.timer-mode.test.ts b/app/routes/api/__tests__/draft.force-manual-pick.timer-mode.test.ts index e7f6620..4b8c869 100644 --- a/app/routes/api/__tests__/draft.force-manual-pick.timer-mode.test.ts +++ b/app/routes/api/__tests__/draft.force-manual-pick.timer-mode.test.ts @@ -163,7 +163,7 @@ describe("draft.force-manual-pick action — timer mode behavior", () => { findFirst: vi.fn().mockResolvedValue({ id: "c-1", userId: COMMISSIONER_ID }), }, draftPicks: { findFirst: vi.fn().mockResolvedValue(null) }, - participants: { findFirst: vi.fn().mockResolvedValue(mockParticipant) }, + seasonParticipants: { findFirst: vi.fn().mockResolvedValue(mockParticipant) }, draftSlots: { findMany: vi.fn().mockResolvedValue(mockDraftSlots) }, draftTimers: { findFirst: vi.fn().mockResolvedValue({ id: "timer-1", seasonId: SEASON_ID, teamId: TEAM_ID, timeRemaining: 75 }), diff --git a/app/routes/api/__tests__/draft.make-pick.timer-mode.test.ts b/app/routes/api/__tests__/draft.make-pick.timer-mode.test.ts index 0a9ffd4..16a112f 100644 --- a/app/routes/api/__tests__/draft.make-pick.timer-mode.test.ts +++ b/app/routes/api/__tests__/draft.make-pick.timer-mode.test.ts @@ -158,7 +158,7 @@ describe("draft.make-pick action — timer mode behavior", () => { seasons: { findFirst: vi.fn() }, commissioners: { findFirst: vi.fn().mockResolvedValue(null) }, draftPicks: { findFirst: vi.fn().mockResolvedValue(null) }, - participants: { findFirst: vi.fn().mockResolvedValue(mockParticipant) }, + seasonParticipants: { findFirst: vi.fn().mockResolvedValue(mockParticipant) }, draftSlots: { findMany: vi.fn().mockResolvedValue(mockDraftSlots) }, draftTimers: { findFirst: vi.fn().mockResolvedValue({ id: "timer-1", timeRemaining: 75 }) }, draftQueue: { findMany: vi.fn().mockResolvedValue([]) }, diff --git a/app/services/simulations/__tests__/world-cup-simulator.test.ts b/app/services/simulations/__tests__/world-cup-simulator.test.ts index 6fc3602..8760dfd 100644 --- a/app/services/simulations/__tests__/world-cup-simulator.test.ts +++ b/app/services/simulations/__tests__/world-cup-simulator.test.ts @@ -86,7 +86,7 @@ import { database } from "~/database/context"; const mockDb = { query: { - participants: { findMany: vi.fn() }, + seasonParticipants: { findMany: vi.fn() }, scoringEvents: { findFirst: vi.fn() }, tournamentGroups: { findMany: vi.fn() }, playoffMatches: { findMany: vi.fn() }, @@ -98,7 +98,7 @@ const mockDb = { beforeEach(() => { vi.mocked(database).mockReturnValue(mockDb as never); - mockDb.query.participants.findMany.mockReset(); + mockDb.query.seasonParticipants.findMany.mockReset(); mockDb.query.scoringEvents.findFirst.mockReset(); mockDb.query.tournamentGroups.findMany.mockReset(); mockDb.query.playoffMatches.findMany.mockReset(); @@ -109,7 +109,7 @@ beforeEach(() => { describe("WorldCupSimulator", () => { it("throws when no participants are found", async () => { - mockDb.query.participants.findMany.mockResolvedValue([]); + mockDb.query.seasonParticipants.findMany.mockResolvedValue([]); mockDb.query.scoringEvents.findFirst.mockResolvedValue(null); mockDb.query.tournamentGroups.findMany.mockResolvedValue([]); mockDb.query.playoffMatches.findMany.mockResolvedValue([]); @@ -120,7 +120,7 @@ describe("WorldCupSimulator", () => { it("returns one result per participant", async () => { const participants = makeParticipants(48); - mockDb.query.participants.findMany.mockResolvedValue(participants); + mockDb.query.seasonParticipants.findMany.mockResolvedValue(participants); mockDb.query.scoringEvents.findFirst.mockResolvedValue(null); mockDb.query.tournamentGroups.findMany.mockResolvedValue([]); mockDb.query.playoffMatches.findMany.mockResolvedValue([]); @@ -136,7 +136,7 @@ describe("WorldCupSimulator", () => { it("column sums for champion, runner-up, 3rd, 4th are each ≈1.0", async () => { const participants = makeParticipants(48); - mockDb.query.participants.findMany.mockResolvedValue(participants); + mockDb.query.seasonParticipants.findMany.mockResolvedValue(participants); mockDb.query.scoringEvents.findFirst.mockResolvedValue(null); mockDb.query.tournamentGroups.findMany.mockResolvedValue([]); mockDb.query.playoffMatches.findMany.mockResolvedValue([]); @@ -157,7 +157,7 @@ describe("WorldCupSimulator", () => { it("probabilities are all non-negative", async () => { const participants = makeParticipants(48); - mockDb.query.participants.findMany.mockResolvedValue(participants); + mockDb.query.seasonParticipants.findMany.mockResolvedValue(participants); mockDb.query.scoringEvents.findFirst.mockResolvedValue(null); mockDb.query.tournamentGroups.findMany.mockResolvedValue([]); mockDb.query.playoffMatches.findMany.mockResolvedValue([]); @@ -178,7 +178,7 @@ describe("WorldCupSimulator", () => { it("SF losers land in 3rd or 4th, never 1st or 2nd", async () => { // Set up 8 participants (small bracket, 2 groups of 4) const participants = makeParticipants(8); - mockDb.query.participants.findMany.mockResolvedValue(participants); + mockDb.query.seasonParticipants.findMany.mockResolvedValue(participants); mockDb.query.scoringEvents.findFirst.mockResolvedValue(null); mockDb.query.tournamentGroups.findMany.mockResolvedValue([]); mockDb.query.playoffMatches.findMany.mockResolvedValue([]); @@ -200,7 +200,7 @@ describe("WorldCupSimulator", () => { it("a team with pre-completed group stage result is fixed in simulation", async () => { const participants = makeParticipants(48); - mockDb.query.participants.findMany.mockResolvedValue(participants); + mockDb.query.seasonParticipants.findMany.mockResolvedValue(participants); mockDb.query.scoringEvents.findFirst.mockResolvedValue({ id: "event-1" }); // One group fully complete: p0 wins everything, p3 loses everything @@ -254,7 +254,7 @@ describe("WorldCupSimulator", () => { it("probFifth through probEighth are equal for each participant (QF losers split evenly)", async () => { const participants = makeParticipants(48); - mockDb.query.participants.findMany.mockResolvedValue(participants); + mockDb.query.seasonParticipants.findMany.mockResolvedValue(participants); mockDb.query.scoringEvents.findFirst.mockResolvedValue(null); mockDb.query.tournamentGroups.findMany.mockResolvedValue([]); mockDb.query.playoffMatches.findMany.mockResolvedValue([]); diff --git a/server/__tests__/timer-autodraft.test.ts b/server/__tests__/timer-autodraft.test.ts index afd66c2..9e6459a 100644 --- a/server/__tests__/timer-autodraft.test.ts +++ b/server/__tests__/timer-autodraft.test.ts @@ -31,7 +31,7 @@ beforeEach(() => { autodraftSettings: { findFirst: vi.fn() }, draftPicks: { findMany: vi.fn(), findFirst: vi.fn() }, draftQueue: { findMany: vi.fn() }, - participants: { findMany: vi.fn() }, + seasonParticipants: { findMany: vi.fn() }, seasonTemplateSports: { findMany: vi.fn() }, }, update: vi.fn().mockReturnThis(), @@ -146,7 +146,7 @@ describe('Timer Autodraft Integration', () => { it('should fall back to highest EV when queue is empty and queueOnly is OFF', async () => { mockDb.query.draftQueue.findMany.mockResolvedValue([]); - mockDb.query.participants.findMany.mockResolvedValue([ + mockDb.query.seasonParticipants.findMany.mockResolvedValue([ { id: 'participant-high-ev', name: 'High EV Participant', expectedValue: 1000 }, ]); @@ -154,7 +154,7 @@ describe('Timer Autodraft Integration', () => { expect(queueItems.length).toBe(0); const queueOnly = false; - const availableParticipants = await mockDb.query.participants.findMany(); + const availableParticipants = await mockDb.query.seasonParticipants.findMany(); const selectedParticipant = queueOnly ? null : availableParticipants[0]; expect(selectedParticipant).not.toBeNull(); expect(selectedParticipant?.expectedValue).toBe(1000); From 43304f4a8dbbe955eb5a1ba07d3bc1bc10134618 Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Fri, 1 May 2026 19:18:34 +0000 Subject: [PATCH 09/13] fix(tests): update remaining mock paths and keys after schema rename --- app/models/__tests__/auto-pick.test.ts | 14 +++++++------- app/models/__tests__/draft-pick.test.ts | 2 +- app/models/__tests__/executeAutoPick.timer.test.ts | 2 +- .../__tests__/participant-expected-value.test.ts | 4 ++-- app/models/__tests__/process-match-result.test.ts | 4 ++-- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/models/__tests__/auto-pick.test.ts b/app/models/__tests__/auto-pick.test.ts index b66fbe5..cba5bc8 100644 --- a/app/models/__tests__/auto-pick.test.ts +++ b/app/models/__tests__/auto-pick.test.ts @@ -8,7 +8,7 @@ vi.mock("~/models/draft-pick", () => ({ isParticipantDrafted: vi.fn(), })); -vi.mock("~/models/participant", () => ({ +vi.mock("~/models/season-participant", () => ({ getParticipantsForSeasonWithSports: vi.fn(), })); @@ -148,7 +148,7 @@ describe("autoPickForTeam – queueOnly constraint (AC2 & AC3)", () => { const mockDb = makeMockDb({ query: { - participants: { + seasonParticipants: { findMany: vi.fn().mockResolvedValue([ { id: "p-1", @@ -188,7 +188,7 @@ describe("autoPickForTeam – queueOnly constraint (AC2 & AC3)", () => { const mockWhere = vi.fn().mockResolvedValue(undefined); const mockDb = makeMockDb({ query: { - participants: { + seasonParticipants: { findMany: vi.fn().mockResolvedValue([ { id: "p-1", @@ -233,7 +233,7 @@ describe("autoPickForTeam – queueOnly constraint (AC2 & AC3)", () => { const mockWhere = vi.fn().mockResolvedValue(undefined); const mockDb = makeMockDb({ query: { - participants: { + seasonParticipants: { findMany: vi.fn().mockResolvedValue([ { id: "p-snooker", @@ -280,7 +280,7 @@ describe("autoPickForTeam – queueOnly constraint (AC2 & AC3)", () => { // 4. select().from(participants).where().orderBy() — participant query (chain) const mockDb = { query: { - participants: { + seasonParticipants: { findMany: vi.fn().mockResolvedValue([ { id: "p-snooker", @@ -330,7 +330,7 @@ describe("autoPickForTeam – queueOnly constraint (AC2 & AC3)", () => { const mockDb = makeMockDb({ query: { - participants: { + seasonParticipants: { findMany: vi.fn().mockResolvedValue([ { id: "p-1", @@ -373,7 +373,7 @@ describe("autoPickForTeam – queueOnly constraint (AC2 & AC3)", () => { const mockDb = makeMockDb({ query: { - participants: { + seasonParticipants: { findMany: vi.fn().mockResolvedValue([ { id: "p-1", diff --git a/app/models/__tests__/draft-pick.test.ts b/app/models/__tests__/draft-pick.test.ts index d6475a3..e335b11 100644 --- a/app/models/__tests__/draft-pick.test.ts +++ b/app/models/__tests__/draft-pick.test.ts @@ -45,7 +45,7 @@ function makeDb(opts: MakeDbOpts = {}) { scoringEvents: { findMany: vi.fn().mockResolvedValue(scoringEvents), }, - participantQualifyingTotals: { + seasonParticipantQualifyingTotals: { findMany: vi.fn().mockResolvedValue(qualifyingTotals), }, }, diff --git a/app/models/__tests__/executeAutoPick.timer.test.ts b/app/models/__tests__/executeAutoPick.timer.test.ts index 65b2516..593d8bf 100644 --- a/app/models/__tests__/executeAutoPick.timer.test.ts +++ b/app/models/__tests__/executeAutoPick.timer.test.ts @@ -21,7 +21,7 @@ vi.mock("~/models/draft-pick", () => ({ isParticipantDrafted: vi.fn(), })); -vi.mock("~/models/participant", () => ({ +vi.mock("~/models/season-participant", () => ({ getParticipantsForSeasonWithSports: vi.fn(), })); diff --git a/app/models/__tests__/participant-expected-value.test.ts b/app/models/__tests__/participant-expected-value.test.ts index 6f605a0..46b5569 100644 --- a/app/models/__tests__/participant-expected-value.test.ts +++ b/app/models/__tests__/participant-expected-value.test.ts @@ -25,8 +25,8 @@ vi.mock("~/database/context", () => ({ })); vi.mock("~/database/schema", () => ({ - participants: { id: "id" }, - participantExpectedValues: { + seasonParticipants: { id: "id" }, + seasonParticipantExpectedValues: { participantId: "participantId", sportsSeasonId: "sportsSeasonId", }, diff --git a/app/models/__tests__/process-match-result.test.ts b/app/models/__tests__/process-match-result.test.ts index 1112225..0d530b9 100644 --- a/app/models/__tests__/process-match-result.test.ts +++ b/app/models/__tests__/process-match-result.test.ts @@ -42,7 +42,7 @@ function makeDb(existingResult?: { id: string; isPartialScore: boolean }) { insert: vi.fn().mockReturnValue({ values: insertValues }), update: vi.fn().mockReturnValue({ set: updateSet }), query: { - participantResults: { findFirst }, + seasonParticipantResults: { findFirst }, seasonSports: { findMany: vi.fn().mockResolvedValue([]), // empty → standings loop exits immediately }, @@ -433,7 +433,7 @@ describe("processPlayoffEvent - NBA Play-In Round 1 loserAdvances fix", () => { participants: { findMany: vi.fn().mockResolvedValue([]), }, - participantResults: { + seasonParticipantResults: { findFirst: vi.fn().mockResolvedValue(undefined), }, seasons: { From 2c9fd6fe81d90603cf661a3d2234468cf4fe29de Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Fri, 1 May 2026 19:25:25 +0000 Subject: [PATCH 10/13] fix(tests): final two mock stragglers after schema rename MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - draft-pick.test.ts: assertion on db.query.participantQualifyingTotals - process-match-result.test.ts: mock key participants → seasonParticipants Co-Authored-By: Claude Opus 4.7 --- app/models/__tests__/draft-pick.test.ts | 2 +- app/models/__tests__/process-match-result.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/__tests__/draft-pick.test.ts b/app/models/__tests__/draft-pick.test.ts index e335b11..38930d7 100644 --- a/app/models/__tests__/draft-pick.test.ts +++ b/app/models/__tests__/draft-pick.test.ts @@ -220,6 +220,6 @@ describe("getDraftedParticipantsWithPoints", () => { await getDraftedParticipantsWithPoints("team-1", "season-1", db); - expect(db.query.participantQualifyingTotals.findMany).not.toHaveBeenCalled(); + expect(db.query.seasonParticipantQualifyingTotals.findMany).not.toHaveBeenCalled(); }); }); diff --git a/app/models/__tests__/process-match-result.test.ts b/app/models/__tests__/process-match-result.test.ts index 0d530b9..fdb5d6d 100644 --- a/app/models/__tests__/process-match-result.test.ts +++ b/app/models/__tests__/process-match-result.test.ts @@ -430,7 +430,7 @@ describe("processPlayoffEvent - NBA Play-In Round 1 loserAdvances fix", () => { playoffMatches: { findMany: vi.fn().mockResolvedValue(matches), }, - participants: { + seasonParticipants: { findMany: vi.fn().mockResolvedValue([]), }, seasonParticipantResults: { From 700b03775f0c164a48ae9580b384315947d70bdf Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Fri, 1 May 2026 19:40:40 +0000 Subject: [PATCH 11/13] chore: add post-phase1a baseline capture (temp, for diff verification) --- scripts/capture-baseline-post.ts | 110 +++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 scripts/capture-baseline-post.ts diff --git a/scripts/capture-baseline-post.ts b/scripts/capture-baseline-post.ts new file mode 100644 index 0000000..9b08818 --- /dev/null +++ b/scripts/capture-baseline-post.ts @@ -0,0 +1,110 @@ +/** + * Post-Phase-1a Baseline Capture - diff-only helper + * + * Queries the renamed tables and writes post-rename JSON fixtures. After running, + * diff these against test-fixtures/baselines/*-pre-phase1.json to verify the + * rename did not change any data. DO NOT COMMIT THIS FILE OR ITS OUTPUT. + * + * Usage: + * npx dotenv -- tsx scripts/capture-baseline-post.ts + */ + +import { drizzle } from "drizzle-orm/postgres-js"; +import postgres from "postgres"; +import { sql } from "drizzle-orm"; +import { writeFileSync, mkdirSync } from "fs"; +import { join } from "path"; +import * as schema from "../database/schema.js"; + +const OUT_DIR = join(process.cwd(), "test-fixtures", "baselines"); + +async function main() { + const dbUrl = process.env.DATABASE_URL; + if (!dbUrl) { + console.error("ERROR: DATABASE_URL is required"); + process.exit(1); + } + + console.log("Connecting to database..."); + const client = postgres(dbUrl, { max: 1 }); + const db = drizzle(client, { schema }); + + mkdirSync(OUT_DIR, { recursive: true }); + console.log(`Output directory: ${OUT_DIR}\n`); + + // ─── 1. season_participant_qualifying_totals ────────────────────────────────── + + console.log("Capturing season_participant_qualifying_totals..."); + const qpTotals = await db.execute(sql` + SELECT pqt.*, ss.id as sports_season_id, ss.name as sports_season_name, s.name as sport_name + FROM season_participant_qualifying_totals pqt + JOIN sports_seasons ss ON ss.id = pqt.sports_season_id + JOIN sports s ON s.id = ss.sport_id + WHERE ss.scoring_pattern = 'qualifying_points' + ORDER BY ss.id, pqt.participant_id + `); + + writeFileSync( + join(OUT_DIR, "qp-totals-post-phase1a.json"), + JSON.stringify(qpTotals, null, 2) + ); + console.log(` Wrote ${qpTotals.length} rows → qp-totals-post-phase1a.json`); + + // ─── 2. event_results with qualifying_points_awarded ───────────────────────── + + console.log("Capturing event_results with qualifying_points_awarded..."); + const eventResults = await db.execute(sql` + SELECT er.*, se.sports_season_id, se.name as event_name + FROM event_results er + JOIN scoring_events se ON se.id = er.scoring_event_id + JOIN sports_seasons ss ON ss.id = se.sports_season_id + WHERE ss.scoring_pattern = 'qualifying_points' + AND er.qualifying_points_awarded IS NOT NULL + ORDER BY se.sports_season_id, er.scoring_event_id, er.season_participant_id + `); + + writeFileSync( + join(OUT_DIR, "event-results-post-phase1a.json"), + JSON.stringify(eventResults, null, 2) + ); + console.log(` Wrote ${eventResults.length} rows → event-results-post-phase1a.json`); + + // ─── 3. season_participant_surface_elos ────────────────────────────────────── + + console.log("Capturing season_participant_surface_elos..."); + const surfaceElos = await db.execute(sql` + SELECT pse.*, ss.sport_id, ss.name as sports_season_name, s.name as sport_name + FROM season_participant_surface_elos pse + JOIN sports_seasons ss ON ss.id = pse.sports_season_id + JOIN sports s ON s.id = ss.sport_id + WHERE ss.scoring_pattern = 'qualifying_points' + ORDER BY ss.id, pse.participant_id + `); + + writeFileSync( + join(OUT_DIR, "surface-elos-post-phase1a.json"), + JSON.stringify(surfaceElos, null, 2) + ); + console.log(` Wrote ${surfaceElos.length} rows → surface-elos-post-phase1a.json`); + + console.log(`\n✓ Post-rename capture complete!`); + console.log(` ${qpTotals.length} QP totals`); + console.log(` ${eventResults.length} event results`); + console.log(` ${surfaceElos.length} surface elo rows`); + console.log(`\nNow diff against the pre-phase1 fixtures:`); + console.log(` diff <(jq -S . test-fixtures/baselines/qp-totals-pre-phase1.json) \\`); + console.log(` <(jq -S . test-fixtures/baselines/qp-totals-post-phase1a.json)`); + console.log(` diff <(jq -S . test-fixtures/baselines/surface-elos-pre-phase1.json) \\`); + console.log(` <(jq -S . test-fixtures/baselines/surface-elos-post-phase1a.json)`); + console.log(` diff <(jq -S 'map(del(.participant_id))' test-fixtures/baselines/event-results-pre-phase1.json) \\`); + console.log(` <(jq -S 'map(del(.season_participant_id))' test-fixtures/baselines/event-results-post-phase1a.json)`); + + await client.end(); +} + +main() + .then(() => process.exit(0)) + .catch((e) => { + console.error("FATAL:", e); + process.exit(1); + }); From 084fe65a513c4f70f6cd4eb8fd75f341013a662b Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Thu, 30 Apr 2026 23:09:24 -0700 Subject: [PATCH 12/13] chore: capture pre-migration baselines --- .../baselines/event-results-pre-phase1.json | 2628 +++++++++++++ .../baselines/qp-totals-pre-phase1.json | 189 + .../baselines/surface-elos-pre-phase1.json | 3304 +++++++++++++++++ 3 files changed, 6121 insertions(+) create mode 100644 test-fixtures/baselines/event-results-pre-phase1.json create mode 100644 test-fixtures/baselines/qp-totals-pre-phase1.json create mode 100644 test-fixtures/baselines/surface-elos-pre-phase1.json diff --git a/test-fixtures/baselines/event-results-pre-phase1.json b/test-fixtures/baselines/event-results-pre-phase1.json new file mode 100644 index 0000000..6563574 --- /dev/null +++ b/test-fixtures/baselines/event-results-pre-phase1.json @@ -0,0 +1,2628 @@ +[ + { + "id": "ae6c91db-5551-44d1-9c90-e96cf996e513", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "02ba4dec-1a60-40c3-8c50-0e3cb0309855", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "c5158a3f-81fc-4ed5-b7c4-6541fdd74f92", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "02be8a8d-3f15-4f92-a987-0dca294fb517", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "66bf95a0-4181-4f1a-ae08-8553c630e680", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "02e1cf49-cec2-44e2-83eb-f97c9bbfa519", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "e18d95e8-508f-4f90-82e1-dc8857418da7", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "040efc66-2988-4859-8a3d-231426c52dc9", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "c6d9b3e5-8ceb-4f80-8238-73f64007820a", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "088171f7-7d4a-418e-8df8-2a191fd08ce3", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "80f41c9c-0023-4bff-a8bf-0acb0d0802dc", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "08d9da4a-a5c0-4280-ac0e-9605bc39530e", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "ca9c2dc8-795a-4c4a-975c-12656eb63d43", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "0c38105a-1f1d-4a59-b273-8daa34e8fbc7", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "3bf77a5b-8b7b-495f-af41-965eb1736c37", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "0e06015e-372e-4468-9b7b-21bffa6bafb2", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "2de24f84-a98a-4fd8-ab4e-b05e633b6778", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "0e81ed97-a0e4-4e4e-992b-7be26d282749", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "868ec475-c664-4c1e-92bc-5771a4b4b5cd", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "0f6c722c-12e7-43e5-9bd5-4cd4142c257b", + "placement": 3, + "qualifying_points_awarded": "7.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:55:55.40218", + "updated_at": "2026-04-12 23:56:26.254", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "58650cc2-284c-4c0e-afed-44ed0dacd1ae", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "11411494-4af2-44fd-b777-ba3df89b01af", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "996d3386-ed75-44d9-9642-d20be467d007", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "1143e565-9db2-4f3b-8b50-0dcdd284c0aa", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "f73def1e-1c50-45a9-8245-dc941dffd17a", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "12043728-580d-4daf-b184-069f7923efa7", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "b62fcc4f-34f2-4c16-b963-9fdc52737fb4", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "14768445-ee56-45f2-87e1-8b86c089ea98", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "6542a494-c6f0-4f1f-9ca7-8c161bd1232b", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "1572246d-5038-4ba2-8faa-d6cd451fc6c8", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "c3857c87-093a-4173-b61f-5063b4672e90", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "15faa1db-b09d-47f6-af06-37ef03df4aec", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "cc86d6f0-2a52-47fb-8db0-3f46117a72cc", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "1656ab65-f667-4e74-8877-5465743ad87a", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "21e6a9c6-a70c-4843-8544-c9656e9ae041", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "19b94e16-3d7e-42fe-b411-f947f631975c", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "8a3fa7af-0ea5-4a6f-8f40-97929883b051", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "1a4e2d1f-8f82-44a1-886b-f9307d1326d2", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "34e08352-e07d-4fe8-b538-c22431cc6147", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "1c236161-43b3-4d2f-9cc0-e06dc1524714", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "76c0f0f8-c8ad-44bb-9cd4-236f032c9b51", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "1e528316-9b9f-47aa-9ad3-c853af04708b", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "0e2fbf1d-0acd-4410-ae44-d70d577604bb", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "20243f52-ddab-48ee-8d01-2ecd75dd0335", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "5f49571c-1ef8-4a77-8a7f-3601db7cc5ac", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "23fd7735-cafe-43bf-9602-48453e49f059", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "8ed26bbe-6cd1-46e7-a099-cabd47498a57", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "24f242b6-475e-4432-b945-e52bd5d4fb75", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "89a2b446-4282-4446-bb7d-ade2b69f55bc", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "25ddc3c7-3102-4970-b3b5-9812ae9bb243", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "92c40e27-f532-4f8c-9a41-0acbe068fae2", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "27262b53-9360-4b26-9a51-6d6a66fad148", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "7bfc4b6e-0279-469b-99bb-e3a8962b0497", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "28ace007-6a86-4960-97fd-c1ffab661c50", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "c22336cc-0929-4538-a8a2-013734de5277", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "29c64778-92ea-4450-905b-f6e7708d497b", + "placement": 3, + "qualifying_points_awarded": "7.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:55:55.40218", + "updated_at": "2026-04-12 23:56:26.258", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "529ad760-ab5e-487c-8ae4-95578f8d8499", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "2c67e2e9-7330-4c4c-89e6-1624d5762902", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "dcfe0b27-bec8-4aaf-a0cf-6ae429bb522e", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "308ebca3-8914-4427-a84c-78b28e52f967", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "708ce0a6-db40-4942-a90e-87a781ecbaa0", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "315dc804-fb3e-41cc-954b-250796009ae6", + "placement": 12, + "qualifying_points_awarded": "1.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:55:55.40218", + "updated_at": "2026-04-12 23:56:26.302", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "b301b8fb-7dff-4a20-a9fc-1a726436bd71", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "343ac2d4-e8c5-46f2-9b6f-1d6bb93bee18", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "274fe61a-c47d-41b9-a536-9589e4cb2b0c", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "3b57d9c5-a9bd-4ebc-9a3e-1ee802fe1fb9", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "a23f4dc1-9ea1-4436-ac53-abf1d7befeaa", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "3bba682a-2c84-4e4a-8edc-8e8b5abcd87c", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "9dce6fe2-85bf-412d-bc2f-529699a765a3", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "3c8e912c-3a67-472b-8122-6c15081bd137", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "26852e47-fc12-483f-b5e3-0c58a0c5e0d7", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "3e563e59-bd0c-45fc-a299-dfaad914e719", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "0d7598b4-bebb-4a8e-9570-2ceab0bfd529", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "3f098cf7-bb7d-4224-8069-1f32837122af", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "e1fa745b-b252-4100-b4fd-a38feba7864e", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "3f937a08-49a8-4425-a3cb-9805dfd5005e", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "83f3f7cf-663b-4aa7-82e5-ad3326cdb6d6", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "427aa43b-837e-4310-838a-0d5fc0093f07", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "65709119-d16f-4fd6-9e98-c9b6c0798497", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "4339f7d0-effb-40e8-a26f-061460f05b6b", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "68400d9d-4b04-46fc-8d02-df19a3441cff", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "43cc4a32-71df-4344-9694-d25d184cbbe3", + "placement": 3, + "qualifying_points_awarded": "7.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:55:55.40218", + "updated_at": "2026-04-12 23:56:26.252", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "40f66a9d-5802-4b85-9ce7-72611451bb16", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "48f9eadd-166c-4de2-9fa6-09c9c1a7d999", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "172f8d7d-32cd-493f-97f3-680e18c4fd4e", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "49b097bf-e74a-4e2d-b58f-7f180664e8d0", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "15dc0c51-4b89-4c6f-a711-95dceacd058c", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "4a0cd757-9dba-4531-b689-8150137895b4", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "e2024d1a-0525-434c-bd6c-e9a51b75452f", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "4ac44ebe-2f87-4cf2-8211-f64c8cf3ec0b", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "6be3c834-e601-48e7-a058-3f5eba234c24", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "4b6dfb84-77fd-4ecd-ab9b-618b103aabd5", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "af8e3637-3f99-4092-90e5-78c327ed017f", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "4c43b41b-bca4-4eda-abc0-7e5c286e408e", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "58204e9f-c023-462e-9d86-f1ad0121a06d", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "4f8a3834-88f9-4f13-bedb-a545e791305b", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "35a8fe5e-0a07-49a0-af88-12b7e22bcce4", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "4fbf532c-5f15-4a94-881e-be1a65243127", + "placement": 12, + "qualifying_points_awarded": "1.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:55:55.40218", + "updated_at": "2026-04-12 23:56:26.299", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "7e11944f-fcc7-48a5-8133-008380fdf25f", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "503f2ad3-c257-4641-9dd9-85cdd90ac579", + "placement": 9, + "qualifying_points_awarded": "2.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:55:55.40218", + "updated_at": "2026-04-12 23:56:26.273", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "9d9e0e5e-eac7-4b54-8d15-bb90874611be", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "50bb1c05-b8d7-4e51-9662-f6ff8da7081c", + "placement": 11, + "qualifying_points_awarded": "2.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:55:55.40218", + "updated_at": "2026-04-12 23:56:26.28", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "fa85fd6b-7fae-4533-8e41-c29ab21f372e", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "51573744-653f-43f7-80b2-899b675b8494", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "d3adb310-e2df-416c-85fa-b5007c976af9", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "53e3136e-cfd0-4fdc-89d3-160de46320eb", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "ccf924ec-1cea-4224-bd98-c0a2593be444", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "53f1c608-779b-4790-9493-b670caf4bcfd", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "81630014-08ce-4d70-b3eb-54607b7c267e", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "5544b23e-5dd4-4f5e-bac1-5df7c8c62e7d", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "0896cae0-f3c5-4756-baae-8e1e48ae9b55", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "5579cb9d-718b-4c8d-b0b4-7934ae70633c", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "9d15211c-991f-45c6-b239-9a96eeb11e2a", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "55af0711-2f2b-4f3f-b44e-ccfc0df2b169", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "ae002467-bd5c-4b80-adfc-d1ef3cb2e928", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "5724ca28-5064-495c-b67a-942d6121dee0", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "0546826a-2937-4f15-9563-ed93dbc13485", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "590a48e4-2ef3-42b7-90d3-a97805f02275", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "6fd6fd13-69bb-4c38-bddc-61f681b36622", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "5c55a90f-bec7-4bd4-b1f0-798377074740", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "b2aab2a7-636b-44e7-98cc-44c0878a6c5c", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "5f775b91-0d8b-4ebe-99f4-972805fea6e9", + "placement": 12, + "qualifying_points_awarded": "1.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:55:55.40218", + "updated_at": "2026-04-12 23:56:26.301", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "8e93508d-07be-42aa-81d3-b50bc1886937", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "5fd64316-8c29-4063-a7c5-d9358199c965", + "placement": 2, + "qualifying_points_awarded": "14.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:55:55.40218", + "updated_at": "2026-04-12 23:56:26.243", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "933271b2-7c90-44b8-9019-2193e81d58d3", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "60877575-5411-4b5b-899b-395f18e5fd91", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "ad45b1aa-f088-4cf1-b03c-706c03a6af2f", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "60ed0a4e-de2c-4818-ac0d-8778f51b896c", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "5966c7a5-3eac-4d0d-ad68-a67bbfb50c95", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "61699ea7-378e-4856-bcc8-e46892de67b7", + "placement": 7, + "qualifying_points_awarded": "3.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:55:55.40218", + "updated_at": "2026-04-12 23:56:26.264", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "79a751b7-9830-4f23-b673-9a379801075c", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "61d326da-cd2e-4fe7-90d8-a9f33a9f8517", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "56d1b9f8-21de-4963-89ed-f96248123a55", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "626c7ba3-4a20-41bf-88c7-ccf3dbf1e190", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "f166098e-8c6e-4983-8e30-ed28e53221ef", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "62823b9a-2b36-4927-901e-49c8b411e6e5", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "e19ba71c-4e11-4d47-be93-bfd6c37bb89e", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "637cda11-f908-41db-aee9-b7c0d1582d7f", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "7bf4f057-0cc4-441e-94b2-c326a305806e", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "65c97ade-ee8f-43be-a905-77f8e0136406", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "92f77175-33c0-46e7-951f-c91de19ad53c", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "67837764-039e-4286-ad7b-706ab4178f82", + "placement": 12, + "qualifying_points_awarded": "1.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:55:55.40218", + "updated_at": "2026-04-12 23:56:26.297", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "c0358754-abe0-40f9-bb9d-4a8d1e8434d2", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "68062b84-3851-46ae-91de-ecac9c02bd78", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "807e253f-50f7-4f07-b394-f183603776e5", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "6842bedc-ffc6-47d8-86b1-1ae1c43afc3b", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "f9751db8-e2f0-45b2-8de0-8faf6268088e", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "68f4b595-5287-4b68-9345-a797428779ab", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "6c1881a5-cf77-4e39-8b2f-049144a399e3", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "6977e162-3d78-44af-ab62-942e1f91eeef", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "b7cf2772-e110-43da-bec9-8a4bc76b48e0", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "69acc6b6-6e15-47ce-b7af-5c489bdf60d0", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "b766fe52-c692-4aab-8850-40fad6caf228", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "6a54670c-6b0f-4978-9a1c-8307f039c783", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "f1a899f3-cc92-47bd-ba98-74734f613055", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "6b5cac37-2255-495d-8d58-f8ab39c14557", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "7e7c610e-3538-47be-aa20-8793997b0307", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "6c0eb4eb-5956-43a5-a339-ada8c830fb26", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "de1c0922-2ea5-4467-aa54-ac62ac1cb9ad", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "6c1d054c-206a-4ade-9458-1e57958f822b", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "fb81bca1-afd3-423c-9025-149f3bd6d700", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "6c551c5f-05c6-46e7-814f-ae0930638274", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "a16abe63-90a5-497a-bfde-945613fa2975", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "6edb8b0f-7c34-465a-be20-115261216326", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "04af48c7-4c19-4c6b-a029-836cfdc51550", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "70165ef2-6446-45e4-ac41-1176819220b7", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "678413bd-0af1-4fdb-a8aa-f1c5fd9b8291", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "7023ec8c-06a8-4c0f-a34e-7ce807cb0781", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "c1607ab6-0851-41d8-a7b4-1a1ecf6ebe27", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "70687bc1-32ae-460d-a4cd-03fb73adf480", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "aac94bd8-3039-4375-967d-1f67e71c2ea8", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "70a25267-a7a0-4de5-9bc1-3c97c7c4052f", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "58e7fe37-2934-46c2-b93f-117040bc677a", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "71438cc1-223b-4876-857a-d523f1ad1db4", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "3e3104d6-fea0-432a-bfe7-6a60f8e097cd", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "720cc192-6c8c-4dc1-8b3e-4fb1d614b430", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "2a9ad994-94ee-4b6a-aff1-b22df0195a6f", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "72342e85-8ccc-487e-8fe1-33a4ebb47474", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "7a1cd6ae-25f4-46ac-8824-e28c277591fc", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "72c59821-3f7d-4986-a329-e5f0b0948f11", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "05453625-c002-490b-9285-0592c09fbbf3", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "7756331c-61e9-47f1-ab5a-d39eba28c2f6", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "03e65271-8882-43e8-8cff-e09998dc27f4", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "7917f1a4-9bc2-45f1-afca-f53b9453e4e8", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "fa1e72f5-908a-4827-8688-f2af71db6cb8", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "7fcf22cf-d729-47a3-a748-dde03e33c16a", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "9ac7193c-0609-4ebf-a61e-1b3779b11342", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "8180ddc4-ab37-4be2-8b6a-9d84c3066611", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "b0356185-e185-4eb3-b9a8-e8c3913214d4", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "8184f58f-e7a4-46ea-9397-8a39b1dab200", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "7c96a513-5ca8-4830-9497-bd775596a10b", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "81c9c16d-1c4f-4600-9e57-d63c48484375", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "0dc3883a-3e05-4143-8074-3b1bcdd057b5", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "821e99b1-5a94-49e6-b4ac-147b44bac6b1", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "3bb0f3c9-c379-4ad8-a81c-b0d6e5980787", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "825b7ca8-7ea5-444e-8b8d-e2fb2c902712", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "4232ccab-8872-44f6-bf56-32e90d32887d", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "829ad057-1426-4d73-b22d-06ab81e9c19b", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "a53cc0e0-dab2-4fe6-92b5-f431f7611fb4", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "8566e27c-aeb5-406c-805a-65abb586f891", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "6538fd4e-bef2-4aff-b731-d93372327f64", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "88fec408-eaa4-4b27-9690-0683ec611abd", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "cfc702ef-13f9-411a-9c9e-169685394299", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "8a9ba7d3-a4b2-43b2-858a-e4f5353365d5", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "077775bb-76ca-46ec-b8b6-df2625e774d3", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "8af9dfb0-0b54-48c3-9ffb-c647e3472008", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "171ada8e-a145-4b9c-bcb9-547283ea4248", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "8b9cb87d-0f9d-4173-835c-6ffc763c02be", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "5e1e53c0-309c-4587-8599-beae132645b4", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "8c1fc0ab-35aa-4bdd-8beb-0b5889e2217e", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "4280394e-1e35-4fce-863a-58f9efe9e3e5", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "8c5f54bf-7d3c-4e13-b626-ad0cea81b706", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "d237ea51-5525-4806-8a57-c9f2835dcff0", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "8de36ba4-bd96-43d7-98b1-8f58fe8873b1", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "ab2f5245-e7d9-40cd-9f4a-009f3c1e14cd", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "8fbc750f-57c0-4859-96f1-188711aeba49", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "4c2dde5b-5ccf-4b16-a8c7-d9ab49aa4119", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "9053d840-5336-48b3-ba5e-684e6ed77ba2", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "38516196-beb6-416b-ae39-fdfbeeca4b34", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "90eed6a1-a797-47e3-90e6-d6db368ab494", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "7855b05e-3665-4146-b788-08fd7b550674", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "92b7b4c1-eb4f-45b0-a8fa-384667e1eca4", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "d53a3987-90f6-4851-932e-6dadb6c40fe0", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "93d70f3f-ff0d-4290-8028-56749b766ea0", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "66a1e6ed-8484-4c43-9b34-aef1463495e2", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "9506b2ed-e81e-427c-a059-5fa8976bed8f", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "6a988d37-7eaf-470d-9a47-b3fff14ae741", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "956840a1-8540-4fef-b991-6f9c59911241", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "84cfdb9a-c0bb-4874-bee8-efbe765cb1f9", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "96b73830-f4ca-4b84-a8f1-1810b70834e4", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "ed5f1ff9-8c52-4da7-b084-8def4c417bdc", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "9981987c-7873-4e78-964b-036c7be879e6", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "2d3a6a72-66d0-4105-9365-24506adf61dd", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "9b393810-8f29-45fa-bb1d-21841a752426", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "8903a0f8-e470-4b89-bfd5-1997e8614922", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "9b68ab68-dd0b-4fb2-b246-a4f41699cd9e", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "338a35d7-f869-4511-a177-fd721026576f", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "9d83349f-138b-4c87-8752-8b337ab1aa18", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "62e95716-77ce-4723-8552-09fc5d7b17b5", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "a032b837-acf4-481b-9b4d-278d419fa659", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "da29c297-5971-4a8a-8ac8-63c8ca17cb32", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "a22abc3c-d9ad-47ae-af39-0f7836a085ed", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "d749ae6f-6eab-46e6-8436-02d256d3a3f3", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "a351dbd3-c87c-4b67-9031-925e9831002b", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "6c17a2d5-0efc-4e0b-84a7-5f0ec8a00115", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "a3bb32ae-5235-435c-84a9-cb1b3e20a6bc", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "ae25f711-053f-42bc-89ab-c8c3e8cf07d0", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "a42025e6-c9e5-4382-92ba-a3c999bbc13e", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "fafa622e-6ee6-483a-beba-a10c86f67baf", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "a56a5507-0474-4be6-9bec-c69e7cd1e506", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "c76e4494-aa7a-433d-a96a-ce1158092f3d", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "a81c6e15-70ff-4095-9ca9-4b3c3c26a7ca", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "b577fecb-118a-47d9-9657-840d826781ae", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "a8dc49fd-436b-436d-91a4-840fe387ddd8", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "add09ad6-5e4b-4565-87db-0f1b858f1725", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "ab02e8b5-4f0e-459c-a026-d5ca21a01a20", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "bcc52e85-077c-4167-8f72-a86edb583c1d", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "ab4e7ef1-5caa-4fac-93d3-688291a2a7e2", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "8cc23626-79ce-4d8c-82dd-1d6e7695aa4b", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "ac61be02-5678-4f52-9d7c-4b7e361cb8b5", + "placement": 9, + "qualifying_points_awarded": "2.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:55:55.40218", + "updated_at": "2026-04-12 23:56:26.275", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "6da05f8f-9ec3-4943-ac39-3ae1b52c8b0d", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "ae3886ac-5803-4efb-acbc-8e601d9acc35", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "7cea7a31-ff5d-48c0-a0b2-418f539410a7", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "af00ca8a-9316-403f-b8fa-63a418094566", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "faa7f194-38a6-4f57-b2a3-7f13b02e1c85", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "af1bd272-3fe0-4a42-8f39-e817e537633d", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "0f1dc17e-17c8-486e-95f2-0bf18636a66f", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "b09fc038-d143-440e-ac77-07dc36e807c5", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "1d29d942-a450-4aef-abca-e4eb6568d5f4", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "b391090e-c00a-4eaf-81a1-3efef564606f", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "7cbbfac8-5309-48ca-91b2-da3eaded16a1", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "b3f30f9a-4e99-4a35-8804-ea545c8f107a", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "ac598752-22f0-4e63-bf04-055975135f6d", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "b54ed900-0d7b-44db-9071-56608831201c", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "3d3da387-068e-4894-96ef-8cdc4102c899", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "b60bbb1d-6cf5-411f-bc42-07fd0bbff6e0", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "8530c8e7-2fab-4c0e-8593-809094f578ce", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "b77cffc1-596a-46d6-97c0-b71263b466f3", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "bf900a7c-b1e6-45b4-8288-e038a21dbaa0", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "b860494f-63bb-44ea-bb6f-dc3362e10129", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "e498fdc2-4e2c-4793-804e-608b8eeefe4d", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "b8b7d3e8-7e07-4024-9317-fa68df83c11c", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "203b19f3-3cd2-40a1-bad1-94eefc6d0d4c", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "be25a47f-7436-4ed2-920f-adda6a6e1a30", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "01bf9624-c7f5-4075-8134-07986bcfe5c1", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "be9e0e40-07e1-4fb6-921b-ba3e54bd010c", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "761be577-d069-4f6d-be86-48a5e67bb20f", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "c0a0a950-5418-4c75-be05-3c80d547de26", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "1521b054-a415-4c28-99a2-05c1c6475104", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "c252fe33-bf96-4ce6-b771-d7a23bdcc680", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "d80eebb4-9a71-441c-a664-4129b3d60a0a", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "c341b05b-9e9f-4b89-95fc-c0fb96dd07a3", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "4f0e09ec-90e9-4f5a-9402-a87ce2df8f7c", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "c43dad18-9034-4013-a8a7-617e5717de2a", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "6775a9ef-7190-4dd0-913c-7cdedbe67f59", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "c4b89829-363c-4319-8e8b-3b45c8976f4f", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "f516180f-9be7-4579-a989-fb20597ab036", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "c4ec4a2d-1a00-4fed-b9aa-ae0d7e34e285", + "placement": 7, + "qualifying_points_awarded": "3.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:55:55.40218", + "updated_at": "2026-04-12 23:56:26.266", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "b1cfd378-ed07-42b6-a1b3-0971a54a65fd", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "c698b147-9a5f-4753-b43c-20488d5761f5", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "c24502cb-f3c4-43cf-a17c-45730dc9b7c4", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "c8d8ccf7-f626-44b5-a69a-dc3f676c2d76", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "848abf72-5d94-4be7-9625-ef73ddc57118", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "c93fbc7b-32b9-416e-b023-5e4af244528a", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "fa719bcb-95d5-4a1a-b17d-095889326a92", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "caa72fde-1f3a-4424-b2bc-1d4de2e99dfa", + "placement": 12, + "qualifying_points_awarded": "1.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:55:55.40218", + "updated_at": "2026-04-12 23:56:26.304", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "679a4ea7-a28b-4b57-a400-72d8658519ea", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "cd1fd72f-9bcf-4e84-b9c5-08a7ed37b55a", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "c010f119-cac7-4585-8d23-f30e7bddb49e", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "cf9196f2-b3e4-4f70-8bf2-6b275e4d065a", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "c54fc8b7-4e14-43b1-a4d0-f84085de72d4", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "d1be69a5-4f13-422f-9390-0d27fdd71977", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "eccddbbb-7b7b-42df-b270-93ad2448637d", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "d1c70aa4-dfd2-4c0b-a8e8-c7fafdf84188", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "975a7bd8-d118-4e7d-b987-f4b06a66ed78", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "d3b4b616-c75d-4fc3-b168-937c124b2a89", + "placement": 12, + "qualifying_points_awarded": "1.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:55:55.40218", + "updated_at": "2026-04-12 23:56:26.295", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "95267967-0919-4b00-ac7e-9b67e86dbdeb", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "d3efdc12-74a8-4f86-bebc-35bcb9869fc4", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "bb3409fc-34cf-4c1a-9020-583e2f47067d", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "d4b2c1f9-e0e4-41f8-9d6c-83b090c69382", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "0bf3269a-b098-4475-8e21-39f808c8b1da", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "d698bd2c-0015-447c-a645-0ede3b9bc065", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "9869bea3-509b-4dc0-b31f-eb53d83d1a22", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "d6bf6e2c-7c9e-4ba9-be79-aeaf96398812", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "89c804f9-f95d-4281-8e21-bf042b6a89fa", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "d80c655b-5508-4037-8471-6cfa37e627a3", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "8c480331-28ee-4d2c-9c7c-3f00b221de5f", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "d8203700-a9b2-4792-bc0b-d7e14b4c976a", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "81f2ca02-5fc4-4aee-9743-6122f00f5305", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "d82884a0-03d9-4827-989d-bebd7186aa1e", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "037f24e7-0ff2-4152-9147-40f1cf79fcd5", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "d994767c-2f75-4e41-adb1-0ad8e2987a9c", + "placement": 3, + "qualifying_points_awarded": "7.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:55:55.40218", + "updated_at": "2026-04-12 23:56:26.256", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "609512b5-abfc-4c77-97e9-ad3971dbb88f", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "da539efa-7806-43f7-8fc6-e9b90e4babf0", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "24ff0ee2-7400-494c-b1d9-3ae9baa946d2", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "dbd52f45-296f-47ec-a508-5fe00ce454ed", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "b7753062-550b-453e-bf54-167e74fd29e0", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "dcea531f-5d2d-4898-9556-3454d209dc76", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "58c7be2c-6ba3-4a13-bb1e-8dfa4de1dec3", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "de43916e-8749-4539-aee3-39db893f28ea", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "7ebf4fff-3977-4d06-a164-46828123d91a", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "de767e94-a15c-4a1b-a20d-f4c2e47cb66e", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "cf36bab6-3894-41fb-9f12-c6851cfdcdce", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "df77487f-f8fe-4ae5-973e-444e24786137", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "5094b3dc-37a8-4c1d-bc36-672c0ba6e0c9", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "e3c1036d-2623-4e9a-b5d2-0fbc29a76175", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "2862aefd-487c-42b1-8d1f-602c757555f6", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "e437d5f4-6d6d-404e-8c5e-2fefd9b01097", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "19be3a1d-372d-42f3-9466-7b36f921c37e", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "e4b7b36b-3adf-4530-bbea-6eb220187926", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "59ef4519-e268-44f6-9089-68c6e5153077", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "e5684627-e4da-4cc4-9a1d-ce5943997ed9", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "7301249b-a92e-4054-bfea-f3eff6b33e51", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "e586aaae-b931-4520-b9ba-6563c2b2a581", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "a3370ca7-33f0-4a20-8800-48cbf7952d2c", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "e5e3022c-12c0-4b78-8a36-625c2b9fac90", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "e2deac30-6657-432a-b12c-bd9601e61f69", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "e6a720f8-4294-4fb6-b572-b098a466e3ac", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "56d0a3be-616e-4cb1-b862-9b02f7274a8f", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "e958fed5-4d48-4d33-bda6-12ccbf620f71", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "955d456c-ae90-4426-8431-6ded7130ff85", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "eb13d155-6992-462b-bb20-1648dd37bf3d", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "9a90f290-2612-4f79-b367-551733f43791", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "eb822bc3-5356-49fb-9ce1-2fcdac9f287d", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "e11ab91a-7d62-4bb9-9eaa-bc1c28db3082", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "ecf4bf8d-6dc7-4404-87e7-69bf2819fa9b", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "7f0cb418-28a6-445e-ac8e-c150bf89bc0c", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "ed0ed0bc-7d9c-49cd-9ec4-c0edb314fbe6", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "a9e59bab-3245-459d-afc6-e26410fc97c5", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "eea601d4-2bda-4e7d-aaad-2f91c0e0e65d", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "70a5c006-66d6-4a8d-9893-4fd5d1972228", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "eeeef1e6-76d9-4cec-83d5-39ea4ec75bf9", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "901ee3af-539e-4735-b7ea-7e45d6f73358", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "ef4c9ef3-e0a4-47e1-aa63-bcd96761d0f1", + "placement": 1, + "qualifying_points_awarded": "20.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:55:55.40218", + "updated_at": "2026-04-12 23:56:26.238", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "2c96e021-6940-4bd7-a3c6-b11bddf217a8", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "ef721746-0631-4c0b-8101-1d896a71d2bc", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "c4f9a244-806b-4c92-93a2-91b77fe33cd4", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "efaae324-5159-4016-a338-590279eddeba", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "e1f7a508-3282-4861-8f62-f3ca1df2846e", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "efce972a-355f-492a-9c6e-050cf86f51d2", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "d58fbe1a-31d1-4f61-86fc-b177cf3b5dee", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "f02b7a93-e882-4de6-9ca1-90b6d86649bc", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "ec02c90c-ec19-4650-8ff1-4144df665b2f", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "f13844b8-091c-4187-9b3c-ba796c9b36fc", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "2601e7cd-b6b6-4d31-87c1-9df04b0cabf3", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "f1a1068f-8cb0-4a68-9a53-560aa796989f", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "9cbd94c7-89b8-49e6-ad70-539b11d4cdfa", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "f2c2e252-f1e5-433d-9689-1063886c7f37", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "ebc62365-155e-4d08-b8b5-b6d5a944ddb4", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "f53fbdc1-48be-4e36-8eda-bf23325c85c1", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "3db1aeb9-3bcd-4b07-8bf1-95230a01779b", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "f5d6ea35-8757-4fc2-a9c3-c32c659cd4e6", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "26571087-4bdb-4856-bb05-13b4da212235", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "f5dcc812-e54f-4fb2-807d-cfb4275b635d", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "f5ad6f59-a6b4-4a29-a38e-db41a76e5386", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "f92f7d62-04e6-4db4-9ea7-4b87e646ccc4", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "71edce13-4c6e-4a07-a75f-6704c1cf8061", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "f9494640-4cd4-44ec-8731-0bb35dad131b", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "60e69461-bb7b-41d4-a223-8960cfa65d7a", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "fb89179b-40f2-4bcf-b235-7c03eab208c3", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "2d1dc5fc-a849-444f-ad8c-e58624b42e3c", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "fddd7435-fcfb-42c5-bb60-9864518b1f49", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + }, + { + "id": "6a67ead3-3065-4389-8be2-d98a6e4fa936", + "scoring_event_id": "34a13ba8-b0e9-4580-af72-368ad19f5a58", + "participant_id": "ff2ebb81-6d9f-4a19-9eaa-0909059f7c54", + "placement": null, + "qualifying_points_awarded": "0.00", + "eliminated": null, + "raw_score": null, + "created_at": "2026-04-12 23:56:26.519516", + "updated_at": "2026-04-12 23:56:26.519516", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "event_name": "The Masters" + } +] \ No newline at end of file diff --git a/test-fixtures/baselines/qp-totals-pre-phase1.json b/test-fixtures/baselines/qp-totals-pre-phase1.json new file mode 100644 index 0000000..ec8e97c --- /dev/null +++ b/test-fixtures/baselines/qp-totals-pre-phase1.json @@ -0,0 +1,189 @@ +[ + { + "id": "11ddd8e1-66cb-4452-a3ec-b83b34d269c8", + "participant_id": "0f6c722c-12e7-43e5-9bd5-4cd4142c257b", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "total_qualifying_points": "7.00", + "events_scored": 1, + "final_ranking": null, + "updated_at": "2026-04-12 23:56:26.344", + "sports_season_name": "2026", + "sport_name": "PGA Golf" + }, + { + "id": "3b2cffcc-75fa-442b-867d-64fe137e2b33", + "participant_id": "29c64778-92ea-4450-905b-f6e7708d497b", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "total_qualifying_points": "7.00", + "events_scored": 1, + "final_ranking": null, + "updated_at": "2026-04-12 23:56:26.367", + "sports_season_name": "2026", + "sport_name": "PGA Golf" + }, + { + "id": "051b4eed-454d-4cb4-b77b-35ce725cfb07", + "participant_id": "315dc804-fb3e-41cc-954b-250796009ae6", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "total_qualifying_points": "1.00", + "events_scored": 1, + "final_ranking": null, + "updated_at": "2026-04-12 23:56:26.478", + "sports_season_name": "2026", + "sport_name": "PGA Golf" + }, + { + "id": "7fc4ad10-f6fc-4e7c-a7b1-2aa24c0fb9f1", + "participant_id": "43cc4a32-71df-4344-9694-d25d184cbbe3", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "total_qualifying_points": "7.00", + "events_scored": 1, + "final_ranking": null, + "updated_at": "2026-04-12 23:56:26.334", + "sports_season_name": "2026", + "sport_name": "PGA Golf" + }, + { + "id": "d50afaeb-3967-4332-80b3-8e4a320299db", + "participant_id": "4fbf532c-5f15-4a94-881e-be1a65243127", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "total_qualifying_points": "1.00", + "events_scored": 1, + "final_ranking": null, + "updated_at": "2026-04-12 23:56:26.455", + "sports_season_name": "2026", + "sport_name": "PGA Golf" + }, + { + "id": "7544c4fc-5716-4353-b024-8e883fe8e274", + "participant_id": "503f2ad3-c257-4641-9dd9-85cdd90ac579", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "total_qualifying_points": "2.00", + "events_scored": 1, + "final_ranking": null, + "updated_at": "2026-04-12 23:56:26.395", + "sports_season_name": "2026", + "sport_name": "PGA Golf" + }, + { + "id": "7aaf119b-4f81-4239-a04a-6f83d15e79ce", + "participant_id": "50bb1c05-b8d7-4e51-9662-f6ff8da7081c", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "total_qualifying_points": "2.00", + "events_scored": 1, + "final_ranking": null, + "updated_at": "2026-04-12 23:56:26.42", + "sports_season_name": "2026", + "sport_name": "PGA Golf" + }, + { + "id": "1fb5fa25-ffce-47b4-bdfa-3d7f0d107063", + "participant_id": "5f775b91-0d8b-4ebe-99f4-972805fea6e9", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "total_qualifying_points": "1.00", + "events_scored": 1, + "final_ranking": null, + "updated_at": "2026-04-12 23:56:26.467", + "sports_season_name": "2026", + "sport_name": "PGA Golf" + }, + { + "id": "3bcac779-4c57-4c93-a1e9-165af8d14133", + "participant_id": "5fd64316-8c29-4063-a7c5-d9358199c965", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "total_qualifying_points": "14.00", + "events_scored": 1, + "final_ranking": null, + "updated_at": "2026-04-12 23:56:26.325", + "sports_season_name": "2026", + "sport_name": "PGA Golf" + }, + { + "id": "7f2f88c3-33f8-4a94-82a2-7a64f35877e5", + "participant_id": "61699ea7-378e-4856-bcc8-e46892de67b7", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "total_qualifying_points": "3.00", + "events_scored": 1, + "final_ranking": null, + "updated_at": "2026-04-12 23:56:26.377", + "sports_season_name": "2026", + "sport_name": "PGA Golf" + }, + { + "id": "48939189-8fa7-4089-9a2e-40405e9bccce", + "participant_id": "67837764-039e-4286-ad7b-706ab4178f82", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "total_qualifying_points": "1.00", + "events_scored": 1, + "final_ranking": null, + "updated_at": "2026-04-12 23:56:26.443", + "sports_season_name": "2026", + "sport_name": "PGA Golf" + }, + { + "id": "46d77a18-8e65-478c-ab85-be034135f681", + "participant_id": "ac61be02-5678-4f52-9d7c-4b7e361cb8b5", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "total_qualifying_points": "2.00", + "events_scored": 1, + "final_ranking": null, + "updated_at": "2026-04-12 23:56:26.409", + "sports_season_name": "2026", + "sport_name": "PGA Golf" + }, + { + "id": "4eb84497-b02b-46b8-8230-c3f32c1c21ad", + "participant_id": "c4ec4a2d-1a00-4fed-b9aa-ae0d7e34e285", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "total_qualifying_points": "3.00", + "events_scored": 1, + "final_ranking": null, + "updated_at": "2026-04-12 23:56:26.386", + "sports_season_name": "2026", + "sport_name": "PGA Golf" + }, + { + "id": "7b194daa-7dd7-4c1a-b5db-539c7f8cd7f6", + "participant_id": "caa72fde-1f3a-4424-b2bc-1d4de2e99dfa", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "total_qualifying_points": "1.00", + "events_scored": 1, + "final_ranking": null, + "updated_at": "2026-04-12 23:56:26.487", + "sports_season_name": "2026", + "sport_name": "PGA Golf" + }, + { + "id": "caa8e800-e4c6-462c-ad43-47cf0b0d6625", + "participant_id": "d3b4b616-c75d-4fc3-b168-937c124b2a89", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "total_qualifying_points": "1.00", + "events_scored": 1, + "final_ranking": null, + "updated_at": "2026-04-12 23:56:26.433", + "sports_season_name": "2026", + "sport_name": "PGA Golf" + }, + { + "id": "9aa38372-5c10-41a3-bc6a-171af32f6226", + "participant_id": "d994767c-2f75-4e41-adb1-0ad8e2987a9c", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "total_qualifying_points": "7.00", + "events_scored": 1, + "final_ranking": null, + "updated_at": "2026-04-12 23:56:26.358", + "sports_season_name": "2026", + "sport_name": "PGA Golf" + }, + { + "id": "96d6f154-5e76-442c-ae2d-f8af5ac6cd7c", + "participant_id": "ef4c9ef3-e0a4-47e1-aa63-bcd96761d0f1", + "sports_season_id": "23448e84-6f06-4a7a-b398-6bf67ba2b5da", + "total_qualifying_points": "20.00", + "events_scored": 1, + "final_ranking": null, + "updated_at": "2026-04-12 23:56:26.316", + "sports_season_name": "2026", + "sport_name": "PGA Golf" + } +] \ No newline at end of file diff --git a/test-fixtures/baselines/surface-elos-pre-phase1.json b/test-fixtures/baselines/surface-elos-pre-phase1.json new file mode 100644 index 0000000..47b1877 --- /dev/null +++ b/test-fixtures/baselines/surface-elos-pre-phase1.json @@ -0,0 +1,3304 @@ +[ + { + "id": "41730ceb-3c2c-4357-b092-9a74447f845f", + "participant_id": "01c4970f-d994-4def-a56b-049f60d7fb4a", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1623, + "elo_clay": 1562, + "elo_grass": 1591, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 131, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "ca2b17a1-df72-4246-bd4e-d3a02005483c", + "participant_id": "02e0f2de-22b1-4804-95c3-e52a447d8e31", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1741, + "elo_clay": 1704, + "elo_grass": 1660, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 53, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "c765476d-c971-4c28-8ef1-49bc2964a741", + "participant_id": "0497f0be-4720-4d96-bccf-8ec0acb150d1", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1796, + "elo_clay": 1715, + "elo_grass": 1612, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 39, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "53a9f976-41d0-4097-9946-d13b1537bf10", + "participant_id": "063905f6-fcfd-4785-be33-2903ba7b5b40", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1909, + "elo_clay": 1984, + "elo_grass": 1856, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 10, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "b53a226c-5de9-49b3-ad58-6a7658ee7183", + "participant_id": "06d65207-ea7e-4c95-8bc6-a852549efdb5", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 2052, + "elo_clay": 2002, + "elo_grass": 1955, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 3, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "445bf100-7348-46dc-a6f5-c85f37da8ba6", + "participant_id": "0a130b69-05f1-4a02-bb59-122a8f4c42b2", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1853, + "elo_clay": 1856, + "elo_grass": 1798, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 21, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "30e4aaf8-97ac-4e34-938c-f84cd7ce2244", + "participant_id": "0cccf18a-38bf-4eea-b45b-da52d19674cd", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 2217, + "elo_clay": 2225, + "elo_grass": 2148, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 1, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "47f4c057-e461-428d-b93c-2c66e392019e", + "participant_id": "0e90b5b7-4ea5-44eb-b8dd-67eee35089d7", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1729, + "elo_clay": 1766, + "elo_grass": 1699, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 50, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "95b0036a-f99c-4f1e-8339-203fe6949d4d", + "participant_id": "107da01b-79c1-48d0-b45a-deb2029d1598", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1696, + "elo_clay": 1708, + "elo_grass": 1605, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 78, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "ef78c575-e74a-4d78-96b5-6395c6632e7a", + "participant_id": "110281fc-90d0-4dad-8128-a544e4b46f2e", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1952, + "elo_clay": 1864, + "elo_grass": 1814, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 8, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "94babfe0-0cbb-48d7-8df8-1e74dda6978f", + "participant_id": "12d694de-bdc4-4db9-94fd-c81253ae96fa", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1698, + "elo_clay": 1710, + "elo_grass": 1690, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 66, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "4145d5a3-0c1c-4892-a2fe-43a2bccf750e", + "participant_id": "15518d22-94e0-4982-895f-44dccf333437", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1652, + "elo_clay": 1653, + "elo_grass": 1628, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 107, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "26be7e81-4076-4225-b844-2fc2529973b7", + "participant_id": "156cd839-81b4-4c14-aafe-e382b10d9765", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1716, + "elo_clay": 1547, + "elo_grass": 1727, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 64, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "a8ae0891-3225-40fc-a2a1-dc3f0ada4b26", + "participant_id": "1b2e7679-9f61-4bec-842f-0ec52c1f7b0e", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1772, + "elo_clay": 1596, + "elo_grass": 1637, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 46, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "8119cbfa-5510-4fe9-8aa3-e4725d8540d8", + "participant_id": "1dd75ad9-5376-436c-83e3-f8946502acc9", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1445, + "elo_clay": 1605, + "elo_grass": 1433, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 175, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "df1c542a-d95b-48f4-a3f8-d869aa34b013", + "participant_id": "1e4b897a-37f6-4738-a9b7-467205a93389", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1643, + "elo_clay": 1647, + "elo_grass": 1551, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 124, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "f24b0403-3ade-498d-b558-0401b41ed5f4", + "participant_id": "20093de3-076c-4d0d-adae-dcf85825b02b", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1872, + "elo_clay": 1939, + "elo_grass": 1690, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 16, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "1d837aae-3707-4d20-8efa-862d09857339", + "participant_id": "236a3b18-9b66-4c80-a34c-3b4e46a2b844", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1636, + "elo_clay": 1565, + "elo_grass": 1497, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 130, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "5ef6b403-4a80-4be5-92c0-c11b5b2529c8", + "participant_id": "2829e6a2-a835-4792-aa28-9e127a337227", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1607, + "elo_clay": 1686, + "elo_grass": 1462, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 115, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "3d489cbb-7641-4839-857e-1b5b7d739528", + "participant_id": "282b480d-3321-461d-91cf-8b9a32b31c8e", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1656, + "elo_clay": 1517, + "elo_grass": 1671, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 104, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "a6385d00-ad18-4a7e-a34c-10850302e483", + "participant_id": "28a1278c-adb5-4609-9b75-d32ffd1683a2", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1548, + "elo_clay": 1643, + "elo_grass": 1436, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 148, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "7c800c2c-5c54-4e8e-a10d-791a338bbd1e", + "participant_id": "2954b93c-2873-4db5-aecc-27e5cbb2e0b5", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1873, + "elo_clay": 1781, + "elo_grass": 1790, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 17, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "21d5d724-caf0-443d-b35a-515464c245b4", + "participant_id": "2988c7c2-b24c-4b79-be62-c2f4a76c2f23", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1469, + "elo_clay": 1664, + "elo_grass": 1531, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 191, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "26752f82-c976-4099-9947-b4f3ec39cf98", + "participant_id": "2bb9b159-b5a4-4578-b9cf-877f82a3036b", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1995, + "elo_clay": 1930, + "elo_grass": 1894, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 5, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "13a96580-b8d0-4a5b-8933-bf33cd1132d1", + "participant_id": "2d5e2965-edd2-4df0-aff7-e9c91e7f7d3f", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1733, + "elo_clay": 1693, + "elo_grass": 1646, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 63, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "ec766aa7-f34a-4b4f-8cec-5372aca032cf", + "participant_id": "30492aec-c167-41fd-a0a9-6bf3bd03d582", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1711, + "elo_clay": 1747, + "elo_grass": 1642, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 61, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "421df817-fbc4-4691-98fd-66fbadc5db0f", + "participant_id": "309b687b-febd-4b2d-af82-f2a69b556ac4", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1858, + "elo_clay": 1821, + "elo_grass": 1730, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 20, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "20d6d500-4dcc-45a9-aac9-4930e9d47f75", + "participant_id": "32c6a2ad-8284-480d-bd2e-9f3be5509c78", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1706, + "elo_clay": 1712, + "elo_grass": 1663, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 70, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "a896c7c9-ae2f-435a-b9a3-263aa1762321", + "participant_id": "34ed4f56-7756-41be-848f-5801ae7f9df6", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1605, + "elo_clay": 1724, + "elo_grass": 1473, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 97, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "16f6ebb8-403e-4776-a364-87acfe76b748", + "participant_id": "35cf4877-f69a-4f54-a53a-f5c94b1e2a02", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1703, + "elo_clay": 1753, + "elo_grass": 1576, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 74, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "a0e3705b-e45d-44de-bf19-131d09d7dc78", + "participant_id": "360c8e54-ab90-459d-b211-afe9285bb00c", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1755, + "elo_clay": 1759, + "elo_grass": 1643, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 58, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "4be90561-f5cb-4b73-8ad6-f742fc70dca2", + "participant_id": "369c082e-808d-40fd-be6b-48debfc73494", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1795, + "elo_clay": 1733, + "elo_grass": 1742, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 34, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "1f44f04d-caac-48dc-a241-c5d05a06ceab", + "participant_id": "3828753f-daf7-4aeb-be44-0a6666f5a5d0", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 2017, + "elo_clay": 2003, + "elo_grass": 1885, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 4, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "77aff0ef-0cd7-4873-ae0e-d827d62c043a", + "participant_id": "3f2cbf7f-4379-4adf-be04-754aac333af7", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1734, + "elo_clay": 1744, + "elo_grass": 1559, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 59, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "1d4510a7-90b6-4586-8b8c-3a988a09c207", + "participant_id": "40eb5507-e1e3-4d81-98d6-6c4076768b43", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1538, + "elo_clay": 1631, + "elo_grass": 1586, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 150, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "44696c2f-4257-4120-b802-eb231b4feb73", + "participant_id": "4440793d-4bcc-4679-9e6e-5150872a74e1", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1652, + "elo_clay": 1692, + "elo_grass": 1632, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 100, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "c98b127d-fdef-4fe3-baaf-357b32a66941", + "participant_id": "453680a5-cacc-4623-8c87-d6c5eb5dad4b", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1732, + "elo_clay": 1635, + "elo_grass": 1629, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 67, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "cacfe348-3fa2-4a7d-8611-177e6a8afc66", + "participant_id": "45df5b55-d2b7-47f3-9eef-6c58deeed8b3", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1793, + "elo_clay": 1816, + "elo_grass": 1737, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 32, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "a68a4fe6-d880-4d6c-b53f-114c65fe2d1f", + "participant_id": "465416d9-7b71-4722-b9de-3af4aba19802", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1685, + "elo_clay": 1543, + "elo_grass": 1701, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 89, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "b110d0f9-2e94-4114-8291-773bc4746f0d", + "participant_id": "465a2f40-e224-4029-ab72-4eff6f4ac2e9", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1835, + "elo_clay": 1780, + "elo_grass": 1776, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 22, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "dd9a23c5-c7da-4784-bac7-52476f50a687", + "participant_id": "49629a27-3ec5-47cc-af4e-24d20893d45f", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1564, + "elo_clay": 1622, + "elo_grass": 1493, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 156, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "814bce53-93b7-49b1-94e8-bb2a3b7563f0", + "participant_id": "4c93ba6b-3ee2-4d19-b35a-77c4a610b9a5", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 2238, + "elo_clay": 2150, + "elo_grass": 2071, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 2, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "41a4bf2e-a147-44e3-8c05-40378ead327c", + "participant_id": "510593de-893b-41d3-ab2d-7c189524c5c3", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1812, + "elo_clay": 1792, + "elo_grass": 1788, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 27, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "4dea9a3e-8248-4ca4-8fef-3a7d1dc4a954", + "participant_id": "5292e7ae-7435-41b3-b7f4-ba2095b3d7a5", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1587, + "elo_clay": 1694, + "elo_grass": 1625, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 119, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "04eaf702-b2bd-4ee1-ba47-927b00a585cf", + "participant_id": "590d3bee-bdf4-4ec8-a58d-a68542165575", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1820, + "elo_clay": 1795, + "elo_grass": 1731, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 28, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "572db7a0-48b5-4552-b4fc-7fc39ca61fd8", + "participant_id": "59d7609c-34f0-402d-91e8-a0ce78bd90bb", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1684, + "elo_clay": 1511, + "elo_grass": 1620, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 94, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "e01c12e7-f269-4de5-bff1-cc81259b629f", + "participant_id": "59f33ac4-38ab-496f-92a8-06f059f0878a", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1606, + "elo_clay": 1644, + "elo_grass": 1575, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 127, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "927f980f-f8b5-45cc-bdcf-399a199c365a", + "participant_id": "5a7fde0f-5c0e-4cfe-a3d8-94d67eedd6b4", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1622, + "elo_clay": 1571, + "elo_grass": 1471, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 142, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "cc01619f-1533-4254-bc16-114e03e8caa1", + "participant_id": "5b2d9193-8ca5-4737-9e8e-d3abd3fffad5", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1659, + "elo_clay": 1696, + "elo_grass": 1593, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 95, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "f08555f9-b822-49d9-b7ab-7f967ad74d9b", + "participant_id": "5d438ff1-514f-4e03-9d44-b6f15cb01da7", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1851, + "elo_clay": 1843, + "elo_grass": 1750, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 19, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "edab67cc-ec44-4cee-87a2-60ed843faac1", + "participant_id": "5eb98a02-73d7-454c-9c7e-6ad8df15eb72", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1594, + "elo_clay": 1645, + "elo_grass": 1536, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 143, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "6482eff3-6bcc-4d80-9237-8dffa5bbfd61", + "participant_id": "614ab3e9-5b00-4873-8ccf-202bc7ebddec", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1682, + "elo_clay": 1673, + "elo_grass": 1650, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 83, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "3fceee04-35cf-487e-bac9-09b1e291130e", + "participant_id": "61ad8701-1913-44bc-b7b8-53e7d7b4c7ee", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1685, + "elo_clay": 1744, + "elo_grass": 1614, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 82, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "e118ee08-7e8b-4004-87e7-ceb2224f2827", + "participant_id": "642fd020-0000-42ea-931c-826facb0513c", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1755, + "elo_clay": 1607, + "elo_grass": 1597, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 54, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "22cb6969-d3fc-4125-ae3c-31e43552f8f5", + "participant_id": "6a5f9830-d690-4d94-b0e3-49f2cfc83853", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1758, + "elo_clay": 1727, + "elo_grass": 1600, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 52, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "dd80ecce-06b1-4bf1-bb36-53857c130f3e", + "participant_id": "6cf40aa2-6423-41ac-ae82-769e15fb31af", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1770, + "elo_clay": 1738, + "elo_grass": 1644, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 45, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "3f870d8b-3660-4319-8178-f72d51a714a7", + "participant_id": "6e92a362-0a14-4b7b-9f03-26ef611686f8", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1613, + "elo_clay": 1638, + "elo_grass": 1614, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 123, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "47a45cde-ab65-44f2-9937-271228c43116", + "participant_id": "6f337676-8ada-4698-80ba-ee3a22b754cf", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1731, + "elo_clay": 1692, + "elo_grass": 1681, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 60, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "de058706-987f-4a45-bfa9-ba44965e60ab", + "participant_id": "6fa537c0-7bf3-4b38-9113-7e0320447ff8", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1690, + "elo_clay": 1725, + "elo_grass": 1573, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 71, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "a90d3498-cc16-4b1d-aaab-f880d01c43f5", + "participant_id": "70d4ac9a-0fba-4e17-8a08-3cd92906590b", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1729, + "elo_clay": 1741, + "elo_grass": 1713, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 56, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "7cc832ca-65dd-494f-9552-d7c8337f2f72", + "participant_id": "75e72cea-e640-454e-add3-c38526892e7f", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1653, + "elo_clay": 1541, + "elo_grass": 1601, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 112, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "4a607f34-2970-4394-b345-59dc3989a52c", + "participant_id": "7683dfdc-3f54-4337-a94d-217c622f8cf6", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1632, + "elo_clay": 1512, + "elo_grass": 1507, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 135, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "0bc4a0fe-9ca1-4230-8b88-c4eb35e17c5e", + "participant_id": "77d01c2b-bb8e-499e-8455-bb55f33b8db2", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1832, + "elo_clay": 1739, + "elo_grass": 1702, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 29, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "6a3dc94a-4dc1-43d7-a9d8-0d5be45b3197", + "participant_id": "79774a1f-3cb7-4ab0-9398-a74e3ca623f8", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1724, + "elo_clay": 1619, + "elo_grass": 1650, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 69, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "6a4375c0-7f1e-4a70-b046-f468b4940dca", + "participant_id": "7b07f1c6-9413-45a5-9b3a-38c31d1c55d9", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1699, + "elo_clay": 1717, + "elo_grass": 1715, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 68, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "bc33eb43-e213-4ed5-bcb7-d1e7e9b200c8", + "participant_id": "7ba57f1c-5374-4b22-89a8-0f5428000de7", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1646, + "elo_clay": 1482, + "elo_grass": 1541, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 113, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "8f593b43-989d-46f9-a170-0af64865c54a", + "participant_id": "7c5ad0b6-3060-4dd1-a200-b17f01691646", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1707, + "elo_clay": 1697, + "elo_grass": 1638, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 72, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "c561c2c6-4d8e-40af-b1d4-840801525d94", + "participant_id": "80e02d36-009d-4204-bdd8-0fabfc9fc260", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1732, + "elo_clay": 1724, + "elo_grass": 1726, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 57, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "d953d443-ac92-45ac-9e09-dec15ca00a32", + "participant_id": "855d7b68-1a0d-44b1-9972-37910fe331ba", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1489, + "elo_clay": 1632, + "elo_grass": 1474, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 170, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "480fdefe-5cec-4363-be9d-e6f5fc6e80a1", + "participant_id": "89e6f58a-44e3-4650-bf87-f065fbcc4f11", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1825, + "elo_clay": 1718, + "elo_grass": 1583, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 30, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "635daec5-4ba4-43c7-bc51-aeeec2cce012", + "participant_id": "8a076567-557b-44dc-916e-77686211b286", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1661, + "elo_clay": 1600, + "elo_grass": 1516, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 105, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "11830e76-3fcb-455c-83f5-182ec60d3ba2", + "participant_id": "8bdc7dc7-5762-4a81-a2b7-c4bb1f838d7f", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1874, + "elo_clay": 1900, + "elo_grass": 1845, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 14, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "bab0356d-3233-414d-a53c-9406f13dec6d", + "participant_id": "8deda678-87a3-4d7d-81fd-df13abc0b1c3", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1779, + "elo_clay": 1737, + "elo_grass": 1684, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 44, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "2534876f-e9ac-4046-9690-9964df607ae7", + "participant_id": "8e705165-aa7f-4a1f-b4e3-05f5eaf3b683", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1715, + "elo_clay": 1706, + "elo_grass": 1569, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 79, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "a5a0aee9-cda3-4f15-a735-e14d9147120c", + "participant_id": "9025a1db-13f0-4940-8fc7-55a91ffb41dc", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1926, + "elo_clay": 1874, + "elo_grass": 1916, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 9, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "656395ba-b64b-4412-a549-9aebce22a1ea", + "participant_id": "91378272-6b5e-42c5-9345-e0946573e9be", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1699, + "elo_clay": 1619, + "elo_grass": 1565, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 91, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "4d6501ea-c16d-482e-b6a9-6144ac1a3488", + "participant_id": "91a6f194-a1b4-4bf2-99c7-042dcd772ca5", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1542, + "elo_clay": 1354, + "elo_grass": 1577, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 194, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "4962e0e8-b063-4baa-b370-bc3b68f7ae1f", + "participant_id": "9402358d-1094-4e63-b81e-2ef02186731b", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1668, + "elo_clay": 1721, + "elo_grass": 1549, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 85, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "734efa59-42a1-4666-be41-76e4c5a0b84c", + "participant_id": "95c72dc7-ae2d-4c07-9b22-0aa775503971", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1837, + "elo_clay": 1858, + "elo_grass": 1664, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 23, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "09000a57-8bc5-4e20-8245-cd7620307d82", + "participant_id": "95e34528-dbf5-412f-8af1-ae6c61a0060f", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1595, + "elo_clay": 1661, + "elo_grass": 1591, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 145, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "9af52fa6-d668-4ce9-8593-07c7c5c30521", + "participant_id": "9bbd7ffd-f1db-4901-86a0-f59533193296", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1638, + "elo_clay": 1676, + "elo_grass": 1539, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 109, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "728ebd6f-422d-4a58-a108-be5421b140ab", + "participant_id": "9e950439-56a7-4334-a69d-23a7c8162381", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1682, + "elo_clay": 1837, + "elo_grass": 1611, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 43, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "b165792e-74ed-485e-a62b-9f093640d212", + "participant_id": "a0b85b75-455f-4dd4-98f9-c3e32726f697", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1577, + "elo_clay": 1678, + "elo_grass": 1506, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 141, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "212371ff-8b43-4dc3-8c39-ed6d71cf2803", + "participant_id": "a199c7a2-aa68-46f0-bfe9-a183a88f215c", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1795, + "elo_clay": 1659, + "elo_grass": 1601, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 38, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "a8e3212a-71b5-481c-a322-d18128c40c63", + "participant_id": "a223250e-7ecd-4b3f-94bf-c431c28bb6f2", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1788, + "elo_clay": 1790, + "elo_grass": 1735, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 40, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "7f974148-c02d-4c22-a124-402421ebebad", + "participant_id": "a44a47ec-a158-4940-9987-df199f21d6f4", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1758, + "elo_clay": 1720, + "elo_grass": 1652, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 48, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "fc8af7cc-e791-4e27-b2db-4054d1131f96", + "participant_id": "a5f0e394-8ee3-40ed-8715-e6e27de98e99", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1841, + "elo_clay": 1729, + "elo_grass": 1717, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 26, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "4a0d8de5-6df8-4a5c-9d03-d64e4a32415a", + "participant_id": "a610ef27-c011-4fbb-a442-a1bc049899de", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1750, + "elo_clay": 1687, + "elo_grass": 1659, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 55, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "1c2161af-b989-4691-9bd5-5415b7df0a6a", + "participant_id": "a9de7f5e-ada3-4d99-bc16-0fed13db5cdb", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1639, + "elo_clay": 1727, + "elo_grass": 1529, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 88, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "da98ae69-ec2e-42f9-af64-cf18e50dd2c5", + "participant_id": "ad02a102-f401-46de-9dcf-b4068453eb07", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1523, + "elo_clay": 1658, + "elo_grass": 1544, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 138, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "bb2d5a1c-2db4-40f1-bfca-03bc9279ddd6", + "participant_id": "ae5b6f03-ebf7-4be2-8523-853fb25a3f29", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1733, + "elo_clay": 1605, + "elo_grass": 1709, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 62, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "4785f188-bb17-40f5-ab4a-b3e2a4df9cd2", + "participant_id": "af2ea35d-b285-4e7c-92cd-57bc5129d178", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1960, + "elo_clay": 1870, + "elo_grass": 1801, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 7, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "1e63b5ae-0e7a-44d2-85d4-e85fb25d2708", + "participant_id": "b0bbeb31-311b-4238-8a11-7f48d471af96", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1628, + "elo_clay": 1645, + "elo_grass": 1483, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 120, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "41771777-ac5b-46e6-9f03-776e95510c63", + "participant_id": "b0fee53d-61d8-4002-9ac9-7ca0071d2e9e", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1905, + "elo_clay": 1800, + "elo_grass": 1731, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 15, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "349b66d2-e2cc-4043-ab55-36b83dabf3e6", + "participant_id": "b1ad7594-6477-473f-bd63-8da9967395bb", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1905, + "elo_clay": 1785, + "elo_grass": 1697, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 18, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "cce6ce52-6502-455b-9615-0bc2d52d3590", + "participant_id": "b21f255b-0154-451b-8d1f-60972d2409d8", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1589, + "elo_clay": 1465, + "elo_grass": 1482, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 163, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "42a079ef-92e6-47a6-b45f-affa97c15e97", + "participant_id": "b3154db7-b04f-473e-b147-1d89a286922c", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1502, + "elo_clay": 1696, + "elo_grass": 1602, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 101, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "fc01fc12-53b0-439f-83fa-0cd9ed365f15", + "participant_id": "b35bfc64-18a3-4f03-bf85-a81525ae439b", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1599, + "elo_clay": 1723, + "elo_grass": 1543, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 81, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "3bba1246-25aa-4c90-b072-53f4440751d4", + "participant_id": "b5ed0f0e-97a9-40f0-b2cb-180ef1854b2d", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1374, + "elo_clay": 1583, + "elo_grass": 1411, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 198, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "2236285f-16e2-4cdb-9c7b-667f0d3c84df", + "participant_id": "b614d73e-e473-4af3-9832-c7e6563f7683", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1934, + "elo_clay": 1638, + "elo_grass": 1728, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 11, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "d379fafd-e467-40cc-ac03-a97cedd3507b", + "participant_id": "bc17bca8-6b9e-4b3c-8e8e-4f0f8993c700", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1800, + "elo_clay": 1670, + "elo_grass": 1718, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 33, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "8a318472-8146-485f-ae08-1e0ba23ac48c", + "participant_id": "c13dd0dc-cca3-493a-b036-135a36f55a97", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1641, + "elo_clay": 1531, + "elo_grass": 1602, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 121, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "44793a69-1c9a-4083-b33a-ac7c0776b391", + "participant_id": "c37f8718-1834-4c92-99bf-a70e3dbeded9", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1713, + "elo_clay": 1706, + "elo_grass": 1610, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 73, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "4e236b9a-7feb-42c5-910e-4afd22d98b88", + "participant_id": "c578afb3-db9c-4fb9-85b8-756286cc1961", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1602, + "elo_clay": 1624, + "elo_grass": 1554, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 137, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "0e176f28-f55e-4cf3-82ed-3513916ee393", + "participant_id": "c6650f43-b7e0-4130-bf84-7a963d1af62f", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1903, + "elo_clay": 1884, + "elo_grass": 1764, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 13, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "58ed4951-0a3f-40d6-a68d-ab14be806f32", + "participant_id": "c6b33ce5-6f4b-4851-a3ea-946056f7b611", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1758, + "elo_clay": 1755, + "elo_grass": 1728, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 41, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "740f264d-a7f9-4b48-8c9a-1fd4139eb263", + "participant_id": "c6d7a7da-0602-497f-9366-02adbb022195", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1804, + "elo_clay": 1828, + "elo_grass": 1760, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 25, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "d7e4f6a0-1d3a-4828-9321-5cd40c8ad9e2", + "participant_id": "cab6721f-e124-42c1-b4ca-cb1008d8a251", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1803, + "elo_clay": 1896, + "elo_grass": 1699, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 31, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "7311a266-d07a-4b13-90f2-5f7a8464df6e", + "participant_id": "cb9d130e-9e1c-4d5f-a6d7-a356a10830bd", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1975, + "elo_clay": 1909, + "elo_grass": 1848, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 6, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "091cbbdf-da45-4964-9cf9-b7064df600d6", + "participant_id": "cca44290-e140-4e84-92cc-6955f4312194", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1681, + "elo_clay": 1651, + "elo_grass": 1607, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 98, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "2169001a-b935-45ca-a762-8477c9140a36", + "participant_id": "d7240ae6-4a84-403d-bf58-971d88de050c", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1669, + "elo_clay": 1568, + "elo_grass": 1629, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 99, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "c3b7ea41-d097-4955-929d-91087cc752e4", + "participant_id": "d8223afd-ee26-4e1b-ab78-37f680b89300", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1756, + "elo_clay": 1718, + "elo_grass": 1773, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 49, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "77939a05-80eb-4287-b5ca-4435ae91ab47", + "participant_id": "d9f560de-39c7-4e86-9715-fd98527b7f00", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1663, + "elo_clay": 1633, + "elo_grass": 1570, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 108, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "8680d073-e888-4a88-bf7e-a116278cbbcc", + "participant_id": "dbe146f9-5330-4eb1-9b4e-893d2dd36feb", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1813, + "elo_clay": 1833, + "elo_grass": 1753, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 24, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "9530fd85-00c5-4f28-abb5-0d45f68ec8f2", + "participant_id": "dbf6bc75-658c-407a-8ee3-db1e76a1760e", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1624, + "elo_clay": 1592, + "elo_grass": 1520, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 136, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "9d02349b-7e85-45e8-be81-088937c8e68e", + "participant_id": "e0ff340c-6411-498b-a76c-be9036a71e34", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1587, + "elo_clay": 1620, + "elo_grass": 1509, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 147, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "c87326ae-61b0-4e55-9b47-16bcc3ba1ae1", + "participant_id": "e15238d0-b641-480d-983e-484e19092bea", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1817, + "elo_clay": 1735, + "elo_grass": 1665, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 35, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "039b8658-92b7-4f8b-a8d3-5c64dcbb4f4d", + "participant_id": "e4386e71-8b3a-4d04-9895-79c4eae288c8", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1742, + "elo_clay": 1725, + "elo_grass": 1706, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 51, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "3896229a-9636-44f5-98ad-675b1f8ae3c9", + "participant_id": "e5c912a6-e324-45aa-a71c-2bcc7cc480b6", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1462, + "elo_clay": 1563, + "elo_grass": 1512, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 210, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "d938b755-407b-44f8-b3d4-967c36fe07a6", + "participant_id": "e884f797-58c9-487b-9a09-b7d94fc88625", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1914, + "elo_clay": 1828, + "elo_grass": 1765, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 12, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "25dda7ae-0296-43e2-8e3c-2ad305d968a4", + "participant_id": "e944c865-5762-4c84-b76b-b64a8f57ea22", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1568, + "elo_clay": 1603, + "elo_grass": 1467, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 172, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "59d8b5f2-946a-4aac-bc61-52e7401f812e", + "participant_id": "eb41771b-11bb-46a0-ac29-4948cae9ab4f", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1782, + "elo_clay": 1735, + "elo_grass": 1695, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 36, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "43163cc3-de27-47e2-89df-5e4ccd5e5d74", + "participant_id": "f043c59c-2a3a-469a-95b5-e76a4a37f957", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1706, + "elo_clay": 1689, + "elo_grass": 1594, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 76, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "0afe8146-fae9-477e-b22c-251c82982e46", + "participant_id": "f1edae50-b663-4d7d-8c84-72888d09daf8", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1600, + "elo_clay": 1518, + "elo_grass": 1562, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 158, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "b1cf0451-033f-469a-9b82-9ed69ba4a865", + "participant_id": "f379b018-ea84-4fba-833f-ab2407bec0b9", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1630, + "elo_clay": 1678, + "elo_grass": 1582, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 122, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "37dca785-d9f9-4ecd-8af0-a49c06047d0a", + "participant_id": "f48a1d81-f825-4e56-a3a4-213d9450ae78", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1758, + "elo_clay": 1676, + "elo_grass": 1721, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 47, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "14cf6006-36c8-4a05-8a0a-289c6c641b7e", + "participant_id": "fdd70df6-2772-4182-8a77-4ec642e6c430", + "sports_season_id": "28fd9221-efc6-45f9-a049-8786539f1111", + "elo_hard": 1761, + "elo_clay": 1787, + "elo_grass": 1594, + "updated_at": "2026-03-24 07:13:40.067", + "world_ranking": 37, + "sport_id": "56fb2554-1c8b-4609-a52a-f643a2b882c7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Men" + }, + { + "id": "52a8c182-043a-4b49-a025-067afecd8b06", + "participant_id": "00d5f52c-4789-461f-9189-b208f8c2010c", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1691, + "elo_clay": 1567, + "elo_grass": 1602, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 101, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "c4f23737-d634-445a-850b-d05cd5c8ddc8", + "participant_id": "02187461-8fb1-4c10-871e-13ef972a45ea", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 2124, + "elo_clay": 2006, + "elo_grass": 1915, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 2, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "d3261194-21ae-474d-8165-b232166da1b8", + "participant_id": "0261a525-61ab-45d3-86c6-88cf9bc76e7f", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1574, + "elo_clay": 1748, + "elo_grass": 1548, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 73, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "41413583-410b-4d8a-81bc-68745a0ff968", + "participant_id": "0280fd90-819c-49cf-b88b-64741f084f11", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1686, + "elo_clay": 1628, + "elo_grass": 1534, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 103, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "86f81733-f74b-4ba7-be8e-7c9a1cc8e5d5", + "participant_id": "04bef66c-2448-4f75-81fb-765b565ee05f", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1567, + "elo_clay": 1639, + "elo_grass": 1541, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 154, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "3d51322a-4f90-44d5-9080-bbc855564b27", + "participant_id": "04d6d71f-636f-4f15-b2d3-1d4047ef5e33", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1754, + "elo_clay": 1520, + "elo_grass": 1635, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 71, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "f3d27a4d-5c70-47b7-beeb-b9a091b6a989", + "participant_id": "055d2b36-8e62-437d-8b27-511c1a131575", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1701, + "elo_clay": 1709, + "elo_grass": 1561, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 87, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "e915ad93-c3ee-45b5-93e9-ae095f3858a6", + "participant_id": "076924e7-8c90-4fc7-b8bd-caa005e414f0", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1783, + "elo_clay": 1718, + "elo_grass": 1739, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 44, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "f3ffefe7-7691-464a-9078-90b0e3e31694", + "participant_id": "086da1c5-8aaf-429d-a63d-8ec85b2c6c57", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1762, + "elo_clay": 1627, + "elo_grass": 1541, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 85, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "c8bfeca6-d26d-4f12-8683-ad1d56b66181", + "participant_id": "0c14ed26-3e7b-48a9-a030-bfdd2d87c119", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1706, + "elo_clay": 1685, + "elo_grass": 1577, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 91, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "a04a0e0d-6bb1-4297-9cea-0d819663a2bd", + "participant_id": "0f33c97e-96d0-4285-b43b-dce4508c64bf", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 2056, + "elo_clay": 2054, + "elo_grass": 1951, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 3, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "bc3d95dd-7ae5-4542-97e9-2160924b8667", + "participant_id": "0fd833b1-6534-4e62-ac70-6369fbcc555d", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1743, + "elo_clay": 1661, + "elo_grass": 1572, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 65, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "3f301d55-82e5-4203-9ea2-513e75dec9ba", + "participant_id": "166290d3-704c-4a71-827c-6db04566dfc6", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1528, + "elo_clay": 1632, + "elo_grass": 1563, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 156, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "f477db4d-cf04-4470-ba39-e4a453ba8bc8", + "participant_id": "191fea59-985c-4054-967e-79ccae4e22c5", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1825, + "elo_clay": 1727, + "elo_grass": 1746, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 27, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "7529dc4c-5812-4175-a9e2-cac690ee49dc", + "participant_id": "1cdd405c-3344-4b54-9f9e-276a08782b03", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1797, + "elo_clay": 1588, + "elo_grass": 1723, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 35, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "5d82874f-3f3e-4de1-b038-42a46a528aee", + "participant_id": "1f8616f1-d038-49d7-8898-f2668d8cd678", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1579, + "elo_clay": 1606, + "elo_grass": 1485, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 167, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "d88a4f7c-a5c5-49bb-ac74-3d7f653297de", + "participant_id": "21a62ed5-c25b-427a-becd-fbaf12c37033", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1913, + "elo_clay": 1884, + "elo_grass": 1780, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 13, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "055a01f4-ea03-4065-aa65-91224b1c4457", + "participant_id": "238ef816-cc88-4cfa-93b5-117b143d15be", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1660, + "elo_clay": 1635, + "elo_grass": 1581, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 108, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "4b99578b-6b12-4974-b6cc-1f4d748eaa92", + "participant_id": "2569df0d-6734-452e-b402-91778602ddc2", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1646, + "elo_clay": 1495, + "elo_grass": 1494, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 127, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "92559366-568b-4e5e-81d5-26a49672355b", + "participant_id": "25709d99-f22a-4bab-af06-b0a68c8bfca5", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1816, + "elo_clay": 1741, + "elo_grass": 1649, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 33, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "fd34b7a1-e810-48e1-9ae5-cb33e168d319", + "participant_id": "25fb8b3d-4b55-4212-a1b0-60f8f7bb6e61", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1782, + "elo_clay": 1745, + "elo_grass": 1635, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 47, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "1bb639b5-f6a2-43cf-b9f2-6bfd9f533f58", + "participant_id": "263ac168-f42c-4c29-a336-c769c0ce9c8e", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1712, + "elo_clay": 1733, + "elo_grass": 1678, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 76, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "54badf98-0826-43ca-9646-ca12b0da2197", + "participant_id": "2653ea9a-6745-4cd9-877f-f554acd23c47", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1801, + "elo_clay": 1615, + "elo_grass": 1734, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 36, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "bda6deb2-eb64-4476-971a-1ae656562d30", + "participant_id": "27206dec-a4dd-481f-92af-55fabfa0df66", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1753, + "elo_clay": 1722, + "elo_grass": 1690, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 62, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "c117f830-5721-428d-ad26-65f438e2d67d", + "participant_id": "282850fa-f59a-46d6-ae6f-9fe4bda541e1", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1774, + "elo_clay": 1806, + "elo_grass": 1754, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 42, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "dd5b6952-bf2a-4161-a434-7952bbbaa013", + "participant_id": "2875a91a-a632-469c-9d5d-407dd9f7938a", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1786, + "elo_clay": 1765, + "elo_grass": 1710, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 38, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "656db24e-c9d9-4209-a6ae-762025eb8ee6", + "participant_id": "29811325-544a-4131-809b-ae44f2ce62aa", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1617, + "elo_clay": 1610, + "elo_grass": 1631, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 135, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "113dbbe6-8cc1-46a1-b0d1-06cbd49a1b46", + "participant_id": "2bb36623-3e25-4ebc-8b63-bc1348857227", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1684, + "elo_clay": 1711, + "elo_grass": 1648, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 89, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "8b63d429-9d39-4147-9682-2994f9b164e1", + "participant_id": "335acc14-7649-4d3e-9a33-5f275f92278d", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1811, + "elo_clay": 1680, + "elo_grass": 1756, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 32, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "048758cb-5d10-45de-8d96-8c81d5eb5b2e", + "participant_id": "36cd520c-0dc6-4502-a66a-47fcba4572eb", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1814, + "elo_clay": 1805, + "elo_grass": 1725, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 30, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "b91f2656-02de-4fd3-a29a-ed2af169a1a9", + "participant_id": "38ba1a32-d2eb-4230-a36b-c18a0652cec2", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 2037, + "elo_clay": 1862, + "elo_grass": 1750, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 6, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "a0341fa4-eb01-4da8-97b5-ee6d726f5d9a", + "participant_id": "3c745ece-5e67-43bc-a708-e8a1056cebc7", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1881, + "elo_clay": 1770, + "elo_grass": 1744, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 18, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "e9815647-c68f-412a-97be-e918941bda06", + "participant_id": "4081368b-41b4-45c5-8964-8b43643cb8ad", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1707, + "elo_clay": 1601, + "elo_grass": 1638, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 94, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "61042189-f8ef-4088-a90a-47e0a4cb9cfb", + "participant_id": "45fa3fca-9548-4b60-a733-fe90758e4c38", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1740, + "elo_clay": 1796, + "elo_grass": 1640, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 49, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "e25cef49-482c-4db2-a326-208435a32541", + "participant_id": "467d097c-14fa-4bc7-881e-495794b04524", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1538, + "elo_clay": 1587, + "elo_grass": 1509, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 192, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "d9f88a59-249d-4f42-97a6-e94601b5bcd5", + "participant_id": "494ef07e-8a47-4c9e-b782-53380dc771e9", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1757, + "elo_clay": 1781, + "elo_grass": 1652, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 57, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "c72b00b6-caa6-4fa7-b277-f21997e63189", + "participant_id": "4acc230c-7424-495b-8de8-0c38feb28e73", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1757, + "elo_clay": 1753, + "elo_grass": 1629, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 60, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "ade8c001-7278-4c14-b25d-26f32e6ad8e5", + "participant_id": "4d1c5b9f-f0dd-4c64-a8fe-835b78cc00e0", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1661, + "elo_clay": 1625, + "elo_grass": 1571, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 111, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "57519027-a1bb-41e2-b1af-e16dd87e3f05", + "participant_id": "4e685962-4e24-4926-9381-9de15772ba46", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1851, + "elo_clay": 1798, + "elo_grass": 1816, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 17, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "9dc92988-b27c-4d13-b04b-12673ca09c97", + "participant_id": "4ed44766-cdf7-4f7d-a7f8-a6093589c10a", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1672, + "elo_clay": 1608, + "elo_grass": 1580, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 105, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "4e83afb7-0fe4-4a1d-b503-3356a19c0fb6", + "participant_id": "4fb44ae1-3e4a-4937-8444-c5135d04be33", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1606, + "elo_clay": 1615, + "elo_grass": 1594, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 133, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "0289fe1c-1bf7-4372-9fd3-964e6199023c", + "participant_id": "5024a860-9524-4a09-bdf6-18b1f73535d0", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1491, + "elo_clay": 1634, + "elo_grass": 1409, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 169, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "5d98c22d-c0e8-4c9a-9058-a8cf7e7b6750", + "participant_id": "523911c3-d6a0-4d92-81d4-36d1ab1f34fd", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1736, + "elo_clay": 1742, + "elo_grass": 1692, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 61, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "25066618-0ecc-4585-a36a-9f2d0a5a8713", + "participant_id": "5646a306-30b8-474e-9937-6c41a9e64ecb", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1882, + "elo_clay": 1764, + "elo_grass": 1659, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 20, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "6d76f252-56bb-4066-a4a9-c85f9ef89042", + "participant_id": "56b98fe7-843f-4f31-8669-d07888a1b57f", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1693, + "elo_clay": 1612, + "elo_grass": 1616, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 98, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "6f5183f4-d306-42eb-bf7d-324e7c87fb73", + "participant_id": "59a07e5b-3e3e-4375-90ad-6bee6b5ff957", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1646, + "elo_clay": 1612, + "elo_grass": 1593, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 121, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "0e9a5f0d-9dbc-4308-a139-657527e07075", + "participant_id": "5bf513ae-11ce-4d03-b1fd-57d33bc3afad", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1674, + "elo_clay": 1685, + "elo_grass": 1667, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 96, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "acfe1df0-2e47-42bc-baa0-27e212c39716", + "participant_id": "5c87309d-72ad-48b9-932e-422021e22b9f", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1652, + "elo_clay": 1721, + "elo_grass": 1489, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 106, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "e393e892-aaa9-47eb-925f-80e11d0a694b", + "participant_id": "60fb33e7-71e6-40b5-b0ca-3fc0e4674175", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1746, + "elo_clay": 1708, + "elo_grass": 1695, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 64, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "d0bffa15-cf11-4562-8550-cc5a78202aa5", + "participant_id": "61c35bd9-f9e2-4d84-9b4a-15aec49a684b", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1784, + "elo_clay": 1559, + "elo_grass": 1643, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 51, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "2c993344-f1d8-406b-8bbf-8562a41c0e75", + "participant_id": "67ad8b75-ed37-4c5d-a0f2-3cb368da7ba4", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1755, + "elo_clay": 1714, + "elo_grass": 1648, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 63, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "00915e2b-db7c-4d78-af2e-d408d7908e67", + "participant_id": "688cb2d4-957c-4ece-bf6d-f3467f077236", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1668, + "elo_clay": 1714, + "elo_grass": 1683, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 97, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "9fbab0dc-7669-418a-bd9f-551fe5284ed9", + "participant_id": "691cadbe-f1c8-4ac7-ae66-d76856a106fb", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1597, + "elo_clay": 1615, + "elo_grass": 1447, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 151, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "4395dbed-156d-469a-a943-29aa367d3c72", + "participant_id": "6b6fb0cf-55df-4121-8bd9-e8af7a2674a5", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1748, + "elo_clay": 1676, + "elo_grass": 1740, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 58, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "0ea121bb-7853-4b8b-9dd0-defef22702b0", + "participant_id": "6e660df1-5af7-45ec-8f20-c837b6f17d4a", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1777, + "elo_clay": 1708, + "elo_grass": 1647, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 46, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "d8ce9c5d-9b60-436a-ae5c-7c0cd06ce5d8", + "participant_id": "72bf6939-3b91-4d11-ac9b-04c2c380bf1f", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1606, + "elo_clay": 1672, + "elo_grass": 1433, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 138, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "6eff71b0-e60f-4030-be1e-52b5020c9725", + "participant_id": "73d118b7-4e9f-4652-a283-5ac3268519cb", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1695, + "elo_clay": 1652, + "elo_grass": 1640, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 90, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "d44c2607-a4e7-476f-a775-af58251438b1", + "participant_id": "73e63a1c-06bd-4c71-a837-71157ce5336b", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1629, + "elo_clay": 1504, + "elo_grass": 1546, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 139, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "c03d7aaa-3e11-4bf1-b075-883a12db934d", + "participant_id": "768bbc42-fc48-4abe-b540-903f8b04f7b1", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1834, + "elo_clay": 1805, + "elo_grass": 1683, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 26, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "110583ee-7c63-42eb-9aa2-474fbe80a04c", + "participant_id": "79111fea-1666-46db-9031-88d34851ad63", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1753, + "elo_clay": 1624, + "elo_grass": 1626, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 70, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "49c47c8f-e12b-4d09-be7b-29727ce8ebcd", + "participant_id": "7a09a1a1-436e-4a8f-96ba-abc55dd025a3", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1701, + "elo_clay": 1596, + "elo_grass": 1621, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 92, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "39024075-6b5c-453f-9b9d-dd13bc29b3e4", + "participant_id": "7a2d456d-3435-4aa9-8275-4fbfbafaec73", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1637, + "elo_clay": 1527, + "elo_grass": 1585, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 130, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "b3b0c10e-fda1-4b8d-9f7d-b53d7b1e9d67", + "participant_id": "7c84daa4-5a39-4e44-914c-09f2e462c861", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1723, + "elo_clay": 1735, + "elo_grass": 1726, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 72, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "315dae31-826d-49df-b0aa-34f17a41523b", + "participant_id": "80264f2a-0060-44bf-be22-3fd6c2dbb633", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1543, + "elo_clay": 1578, + "elo_grass": 1537, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 174, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "6f4dbd90-47f7-4b2f-b4fd-fd9d864f0133", + "participant_id": "8743308b-225d-4646-8a60-a4d747ec1467", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1804, + "elo_clay": 1803, + "elo_grass": 1541, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 31, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "e070a7ef-722d-479d-87db-97bb9fc2207d", + "participant_id": "89437c41-3ede-4da2-8b5c-5a541042f7d4", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1730, + "elo_clay": 1700, + "elo_grass": 1593, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 74, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "249c384e-ec38-4ef9-bb2b-9a6f77ae43a0", + "participant_id": "8b1ddcfe-bffe-47ad-8c17-391e33c69099", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1579, + "elo_clay": 1559, + "elo_grass": 1443, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 172, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "231362eb-a52e-466e-8a5a-1d42c1b4ff4e", + "participant_id": "8c378047-1c17-45bc-9267-8562b5f46c0f", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1906, + "elo_clay": 1920, + "elo_grass": 1792, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 12, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "945956c7-5146-4988-a1f2-297cbfcdc3e1", + "participant_id": "8dffbb35-0643-479c-b037-fface7962821", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1772, + "elo_clay": 1809, + "elo_grass": 1680, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 34, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "999c94ae-659b-4d47-a5d3-6f4321486a9d", + "participant_id": "8e48d25b-b652-4ce6-b02e-0a0ff53bafd9", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1789, + "elo_clay": 1757, + "elo_grass": 1497, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 41, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "d1dc8323-b4a7-4de5-92ca-36316c6a47df", + "participant_id": "8fd65b88-d222-484e-9332-ef30e448e9f8", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1941, + "elo_clay": 1915, + "elo_grass": 1766, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 11, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "5ab774fa-2a7d-4e88-9907-254df95b3b87", + "participant_id": "90f76e78-e227-48b2-b71e-f11a0200a209", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 2204, + "elo_clay": 2143, + "elo_grass": 2000, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 1, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "eab3583e-5489-4c77-9091-92722e9f758b", + "participant_id": "91096cae-9614-4ee6-8b91-e6e6c462a1f7", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1757, + "elo_clay": 1599, + "elo_grass": 1619, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 68, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "395b0a66-a952-438d-9b37-84cc747fdfd1", + "participant_id": "92518afc-f4ce-40f7-82d7-9c4e40a3f840", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1702, + "elo_clay": 1697, + "elo_grass": 1671, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 83, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "133ef0fb-1293-4c91-bac6-687623e53213", + "participant_id": "930f52d0-229c-4cd8-8443-601fba04df82", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1779, + "elo_clay": 1662, + "elo_grass": 1662, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 45, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "03ebee16-57f0-416c-bdd2-f26aa37616d6", + "participant_id": "951aad3e-dbb5-49f0-82c0-ea9c226cf4e4", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1710, + "elo_clay": 1676, + "elo_grass": 1650, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 84, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "12029639-4dad-4e90-bedf-ee410fd44c1b", + "participant_id": "95bd8f5e-73e5-460d-8ae1-d35217cd7227", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 2056, + "elo_clay": 1909, + "elo_grass": 1877, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 4, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "3a7af279-9f23-41b2-b077-ef5a9fc6e5ef", + "participant_id": "9687afef-120c-4ca7-a136-3bcd50399765", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1607, + "elo_clay": 1716, + "elo_grass": 1499, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 114, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "6f96e823-5bcd-47ad-a284-9c03dab141be", + "participant_id": "989689cd-8e8e-424f-b36b-4d7b57b5e841", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1763, + "elo_clay": 1770, + "elo_grass": 1710, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 59, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "333a6bb9-3f75-4c8e-b89d-7567d1147ed3", + "participant_id": "98deb7fc-59fb-4bcf-b234-556d10acc77a", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1760, + "elo_clay": 1787, + "elo_grass": 1559, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 53, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "560ca09c-ab55-47c1-8be9-5ca296d71cb3", + "participant_id": "9a505894-f969-4fe9-84eb-7920cd84800e", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1613, + "elo_clay": 1650, + "elo_grass": 1569, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 128, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "9839194a-7de3-4573-873a-8c4c33532ed6", + "participant_id": "9c31b642-3d29-4eaf-8bb6-6d857cf315bc", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1712, + "elo_clay": 1662, + "elo_grass": 1597, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 86, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "509cb671-b8e1-4e3b-bf70-ba4862e2dfe6", + "participant_id": "9de11349-626f-4a9c-96ea-6cefd550d9f7", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1861, + "elo_clay": 1831, + "elo_grass": 1766, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 19, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "298ab97a-c18b-4988-a8b7-cd03d95cb5a9", + "participant_id": "9eb85dba-1e9c-427e-85d7-1d97ef5dce0d", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 2012, + "elo_clay": 1844, + "elo_grass": 1767, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 9, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "4452993a-4e18-4343-b7cb-5c37d10713de", + "participant_id": "a14050ce-31db-4b27-97cb-8cc716005af9", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1717, + "elo_clay": 1720, + "elo_grass": 1681, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 78, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "a4adbde1-cc9e-44d4-8b5f-7e13dcc9b52b", + "participant_id": "a15990e6-cf94-430b-827b-78e1bcfebe52", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1609, + "elo_clay": 1665, + "elo_grass": 1618, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 126, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "8ad7c9e9-2bcc-408a-99f9-0b71215e9255", + "participant_id": "a3f27b33-c02d-4a15-a386-582e1670c035", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1754, + "elo_clay": 1641, + "elo_grass": 1605, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 67, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "feec5b98-70b9-4756-807b-b77827d6f51c", + "participant_id": "aac4dbb9-7c5a-4328-9375-8104b8912c8a", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1753, + "elo_clay": 1766, + "elo_grass": 1755, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 48, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "880160d0-e31c-43b1-9db5-c7053829e9e8", + "participant_id": "aba83bdf-21bd-44bc-8804-46a94373a1bf", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1736, + "elo_clay": 1538, + "elo_grass": 1613, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 79, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "4650ce89-1d7f-4ca5-bad0-c2b7835e902e", + "participant_id": "adc57729-2c68-4520-979b-af17092e33c2", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 2002, + "elo_clay": 1862, + "elo_grass": 1886, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 7, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "196f6283-89b6-48cf-bd10-ccf95f02db06", + "participant_id": "af724e9e-56d8-42d3-b082-0b1b828aac64", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1572, + "elo_clay": 1535, + "elo_grass": 1624, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 165, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "92c93a18-20ae-49bf-96d6-c4a08562d616", + "participant_id": "b13cb277-fddb-42c8-8e44-7b692bf47503", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1693, + "elo_clay": 1722, + "elo_grass": 1619, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 88, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "3e610f20-7009-45fc-ad1b-ca15ad828653", + "participant_id": "b355e16b-8ec3-43ec-9b38-d1f9e1fbf15c", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1911, + "elo_clay": 1812, + "elo_grass": 1730, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 14, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "84ddc9bc-cd6d-4f65-b9e3-0feb1a2118c3", + "participant_id": "b3d45d5c-31ba-4f7d-9b8b-b82f10f740cb", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1706, + "elo_clay": 1702, + "elo_grass": 1590, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 80, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "5cd5a246-96fa-4026-bf4c-7ad214aa0547", + "participant_id": "b4863490-4ae6-41ad-9a8a-fc82b51b57f8", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1747, + "elo_clay": 1745, + "elo_grass": 1653, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 66, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "c632887a-da47-4746-ac3b-2a7599c6f88f", + "participant_id": "bb625d13-f7f0-4600-976f-715476889b2d", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1769, + "elo_clay": 1748, + "elo_grass": 1654, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 55, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "0933453a-1434-4af6-aa67-143ea0ba3b3f", + "participant_id": "bd468139-e82b-4f32-9819-c706f9e88b15", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1651, + "elo_clay": 1684, + "elo_grass": 1612, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 109, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "821e2f90-16a7-4ab1-8cb0-4fa9e4dbceea", + "participant_id": "bf5b105f-c411-4de3-820b-8679b6e9b552", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1813, + "elo_clay": 1759, + "elo_grass": 1698, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 29, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "f2e09f97-2006-4ef7-8001-40f5897cd47e", + "participant_id": "c1198f03-ee12-424b-badd-df4e51418d7b", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1770, + "elo_clay": 1758, + "elo_grass": 1705, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 43, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "bf3a6418-3cef-47a9-82c8-57e33ea52796", + "participant_id": "c1c72d10-c993-4979-9d5f-ad7111e209e6", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1801, + "elo_clay": 1723, + "elo_grass": 1627, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 39, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "08eaeaae-e626-4412-95a8-ad98745891a9", + "participant_id": "c5915041-e53a-4e97-ba8a-c1a3885dbaf5", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1833, + "elo_clay": 1602, + "elo_grass": 1732, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 25, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "22fa0aa1-d766-40f6-b515-1795094b68a5", + "participant_id": "c794f33f-0b1c-4b76-b7ad-7d2997e49550", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1906, + "elo_clay": 1761, + "elo_grass": 1775, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 15, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "10c5d45c-c10c-488b-b746-301d65c0662b", + "participant_id": "c9cc13ff-d61f-4624-a95e-57aa4c4993c7", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1637, + "elo_clay": 1588, + "elo_grass": 1532, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 129, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "5dc65478-6217-43e7-8f54-0e0e6eeb354a", + "participant_id": "cd6b7265-40fa-4871-8561-29a5914e05f8", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1826, + "elo_clay": 1798, + "elo_grass": 1653, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 28, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "62ee54e8-afb1-4d4d-9731-1cd00dbaf460", + "participant_id": "ce4629ef-aca1-4529-b8c2-50482032f961", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1819, + "elo_clay": 1801, + "elo_grass": 1777, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 22, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "8841ae8a-c5a9-4c26-844c-bfe30b207e98", + "participant_id": "ce758c81-d10d-4782-8e03-50f6a8a7b511", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1597, + "elo_clay": 1635, + "elo_grass": 1520, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 141, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "a1001500-cde2-460a-9d48-6fe6f681f4a9", + "participant_id": "ce7cbc10-437f-4526-a78f-b8ed67ff22bb", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1666, + "elo_clay": 1650, + "elo_grass": 1530, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 116, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "423c2f34-835f-40cd-a86e-0129f94db48a", + "participant_id": "d1f97759-3549-4d30-a057-8e0a9c0b77a2", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1610, + "elo_clay": 1807, + "elo_grass": 1558, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 56, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "cd8f8f31-1ae2-4d52-a3e0-63de7eac4c81", + "participant_id": "d2af4d3a-1c36-457e-8c2d-1d48f5d98e88", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1637, + "elo_clay": 1699, + "elo_grass": 1644, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 112, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "91bd5f17-a2fd-4d85-bdd7-1f6c327b1a0d", + "participant_id": "d417542d-1002-40d2-a54a-bb6aa6cdec8e", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1719, + "elo_clay": 1701, + "elo_grass": 1554, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 77, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "44e9d1df-43a9-429e-8890-b72297750cb5", + "participant_id": "d5b585f3-6f73-4f3b-bbac-a25626bcdea8", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1618, + "elo_clay": 1684, + "elo_grass": 1487, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 124, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "f97609d9-76dc-4f8e-a446-2f1352b50308", + "participant_id": "d9673fa2-7fd9-40d2-b542-9056fe14e21c", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1737, + "elo_clay": 1799, + "elo_grass": 1641, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 52, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "a47bb07a-0022-4afa-b083-ef719b8834cd", + "participant_id": "db82b6cb-2782-45b2-9fa5-00a9e8504597", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1618, + "elo_clay": 1604, + "elo_grass": 1505, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 140, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "1c98c8e9-99f1-44c9-90c2-c0b5c0ccfa96", + "participant_id": "dc7d6834-286f-4788-b43e-a25ebcf2cda2", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1792, + "elo_clay": 1753, + "elo_grass": 1713, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 37, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "6bbcd508-2ba8-46a5-a122-e67a7abc6c4b", + "participant_id": "e19680d2-a26d-463e-9d4a-996749024d3f", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1910, + "elo_clay": 1839, + "elo_grass": 1679, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 16, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "75b33736-e6d5-462d-b0c9-5c8f23921f52", + "participant_id": "e5d38d8c-986a-4599-aacc-61cfad9430bf", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 2017, + "elo_clay": 2045, + "elo_grass": 1843, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 5, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "7a0984cf-f8a3-42bb-9f3e-d9777d9af0d9", + "participant_id": "e7ce8b54-63a1-4df5-85d1-82e0aefc1afd", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1480, + "elo_clay": 1635, + "elo_grass": 1473, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 158, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "750ea49b-597e-4107-af38-93d5f7d3ec27", + "participant_id": "e7d000f1-1d67-4be7-8c9c-50603fb70600", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1709, + "elo_clay": 1667, + "elo_grass": 1661, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 81, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "a6b18205-3931-4589-956d-51c10c0599f7", + "participant_id": "ea58adc8-fc1a-447e-9648-00d8cbefafdd", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1994, + "elo_clay": 1956, + "elo_grass": 1826, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 8, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "3bf099e5-aee0-4d05-a3ab-22715faa90e5", + "participant_id": "eeca51c5-056f-4737-a4f7-d7b7e6d4f07f", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1826, + "elo_clay": 1843, + "elo_grass": 1645, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 24, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "5d021163-b8bd-4514-86ab-7443b8e3586f", + "participant_id": "f05dde16-4474-4198-9f3c-88f887056e7a", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1761, + "elo_clay": 1510, + "elo_grass": 1554, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 69, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "9fbf2b5a-0593-4f2c-9aba-63787dc80a3e", + "participant_id": "f1149ce9-b780-46be-ae9d-4a4451e696d4", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1843, + "elo_clay": 1728, + "elo_grass": 1759, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 21, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "7b1a3601-9699-4764-9082-bedf428796a6", + "participant_id": "f31b7865-a9a7-4503-85db-6c78b96c54cd", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1796, + "elo_clay": 1689, + "elo_grass": 1688, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 40, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "09e54166-7cdf-42cd-8b1f-1d27c4ddb770", + "participant_id": "f45e6b59-a193-49bb-8518-83e6c90734c9", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1944, + "elo_clay": 1791, + "elo_grass": 1790, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 10, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "75ab453c-d717-4c25-ba4d-82487b8bd055", + "participant_id": "f50533cc-d3b0-48bc-aa82-57360760f148", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1656, + "elo_clay": 1699, + "elo_grass": 1499, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 100, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "307051b0-023d-47c1-8d29-952a4328f302", + "participant_id": "f529098e-16cb-4211-8e24-e5bb194b5eef", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1693, + "elo_clay": 1568, + "elo_grass": 1618, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 99, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + }, + { + "id": "488084a0-c761-47d2-9204-1dbb61e996dc", + "participant_id": "fcf73240-93f6-4a5c-9dc0-a03962629959", + "sports_season_id": "5a62eef6-927a-449e-a993-c8a722ba6445", + "elo_hard": 1584, + "elo_clay": 1559, + "elo_grass": 1516, + "updated_at": "2026-03-24 07:12:12.756", + "world_ranking": 160, + "sport_id": "515829f3-d27b-4f2d-bf4c-f0e19dc36cb7", + "sports_season_name": "2026-2027 Season", + "sport_name": "Tennis - Women" + } +] \ No newline at end of file From ec10c9006c5c7f0285718a6db1cc8bf8233b439c Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Fri, 1 May 2026 12:42:34 -0700 Subject: [PATCH 13/13] chore: remove post-phase1a capture helper after verification --- scripts/capture-baseline-post.ts | 110 ------------------------------- 1 file changed, 110 deletions(-) delete mode 100644 scripts/capture-baseline-post.ts diff --git a/scripts/capture-baseline-post.ts b/scripts/capture-baseline-post.ts deleted file mode 100644 index 9b08818..0000000 --- a/scripts/capture-baseline-post.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Post-Phase-1a Baseline Capture - diff-only helper - * - * Queries the renamed tables and writes post-rename JSON fixtures. After running, - * diff these against test-fixtures/baselines/*-pre-phase1.json to verify the - * rename did not change any data. DO NOT COMMIT THIS FILE OR ITS OUTPUT. - * - * Usage: - * npx dotenv -- tsx scripts/capture-baseline-post.ts - */ - -import { drizzle } from "drizzle-orm/postgres-js"; -import postgres from "postgres"; -import { sql } from "drizzle-orm"; -import { writeFileSync, mkdirSync } from "fs"; -import { join } from "path"; -import * as schema from "../database/schema.js"; - -const OUT_DIR = join(process.cwd(), "test-fixtures", "baselines"); - -async function main() { - const dbUrl = process.env.DATABASE_URL; - if (!dbUrl) { - console.error("ERROR: DATABASE_URL is required"); - process.exit(1); - } - - console.log("Connecting to database..."); - const client = postgres(dbUrl, { max: 1 }); - const db = drizzle(client, { schema }); - - mkdirSync(OUT_DIR, { recursive: true }); - console.log(`Output directory: ${OUT_DIR}\n`); - - // ─── 1. season_participant_qualifying_totals ────────────────────────────────── - - console.log("Capturing season_participant_qualifying_totals..."); - const qpTotals = await db.execute(sql` - SELECT pqt.*, ss.id as sports_season_id, ss.name as sports_season_name, s.name as sport_name - FROM season_participant_qualifying_totals pqt - JOIN sports_seasons ss ON ss.id = pqt.sports_season_id - JOIN sports s ON s.id = ss.sport_id - WHERE ss.scoring_pattern = 'qualifying_points' - ORDER BY ss.id, pqt.participant_id - `); - - writeFileSync( - join(OUT_DIR, "qp-totals-post-phase1a.json"), - JSON.stringify(qpTotals, null, 2) - ); - console.log(` Wrote ${qpTotals.length} rows → qp-totals-post-phase1a.json`); - - // ─── 2. event_results with qualifying_points_awarded ───────────────────────── - - console.log("Capturing event_results with qualifying_points_awarded..."); - const eventResults = await db.execute(sql` - SELECT er.*, se.sports_season_id, se.name as event_name - FROM event_results er - JOIN scoring_events se ON se.id = er.scoring_event_id - JOIN sports_seasons ss ON ss.id = se.sports_season_id - WHERE ss.scoring_pattern = 'qualifying_points' - AND er.qualifying_points_awarded IS NOT NULL - ORDER BY se.sports_season_id, er.scoring_event_id, er.season_participant_id - `); - - writeFileSync( - join(OUT_DIR, "event-results-post-phase1a.json"), - JSON.stringify(eventResults, null, 2) - ); - console.log(` Wrote ${eventResults.length} rows → event-results-post-phase1a.json`); - - // ─── 3. season_participant_surface_elos ────────────────────────────────────── - - console.log("Capturing season_participant_surface_elos..."); - const surfaceElos = await db.execute(sql` - SELECT pse.*, ss.sport_id, ss.name as sports_season_name, s.name as sport_name - FROM season_participant_surface_elos pse - JOIN sports_seasons ss ON ss.id = pse.sports_season_id - JOIN sports s ON s.id = ss.sport_id - WHERE ss.scoring_pattern = 'qualifying_points' - ORDER BY ss.id, pse.participant_id - `); - - writeFileSync( - join(OUT_DIR, "surface-elos-post-phase1a.json"), - JSON.stringify(surfaceElos, null, 2) - ); - console.log(` Wrote ${surfaceElos.length} rows → surface-elos-post-phase1a.json`); - - console.log(`\n✓ Post-rename capture complete!`); - console.log(` ${qpTotals.length} QP totals`); - console.log(` ${eventResults.length} event results`); - console.log(` ${surfaceElos.length} surface elo rows`); - console.log(`\nNow diff against the pre-phase1 fixtures:`); - console.log(` diff <(jq -S . test-fixtures/baselines/qp-totals-pre-phase1.json) \\`); - console.log(` <(jq -S . test-fixtures/baselines/qp-totals-post-phase1a.json)`); - console.log(` diff <(jq -S . test-fixtures/baselines/surface-elos-pre-phase1.json) \\`); - console.log(` <(jq -S . test-fixtures/baselines/surface-elos-post-phase1a.json)`); - console.log(` diff <(jq -S 'map(del(.participant_id))' test-fixtures/baselines/event-results-pre-phase1.json) \\`); - console.log(` <(jq -S 'map(del(.season_participant_id))' test-fixtures/baselines/event-results-post-phase1a.json)`); - - await client.end(); -} - -main() - .then(() => process.exit(0)) - .catch((e) => { - console.error("FATAL:", e); - process.exit(1); - });