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,84 @@
1
+ /**
2
+ * 🔥 Migration: Add Winner Announcement Columns to Chat
3
+ *
4
+ * Run this to add the epic winner announcement features!
5
+ */
6
+
7
+ const { Pool } = require('pg');
8
+
9
+ async function migrate() {
10
+ const pool = new Pool({
11
+ connectionString: process.env.DATABASE_URL,
12
+ ssl: process.env.DATABASE_URL ? { rejectUnauthorized: false } : false,
13
+ });
14
+
15
+ try {
16
+ console.log('🚀 Starting migration...');
17
+
18
+ // Add columns if they don't exist
19
+ await pool.query(`
20
+ DO $$
21
+ BEGIN
22
+ -- Add is_winner_announcement column
23
+ IF NOT EXISTS (
24
+ SELECT 1 FROM information_schema.columns
25
+ WHERE table_name = 'chat_messages'
26
+ AND column_name = 'is_winner_announcement'
27
+ ) THEN
28
+ ALTER TABLE chat_messages ADD COLUMN is_winner_announcement BOOLEAN DEFAULT FALSE;
29
+ RAISE NOTICE 'Added is_winner_announcement column';
30
+ END IF;
31
+
32
+ -- Add win_amount column
33
+ IF NOT EXISTS (
34
+ SELECT 1 FROM information_schema.columns
35
+ WHERE table_name = 'chat_messages'
36
+ AND column_name = 'win_amount'
37
+ ) THEN
38
+ ALTER TABLE chat_messages ADD COLUMN win_amount NUMERIC(20, 9);
39
+ RAISE NOTICE 'Added win_amount column';
40
+ END IF;
41
+
42
+ -- Add round_id column
43
+ IF NOT EXISTS (
44
+ SELECT 1 FROM information_schema.columns
45
+ WHERE table_name = 'chat_messages'
46
+ AND column_name = 'round_id'
47
+ ) THEN
48
+ ALTER TABLE chat_messages ADD COLUMN round_id INTEGER;
49
+ RAISE NOTICE 'Added round_id column';
50
+ END IF;
51
+ END $$;
52
+ `);
53
+
54
+ // Create index
55
+ await pool.query(`
56
+ CREATE INDEX IF NOT EXISTS idx_chat_winner ON chat_messages(is_winner_announcement);
57
+ `);
58
+
59
+ console.log('✅ Migration completed successfully!');
60
+ console.log('🔥 Winner announcements are now ready!');
61
+
62
+ // Test the structure
63
+ const result = await pool.query(`
64
+ SELECT column_name, data_type
65
+ FROM information_schema.columns
66
+ WHERE table_name = 'chat_messages'
67
+ ORDER BY ordinal_position;
68
+ `);
69
+
70
+ console.log('\n📊 Current table structure:');
71
+ result.rows.forEach(row => {
72
+ console.log(` ${row.column_name}: ${row.data_type}`);
73
+ });
74
+
75
+ await pool.end();
76
+ } catch (error) {
77
+ console.error('❌ Migration failed:', error);
78
+ await pool.end();
79
+ process.exit(1);
80
+ }
81
+ }
82
+
83
+ migrate();
84
+
@@ -0,0 +1,17 @@
1
+ #!/bin/bash
2
+
3
+ # 🔥 Migrate Chat Database for Winner Announcements
4
+
5
+ echo "🚀 Running migration on Heroku..."
6
+ echo ""
7
+
8
+ # Run the migration script on Heroku
9
+ heroku run node scripts/add-winner-columns.js
10
+
11
+ echo ""
12
+ echo "✅ Done! Winner announcements should now work!"
13
+ echo ""
14
+ echo "Next steps:"
15
+ echo " 1. Restart the server: heroku restart"
16
+ echo " 2. Check logs: heroku logs --tail"
17
+
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Migration Script: Add game_invite notification type
3
+ *
4
+ * This updates the database constraint to allow 'game_invite' notifications
5
+ */
6
+
7
+ const { Pool } = require('pg');
8
+
9
+ async function runMigration() {
10
+ const pool = new Pool({
11
+ connectionString: process.env.DATABASE_URL,
12
+ ssl: process.env.DATABASE_URL && (process.env.DATABASE_URL.includes('amazonaws') || process.env.DATABASE_URL.includes('heroku'))
13
+ ? { rejectUnauthorized: false }
14
+ : false
15
+ });
16
+
17
+ try {
18
+ console.log('🔄 Starting migration: Add game_invite notification type...');
19
+
20
+ // Drop old constraint
21
+ console.log('📝 Dropping old constraint...');
22
+ await pool.query(`
23
+ ALTER TABLE chat_notifications
24
+ DROP CONSTRAINT IF EXISTS chat_notifications_notification_type_check;
25
+ `);
26
+ console.log('✅ Old constraint dropped');
27
+
28
+ // Add new constraint with game_invite
29
+ console.log('📝 Adding new constraint with game_invite...');
30
+ await pool.query(`
31
+ ALTER TABLE chat_notifications
32
+ ADD CONSTRAINT chat_notifications_notification_type_check
33
+ CHECK (notification_type IN (
34
+ 'reply',
35
+ 'mention',
36
+ 'friend_message',
37
+ 'reaction',
38
+ 'friend_request',
39
+ 'friend_request_accepted',
40
+ 'friend_request_declined',
41
+ 'referral',
42
+ 'game_joined',
43
+ 'game_invite'
44
+ ));
45
+ `);
46
+ console.log('✅ New constraint added with game_invite');
47
+
48
+ // Verify the constraint
49
+ const verifyResult = await pool.query(`
50
+ SELECT constraint_name, check_clause
51
+ FROM information_schema.check_constraints
52
+ WHERE constraint_name = 'chat_notifications_notification_type_check';
53
+ `);
54
+
55
+ if (verifyResult.rows.length > 0) {
56
+ console.log('✅ Constraint verified:', verifyResult.rows[0].check_clause);
57
+ }
58
+
59
+ console.log('');
60
+ console.log('🎉 Migration completed successfully!');
61
+ console.log('✅ game_invite notification type is now available');
62
+ console.log('');
63
+
64
+ } catch (error) {
65
+ console.error('❌ Migration failed:', error.message);
66
+ console.error('Full error:', error);
67
+ process.exit(1);
68
+ } finally {
69
+ await pool.end();
70
+ }
71
+ }
72
+
73
+ // Run migration
74
+ runMigration();
75
+
76
+
77
+
78
+
79
+
80
+
81
+
82
+
83
+
@@ -0,0 +1,159 @@
1
+ #!/bin/bash
2
+
3
+ # ============================================
4
+ # 🔔 Add Game Start Notifications to Heroku
5
+ # ============================================
6
+ # This script updates the Heroku PostgreSQL database
7
+ # to support game_starting_soon and game_starting_now notifications
8
+ # Safe to run multiple times (idempotent)
9
+
10
+ set -e # Exit on error
11
+
12
+ # Colors for output
13
+ RED='\033[0;31m'
14
+ YELLOW='\033[1;33m'
15
+ GREEN='\033[0;32m'
16
+ BLUE='\033[0;34m'
17
+ NC='\033[0m' # No Color
18
+
19
+ echo "╔════════════════════════════════════════════════╗"
20
+ echo "║ 🔔 Game Start Notifications Migration 🔔 ║"
21
+ echo "╚════════════════════════════════════════════════╝"
22
+ echo ""
23
+
24
+ # Check for Heroku CLI
25
+ if ! command -v heroku &> /dev/null; then
26
+ echo -e "${RED}❌ Heroku CLI is not installed${NC}"
27
+ echo ""
28
+ echo "Install with:"
29
+ echo " brew tap heroku/brew && brew install heroku"
30
+ exit 1
31
+ fi
32
+
33
+ # Get app name from argument or use default
34
+ APP_NAME="${1:-dubs-server-dev}"
35
+
36
+ echo -e "${BLUE}Target Heroku App:${NC} $APP_NAME"
37
+ echo ""
38
+
39
+ # Verify app exists
40
+ echo "Verifying Heroku app access..."
41
+ if ! heroku apps:info --app $APP_NAME &> /dev/null; then
42
+ echo -e "${RED}❌ Cannot access Heroku app: $APP_NAME${NC}"
43
+ echo ""
44
+ echo "Available apps:"
45
+ heroku apps --team dubs || heroku apps
46
+ exit 1
47
+ fi
48
+
49
+ echo -e "${GREEN}✅ App access verified${NC}"
50
+ echo ""
51
+
52
+ # Check current constraint
53
+ echo "Checking current notification types..."
54
+ CURRENT_TYPES=$(heroku pg:psql --app $APP_NAME --command "
55
+ SELECT constraint_name
56
+ FROM information_schema.check_constraints
57
+ WHERE constraint_name = 'chat_notifications_notification_type_check'
58
+ LIMIT 1;" 2>/dev/null | grep -c "chat_notifications_notification_type_check" || echo "0")
59
+
60
+ if [ "$CURRENT_TYPES" -eq "0" ]; then
61
+ echo -e "${YELLOW}⚠️ Constraint not found - may be first-time setup${NC}"
62
+ else
63
+ echo -e "${GREEN}✅ Constraint exists${NC}"
64
+ fi
65
+ echo ""
66
+
67
+ # Show current database info
68
+ echo "Database information:"
69
+ heroku pg:info --app $APP_NAME | head -n 10
70
+ echo ""
71
+
72
+ # Confirmation
73
+ echo -e "${YELLOW}This will update the database constraint to add:${NC}"
74
+ echo " • game_starting_soon (⏰ 10 min before game)"
75
+ echo " • game_starting_now (🚨 when game starts)"
76
+ echo ""
77
+ read -p "Continue with migration? (y/N): " -n 1 -r
78
+ echo ""
79
+
80
+ if [[ ! $REPLY =~ ^[Yy]$ ]]; then
81
+ echo -e "${GREEN}✅ Cancelled. No changes made.${NC}"
82
+ exit 0
83
+ fi
84
+
85
+ echo ""
86
+ echo "🔄 Running migration..."
87
+ echo ""
88
+
89
+ # Run the migration SQL
90
+ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
91
+ SQL_FILE="$SCRIPT_DIR/add-game-start-notifications.sql"
92
+
93
+ if [ ! -f "$SQL_FILE" ]; then
94
+ echo -e "${RED}❌ Migration file not found: $SQL_FILE${NC}"
95
+ exit 1
96
+ fi
97
+
98
+ # Execute migration
99
+ heroku pg:psql --app $APP_NAME < "$SQL_FILE"
100
+
101
+ echo ""
102
+ echo -e "${GREEN}✅ Migration executed successfully!${NC}"
103
+ echo ""
104
+
105
+ # Verify the update
106
+ echo "Verifying updated constraint..."
107
+ heroku pg:psql --app $APP_NAME --command "
108
+ SELECT constraint_name,
109
+ CASE
110
+ WHEN check_clause LIKE '%game_starting_soon%' THEN '✅ Includes game_starting_soon'
111
+ ELSE '❌ Missing game_starting_soon'
112
+ END as soon_check,
113
+ CASE
114
+ WHEN check_clause LIKE '%game_starting_now%' THEN '✅ Includes game_starting_now'
115
+ ELSE '❌ Missing game_starting_now'
116
+ END as now_check
117
+ FROM information_schema.check_constraints
118
+ WHERE constraint_name = 'chat_notifications_notification_type_check';
119
+ " 2>/dev/null || echo "Verification completed"
120
+
121
+ echo ""
122
+ echo "╔════════════════════════════════════════════════╗"
123
+ echo "║ ✅ MIGRATION COMPLETE! ✅ ║"
124
+ echo "╚════════════════════════════════════════════════╝"
125
+ echo ""
126
+ echo "Database: $APP_NAME"
127
+ echo "Status: Updated"
128
+ echo "New notification types: game_starting_soon, game_starting_now"
129
+ echo ""
130
+ echo "📝 Next steps:"
131
+ echo " 1. Deploy updated code: git push heroku main"
132
+ echo " 2. Restart dynos: heroku restart --app $APP_NAME"
133
+ echo " 3. Test notifications with a game starting in ~15 minutes"
134
+ echo ""
135
+
136
+ # Show recent notifications as verification
137
+ echo "Recent notifications (if any):"
138
+ heroku pg:psql --app $APP_NAME --command "
139
+ SELECT
140
+ notification_type,
141
+ COUNT(*) as count
142
+ FROM chat_notifications
143
+ GROUP BY notification_type
144
+ ORDER BY count DESC
145
+ LIMIT 10;
146
+ " 2>/dev/null || echo "No notifications yet"
147
+
148
+ echo ""
149
+ echo -e "${GREEN}🎉 All done!${NC}"
150
+ echo ""
151
+
152
+
153
+
154
+
155
+
156
+
157
+
158
+
159
+