Skip to content

US9: Follow Players#100

Merged
Ghee-clarified-butter merged 8 commits into
mainfrom
user-story-9-follow-players
May 3, 2026
Merged

US9: Follow Players#100
Ghee-clarified-butter merged 8 commits into
mainfrom
user-story-9-follow-players

Conversation

@mollup
Copy link
Copy Markdown
Collaborator

@mollup mollup commented May 3, 2026

Implement User Story 9: Follow Players

This PR adds social following functionality, allowing players to follow each other and view their network.

Key Features:

  • Follow/unfollow player accounts
  • View following and followers lists with pagination
  • Duplicate follow prevention (409 status)
  • Self-follow prevention with validation
  • Authorization checks (users can only unfollow their own follows)
  • Profile information in results

Technical Implementation:

  • Follow interface with followerId, followingId, createdAt
  • Bidirectional indexes for efficient queries (followersByUser, followingByUser)
  • POST /api/follows endpoint to create relationships
  • DELETE /api/follows/:id endpoint to remove follows
  • GET /api/users/:id/following endpoint with pagination
  • GET /api/users/:id/followers endpoint with pagination
  • Comprehensive test coverage (20 tests)

Machine Acceptance Criteria Verified:
✓ POST /api/follows creates follow and returns 201
✓ DELETE /api/follows/:id removes follow and returns 200
✓ GET /api/users/:id/following returns paginated list
✓ GET /api/users/:id/followers returns paginated list
✓ 409 returned on duplicate follow attempt
✓ Cannot follow yourself (400 status)
✓ Authorization enforced on unfollow

Tests: 20/20 passing

mollup added 8 commits May 3, 2026 14:15
- 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
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 3, 2026

Claude automated code review

Summary — Automated review was skipped.

Reason — Claude API call failed: 429 {"type":"error","error":{"type":"rate_limit_error","message":"This request would exceed your organization's rate limit of 50,000 input tokens per minute (org: f492fb18-9da7-43e0-828c-1403e9d53b6a, model: claude-haiku-4-5-20251001). For details, refer to: https://docs.claude.com/en/api/rate-limits. You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://claude.com/contact-sales to discuss your options for a rate limit increase."},"request_id":"req_011Cag9yaXHEfsR4L6Qgb9cc"}


Advisory only — a human reviewer still approves the merge. Re-run with /claude-review in a comment.

@Ghee-clarified-butter Ghee-clarified-butter merged commit fbc4180 into main May 3, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants