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.
- package/.claude/settings.local.json +280 -0
- package/CLAUDE.md +46 -0
- package/CONNECT4_PRODUCTION_DEPLOY.md +155 -0
- package/CURRENT_SESSION.md +171 -0
- package/CURRENT_SESSION_DRAW.md +516 -0
- package/MARCH_MADNESS_SURVIVOR.md +254 -0
- package/PANDA.md +166 -0
- package/Procfile +4 -0
- package/README.md +476 -0
- package/controllers/livescoresController.js +376 -0
- package/controllers/pickemController.js +554 -0
- package/controllers/survivorAdminController.js +887 -0
- package/controllers/survivorController.js +623 -0
- package/cron/oracleMonitor.js +77 -0
- package/cron/pickemOracleMonitor.js +73 -0
- package/data/jackpot-history.json +952 -0
- package/data/ncaaTeams.js +406 -0
- package/documentation/API_SECURITY_GUIDE.md +327 -0
- package/documentation/ARCADE_API.md +593 -0
- package/documentation/ARCADE_IMPLEMENTATION_SUMMARY.md +399 -0
- package/documentation/ARCADE_QUICKSTART.md +242 -0
- package/documentation/AUTOMATIC_MODE_ORACLE.md +321 -0
- package/documentation/BUG_FIX_COHORT_DATE_DISPLAY.md +171 -0
- package/documentation/CLAIM_MIGRATION_INSTRUCTIONS.md +52 -0
- package/documentation/CLAIM_STATUS_FIX.md +67 -0
- package/documentation/CLI_TOOL_GUIDE.md +372 -0
- package/documentation/COHORT_RETENTION_ANALYSIS.md +295 -0
- package/documentation/COHORT_RETENTION_IMPLEMENTATION_COMPLETE.md +461 -0
- package/documentation/COHORT_RETENTION_SUMMARY.md +204 -0
- package/documentation/COMPLETE_PROJECT_SUMMARY.md +490 -0
- package/documentation/DATABASE_QUERIES.md +269 -0
- package/documentation/DATABASE_RETENTION_POLICY.md +390 -0
- package/documentation/DATABASE_SETUP_GUIDE.md +361 -0
- package/documentation/DATABASE_SETUP_SUMMARY.md +247 -0
- package/documentation/DEMO_API_CURL_COMMANDS.md +656 -0
- package/documentation/DEPLOYMENT_SUMMARY.txt +100 -0
- package/documentation/DUPLICATE_NOTIFICATIONS_FIXED.md +201 -0
- package/documentation/EXCHANGE_RATES_INTEGRATION.md +371 -0
- package/documentation/FINAL_API_PROTECTION_TABLE.md +175 -0
- package/documentation/GAME_START_NOTIFICATIONS_DEPLOYMENT.md +256 -0
- package/documentation/GAME_START_NOTIFICATIONS_INTEGRATION.md +275 -0
- package/documentation/HEROKU_DEPLOYMENT.md +134 -0
- package/documentation/HEROKU_SCHEDULER_SETUP.md +271 -0
- package/documentation/JACKPOT_API.md +521 -0
- package/documentation/JACKPOT_DEPLOYMENT_GUIDE.md +362 -0
- package/documentation/JWT_IMPLEMENTATION_SUMMARY.md +373 -0
- package/documentation/JWT_QUICK_SETUP.md +268 -0
- package/documentation/JWT_TESTING_GUIDE.md +404 -0
- package/documentation/KEEPER_RECOVERY_GUIDE.md +381 -0
- package/documentation/KEEPER_SETUP.md +206 -0
- package/documentation/KEEPER_STATE_MACHINE.md +423 -0
- package/documentation/LATEST_PRODUCTION_SETUP.md +387 -0
- package/documentation/LOCAL_VOTING_TEST.md +279 -0
- package/documentation/ORACLE_FIXES_SUMMARY.md +188 -0
- package/documentation/ORACLE_POSTGRESQL_UPDATE.md +202 -0
- package/documentation/PAYMENT_DEPLOYMENT.md +209 -0
- package/documentation/PNL_TRACKING_SETUP.md +189 -0
- package/documentation/PREVENTING_LOCKUP_ERRORS.md +472 -0
- package/documentation/PRODUCTION_READY_SUMMARY.md +227 -0
- package/documentation/PUBLIC_VS_PRIVATE_ENDPOINTS.md +278 -0
- package/documentation/QUICK_AUTH_SETUP.md +99 -0
- package/documentation/QUICK_DEPLOY.md +224 -0
- package/documentation/QUICK_FIX.md +114 -0
- package/documentation/QUICK_START.md +152 -0
- package/documentation/REFEREE_MODE_GUIDE.md +392 -0
- package/documentation/RETENTION_CORE_ACTION_UPDATE.md +313 -0
- package/documentation/RETENTION_UPDATE_SUMMARY.md +108 -0
- package/documentation/RUN_MIGRATION_NOW.md +39 -0
- package/documentation/SCRIPTS_UPDATE_SUMMARY.md +251 -0
- package/documentation/SETUP_GUIDE.md +184 -0
- package/documentation/STATE_MACHINE_IMPLEMENTATION.md +250 -0
- package/documentation/TELEGRAM_NOTIFICATIONS_DIAGNOSIS.md +361 -0
- package/documentation/UNIFIED_ARCHITECTURE.md +231 -0
- package/documentation/VOTING_DEPLOYMENT_SUMMARY.md +392 -0
- package/documentation/WEBSOCKET_ARCHITECTURE.md +881 -0
- package/documentation/WHAT_WE_BUILT_TODAY.md +369 -0
- package/documentation/latest/LATEST_PRODUCTION_SETUP.md +865 -0
- package/ecosystem.config.js +65 -0
- package/env.template +125 -0
- package/middleware/apiKeyAuth.js +136 -0
- package/middleware/authenticate.js +214 -0
- package/middleware/developerUserAuth.js +76 -0
- package/middleware/socketAuth.js +69 -0
- package/package.json +49 -0
- package/postman/Dubs-API-v1-With-Voting.postman_collection.json +555 -0
- package/postman/Dubs-API-v1.postman_collection.json +205 -0
- package/postman/Dubs_Developer_API.postman_collection.json +662 -0
- package/postman/QUICKSTART.md +118 -0
- package/postman/QUICK_REFERENCE.md +246 -0
- package/postman/README.md +71 -0
- package/postman/VOTING_API_GUIDE.md +426 -0
- package/refactor/Animations.md +148 -0
- package/refactor/Chat.md +252 -0
- package/routes/actionsRoutes.js +699 -0
- package/routes/adminRoutes.js +370 -0
- package/routes/analyticsRoutes.js +1262 -0
- package/routes/arcadeRoutes.js +557 -0
- package/routes/authRoutes.js +2310 -0
- package/routes/avatarRoutes.js +85 -0
- package/routes/botRoutes.js +211 -0
- package/routes/chatRoutes.js +377 -0
- package/routes/cryptoPriceRoutes.js +105 -0
- package/routes/developerRoutes.js +4201 -0
- package/routes/deviceRoutes.js +214 -0
- package/routes/dmRoutes.js +167 -0
- package/routes/esportsRoutes.js +806 -0
- package/routes/exchangeRateRoutes.js +233 -0
- package/routes/gamesRoutes.js +3028 -0
- package/routes/jackpotRoutes.js +754 -0
- package/routes/keeperMonitoringRoutes.js +156 -0
- package/routes/keeperWebhookRoutes.js +466 -0
- package/routes/livescoresRoutes.js +31 -0
- package/routes/pickemAdminRoutes.js +199 -0
- package/routes/pickemRoutes.js +231 -0
- package/routes/playerStatsRoutes.js +147 -0
- package/routes/portfolioRoutes.js +217 -0
- package/routes/promoRoutes.js +418 -0
- package/routes/referralEarningsRoutes.js +392 -0
- package/routes/socialRoutes.js +459 -0
- package/routes/sportsRoutes.js +1271 -0
- package/routes/survivorAdminRoutes.js +345 -0
- package/routes/survivorRoutes.js +756 -0
- package/routes/uploadRoutes.js +256 -0
- package/routes/userProfileRoutes.js +244 -0
- package/routes/whatsNewRoutes.js +331 -0
- package/scripts/.claude/settings.local.json +15 -0
- package/scripts/README.md +170 -0
- package/scripts/RESTART_EVERYTHING.sh +104 -0
- package/scripts/add-claim-columns.sql +48 -0
- package/scripts/add-crypto-prices-cache.sql +27 -0
- package/scripts/add-exchange-rates-cache.sql +40 -0
- package/scripts/add-game-invite-column.sql +23 -0
- package/scripts/add-game-invite-notification.sql +33 -0
- package/scripts/add-game-invite-telegram-pref.sql +16 -0
- package/scripts/add-game-joined-notification.sql +16 -0
- package/scripts/add-game-joined-pref.js +40 -0
- package/scripts/add-game-joined-preference.sql +6 -0
- package/scripts/add-game-start-notifications.sql +41 -0
- package/scripts/add-notification-flags-to-games.sql +55 -0
- package/scripts/add-pending-game-dismissals.sql +19 -0
- package/scripts/add-preferred-currency.sql +34 -0
- package/scripts/add-winner-columns.js +61 -0
- package/scripts/add_mention_system.sql +53 -0
- package/scripts/add_payment_system.sql +96 -0
- package/scripts/add_sports_event_id_column.sql +22 -0
- package/scripts/analyze-cohort-data-heroku.js +276 -0
- package/scripts/analyze-cohort-data.js +295 -0
- package/scripts/analyze-prod-cohorts.sh +10 -0
- package/scripts/backfill-matchup-images.js +245 -0
- package/scripts/backfill-missing-signatures.js +175 -0
- package/scripts/backfill-referral-earnings.js +202 -0
- package/scripts/check-chat-schema.js +130 -0
- package/scripts/check-db.sh +14 -0
- package/scripts/check_oracle_in_game.js +54 -0
- package/scripts/cleanup-database.js +193 -0
- package/scripts/clear-notification-cache.js +85 -0
- package/scripts/convert-mnemonic.js +50 -0
- package/scripts/create-users-table.sql +44 -0
- package/scripts/debug-cohort-counts.js +248 -0
- package/scripts/debug-winner-calc.js +84 -0
- package/scripts/deploy-payment-system.sh +118 -0
- package/scripts/deploy-to-heroku.sh +63 -0
- package/scripts/diagnose-locked-round.js +143 -0
- package/scripts/dubs-cli.js +720 -0
- package/scripts/dump-account.js +65 -0
- package/scripts/find-vrf-offset.js +48 -0
- package/scripts/fix-chat-notifications-constraint.sql +122 -0
- package/scripts/fix-claim-columns.js +124 -0
- package/scripts/fix-constraint-now.js +44 -0
- package/scripts/fix-lock-timestamps.js +96 -0
- package/scripts/fix-locked-round.sh +126 -0
- package/scripts/fix-missing-badges.sql +91 -0
- package/scripts/fix-payment-notifications.sql +41 -0
- package/scripts/force-new-round.js +55 -0
- package/scripts/force-resolve-and-claim.js +278 -0
- package/scripts/important/README.md +115 -0
- package/scripts/important/authority-force-lock.js +197 -0
- package/scripts/important/authority-resolve-game.js +267 -0
- package/scripts/important/check-game-status.js +373 -0
- package/scripts/important/list-pending-games-by-version.js +270 -0
- package/scripts/important/reconcile-v1-v2-payouts.js +270 -0
- package/scripts/initialize-jackpot.js +111 -0
- package/scripts/jackpot/.claude/settings.local.json +10 -0
- package/scripts/jackpot/force-reset.js +84 -0
- package/scripts/jackpot/initialize-mainnet.js +100 -0
- package/scripts/jackpot/keeper.js +742 -0
- package/scripts/jackpot/status.js +107 -0
- package/scripts/jackpot/update-round-duration.js +143 -0
- package/scripts/keeper-bot.js +112 -0
- package/scripts/list-pending-games.js +131 -0
- package/scripts/migrate-chat-v2.js +127 -0
- package/scripts/migrate-chat-winners.js +84 -0
- package/scripts/migrate-chat.sh +17 -0
- package/scripts/migrate-game-invite.js +83 -0
- package/scripts/migrate-heroku-game-notifications.sh +159 -0
- package/scripts/migrations/001_analytics_tables.sql +422 -0
- package/scripts/migrations/002_add_matchup_image_url.sql +14 -0
- package/scripts/migrations/003_referral_earnings.sql +208 -0
- package/scripts/migrations/004_add_whats_new_notification_type.sql +62 -0
- package/scripts/migrations/005_add_connect4_your_turn_notification.sql +61 -0
- package/scripts/migrations/005_push_notifications.sql +55 -0
- package/scripts/migrations/006_add_draw_team_players.sql +28 -0
- package/scripts/migrations/006_add_game_cancelled_notification.sql +62 -0
- package/scripts/migrations/007_add_gif_url.sql +8 -0
- package/scripts/migrations/008_add_connect4_columns.sql +139 -0
- package/scripts/migrations/008_add_pool_tracking.sql +22 -0
- package/scripts/migrations/009_create_survivor_pool_tables.sql +174 -0
- package/scripts/migrations/010_add_survivor_pool_outcome.sql +28 -0
- package/scripts/migrations/011_create_developer_tables.sql +67 -0
- package/scripts/migrations/011_fix_keeper_tables.sql +85 -0
- package/scripts/migrations/012_create_developer_webhooks.sql +31 -0
- package/scripts/migrations/013_add_network_mode.sql +18 -0
- package/scripts/migrations/014_create_developer_app_users.sql +19 -0
- package/scripts/migrations/015_add_ui_config.sql +4 -0
- package/scripts/migrations/016_add_resolution_secret.sql +4 -0
- package/scripts/migrations/017_add_external_game_id.sql +3 -0
- package/scripts/migrations/018_create_pickem_tables.sql +115 -0
- package/scripts/migrations/019_expo_push_tokens.sql +19 -0
- package/scripts/migrations/create_whats_new_tables.sql +88 -0
- package/scripts/migrations/drop_live_games_tables.sql +34 -0
- package/scripts/open-jackpot-round.js +85 -0
- package/scripts/purge-all-data.sh +329 -0
- package/scripts/purge-all-data.sql +142 -0
- package/scripts/purge-heroku-data.sh +149 -0
- package/scripts/purge-heroku-data.sql +62 -0
- package/scripts/rebuild-heroku-database.sh +113 -0
- package/scripts/recover-funds.js +357 -0
- package/scripts/regenerate-epl-images.js +278 -0
- package/scripts/resize-s3-matchup-images.js +374 -0
- package/scripts/resolve-direct.js +88 -0
- package/scripts/resolve-mock-game.js +124 -0
- package/scripts/resolve-pickem-game.js +55 -0
- package/scripts/resolve-round-manual.js +83 -0
- package/scripts/resolve-stuck-game.js +382 -0
- package/scripts/resolve-stuck-round.js +42 -0
- package/scripts/run-connect4-migration.sh +16 -0
- package/scripts/run-mention-migration.sh +32 -0
- package/scripts/run-payment-migration.sh +51 -0
- package/scripts/run-preferred-currency-migration.sh +31 -0
- package/scripts/run-referral-earnings-migration.sh +32 -0
- package/scripts/run-survivor-outcome-migration.sh +16 -0
- package/scripts/seed-test-users.js +346 -0
- package/scripts/setup-auth-tables.js +78 -0
- package/scripts/setup-complete-database.sql +992 -0
- package/scripts/setup-database-fresh.sh +359 -0
- package/scripts/setup-heroku-keeper.sh +48 -0
- package/scripts/setup-keeper-database.js +83 -0
- package/scripts/setup-keeper-state-db.sql +110 -0
- package/scripts/setup-oracle.sh +39 -0
- package/scripts/setup-pnl-tracking.js +111 -0
- package/scripts/start-devnet.sh +14 -0
- package/scripts/test-arcade-devnet.sh +160 -0
- package/scripts/test-arcade-match.sh +109 -0
- package/scripts/test-automatic-mode.sh +239 -0
- package/scripts/test-connect4-cancel-claim.js +370 -0
- package/scripts/test-connect4-e2e.js +369 -0
- package/scripts/test-connect4-resolve.js +369 -0
- package/scripts/test-game-state-endpoint.js +136 -0
- package/scripts/test-invite-notification.js +86 -0
- package/scripts/test-jackpot-api.sh +71 -0
- package/scripts/test-poll-confirmation.js +267 -0
- package/scripts/test-resolve-game.js +271 -0
- package/scripts/test-resolve-signature.js +223 -0
- package/scripts/test-signature-preservation.js +124 -0
- package/scripts/test-state-machine.js +291 -0
- package/scripts/test-webhook-receiver.js +60 -0
- package/scripts/update-notification-constraint.js +52 -0
- package/scripts/verify-account-layout.js +145 -0
- package/scripts/verify-winner-algorithm.js +278 -0
- package/server.js +5259 -0
- package/services/arcadeMatchService.js +763 -0
- package/services/automaticGameOracle.js +1596 -0
- package/services/chatService.js +1612 -0
- package/services/connect4GameService.js +1049 -0
- package/services/connect4NotificationService.js +374 -0
- package/services/cryptoPriceService.js +223 -0
- package/services/customGameResolver.js +260 -0
- package/services/db.js +79 -0
- package/services/directMessageService.js +389 -0
- package/services/discordNotifications.js +160 -0
- package/services/exchangeRateService.js +289 -0
- package/services/expoPushService.js +314 -0
- package/services/gamesCacheService.js +539 -0
- package/services/jackpotHistory.js +331 -0
- package/services/jackpotService.js +856 -0
- package/services/keeperStateService.js +355 -0
- package/services/matchupImageService.js +591 -0
- package/services/notificationCacheService.js +407 -0
- package/services/pickemOracle.js +440 -0
- package/services/playerStatsService.js +389 -0
- package/services/portfolioService.js +555 -0
- package/services/promoService.js +757 -0
- package/services/promoTreasuryService.js +239 -0
- package/services/pushNotifications.js +353 -0
- package/services/redisService.js +422 -0
- package/services/referralEarningsService.js +728 -0
- package/services/s3Service.js +396 -0
- package/services/socialService.js +1202 -0
- package/services/survivorOracle.js +469 -0
- package/services/survivorSimulator.js +475 -0
- package/services/telegramNotifications.js +461 -0
- package/services/userProfileStatsService.js +1185 -0
- package/services/whatsNewService.js +388 -0
- 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
|
+
|