diff --git a/server/internal/api/ymt_users.go b/server/internal/api/ymt_users.go index c41f373..70249d1 100644 --- a/server/internal/api/ymt_users.go +++ b/server/internal/api/ymt_users.go @@ -1,76 +1,72 @@ package api import ( - "database/sql" - "fmt" - "net/http" - "strconv" - "strings" + "database/sql" + "fmt" + "net/http" + "strconv" + "strings" ) type YMTUsersAPI struct { - ymt *sql.DB + ymt *sql.DB } func YMTUsersHandler(ymt *sql.DB) http.Handler { - api := &YMTUsersAPI{ymt: ymt} - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - p := strings.TrimPrefix(r.URL.Path, "/api/ymt/users") - if r.Method == http.MethodGet && p == "" { - api.list(w, r) - return - } - w.WriteHeader(http.StatusNotFound) - }) + api := &YMTUsersAPI{ymt: ymt} + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + p := strings.TrimPrefix(r.URL.Path, "/api/ymt/users") + if r.Method == http.MethodGet && p == "" { + api.list(w, r) + return + } + w.WriteHeader(http.StatusNotFound) + }) } func (a *YMTUsersAPI) list(w http.ResponseWriter, r *http.Request) { - q := r.URL.Query().Get("q") - limitStr := r.URL.Query().Get("limit") - limit := 2000 - if limitStr != "" { - if n, err := strconv.Atoi(limitStr); err == nil && n > 0 && n <= 10000 { limit = n } - } - sql1 := "SELECT DISTINCT user_id, COALESCE(user_name, '') AS name FROM activity WHERE user_id IS NOT NULL" - args := []interface{}{} - if q != "" { - sql1 += " AND (CAST(user_id AS CHAR) LIKE ? OR user_name LIKE ?)" - like := "%" + q + "%" - args = append(args, like, like) - } - sql1 += " ORDER BY user_id ASC LIMIT ?" - args = append(args, limit) - rows, err := a.ymt.Query(sql1, args...) - if err != nil { - fail(w, r, http.StatusInternalServerError, err.Error()) - return - } - defer rows.Close() + limitStr := r.URL.Query().Get("limit") + limit := 2000 + if limitStr != "" { + if n, err := strconv.Atoi(limitStr); err == nil && n > 0 && n <= 10000 { + limit = n + } + } + sql1 := "SELECT DISTINCT user_id, COALESCE(user_name, '') AS name FROM activity WHERE user_id IS NOT NULL" + args := []interface{}{} + sql1 += " ORDER BY user_id ASC LIMIT ?" + args = append(args, limit) + rows, err := a.ymt.Query(sql1, args...) + if err != nil { + fail(w, r, http.StatusInternalServerError, err.Error()) + return + } + defer rows.Close() - out := []map[string]interface{}{} - used := map[int64]struct{}{} - for rows.Next() { - var id sql.NullInt64 - var name sql.NullString - if err := rows.Scan(&id, &name); err != nil { - continue - } - if !id.Valid { - continue - } - if _, ok := used[id.Int64]; ok { - // 根据 ID 去重 - continue - } - used[id.Int64] = struct{}{} + out := []map[string]interface{}{} + used := map[int64]struct{}{} + for rows.Next() { + var id sql.NullInt64 + var name sql.NullString + if err := rows.Scan(&id, &name); err != nil { + continue + } + if !id.Valid { + continue + } + if _, ok := used[id.Int64]; ok { + // 根据 ID 去重 + continue + } + used[id.Int64] = struct{}{} - n := strings.TrimSpace(name.String) - if n == "" { - n = strconv.FormatInt(id.Int64, 10) - } - display := fmt.Sprintf("%s(%d)", n, id.Int64) + n := strings.TrimSpace(name.String) + if n == "" { + n = strconv.FormatInt(id.Int64, 10) + } + display := fmt.Sprintf("%s(%d)", n, id.Int64) - out = append(out, map[string]interface{}{"id": id.Int64, "name": display}) - } - ok(w, r, out) + out = append(out, map[string]interface{}{"id": id.Int64, "name": display}) + } + ok(w, r, out) }