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,327 @@
1
+ # ๐Ÿ” API Security Guide - Protected Routes
2
+
3
+ ## Complete API Protection Status
4
+
5
+ ### ๐Ÿ”“ Public Endpoints (No Authentication Required)
6
+
7
+ | Endpoint | Method | Purpose | Why Public? |
8
+ |----------|--------|---------|-------------|
9
+ | `/auth/nonce/:walletAddress` | GET | Get nonce for signing | Needed to start authentication flow |
10
+ | `/auth/user/:walletAddress` | GET | Check if user exists / Get user profile | Allows profile viewing (consider protecting later) |
11
+ | `/auth/verify-signature` | POST | Verify wallet signature | Part of registration flow |
12
+ | `/auth/register` | POST | Register new user + create session | Creates new account |
13
+ | `/auth/login` | POST | Login existing user + create session | Creates authenticated session |
14
+ | `/stats/leaderboard` | GET | Get public leaderboard | Public game data |
15
+
16
+ **Note:** `/auth/user/:walletAddress` is currently public to allow viewing other players' profiles. If you want privacy, protect this endpoint.
17
+
18
+ ---
19
+
20
+ ### ๐Ÿ”’ Protected Endpoints (Require JWT Authentication)
21
+
22
+ | Endpoint | Method | Protection | Additional Security |
23
+ |----------|--------|------------|---------------------|
24
+ | **Session Management** |
25
+ | `/auth/validate-session` | GET | ๐Ÿ”’ JWT Required | Returns current user's session |
26
+ | `/auth/logout` | POST | ๐Ÿ”’ JWT Required | Clears current session |
27
+ | `/auth/logout-all` | POST | ๐Ÿ”’ JWT Required | Clears all user's sessions |
28
+ | **User Management** |
29
+ | `/auth/user/:walletAddress` | PUT | ๐Ÿ”’ JWT Required | โœ… **Wallet ownership verified** |
30
+ | `/auth/user/:walletAddress/onboarding-complete` | POST | ๐Ÿ”’ JWT Required | โœ… **Wallet ownership verified** |
31
+ | **File Uploads** |
32
+ | `/upload/avatar/presigned-url` | POST | ๐Ÿ”’ JWT Required | โœ… **Wallet ownership verified** |
33
+ | **Stats (Recommended Protection)** |
34
+ | `/stats/player/:walletAddress` | GET | โš ๏ธ Currently Public | Should verify wallet ownership |
35
+ | `/stats/player/:walletAddress/history` | GET | โš ๏ธ Currently Public | Should verify wallet ownership |
36
+
37
+ ---
38
+
39
+ ## ๐Ÿ›ก๏ธ Security Features by Endpoint
40
+
41
+ ### Protected with Wallet Ownership Verification
42
+
43
+ These endpoints not only require authentication but also verify you can only access your own data:
44
+
45
+ #### `PUT /auth/user/:walletAddress`
46
+ ```javascript
47
+ // User can only update their OWN profile
48
+ if (req.user.walletAddress !== walletAddress) {
49
+ return 403 Forbidden
50
+ }
51
+ ```
52
+
53
+ #### `POST /auth/user/:walletAddress/onboarding-complete`
54
+ ```javascript
55
+ // User can only complete their OWN onboarding
56
+ if (req.user.walletAddress !== walletAddress) {
57
+ return 403 Forbidden
58
+ }
59
+ ```
60
+
61
+ #### `POST /upload/avatar/presigned-url`
62
+ ```javascript
63
+ // User can only upload THEIR OWN avatar
64
+ if (req.user.walletAddress !== walletAddress) {
65
+ return 403 Forbidden
66
+ }
67
+ ```
68
+
69
+ ---
70
+
71
+ ## ๐Ÿ”ง How Authentication Works
72
+
73
+ ### For Protected Endpoints
74
+
75
+ 1. **Request includes JWT cookie** (automatic via `withCredentials: true`)
76
+ 2. **Middleware validates token:**
77
+ - Checks cookie exists
78
+ - Verifies JWT signature
79
+ - Checks token not expired
80
+ - Verifies session exists in database
81
+ 3. **User info attached to request:**
82
+ ```javascript
83
+ req.user = {
84
+ walletAddress: "7D47yF...",
85
+ userId: 123
86
+ }
87
+ ```
88
+ 4. **Endpoint logic executes** with authenticated user context
89
+
90
+ ### Error Responses
91
+
92
+ | Status | Code | Meaning |
93
+ |--------|------|---------|
94
+ | 401 | `NO_TOKEN` | No auth token provided |
95
+ | 401 | `TOKEN_EXPIRED` | JWT token expired (> 7 days) |
96
+ | 401 | `INVALID_TOKEN` | Token malformed or invalid |
97
+ | 401 | `SESSION_INVALID` | Session not in database |
98
+ | 403 | `WALLET_MISMATCH` | Trying to access another user's data |
99
+
100
+ ---
101
+
102
+ ## ๐Ÿ“Š Stats Endpoints - Recommended Changes
103
+
104
+ Currently public but should be protected:
105
+
106
+ ### Current Implementation (INSECURE)
107
+ ```javascript
108
+ // Anyone can see anyone's stats
109
+ GET /stats/player/ANY_WALLET_ADDRESS โ†’ 200 OK
110
+ GET /stats/player/ANY_WALLET_ADDRESS/history โ†’ 200 OK
111
+ ```
112
+
113
+ ### Recommended Implementation (SECURE)
114
+ ```javascript
115
+ router.get('/player/:walletAddress', authenticate, async (req, res) => {
116
+ // Allow users to see their own stats
117
+ if (req.user.walletAddress === req.params.walletAddress) {
118
+ return res.json({ stats: userStats });
119
+ }
120
+
121
+ // Optionally allow viewing others' public stats
122
+ // Remove this block if you want stats to be private
123
+ return res.json({
124
+ stats: {
125
+ // Return only public fields
126
+ gamesPlayed: userStats.gamesPlayed,
127
+ winRate: userStats.winRate,
128
+ // Hide sensitive data like wallet balance, etc.
129
+ }
130
+ });
131
+ });
132
+ ```
133
+
134
+ ---
135
+
136
+ ## ๐Ÿšจ Security Issues Fixed
137
+
138
+ ### โœ… Fixed: Unprotected User Update
139
+ **Before:**
140
+ ```javascript
141
+ PUT /auth/user/:walletAddress
142
+ // No authentication required
143
+ // Anyone could update anyone's profile!
144
+ ```
145
+
146
+ **After:**
147
+ ```javascript
148
+ PUT /auth/user/:walletAddress + JWT + Wallet Verification
149
+ // โœ… Must be authenticated
150
+ // โœ… Can only update own profile
151
+ ```
152
+
153
+ ### โœ… Fixed: Unprotected Avatar Upload
154
+ **Before:**
155
+ ```javascript
156
+ POST /upload/avatar/presigned-url
157
+ // No authentication required
158
+ // Anyone could upload avatars for anyone!
159
+ ```
160
+
161
+ **After:**
162
+ ```javascript
163
+ POST /upload/avatar/presigned-url + JWT + Wallet Verification
164
+ // โœ… Must be authenticated
165
+ // โœ… Can only upload own avatar
166
+ ```
167
+
168
+ ---
169
+
170
+ ## ๐ŸŽฏ Frontend Integration
171
+
172
+ ### Automatic Authentication
173
+
174
+ All protected endpoints work automatically because:
175
+
176
+ 1. **JWT cookie sent automatically:**
177
+ ```typescript
178
+ // api.ts already configured with:
179
+ axios.create({
180
+ withCredentials: true // โœ… Sends cookies
181
+ })
182
+ ```
183
+
184
+ 2. **No manual token management needed!**
185
+ - No localStorage
186
+ - No Authorization headers
187
+ - Cookies handled by browser
188
+
189
+ ### Handling Auth Errors
190
+
191
+ ```typescript
192
+ // In api.ts - already configured
193
+ this.client.interceptors.response.use(
194
+ (response) => response,
195
+ (error) => {
196
+ if (error.response?.status === 401) {
197
+ // Session expired - trigger re-authentication
198
+ window.dispatchEvent(new CustomEvent('auth:session-expired'));
199
+ }
200
+ return Promise.reject(error);
201
+ }
202
+ );
203
+ ```
204
+
205
+ ---
206
+
207
+ ## ๐Ÿ“ How to Protect More Endpoints
208
+
209
+ ### Step 1: Import Middleware
210
+ ```javascript
211
+ const { authenticate } = require('../middleware/authenticate');
212
+ ```
213
+
214
+ ### Step 2: Add to Route
215
+ ```javascript
216
+ // Before
217
+ router.get('/my-endpoint', async (req, res) => {
218
+ // Anyone can access
219
+ });
220
+
221
+ // After
222
+ router.get('/my-endpoint', authenticate, async (req, res) => {
223
+ // Only authenticated users
224
+ const { walletAddress, userId } = req.user;
225
+ });
226
+ ```
227
+
228
+ ### Step 3: Add Ownership Check (if needed)
229
+ ```javascript
230
+ router.put('/resource/:walletAddress', authenticate, async (req, res) => {
231
+ // Verify ownership
232
+ if (req.user.walletAddress !== req.params.walletAddress) {
233
+ return res.status(403).json({ error: 'Unauthorized' });
234
+ }
235
+
236
+ // Process request
237
+ });
238
+ ```
239
+
240
+ ---
241
+
242
+ ## ๐Ÿงช Testing Protected Endpoints
243
+
244
+ ### With curl
245
+ ```bash
246
+ # 1. Login and save cookies
247
+ curl -X POST http://localhost:3001/auth/login \
248
+ -H "Content-Type: application/json" \
249
+ -d '{"walletAddress":"...","signature":"...","nonce":"...","message":"..."}' \
250
+ -c cookies.txt
251
+
252
+ # 2. Access protected endpoint
253
+ curl http://localhost:3001/auth/validate-session \
254
+ -b cookies.txt
255
+
256
+ # 3. Try without auth (should fail)
257
+ curl http://localhost:3001/auth/validate-session
258
+ # Returns: 401 Unauthorized
259
+ ```
260
+
261
+ ### With Frontend
262
+ ```typescript
263
+ // All protected endpoints work automatically
264
+ await apiService.updateUser(walletAddress, { username: 'newname' });
265
+ await apiService.completeOnboarding(walletAddress);
266
+ // JWT cookie sent automatically โœ…
267
+ ```
268
+
269
+ ---
270
+
271
+ ## ๐Ÿ” Security Best Practices
272
+
273
+ ### โœ… Implemented
274
+ - [x] JWT authentication on sensitive endpoints
275
+ - [x] httpOnly cookies (XSS protection)
276
+ - [x] Wallet ownership verification
277
+ - [x] Session tracking in database
278
+ - [x] Token expiration (7 days)
279
+ - [x] CORS with credentials
280
+ - [x] Nonce-based signatures
281
+
282
+ ### ๐Ÿ”„ Recommended Next Steps
283
+ - [ ] Protect stats endpoints (or make them optionally public)
284
+ - [ ] Add rate limiting per user
285
+ - [ ] Add admin role for privileged operations
286
+ - [ ] Implement session revocation API
287
+ - [ ] Add IP-based session tracking
288
+ - [ ] Set up monitoring for failed auth attempts
289
+
290
+ ---
291
+
292
+ ## ๐Ÿ“Š Summary Table
293
+
294
+ | Category | Public | Protected | Total |
295
+ |----------|--------|-----------|-------|
296
+ | **Auth Endpoints** | 5 | 3 | 8 |
297
+ | **User Management** | 1 | 2 | 3 |
298
+ | **File Uploads** | 0 | 1 | 1 |
299
+ | **Stats** | 3 | 0 | 3 |
300
+ | **TOTAL** | 9 | 6 | 15 |
301
+
302
+ **Protection Rate:** 40% of endpoints require authentication
303
+ **With Wallet Verification:** 3 endpoints (50% of protected)
304
+
305
+ ---
306
+
307
+ ## ๐ŸŽฏ Quick Reference
308
+
309
+ ### Need Authentication?
310
+ - โœ… Modifying user data
311
+ - โœ… Uploading files
312
+ - โœ… Accessing private info
313
+ - โœ… Session management
314
+
315
+ ### Can Be Public?
316
+ - โœ… Registration/Login
317
+ - โœ… Viewing public profiles
318
+ - โœ… Public leaderboards
319
+ - โœ… Public game stats
320
+
321
+ ---
322
+
323
+ **Last Updated:** 2025-01-22
324
+ **Security Level:** โœ… Production Ready
325
+ **Protected Endpoints:** 6/15 (40%)
326
+
327
+