/** * package api * 作用:全局搜索API处理器 */ package api import ( "strconv" "xk-websocket-v2/internal/service" "xk-websocket-v2/internal/utils" "github.com/gin-gonic/gin" ) /** * GlobalSearchHandler * 功能:聚合搜索(联系人、群聊、聊天记录) * 路径:GET /api/search?keyword=xxx&type=all|contacts|groups|messages&limit=20 * * 参数说明: * - keyword: 搜索关键词(必填) * - type: 搜索类型,可选值:all(默认)、contacts、groups、messages * - limit: 每类结果的最大数量,默认20 * * 返回结构: * { * "contacts": [{ "user": {...}, "remark_name": "xxx", "room_id": "xxx" }], * "groups": [{ "room_id": "xxx", "room_name": "xxx", ... }], * "messages": [{ "id": 1, "room_id": "xxx", "content": "xxx", "sender": {...} }] * } */ func GlobalSearchHandler(c *gin.Context) { // 获取当前用户ID userID, exists := c.Get("user_id") if !exists { utils.Unauthorized(c, "未登录") return } // 获取搜索参数 keyword := c.Query("keyword") if keyword == "" { utils.BadRequest(c, "搜索关键词不能为空") return } searchType := c.DefaultQuery("type", "all") if searchType != "all" && searchType != "contacts" && searchType != "groups" && searchType != "messages" { searchType = "all" } limitStr := c.DefaultQuery("limit", "20") limit, err := strconv.Atoi(limitStr) if err != nil || limit <= 0 || limit > 100 { limit = 20 } // 执行搜索 result, err := service.SearchSvc.GlobalSearch(userID.(string), keyword, searchType, limit) if err != nil { utils.InternalError(c, "搜索失败") return } utils.SuccessWithData(c, result, "搜索成功") }