Description
GET /api/v1/users/:id/public requires a UUID that users do not know. The leaderboard shows usernames — clicking them should navigate to a public profile page. This issue adds username-based lookup on the backend and a public learner profile page on the frontend.
Background
UsersService.getPublicProfile(id) takes UUID — no username-based lookup exists
- No
GET /api/v1/users/by-username/:username endpoint
- Leaderboard usernames need to link to
/learners/{username}
Implementation Guide
Backend: add GET /api/v1/users/by-username/:username with case-insensitive username lookup. Return { id, username, xp, badgesCount, coursesCompleted, avatarUrl, bio } — never email or walletAddress. Return 404 for non-existent username. Add Swagger decorators.
Frontend: create frontend/app/learners/[username]/page.tsx showing avatar, username, XP bar, badge count, courses completed, and earned badges grid. Wire to the new endpoint.
Update the leaderboard table (Issue 39) to link each username to /learners/{username}.
Acceptance Criteria
Complexity: High - 200 points
Join: https://t.me/ByteChainAcademy | Contact: contact@nexacore.org
Description
GET /api/v1/users/:id/publicrequires a UUID that users do not know. The leaderboard shows usernames — clicking them should navigate to a public profile page. This issue adds username-based lookup on the backend and a public learner profile page on the frontend.Background
UsersService.getPublicProfile(id)takes UUID — no username-based lookup existsGET /api/v1/users/by-username/:usernameendpoint/learners/{username}Implementation Guide
Backend: add
GET /api/v1/users/by-username/:usernamewith case-insensitive username lookup. Return{ id, username, xp, badgesCount, coursesCompleted, avatarUrl, bio }— never email or walletAddress. Return 404 for non-existent username. Add Swagger decorators.Frontend: create
frontend/app/learners/[username]/page.tsxshowing avatar, username, XP bar, badge count, courses completed, and earned badges grid. Wire to the new endpoint.Update the leaderboard table (Issue 39) to link each username to
/learners/{username}.Acceptance Criteria
GET /api/v1/users/by-username/:usernamereturns public profile without PII/learners/[username]renders public profile pageComplexity: High - 200 points
Join: https://t.me/ByteChainAcademy | Contact: contact@nexacore.org