Backend Implementation: User Stories 3-10 (Score Tracking, Replays, Events, Leaderboard, Follows, Subscriptions)#95
Merged
Conversation
- Add score fields (player1Score, player2Score) to BracketMatch type - Add tournamentWinner field to BracketResponse - Implement PUT /api/tournaments/:id/matches/:matchId/score endpoint - Add submitMatchScore function to store with validation - Update getTournamentBracket to include tournament winner - Add comprehensive test suite with 14 test cases covering: - Score submission and validation - Bracket advancement and winner determination - Real-time updates - Score history preservation - Edge cases (byes, completed matches) - All 73 tests passing
- Add Replay type to types.ts with all required fields - Create replay storage in store.ts with Maps for replays and replaysByTournament - Implement createReplay, getReplayById, getReplaysByTournament, validateReplayFileSize functions - Create src/routes/replays.ts with POST /api/replays and GET /api/replays/:id - Add GET /api/tournaments/:id/replays endpoint in tournaments.ts - Implement 2GB file size limit validation - Add authentication checks (organizer-only upload) - Ensure organizers can only upload to their own tournaments - Replays accessible publicly without authentication - Add comprehensive test suite with 14 tests covering all edge cases - All 96 tests passing
- Add searchReplays function to store.ts with filtering and pagination - Support filtering by game (case-insensitive), event_id, and player_name - Implement pagination with default page size of 20, max 100 - Return paginated results with metadata (total, page, pageSize, totalPages) - Results sorted in reverse-chronological order by default - Add GET /api/replays route to replays.ts - Handle edge cases for invalid pagination parameters - Performance tested for datasets up to 100 replays (< 500ms) - Add comprehensive test suite with 21 tests - All 117 tests passing
- Add startDate, venue, city optional fields to Tournament interface - Update createTournament to accept new location/date fields - Add searchEvents function to store.ts with filtering by game and city - Filter out past events by default (events with startDate < now) - Sort results by startDate ascending (soonest first) - Create EventResponse interface with entrantCount - Create src/routes/events.ts with GET /api/events endpoint - Add events router to app.ts - Performance optimized for large datasets (< 400ms) - Add comprehensive test suite with 17 tests - All 134 tests passing
- Add getPointsForPlacement function with tiered points system (1st=100, 2nd=75, 3-4th=50, 5-8th=25, participation=10) - Create getLeaderboard function to aggregate stats across finalized tournaments - Filter by game (required, case-insensitive) - Support player_id query to return specific player's rank - Implement pagination with default page size 20, max 100 - Sort by points descending with tiebreakers (total wins, total tournaments, userId) - Only include finalized tournaments in calculations - Create LeaderboardEntry and LeaderboardResponse interfaces - Create src/routes/leaderboard.ts with GET /api/leaderboard endpoint - Add leaderboard router to app.ts - Add comprehensive test suite with 14 tests - All 148 tests passing
- Added Follow interface to types.ts with followerId, followingId, createdAt - Implemented follow storage with Maps for follows, followersByUser, followingByUser in store.ts - Created store functions: createFollow, deleteFollow, getUserFollowing, getUserFollowers, isFollowing - Added POST /api/follows endpoint to create follow relationships - Added DELETE /api/follows/:id endpoint to remove follows with proper authorization - Added GET /api/users/:id/following endpoint with pagination - Added GET /api/users/:id/followers endpoint with pagination - Prevents self-follows and duplicate follow attempts (409 status) - All endpoints require authentication - All 20 test cases passing - Full test suite: 168 tests passing
- Added Subscription interface to types.ts with status, priceId, expiryDate, clientSecret - Implemented subscription storage with Maps for subscriptions and subscriptionsByUser in store.ts - Created store functions: createSubscription, getSubscriptionById, getUserSubscription, activateSubscription, cancelSubscription, hasActivePremiumSubscription - Added POST /api/subscriptions endpoint to create subscriptions (organizer only) - Added POST /api/subscriptions/webhook endpoint for Stripe webhooks (payment success/failure, cancellation) - Added GET /api/subscriptions/:userId endpoint to view subscription status - Added DELETE /api/subscriptions/:id endpoint to cancel subscription - Added requirePremium middleware to gate premium features - Added /api/premium/features test endpoint demonstrating premium feature gating - Prevents duplicate active/pending subscriptions (409 status) - Handles subscription expiry automatically - Mock Stripe payment intent format for testing - All 20 test cases passing - Full test suite: 188 tests passing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This comprehensive PR implements the backend API functionality for User Stories 3-10, adding complete backend support for:
Summary of Changes
New Endpoints (24 total)
PUT /api/tournaments/:id/matches/:matchId/scorePOST /api/replays,GET /api/replays,GET /api/replays/:idGET /api/eventswith game/city filteringGET /api/leaderboardwith paginationPOST /api/follows,DELETE /api/follows/:id,GET /api/users/:id/following,GET /api/users/:id/followersPOST /api/subscriptions,POST /api/subscriptions/webhook,GET /api/subscriptions/:userId,DELETE /api/subscriptions/:idGET /api/premium/featuresTechnical Implementation
Data Model Enhancements
startDate,venue,city,finalizedfieldsReplay,Follow,Subscriptionplayer1Score,player2ScoretrackingMachine Acceptance Criteria
All machine acceptance criteria verified through comprehensive automated test suites for each user story.
Testing
All pre-existing tests continue to pass with no regressions.
Ready for Review
This PR represents the complete backend implementation for the specified user stories, fully tested and ready for integration with frontend components.