package handlers import ( "net/http" "strconv" "prompt-generator/internal/db" ) func GetDashboardProjects(w http.ResponseWriter, r *http.Request) { rows, err := db.DB.Query(` SELECT project_name, COUNT(*) as session_count, MIN(created_at) as first_time, MAX(created_at) as last_time FROM prompts GROUP BY project_name ORDER BY last_time DESC `) if err != nil { fail(w, 500, "查询项目列表失败") return } defer rows.Close() var projects []map[string]interface{} for rows.Next() { var name string var count int var firstTime, lastTime string if err := rows.Scan(&name, &count, &firstTime, &lastTime); err != nil { continue } if name == "" { name = "(未命名项目)" } projects = append(projects, map[string]interface{}{ "project_name": name, "session_count": count, "first_time": firstTime, "last_time": lastTime, }) } if projects == nil { projects = []map[string]interface{}{} } success(w, projects) } func GetDashboardSessions(w http.ResponseWriter, r *http.Request) { projectName := r.PathValue("name") if projectName == "" { fail(w, 400, "项目名称必填") return } rows, err := db.DB.Query(` SELECT session_id, COUNT(*) as prompt_count, MIN(created_at) as first_time, MAX(created_at) as last_time FROM prompts WHERE project_name=? GROUP BY session_id ORDER BY last_time DESC LIMIT 100 `, projectName) if err != nil { fail(w, 500, "查询会话列表失败") return } defer rows.Close() var sessions []map[string]interface{} for rows.Next() { var sessionID string var count int var firstTime, lastTime string if err := rows.Scan(&sessionID, &count, &firstTime, &lastTime); err != nil { continue } sessions = append(sessions, map[string]interface{}{ "session_id": sessionID, "prompt_count": count, "first_time": firstTime, "last_time": lastTime, }) } if sessions == nil { sessions = []map[string]interface{}{} } success(w, sessions) } func GetDashboardPrompts(w http.ResponseWriter, r *http.Request) { sessionID := r.URL.Query().Get("session_id") keyword := r.URL.Query().Get("keyword") pageStr := r.URL.Query().Get("page") pageSizeStr := r.URL.Query().Get("page_size") if sessionID == "" { fail(w, 400, "session_id 参数必填") return } page := 1 pageSize := 20 if p, err := strconv.Atoi(pageStr); err == nil && p > 0 { page = p } if ps, err := strconv.Atoi(pageSizeStr); err == nil && ps > 0 && ps <= 100 { pageSize = ps } offset := (page - 1) * pageSize query := "SELECT id, session_id, project_name, prompt, created_at FROM prompts WHERE session_id=?" countQuery := "SELECT COUNT(*) FROM prompts WHERE session_id=?" args := []interface{}{sessionID} countArgs := []interface{}{sessionID} if keyword != "" { query += " AND prompt LIKE ?" countQuery += " AND prompt LIKE ?" kw := "%" + keyword + "%" args = append(args, kw) countArgs = append(countArgs, kw) } var total int db.DB.QueryRow(countQuery, countArgs...).Scan(&total) query += " ORDER BY created_at DESC LIMIT ? OFFSET ?" args = append(args, pageSize, offset) rows, err := db.DB.Query(query, args...) if err != nil { fail(w, 500, "查询 Prompt 列表失败") return } defer rows.Close() var prompts []map[string]interface{} for rows.Next() { var id int64 var sid, pname, prompt, createdAt string if err := rows.Scan(&id, &sid, &pname, &prompt, &createdAt); err != nil { continue } prompts = append(prompts, map[string]interface{}{ "id": id, "session_id": sid, "project": pname, "prompt": prompt, "created_at": createdAt, }) } if prompts == nil { prompts = []map[string]interface{}{} } success(w, map[string]interface{}{ "prompts": prompts, "total": total, "page": page, "page_size": pageSize, }) }