feat(backend): leaderboard tiers, N+1 fix, contributors, certificate approval, physical disable
- leaderboard: batch-fetch users (GetUsersByIDs), deterministic tie-break by user_id - leaderboard: tier system (champion/gold/silver/bronze) based on rank percentile - store: HasCompletedCurriculum requires cert.Status == "issued"; pending does not satisfy - certificate: issueCertificateIfEligible creates pending row; admin approves via handleAdminIssueCertificate - certificate: handleRequestPhysicalCertificate returns 410 Gone (feature disabled) - settings: contributors CRUD (loadContributors, validateContributors, handleAdminContributorAvatarUpload) - community: expose contributors in /api/community response - rate_limit: separate DevMode bypass from redis-nil check in allowWSHandshake - router: remove /api/search route; fix missing tab indent on /api/meta line - migration 0032: contributors app_setting with seed entry
This commit is contained in:
@@ -95,10 +95,16 @@ func (s *Server) handleWeeklyLeaderboard(w http.ResponseWriter, r *http.Request)
|
||||
return scoredList[i].userID < scoredList[j].userID
|
||||
})
|
||||
|
||||
ids := make([]int64, len(scoredList))
|
||||
for i, sc := range scoredList {
|
||||
ids[i] = sc.userID
|
||||
}
|
||||
usersMap, _ := s.store.GetUsersByIDs(context.Background(), ids)
|
||||
|
||||
entries := make([]lbEntry, 0, len(scoredList))
|
||||
for i, sc := range scoredList {
|
||||
usr, err := s.store.GetUserByID(context.Background(), sc.userID)
|
||||
if err != nil {
|
||||
usr, ok := usersMap[sc.userID]
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
s.signUserMedia(usr)
|
||||
|
||||
Reference in New Issue
Block a user