dubs-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/.claude/settings.local.json +280 -0
  2. package/CLAUDE.md +46 -0
  3. package/CONNECT4_PRODUCTION_DEPLOY.md +155 -0
  4. package/CURRENT_SESSION.md +171 -0
  5. package/CURRENT_SESSION_DRAW.md +516 -0
  6. package/MARCH_MADNESS_SURVIVOR.md +254 -0
  7. package/PANDA.md +166 -0
  8. package/Procfile +4 -0
  9. package/README.md +476 -0
  10. package/controllers/livescoresController.js +376 -0
  11. package/controllers/pickemController.js +554 -0
  12. package/controllers/survivorAdminController.js +887 -0
  13. package/controllers/survivorController.js +623 -0
  14. package/cron/oracleMonitor.js +77 -0
  15. package/cron/pickemOracleMonitor.js +73 -0
  16. package/data/jackpot-history.json +952 -0
  17. package/data/ncaaTeams.js +406 -0
  18. package/documentation/API_SECURITY_GUIDE.md +327 -0
  19. package/documentation/ARCADE_API.md +593 -0
  20. package/documentation/ARCADE_IMPLEMENTATION_SUMMARY.md +399 -0
  21. package/documentation/ARCADE_QUICKSTART.md +242 -0
  22. package/documentation/AUTOMATIC_MODE_ORACLE.md +321 -0
  23. package/documentation/BUG_FIX_COHORT_DATE_DISPLAY.md +171 -0
  24. package/documentation/CLAIM_MIGRATION_INSTRUCTIONS.md +52 -0
  25. package/documentation/CLAIM_STATUS_FIX.md +67 -0
  26. package/documentation/CLI_TOOL_GUIDE.md +372 -0
  27. package/documentation/COHORT_RETENTION_ANALYSIS.md +295 -0
  28. package/documentation/COHORT_RETENTION_IMPLEMENTATION_COMPLETE.md +461 -0
  29. package/documentation/COHORT_RETENTION_SUMMARY.md +204 -0
  30. package/documentation/COMPLETE_PROJECT_SUMMARY.md +490 -0
  31. package/documentation/DATABASE_QUERIES.md +269 -0
  32. package/documentation/DATABASE_RETENTION_POLICY.md +390 -0
  33. package/documentation/DATABASE_SETUP_GUIDE.md +361 -0
  34. package/documentation/DATABASE_SETUP_SUMMARY.md +247 -0
  35. package/documentation/DEMO_API_CURL_COMMANDS.md +656 -0
  36. package/documentation/DEPLOYMENT_SUMMARY.txt +100 -0
  37. package/documentation/DUPLICATE_NOTIFICATIONS_FIXED.md +201 -0
  38. package/documentation/EXCHANGE_RATES_INTEGRATION.md +371 -0
  39. package/documentation/FINAL_API_PROTECTION_TABLE.md +175 -0
  40. package/documentation/GAME_START_NOTIFICATIONS_DEPLOYMENT.md +256 -0
  41. package/documentation/GAME_START_NOTIFICATIONS_INTEGRATION.md +275 -0
  42. package/documentation/HEROKU_DEPLOYMENT.md +134 -0
  43. package/documentation/HEROKU_SCHEDULER_SETUP.md +271 -0
  44. package/documentation/JACKPOT_API.md +521 -0
  45. package/documentation/JACKPOT_DEPLOYMENT_GUIDE.md +362 -0
  46. package/documentation/JWT_IMPLEMENTATION_SUMMARY.md +373 -0
  47. package/documentation/JWT_QUICK_SETUP.md +268 -0
  48. package/documentation/JWT_TESTING_GUIDE.md +404 -0
  49. package/documentation/KEEPER_RECOVERY_GUIDE.md +381 -0
  50. package/documentation/KEEPER_SETUP.md +206 -0
  51. package/documentation/KEEPER_STATE_MACHINE.md +423 -0
  52. package/documentation/LATEST_PRODUCTION_SETUP.md +387 -0
  53. package/documentation/LOCAL_VOTING_TEST.md +279 -0
  54. package/documentation/ORACLE_FIXES_SUMMARY.md +188 -0
  55. package/documentation/ORACLE_POSTGRESQL_UPDATE.md +202 -0
  56. package/documentation/PAYMENT_DEPLOYMENT.md +209 -0
  57. package/documentation/PNL_TRACKING_SETUP.md +189 -0
  58. package/documentation/PREVENTING_LOCKUP_ERRORS.md +472 -0
  59. package/documentation/PRODUCTION_READY_SUMMARY.md +227 -0
  60. package/documentation/PUBLIC_VS_PRIVATE_ENDPOINTS.md +278 -0
  61. package/documentation/QUICK_AUTH_SETUP.md +99 -0
  62. package/documentation/QUICK_DEPLOY.md +224 -0
  63. package/documentation/QUICK_FIX.md +114 -0
  64. package/documentation/QUICK_START.md +152 -0
  65. package/documentation/REFEREE_MODE_GUIDE.md +392 -0
  66. package/documentation/RETENTION_CORE_ACTION_UPDATE.md +313 -0
  67. package/documentation/RETENTION_UPDATE_SUMMARY.md +108 -0
  68. package/documentation/RUN_MIGRATION_NOW.md +39 -0
  69. package/documentation/SCRIPTS_UPDATE_SUMMARY.md +251 -0
  70. package/documentation/SETUP_GUIDE.md +184 -0
  71. package/documentation/STATE_MACHINE_IMPLEMENTATION.md +250 -0
  72. package/documentation/TELEGRAM_NOTIFICATIONS_DIAGNOSIS.md +361 -0
  73. package/documentation/UNIFIED_ARCHITECTURE.md +231 -0
  74. package/documentation/VOTING_DEPLOYMENT_SUMMARY.md +392 -0
  75. package/documentation/WEBSOCKET_ARCHITECTURE.md +881 -0
  76. package/documentation/WHAT_WE_BUILT_TODAY.md +369 -0
  77. package/documentation/latest/LATEST_PRODUCTION_SETUP.md +865 -0
  78. package/ecosystem.config.js +65 -0
  79. package/env.template +125 -0
  80. package/middleware/apiKeyAuth.js +136 -0
  81. package/middleware/authenticate.js +214 -0
  82. package/middleware/developerUserAuth.js +76 -0
  83. package/middleware/socketAuth.js +69 -0
  84. package/package.json +49 -0
  85. package/postman/Dubs-API-v1-With-Voting.postman_collection.json +555 -0
  86. package/postman/Dubs-API-v1.postman_collection.json +205 -0
  87. package/postman/Dubs_Developer_API.postman_collection.json +662 -0
  88. package/postman/QUICKSTART.md +118 -0
  89. package/postman/QUICK_REFERENCE.md +246 -0
  90. package/postman/README.md +71 -0
  91. package/postman/VOTING_API_GUIDE.md +426 -0
  92. package/refactor/Animations.md +148 -0
  93. package/refactor/Chat.md +252 -0
  94. package/routes/actionsRoutes.js +699 -0
  95. package/routes/adminRoutes.js +370 -0
  96. package/routes/analyticsRoutes.js +1262 -0
  97. package/routes/arcadeRoutes.js +557 -0
  98. package/routes/authRoutes.js +2310 -0
  99. package/routes/avatarRoutes.js +85 -0
  100. package/routes/botRoutes.js +211 -0
  101. package/routes/chatRoutes.js +377 -0
  102. package/routes/cryptoPriceRoutes.js +105 -0
  103. package/routes/developerRoutes.js +4201 -0
  104. package/routes/deviceRoutes.js +214 -0
  105. package/routes/dmRoutes.js +167 -0
  106. package/routes/esportsRoutes.js +806 -0
  107. package/routes/exchangeRateRoutes.js +233 -0
  108. package/routes/gamesRoutes.js +3028 -0
  109. package/routes/jackpotRoutes.js +754 -0
  110. package/routes/keeperMonitoringRoutes.js +156 -0
  111. package/routes/keeperWebhookRoutes.js +466 -0
  112. package/routes/livescoresRoutes.js +31 -0
  113. package/routes/pickemAdminRoutes.js +199 -0
  114. package/routes/pickemRoutes.js +231 -0
  115. package/routes/playerStatsRoutes.js +147 -0
  116. package/routes/portfolioRoutes.js +217 -0
  117. package/routes/promoRoutes.js +418 -0
  118. package/routes/referralEarningsRoutes.js +392 -0
  119. package/routes/socialRoutes.js +459 -0
  120. package/routes/sportsRoutes.js +1271 -0
  121. package/routes/survivorAdminRoutes.js +345 -0
  122. package/routes/survivorRoutes.js +756 -0
  123. package/routes/uploadRoutes.js +256 -0
  124. package/routes/userProfileRoutes.js +244 -0
  125. package/routes/whatsNewRoutes.js +331 -0
  126. package/scripts/.claude/settings.local.json +15 -0
  127. package/scripts/README.md +170 -0
  128. package/scripts/RESTART_EVERYTHING.sh +104 -0
  129. package/scripts/add-claim-columns.sql +48 -0
  130. package/scripts/add-crypto-prices-cache.sql +27 -0
  131. package/scripts/add-exchange-rates-cache.sql +40 -0
  132. package/scripts/add-game-invite-column.sql +23 -0
  133. package/scripts/add-game-invite-notification.sql +33 -0
  134. package/scripts/add-game-invite-telegram-pref.sql +16 -0
  135. package/scripts/add-game-joined-notification.sql +16 -0
  136. package/scripts/add-game-joined-pref.js +40 -0
  137. package/scripts/add-game-joined-preference.sql +6 -0
  138. package/scripts/add-game-start-notifications.sql +41 -0
  139. package/scripts/add-notification-flags-to-games.sql +55 -0
  140. package/scripts/add-pending-game-dismissals.sql +19 -0
  141. package/scripts/add-preferred-currency.sql +34 -0
  142. package/scripts/add-winner-columns.js +61 -0
  143. package/scripts/add_mention_system.sql +53 -0
  144. package/scripts/add_payment_system.sql +96 -0
  145. package/scripts/add_sports_event_id_column.sql +22 -0
  146. package/scripts/analyze-cohort-data-heroku.js +276 -0
  147. package/scripts/analyze-cohort-data.js +295 -0
  148. package/scripts/analyze-prod-cohorts.sh +10 -0
  149. package/scripts/backfill-matchup-images.js +245 -0
  150. package/scripts/backfill-missing-signatures.js +175 -0
  151. package/scripts/backfill-referral-earnings.js +202 -0
  152. package/scripts/check-chat-schema.js +130 -0
  153. package/scripts/check-db.sh +14 -0
  154. package/scripts/check_oracle_in_game.js +54 -0
  155. package/scripts/cleanup-database.js +193 -0
  156. package/scripts/clear-notification-cache.js +85 -0
  157. package/scripts/convert-mnemonic.js +50 -0
  158. package/scripts/create-users-table.sql +44 -0
  159. package/scripts/debug-cohort-counts.js +248 -0
  160. package/scripts/debug-winner-calc.js +84 -0
  161. package/scripts/deploy-payment-system.sh +118 -0
  162. package/scripts/deploy-to-heroku.sh +63 -0
  163. package/scripts/diagnose-locked-round.js +143 -0
  164. package/scripts/dubs-cli.js +720 -0
  165. package/scripts/dump-account.js +65 -0
  166. package/scripts/find-vrf-offset.js +48 -0
  167. package/scripts/fix-chat-notifications-constraint.sql +122 -0
  168. package/scripts/fix-claim-columns.js +124 -0
  169. package/scripts/fix-constraint-now.js +44 -0
  170. package/scripts/fix-lock-timestamps.js +96 -0
  171. package/scripts/fix-locked-round.sh +126 -0
  172. package/scripts/fix-missing-badges.sql +91 -0
  173. package/scripts/fix-payment-notifications.sql +41 -0
  174. package/scripts/force-new-round.js +55 -0
  175. package/scripts/force-resolve-and-claim.js +278 -0
  176. package/scripts/important/README.md +115 -0
  177. package/scripts/important/authority-force-lock.js +197 -0
  178. package/scripts/important/authority-resolve-game.js +267 -0
  179. package/scripts/important/check-game-status.js +373 -0
  180. package/scripts/important/list-pending-games-by-version.js +270 -0
  181. package/scripts/important/reconcile-v1-v2-payouts.js +270 -0
  182. package/scripts/initialize-jackpot.js +111 -0
  183. package/scripts/jackpot/.claude/settings.local.json +10 -0
  184. package/scripts/jackpot/force-reset.js +84 -0
  185. package/scripts/jackpot/initialize-mainnet.js +100 -0
  186. package/scripts/jackpot/keeper.js +742 -0
  187. package/scripts/jackpot/status.js +107 -0
  188. package/scripts/jackpot/update-round-duration.js +143 -0
  189. package/scripts/keeper-bot.js +112 -0
  190. package/scripts/list-pending-games.js +131 -0
  191. package/scripts/migrate-chat-v2.js +127 -0
  192. package/scripts/migrate-chat-winners.js +84 -0
  193. package/scripts/migrate-chat.sh +17 -0
  194. package/scripts/migrate-game-invite.js +83 -0
  195. package/scripts/migrate-heroku-game-notifications.sh +159 -0
  196. package/scripts/migrations/001_analytics_tables.sql +422 -0
  197. package/scripts/migrations/002_add_matchup_image_url.sql +14 -0
  198. package/scripts/migrations/003_referral_earnings.sql +208 -0
  199. package/scripts/migrations/004_add_whats_new_notification_type.sql +62 -0
  200. package/scripts/migrations/005_add_connect4_your_turn_notification.sql +61 -0
  201. package/scripts/migrations/005_push_notifications.sql +55 -0
  202. package/scripts/migrations/006_add_draw_team_players.sql +28 -0
  203. package/scripts/migrations/006_add_game_cancelled_notification.sql +62 -0
  204. package/scripts/migrations/007_add_gif_url.sql +8 -0
  205. package/scripts/migrations/008_add_connect4_columns.sql +139 -0
  206. package/scripts/migrations/008_add_pool_tracking.sql +22 -0
  207. package/scripts/migrations/009_create_survivor_pool_tables.sql +174 -0
  208. package/scripts/migrations/010_add_survivor_pool_outcome.sql +28 -0
  209. package/scripts/migrations/011_create_developer_tables.sql +67 -0
  210. package/scripts/migrations/011_fix_keeper_tables.sql +85 -0
  211. package/scripts/migrations/012_create_developer_webhooks.sql +31 -0
  212. package/scripts/migrations/013_add_network_mode.sql +18 -0
  213. package/scripts/migrations/014_create_developer_app_users.sql +19 -0
  214. package/scripts/migrations/015_add_ui_config.sql +4 -0
  215. package/scripts/migrations/016_add_resolution_secret.sql +4 -0
  216. package/scripts/migrations/017_add_external_game_id.sql +3 -0
  217. package/scripts/migrations/018_create_pickem_tables.sql +115 -0
  218. package/scripts/migrations/019_expo_push_tokens.sql +19 -0
  219. package/scripts/migrations/create_whats_new_tables.sql +88 -0
  220. package/scripts/migrations/drop_live_games_tables.sql +34 -0
  221. package/scripts/open-jackpot-round.js +85 -0
  222. package/scripts/purge-all-data.sh +329 -0
  223. package/scripts/purge-all-data.sql +142 -0
  224. package/scripts/purge-heroku-data.sh +149 -0
  225. package/scripts/purge-heroku-data.sql +62 -0
  226. package/scripts/rebuild-heroku-database.sh +113 -0
  227. package/scripts/recover-funds.js +357 -0
  228. package/scripts/regenerate-epl-images.js +278 -0
  229. package/scripts/resize-s3-matchup-images.js +374 -0
  230. package/scripts/resolve-direct.js +88 -0
  231. package/scripts/resolve-mock-game.js +124 -0
  232. package/scripts/resolve-pickem-game.js +55 -0
  233. package/scripts/resolve-round-manual.js +83 -0
  234. package/scripts/resolve-stuck-game.js +382 -0
  235. package/scripts/resolve-stuck-round.js +42 -0
  236. package/scripts/run-connect4-migration.sh +16 -0
  237. package/scripts/run-mention-migration.sh +32 -0
  238. package/scripts/run-payment-migration.sh +51 -0
  239. package/scripts/run-preferred-currency-migration.sh +31 -0
  240. package/scripts/run-referral-earnings-migration.sh +32 -0
  241. package/scripts/run-survivor-outcome-migration.sh +16 -0
  242. package/scripts/seed-test-users.js +346 -0
  243. package/scripts/setup-auth-tables.js +78 -0
  244. package/scripts/setup-complete-database.sql +992 -0
  245. package/scripts/setup-database-fresh.sh +359 -0
  246. package/scripts/setup-heroku-keeper.sh +48 -0
  247. package/scripts/setup-keeper-database.js +83 -0
  248. package/scripts/setup-keeper-state-db.sql +110 -0
  249. package/scripts/setup-oracle.sh +39 -0
  250. package/scripts/setup-pnl-tracking.js +111 -0
  251. package/scripts/start-devnet.sh +14 -0
  252. package/scripts/test-arcade-devnet.sh +160 -0
  253. package/scripts/test-arcade-match.sh +109 -0
  254. package/scripts/test-automatic-mode.sh +239 -0
  255. package/scripts/test-connect4-cancel-claim.js +370 -0
  256. package/scripts/test-connect4-e2e.js +369 -0
  257. package/scripts/test-connect4-resolve.js +369 -0
  258. package/scripts/test-game-state-endpoint.js +136 -0
  259. package/scripts/test-invite-notification.js +86 -0
  260. package/scripts/test-jackpot-api.sh +71 -0
  261. package/scripts/test-poll-confirmation.js +267 -0
  262. package/scripts/test-resolve-game.js +271 -0
  263. package/scripts/test-resolve-signature.js +223 -0
  264. package/scripts/test-signature-preservation.js +124 -0
  265. package/scripts/test-state-machine.js +291 -0
  266. package/scripts/test-webhook-receiver.js +60 -0
  267. package/scripts/update-notification-constraint.js +52 -0
  268. package/scripts/verify-account-layout.js +145 -0
  269. package/scripts/verify-winner-algorithm.js +278 -0
  270. package/server.js +5259 -0
  271. package/services/arcadeMatchService.js +763 -0
  272. package/services/automaticGameOracle.js +1596 -0
  273. package/services/chatService.js +1612 -0
  274. package/services/connect4GameService.js +1049 -0
  275. package/services/connect4NotificationService.js +374 -0
  276. package/services/cryptoPriceService.js +223 -0
  277. package/services/customGameResolver.js +260 -0
  278. package/services/db.js +79 -0
  279. package/services/directMessageService.js +389 -0
  280. package/services/discordNotifications.js +160 -0
  281. package/services/exchangeRateService.js +289 -0
  282. package/services/expoPushService.js +314 -0
  283. package/services/gamesCacheService.js +539 -0
  284. package/services/jackpotHistory.js +331 -0
  285. package/services/jackpotService.js +856 -0
  286. package/services/keeperStateService.js +355 -0
  287. package/services/matchupImageService.js +591 -0
  288. package/services/notificationCacheService.js +407 -0
  289. package/services/pickemOracle.js +440 -0
  290. package/services/playerStatsService.js +389 -0
  291. package/services/portfolioService.js +555 -0
  292. package/services/promoService.js +757 -0
  293. package/services/promoTreasuryService.js +239 -0
  294. package/services/pushNotifications.js +353 -0
  295. package/services/redisService.js +422 -0
  296. package/services/referralEarningsService.js +728 -0
  297. package/services/s3Service.js +396 -0
  298. package/services/socialService.js +1202 -0
  299. package/services/survivorOracle.js +469 -0
  300. package/services/survivorSimulator.js +475 -0
  301. package/services/telegramNotifications.js +461 -0
  302. package/services/userProfileStatsService.js +1185 -0
  303. package/services/whatsNewService.js +388 -0
  304. package/utils/urlHelper.js +95 -0
@@ -0,0 +1,108 @@
1
+ # ✅ Retention Metric Update - Your Friend Was Right!
2
+
3
+ ## 🎯 What Changed
4
+
5
+ **Before:**
6
+ - User counted as "retained" if they did **anything** (opened app, viewed page, etc.)
7
+ - **Problem:** Inflated numbers, didn't reflect real engagement
8
+
9
+ **After:**
10
+ - User counted as "retained" **ONLY if they placed a bet**
11
+ - **Benefit:** Accurate business metrics tied to revenue
12
+
13
+ ---
14
+
15
+ ## 📊 What "Retained" Now Means
16
+
17
+ A user is **ONLY** retained if they:
18
+
19
+ ✅ **Created a sports bet** (`bet_creation_completed`)
20
+ ✅ **Joined a sports bet** (`join_game_completed`)
21
+ ✅ **Created a pool game** (`billiards_create_completed`)
22
+ ✅ **Joined a pool game** (`billiards_join_completed`)
23
+
24
+ ❌ **NOT counted:**
25
+ - Just opened the app
26
+ - Viewed pages
27
+ - Sent chat messages
28
+ - Browsed games without betting
29
+
30
+ ---
31
+
32
+ ## 💡 Why This Matters
33
+
34
+ ### Example:
35
+
36
+ **10 users sign up. On Day 1:**
37
+ - 8 users open the app and look around
38
+ - 3 users actually place bets
39
+
40
+ **Old System:**
41
+ - D1 Retention = 80% ❌ (Misleading!)
42
+
43
+ **New System:**
44
+ - D1 Retention = 30% ✅ (Accurate!)
45
+
46
+ ---
47
+
48
+ ## 📉 Expected Impact on Your Numbers
49
+
50
+ Your retention percentages **will drop**, but they'll be **more accurate**:
51
+
52
+ | Metric | Typical Change |
53
+ |--------|---------------|
54
+ | D1 | Drop by 10-20% |
55
+ | D7 | Drop by 8-15% |
56
+ | D14 | Drop by 5-10% |
57
+ | D30 | Drop by 5-8% |
58
+
59
+ **This is GOOD!** Lower but accurate > Higher but misleading.
60
+
61
+ ---
62
+
63
+ ## 🎓 New Benchmarks (Bet-Based Retention)
64
+
65
+ | Metric | Poor | Average | Good | Excellent |
66
+ |--------|------|---------|------|-----------|
67
+ | **D1** | <20% | 20-30% | 30-45% | 45%+ |
68
+ | **D7** | <10% | 10-20% | 20-30% | 30%+ |
69
+ | **D14** | <8% | 8-15% | 15-25% | 25%+ |
70
+ | **D30** | <5% | 5-12% | 12-20% | 20%+ |
71
+
72
+ ---
73
+
74
+ ## 🚀 What to Tell Your Community Manager
75
+
76
+ > "We updated retention to only count users who actually place bets, not just open the app. This is the industry standard for gaming apps and gives us more accurate data. Numbers may look lower, but they now reflect real user engagement and revenue."
77
+
78
+ ---
79
+
80
+ ## 📁 Files Changed
81
+
82
+ ✅ **Backend:** `routes/analyticsRoutes.js`
83
+ ✅ **Frontend:** `app/v2/components/overlay/AnalyticsDashboard.tsx`
84
+ ✅ **Docs:** `documentation/RETENTION_CORE_ACTION_UPDATE.md`
85
+
86
+ ---
87
+
88
+ ## 🔧 Deploy
89
+
90
+ ```bash
91
+ # Backend
92
+ cd /Users/adamdahan/Developer/iheartsolana/solana-programs/dubs-server
93
+ git add .
94
+ git commit -m "feat: Update retention to core action (bets only)"
95
+ git push heroku-dev main
96
+
97
+ # Frontend
98
+ cd /Users/adamdahan/Developer/iheartsolana/dubs-jackpot-spa
99
+ git add .
100
+ git commit -m "feat: Update retention tooltip to clarify bet-based tracking"
101
+ git push origin main
102
+ ```
103
+
104
+ ---
105
+
106
+ **Your friend was 100% correct!** This is now aligned with industry best practices. 🎉
107
+
108
+
@@ -0,0 +1,39 @@
1
+ # 🚨 URGENT: Run This Migration Now!
2
+
3
+ The claim functionality is broken because the database is missing columns.
4
+
5
+ ## Quick Fix (Run This Command):
6
+
7
+ ```bash
8
+ heroku pg:psql --app dubs-server-dev <<EOF
9
+ ALTER TABLE user_game_refs ADD COLUMN IF NOT EXISTS claimed_at TIMESTAMP;
10
+ ALTER TABLE user_game_refs ADD COLUMN IF NOT EXISTS claim_signature TEXT;
11
+ ALTER TABLE user_game_refs ADD COLUMN IF NOT EXISTS claim_explorer_url TEXT;
12
+ ALTER TABLE user_game_refs ADD COLUMN IF NOT EXISTS amount_claimed NUMERIC(20, 9);
13
+ ALTER TABLE user_game_refs ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP DEFAULT NOW();
14
+ EOF
15
+ ```
16
+
17
+ ## Or Run The Migration Script:
18
+
19
+ ```bash
20
+ cd /Users/adamdahan/Developer/iheartsolana/solana-programs/dubs-server
21
+ heroku pg:psql --app dubs-server-dev < scripts/add-claim-columns.sql
22
+ ```
23
+
24
+ ## Verify It Worked:
25
+
26
+ ```bash
27
+ heroku pg:psql --app dubs-server-dev --command "\d user_game_refs"
28
+ ```
29
+
30
+ You should see the new columns listed.
31
+
32
+ ## After Migration:
33
+
34
+ - ✅ Claiming will work
35
+ - ✅ No more 500 errors
36
+ - ✅ Real-time claim updates will work
37
+
38
+ **This takes 5 seconds to run - do it now!** 🚀
39
+
@@ -0,0 +1,251 @@
1
+ # Database Scripts - Game Start Notifications Update
2
+
3
+ ## 📋 Summary
4
+
5
+ All database setup and migration scripts have been updated to include the new game start notification types: `game_starting_soon` and `game_starting_now`.
6
+
7
+ ## ✅ Scripts Updated
8
+
9
+ ### 1. **setup-complete-database.sql** ✅ UPDATED
10
+ **Location**: `/scripts/setup-complete-database.sql`
11
+
12
+ **Change**: Updated `chat_notifications` table constraint to include new notification types.
13
+
14
+ ```sql
15
+ -- OLD:
16
+ notification_type VARCHAR(30) NOT NULL CHECK (notification_type IN ('reply', 'mention', 'friend_message', 'reaction', 'friend_request', 'friend_request_accepted', 'friend_request_declined', 'referral', 'game_joined', 'game_invite'))
17
+
18
+ -- NEW:
19
+ notification_type VARCHAR(30) NOT NULL CHECK (notification_type IN ('reply', 'mention', 'friend_message', 'reaction', 'friend_request', 'friend_request_accepted', 'friend_request_declined', 'referral', 'game_joined', 'game_invite', 'game_starting_soon', 'game_starting_now'))
20
+ ```
21
+
22
+ **Impact**: All fresh database installations will include the new types.
23
+
24
+ ---
25
+
26
+ ### 2. **add-game-start-notifications.sql** ✅ NEW
27
+ **Location**: `/scripts/add-game-start-notifications.sql`
28
+
29
+ **Purpose**: Migration script to add new notification types to existing databases.
30
+
31
+ **Usage**:
32
+ ```bash
33
+ # Local database
34
+ psql $DATABASE_URL -f scripts/add-game-start-notifications.sql
35
+
36
+ # Heroku database
37
+ heroku pg:psql --app dubs-server-dev < scripts/add-game-start-notifications.sql
38
+ ```
39
+
40
+ **Safe**: Can be run multiple times (idempotent).
41
+
42
+ ---
43
+
44
+ ### 3. **migrate-heroku-game-notifications.sh** ✅ NEW
45
+ **Location**: `/scripts/migrate-heroku-game-notifications.sh`
46
+
47
+ **Purpose**: Interactive script to safely migrate Heroku databases.
48
+
49
+ **Features**:
50
+ - Checks Heroku CLI installation
51
+ - Verifies app access
52
+ - Shows current database state
53
+ - Requires confirmation before running
54
+ - Verifies successful migration
55
+ - Shows helpful next steps
56
+
57
+ **Usage**:
58
+ ```bash
59
+ # Default (dubs-server-dev)
60
+ ./scripts/migrate-heroku-game-notifications.sh
61
+
62
+ # Specific app
63
+ ./scripts/migrate-heroku-game-notifications.sh your-app-name
64
+ ```
65
+
66
+ **Status**: Executable (`chmod +x` already applied)
67
+
68
+ ---
69
+
70
+ ## 🔍 Scripts Reviewed (No Changes Needed)
71
+
72
+ ### **purge-all-data.sh** ✅ NO CHANGE NEEDED
73
+ **Reason**: Only truncates data, doesn't define constraints.
74
+
75
+ ### **purge-all-data.sql** ✅ NO CHANGE NEEDED
76
+ **Reason**: Only truncates data, doesn't define constraints.
77
+
78
+ ### **purge-heroku-data.sh** ✅ NO CHANGE NEEDED
79
+ **Reason**: Only truncates data, doesn't define constraints.
80
+
81
+ ### **purge-heroku-data.sql** ✅ NO CHANGE NEEDED
82
+ **Reason**: Only truncates data, doesn't define constraints.
83
+
84
+ ### **setup-database-fresh.sh** ✅ NO CHANGE NEEDED
85
+ **Reason**: Calls `setup-complete-database.sql` which was already updated.
86
+
87
+ ---
88
+
89
+ ## 🎯 Migration Status by Environment
90
+
91
+ ### ✅ Heroku Production (dubs-server-dev)
92
+ - **Status**: MIGRATED ✅
93
+ - **Date**: November 29, 2025
94
+ - **Database**: postgresql-colorful-22525
95
+ - **Method**: Direct SQL via `heroku pg:psql`
96
+ - **Verification**: Constraint verified to include both new types
97
+
98
+ ### ⏳ Heroku Other Environments
99
+ If you have other Heroku instances (staging, production, etc.), migrate them using:
100
+
101
+ ```bash
102
+ ./scripts/migrate-heroku-game-notifications.sh your-app-name
103
+ ```
104
+
105
+ ### ✅ Local Development
106
+ - **Status**: AUTO-MIGRATES ✅
107
+ - **Method**: `chatService.js` automatically updates constraint on server start
108
+ - **Alternative**: Run migration script manually if needed
109
+
110
+ ---
111
+
112
+ ## 📊 Database Schema Impact
113
+
114
+ ### Affected Table
115
+ ```sql
116
+ chat_notifications
117
+ ├── id (PRIMARY KEY)
118
+ ├── user_id (FK to users)
119
+ ├── message_id (FK to chat_messages)
120
+ ├── sender_user_id (FK to users)
121
+ ├── notification_type ⭐ UPDATED CONSTRAINT
122
+ ├── notification_data (JSONB)
123
+ ├── read (BOOLEAN)
124
+ └── created_at (TIMESTAMP)
125
+ ```
126
+
127
+ ### New Constraint Values
128
+ - ✅ `game_starting_soon` - Sent 10 minutes before game lock time
129
+ - ✅ `game_starting_now` - Sent when game lock time passes
130
+
131
+ ### Total Notification Types
132
+ **12 types total**:
133
+ 1. reply
134
+ 2. mention
135
+ 3. friend_message
136
+ 4. reaction
137
+ 5. friend_request
138
+ 6. friend_request_accepted
139
+ 7. friend_request_declined
140
+ 8. referral
141
+ 9. game_joined
142
+ 10. game_invite
143
+ 11. game_starting_soon ⭐ NEW
144
+ 12. game_starting_now ⭐ NEW
145
+
146
+ ---
147
+
148
+ ## 🚀 Deployment Checklist
149
+
150
+ ### For New Heroku Instances
151
+ - [ ] Use `setup-complete-database.sql` (already includes new types)
152
+ - [ ] No migration needed - constraint is current
153
+
154
+ ### For Existing Heroku Instances
155
+ - [x] dubs-server-dev: Migrated ✅
156
+ - [ ] Run migration script on any other instances:
157
+ ```bash
158
+ ./scripts/migrate-heroku-game-notifications.sh app-name
159
+ ```
160
+
161
+ ### For Local Development
162
+ - [x] Updated `setup-complete-database.sql`
163
+ - [x] Auto-migration via `chatService.js` on next server start
164
+ - [ ] Or manually run: `psql $DATABASE_URL -f scripts/add-game-start-notifications.sql`
165
+
166
+ ### For Testing
167
+ - [ ] Create a test game starting in 15 minutes
168
+ - [ ] Join the game with test account
169
+ - [ ] Verify notification at 10 min mark
170
+ - [ ] Verify notification at lock time
171
+
172
+ ---
173
+
174
+ ## 📝 Related Files
175
+
176
+ ### Backend Code
177
+ - `services/chatService.js` - Auto-migration logic
178
+ - `services/automaticGameOracle.js` - Notification sender
179
+ - `routes/gamesRoutes.js` - Notification endpoint
180
+
181
+ ### Migration Scripts
182
+ - ✅ `scripts/setup-complete-database.sql` - Updated
183
+ - ✅ `scripts/add-game-start-notifications.sql` - New
184
+ - ✅ `scripts/migrate-heroku-game-notifications.sh` - New
185
+
186
+ ### Documentation
187
+ - `GAME_START_NOTIFICATIONS_INTEGRATION.md` - Technical docs
188
+ - `GAME_START_NOTIFICATIONS_DEPLOYMENT.md` - Deployment guide
189
+ - `DEPLOYMENT_SUMMARY.txt` - Quick reference
190
+
191
+ ---
192
+
193
+ ## ⚠️ Important Notes
194
+
195
+ 1. **Backwards Compatible**: Old notification types still work exactly as before
196
+ 2. **Safe to Re-run**: All migration scripts are idempotent
197
+ 3. **No Data Loss**: Only the constraint is updated, no data is deleted
198
+ 4. **Production Ready**: Already tested on dubs-server-dev
199
+ 5. **Automatic Updates**: `chatService.js` will auto-migrate local databases
200
+
201
+ ---
202
+
203
+ ## 🆘 Troubleshooting
204
+
205
+ ### Migration Fails on Heroku
206
+ ```bash
207
+ # Check database status
208
+ heroku pg:info --app dubs-server-dev
209
+
210
+ # Try manual migration
211
+ heroku pg:psql --app dubs-server-dev < scripts/add-game-start-notifications.sql
212
+
213
+ # Verify constraint
214
+ heroku pg:psql --app dubs-server-dev --command "
215
+ SELECT constraint_name, check_clause
216
+ FROM information_schema.check_constraints
217
+ WHERE constraint_name = 'chat_notifications_notification_type_check';
218
+ "
219
+ ```
220
+
221
+ ### Local Database Issues
222
+ ```bash
223
+ # Check if PostgreSQL is running
224
+ pg_isready
225
+
226
+ # Start PostgreSQL
227
+ brew services start postgresql@14
228
+
229
+ # Run migration manually
230
+ psql $DATABASE_URL -f scripts/add-game-start-notifications.sql
231
+ ```
232
+
233
+ ### Constraint Already Exists Error
234
+ This is fine! The migration script is designed to:
235
+ 1. Drop existing constraint
236
+ 2. Add new constraint with updated types
237
+ 3. Safe to run multiple times
238
+
239
+ ---
240
+
241
+ **Last Updated**: November 29, 2025
242
+ **Status**: ✅ All Scripts Updated
243
+ **Heroku Status**: ✅ dubs-server-dev Migrated
244
+ **Ready for**: Production Deployment
245
+
246
+
247
+
248
+
249
+
250
+
251
+
@@ -0,0 +1,184 @@
1
+ # 🎮 DUBS Server Setup Guide
2
+
3
+ Quick setup guide for getting the DUBS server running with all required database tables.
4
+
5
+ ## Prerequisites
6
+
7
+ - macOS with Homebrew
8
+ - Node.js 16+ and npm
9
+ - PostgreSQL 14+
10
+
11
+ ## Quick Start (5 minutes)
12
+
13
+ ### Step 1: Install PostgreSQL
14
+
15
+ ```bash
16
+ # Install PostgreSQL via Homebrew
17
+ brew install postgresql@14
18
+
19
+ # Start PostgreSQL service
20
+ brew services start postgresql@14
21
+
22
+ # Verify it's running
23
+ pg_isready
24
+ ```
25
+
26
+ ### Step 2: Clone and Navigate
27
+
28
+ ```bash
29
+ cd /path/to/dubs-server
30
+ ```
31
+
32
+ ### Step 3: Run Database Setup
33
+
34
+ The setup script now includes **all** required tables (including `live_games`):
35
+
36
+ ```bash
37
+ # Make script executable
38
+ chmod +x scripts/setup-database-fresh.sh
39
+
40
+ # Run the complete setup
41
+ ./scripts/setup-database-fresh.sh
42
+ ```
43
+
44
+ This script will:
45
+ - ✅ Check PostgreSQL is running
46
+ - ✅ Create `dubs_db` database
47
+ - ✅ Create all base tables (users, games, chat, etc.)
48
+ - ✅ Create live_games tables (sports betting)
49
+ - ✅ Setup `.env` file with database connection
50
+ - ✅ Create indexes and views
51
+
52
+ ### Step 4: Install Dependencies
53
+
54
+ ```bash
55
+ npm install
56
+ ```
57
+
58
+ ### Step 5: Start the Server
59
+
60
+ ```bash
61
+ npm start
62
+ ```
63
+
64
+ Server should start on `http://localhost:3001` ✅
65
+
66
+ ## Verify Setup
67
+
68
+ Test the server is running:
69
+
70
+ ```bash
71
+ # Check health endpoint
72
+ curl http://localhost:3001/health
73
+
74
+ # Check database connection
75
+ psql -d dubs_db -c "SELECT COUNT(*) FROM users"
76
+ ```
77
+
78
+ ## Troubleshooting
79
+
80
+ ### Error: "live_games relation does not exist"
81
+
82
+ If you ran the old setup script, manually add the live_games tables:
83
+
84
+ ```bash
85
+ psql -d dubs_db -f scripts/create_live_games_tables.sql
86
+ ```
87
+
88
+ ### Error: "PostgreSQL is not running"
89
+
90
+ ```bash
91
+ # Check PostgreSQL status
92
+ brew services list
93
+
94
+ # Restart PostgreSQL
95
+ brew services restart postgresql@14
96
+ ```
97
+
98
+ ### Error: "Database already exists"
99
+
100
+ The script will ask if you want to drop and recreate it:
101
+ - Enter `y` to start fresh (⚠️ deletes all data)
102
+ - Enter `n` to keep existing data and update schema
103
+
104
+ ### Port 3001 already in use
105
+
106
+ ```bash
107
+ # Find and kill the process
108
+ lsof -ti:3001 | xargs kill -9
109
+ ```
110
+
111
+ ## Database Tables Created
112
+
113
+ **Base Tables:**
114
+ - `users` - User accounts
115
+ - `auth_nonces` - Authentication nonces
116
+ - `user_sessions` - JWT sessions
117
+ - `games` - Game metadata
118
+ - `user_game_refs` - User-game relationships
119
+ - `chat_messages` - Chat system
120
+ - `chat_reactions` - Message reactions
121
+ - `chat_payments` - SOL payments
122
+ - `player_stats` - Player statistics
123
+ - `jackpot_rounds` - Jackpot history
124
+
125
+ **Live Sports Tables:**
126
+ - `live_games` - Sports game metadata
127
+ - `live_game_plays` - Play-by-play events
128
+ - `live_game_stats` - Team statistics
129
+ - `live_game_subscriptions` - WebSocket subscriptions
130
+ - `live_game_polling_log` - API polling logs
131
+
132
+ ## Next Steps
133
+
134
+ 1. **Configure Environment Variables** (optional)
135
+ - Edit `.env` if you need custom settings
136
+ - Default settings work for local development
137
+
138
+ 2. **Test API Endpoints**
139
+ ```bash
140
+ # Get nonce for authentication
141
+ curl http://localhost:3001/auth/nonce/YOUR_WALLET_ADDRESS
142
+
143
+ # Get sports events
144
+ curl http://localhost:3001/api/sports/events/NBA
145
+ ```
146
+
147
+ 3. **Start the Frontend** (dubs-jackpot)
148
+ ```bash
149
+ cd /path/to/dubs-jackpot
150
+ npm install
151
+ npm run dev
152
+ # Visit http://localhost:3000/v2
153
+ ```
154
+
155
+ ## Production Deployment
156
+
157
+ For production deployment to Heroku:
158
+
159
+ ```bash
160
+ # Deploy to Heroku
161
+ ./scripts/deploy-to-heroku.sh
162
+
163
+ # Setup database on Heroku
164
+ heroku pg:psql -a your-app-name < scripts/setup-complete-database.sql
165
+ heroku pg:psql -a your-app-name < scripts/create_live_games_tables.sql
166
+ ```
167
+
168
+ ## Support
169
+
170
+ If you encounter issues:
171
+ 1. Check the logs: `tail -f logs/server.log`
172
+ 2. Verify PostgreSQL is running: `pg_isready`
173
+ 3. Check database tables: `psql -d dubs_db -c '\dt'`
174
+ 4. Restart everything: `./scripts/RESTART_EVERYTHING.sh`
175
+
176
+ ---
177
+
178
+ **✨ Happy Coding!**
179
+
180
+
181
+
182
+
183
+
184
+