From fb7f49155e4d3e9b150f0c50f62aad4f5d2ab210 Mon Sep 17 00:00:00 2001 From: Yonie <164077864+Isaiahriveraa@users.noreply.github.com> Date: Wed, 24 Dec 2025 01:19:38 -0800 Subject: [PATCH 1/7] Fixed critical race condition in Mongoose model registration Changed: - Converted model registration function to async/await to ensure all schemas are loaded before database connection returns - Updated connection logic to await registration in both new and cached connection paths Files: - src/server/models/index.js - src/server/db.js Why: In serverless environments (Vercel/Netlify), the previous synchronous implementation could return the database connection before models were registered, leading to 'Schema hasn't been registered' errors when executing queries. Moving to async registration ensures reliable model availability across all execution environments. --- src/server/db.js | 6 +++--- src/server/models/index.js | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/server/db.js b/src/server/db.js index 11779257..dbaf3bfc 100644 --- a/src/server/db.js +++ b/src/server/db.js @@ -27,7 +27,7 @@ async function connectDB() { // IMPORTANT: Even with cached connection, ensure models are registered // This handles cases where the serverless function instance is reused // but models aren't in memory - registerModels(); + await registerModels(); return cached.conn; } @@ -38,11 +38,11 @@ async function connectDB() { }; console.log('🔌 Connecting to MongoDB...'); - cached.promise = mongoose.connect(MONGODB_URI, opts).then((mongoose) => { + cached.promise = mongoose.connect(MONGODB_URI, opts).then(async (mongoose) => { console.log('✅ MongoDB connected successfully'); // Register all models immediately after connection - registerModels(); + await registerModels(); return mongoose; }); diff --git a/src/server/models/index.js b/src/server/models/index.js index 2a6aec88..4e072056 100644 --- a/src/server/models/index.js +++ b/src/server/models/index.js @@ -17,22 +17,22 @@ let modelsRegistered = false; * Register all Mongoose models * This function should be called after MongoDB connection is established */ -export function registerModels() { +export async function registerModels() { // Only register once per serverless function instance if (modelsRegistered) { return; } try { - // Import models in dependency order + // Import models in dependency order using dynamic imports // User has no dependencies - require('./User'); + await import('./User'); // Game has no dependencies - require('./Game'); + await import('./Game'); // Bet depends on User and Game (via references) - require('./Bet'); + await import('./Bet'); modelsRegistered = true; console.log('✅ All Mongoose models registered successfully'); From b5cb7120c0356d63e1a84698cac16202cc80986c Mon Sep 17 00:00:00 2001 From: Yonie <164077864+Isaiahriveraa@users.noreply.github.com> Date: Wed, 24 Dec 2025 01:33:07 -0800 Subject: [PATCH 2/7] Configure CI pipeline and exclude local tooling Changed: - Added GitHub Actions workflow (ci.yml) for automated linting and testing - Updated .gitignore to exclude local development artifacts and temporary files Files: - .github/workflows/ci.yml - .gitignore Why: Establishes a baseline CI process to enforce code quality on every push. Excluding local environment artifacts ensures the shared repository remains clean and environment-agnostic. --- .github/workflows/ci.yml | 3 +-- .gitignore | 7 +++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 91a204ac..959208c7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,8 +25,7 @@ jobs: run: npm ci - name: Run linter - run: npm run lint || true - # TODO: Remove "|| true" after cleanup branch fixes all lint errors + run: npm run lint - name: Run tests run: npm test diff --git a/.gitignore b/.gitignore index 94402855..be5ecf89 100644 --- a/.gitignore +++ b/.gitignore @@ -81,3 +81,10 @@ next-env.d.ts claude.md # Local Netlify folder .netlify + +.gemini/ +gha-creds-*.json + +# Gemini Agent Files +.github/commands/ +.github/workflows/gemini-*.yml From f3f2709fc7a211d84c6d06bcdefe6d52a0f8874f Mon Sep 17 00:00:00 2001 From: Yonie <164077864+Isaiahriveraa@users.noreply.github.com> Date: Wed, 24 Dec 2025 01:34:04 -0800 Subject: [PATCH 3/7] Remove legacy components and unused data artifacts Changed: - Deleted redundant UI components (BettingModal, UWRecord, etc.) replaced by new design system - Removed unused historical data files and legacy HTML/CSS pages - Cleaned up deprecated API endpoints and service methods Files: - src/app/change-password/page.jsx (deleted) - src/app/change-username/page.jsx (deleted) - src/app/contexts/DarkModeContext.jsx (deleted) - src/app/daily-tasks/page.html (deleted) - src/app/daily-tasks/style.css (deleted) - src/app/data/games.js (deleted) - src/app/data/users.js (deleted) - src/components/BettingModal.jsx (deleted) - src/components/BiscuitIcon.jsx (deleted) - src/components/CardStyleC.jsx (deleted) - src/components/DarkModeToggle.jsx (deleted) - src/components/ErrorState.jsx (deleted) - src/components/FireIcon.jsx (deleted) - src/components/GameCalendar.jsx (deleted) - src/components/GameDetailsModal.jsx (deleted) - src/components/UWRecord.jsx (deleted) - src/components/animation/AnimatedCard.jsx (deleted) - src/components/animation/FadeInView.jsx (deleted) - src/components/animation/variants.js (deleted) - src/components/betting/BetConfirmation.jsx (deleted) - src/components/charts/BettingDistributionChart.jsx (deleted) - src/components/charts/BettingTrendChart.jsx (deleted) - src/components/charts/SportActivityChart.jsx (deleted) - src/components/charts/index.js (deleted) - src/components/dashboard/BettingChart.jsx (deleted) - src/components/dashboard/StatsGrid.jsx (deleted) - src/components/game/index.js (deleted) - src/components/leaderboard/Podium.jsx (deleted) - src/components/shared/index.js (deleted) - src/pages/api/bets/settle-all.js (deleted) - src/pages/api/bets/settle-game.js (deleted) - src/hooks/useKeyboardNav.js (deleted) Why: Reduces technical debt and codebase size by removing obsolete features and experimental UI components. This streamlines the project structure and ensures only the current design language and active features remain, making maintenance and onboarding easier. --- src/app/change-password/page.jsx | 18 - src/app/change-username/page.jsx | 10 - src/app/contexts/DarkModeContext.jsx | 57 ---- src/app/daily-tasks/page.html | 74 ----- src/app/daily-tasks/style.css | 28 -- src/app/data/games.js | 50 --- src/app/data/users.js | 72 ---- src/components/BettingModal.jsx | 297 ----------------- src/components/BiscuitIcon.jsx | 84 ----- src/components/CardStyleC.jsx | 266 --------------- src/components/DarkModeToggle.jsx | 29 -- src/components/ErrorState.jsx | 108 ------ src/components/FireIcon.jsx | 125 ------- src/components/GameCalendar.jsx | 221 ------------- src/components/GameDetailsModal.jsx | 309 ------------------ src/components/UWRecord.jsx | 143 -------- src/components/animation/AnimatedCard.jsx | 18 - src/components/animation/FadeInView.jsx | 21 -- src/components/animation/variants.js | 94 ------ src/components/betting/BetConfirmation.jsx | 86 ----- .../charts/BettingDistributionChart.jsx | 87 ----- src/components/charts/BettingTrendChart.jsx | 132 -------- src/components/charts/SportActivityChart.jsx | 130 -------- src/components/charts/index.js | 8 - src/components/dashboard/BettingChart.jsx | 61 ---- src/components/dashboard/StatsGrid.jsx | 100 ------ src/components/game/index.js | 9 - src/components/leaderboard/Podium.jsx | 103 ------ src/components/shared/index.js | 4 - src/hooks/useKeyboardNav.js | 37 --- src/pages/api/bets/settle-all.js | 155 --------- src/pages/api/bets/settle-game.js | 147 --------- 32 files changed, 3083 deletions(-) delete mode 100644 src/app/change-password/page.jsx delete mode 100644 src/app/change-username/page.jsx delete mode 100644 src/app/contexts/DarkModeContext.jsx delete mode 100644 src/app/daily-tasks/page.html delete mode 100644 src/app/daily-tasks/style.css delete mode 100644 src/app/data/games.js delete mode 100644 src/app/data/users.js delete mode 100644 src/components/BettingModal.jsx delete mode 100644 src/components/BiscuitIcon.jsx delete mode 100644 src/components/CardStyleC.jsx delete mode 100644 src/components/DarkModeToggle.jsx delete mode 100644 src/components/ErrorState.jsx delete mode 100644 src/components/FireIcon.jsx delete mode 100644 src/components/GameCalendar.jsx delete mode 100644 src/components/GameDetailsModal.jsx delete mode 100644 src/components/UWRecord.jsx delete mode 100644 src/components/animation/AnimatedCard.jsx delete mode 100644 src/components/animation/FadeInView.jsx delete mode 100644 src/components/animation/variants.js delete mode 100644 src/components/betting/BetConfirmation.jsx delete mode 100644 src/components/charts/BettingDistributionChart.jsx delete mode 100644 src/components/charts/BettingTrendChart.jsx delete mode 100644 src/components/charts/SportActivityChart.jsx delete mode 100644 src/components/charts/index.js delete mode 100644 src/components/dashboard/BettingChart.jsx delete mode 100644 src/components/dashboard/StatsGrid.jsx delete mode 100644 src/components/game/index.js delete mode 100644 src/components/leaderboard/Podium.jsx delete mode 100644 src/components/shared/index.js delete mode 100644 src/hooks/useKeyboardNav.js delete mode 100644 src/pages/api/bets/settle-all.js delete mode 100644 src/pages/api/bets/settle-game.js diff --git a/src/app/change-password/page.jsx b/src/app/change-password/page.jsx deleted file mode 100644 index 25da7328..00000000 --- a/src/app/change-password/page.jsx +++ /dev/null @@ -1,18 +0,0 @@ -"use client"; - -import { UserProfile, SignedIn, SignedOut, RedirectToSignIn } from "@clerk/nextjs"; - -export default function AccountPage() { - return ( -
- | Log in | -100 biscuits |
- - | |
|---|---|---|---|
| Share with a friend | -100 biscuits |
- - | |
| Make a bid | -100 biscuits |
- - | |
| - | - | - | - |
Good luck, Husky!
-- {errorMessage} -
- - {/* Actions */} -{getErrorMessage(error)}
-No upcoming games found.
-Games will appear here once they are scheduled.
-- Teams: {selectedGame.homeTeam} vs {selectedGame.awayTeam} -
-- Date: {formatDate(selectedGame.gameDate, { includeWeekday: true, includeYear: true, format: 'long' })} -
-- Time: {formatTime(selectedGame.gameDate)} -
-- Location: {selectedGame.location} -
-- Status: {selectedGame.status} -
- {selectedGame.status === 'completed' && ( -- Score: {selectedGame.homeTeam} {selectedGame.homeScore} - {selectedGame.awayScore} {selectedGame.awayTeam} -
- )} - -Player statistics not available for this game
-{betDetails?.amount} biscuits
-on {betDetails?.team}
-- Potential Win: {betDetails?.potentialWin} -
-No betting data available yet
-{data.name}
-- {data.value} bets ({percentage}%) -
-No betting data available yet
-{data.date}
-Bet #{data.betNumber}
-{data.game}
-No betting data available yet
-{data.sport}
-Total Bets: {data.totalBets}
-Won: {data.won}
-Lost: {data.lost}
-Pending: {data.pending}
-Win Rate: {data.winRate}%
-- {label} -
- - {/* Value */} -- {value} -
- - {/* Trend indicator */} - {trend !== null && trend !== undefined && ( - = 0 ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400'}`}> - {trend >= 0 ? '+' : ''}{trend}% - - )} -- We couldn't load your daily tasks. Please try again later. + We could not load your daily tasks. Please try again later.