GetMessagesList 获取消息列表 @Summary 获取消息列表 @Description 获取消息列表,支持关键词、思考方式、回答状态、知识类型、日期范围、来源筛选,支持排序 @Tags Message @Accept json @Produce json @Security BearerAuth @Param keyword query string false "搜索关键词,支持在消息内容和回答内容中搜索" @Param file_keyword query string false "文件名搜索关键词,支持模糊搜索匹配的文件" @Param offset query int
(c *gin.Context)
| 619 | // @Success 200 {object} model.CommonResponse{data=MessagesResponse} "Success" |
| 620 | // @Router /api/messages/list [get] |
| 621 | func GetMessagesList(c *gin.Context) { |
| 622 | var messageListRequest MessageListAllRequest |
| 623 | if err := c.ShouldBindQuery(&messageListRequest); err != nil { |
| 624 | c.JSON(http.StatusBadRequest, model.ParamError.ToResponse(err)) |
| 625 | return |
| 626 | } |
| 627 | |
| 628 | // 设置默认方向为从新到旧 |
| 629 | if messageListRequest.Direction == "" { |
| 630 | messageListRequest.Direction = "desc" |
| 631 | } |
| 632 | |
| 633 | // 手动解码 agent_id HashID(防止 RequestDecoder 未能正确解码的情况) |
| 634 | // 同时处理 ShouldBindQuery 解析失败的情况(agent_id 为 HashID 字符串时会导致绑定失败) |
| 635 | if agentIDStr := c.Query("agent_id"); agentIDStr != "" { |
| 636 | if id, err := hashids.TryParseID(agentIDStr); err == nil { |
| 637 | messageListRequest.AgentID = &id |
| 638 | } |
| 639 | } |
| 640 | |
| 641 | eid := config.GetEID(c) |
| 642 | var fileIDs []int64 |
| 643 | if messageListRequest.FileKeyword != "" { |
| 644 | // 执行文件名搜索逻辑 |
| 645 | esClient := elasticsearch.GetGlobalClient() |
| 646 | if esClient != nil && !esClient.IsDisabled() { |
| 647 | // 创建文件搜索服务 |
| 648 | esSearchService := elasticsearch.NewFileNameSearchService(esClient, model.DB) |
| 649 | // 构建搜索请求 |
| 650 | searchReq := &elasticsearch.FileNameSearchRequest{ |
| 651 | Query: messageListRequest.FileKeyword, |
| 652 | TopK: 1000, // 搜索足够多的文件 ID |
| 653 | } |
| 654 | // 执行搜索 |
| 655 | response, err := esSearchService.Search(eid, searchReq) |
| 656 | if err != nil { |
| 657 | logger.SysLogf("GetMessagesList 文件名 ES 搜索失败: eid=%d, query=%s, err=%v", eid, messageListRequest.FileKeyword, err) |
| 658 | } else if len(response.Results) > 0 { |
| 659 | for _, res := range response.Results { |
| 660 | fileIDs = append(fileIDs, res.FileID) |
| 661 | } |
| 662 | } |
| 663 | } |
| 664 | |
| 665 | // 如果 ES 没搜到或报错,尝试数据库降级搜索(仅当 fileIDs 为空时) |
| 666 | if len(fileIDs) == 0 { |
| 667 | var files []model.File |
| 668 | // 数据库 LIKE 搜索 |
| 669 | if err := model.DB.Where("eid = ? AND is_deleted = ? AND path LIKE ?", eid, false, "%"+messageListRequest.FileKeyword+"%").Limit(1000).Find(&files).Error; err == nil { |
| 670 | for _, f := range files { |
| 671 | fileIDs = append(fileIDs, f.ID) |
| 672 | } |
| 673 | } |
| 674 | } |
| 675 | |
| 676 | // 如果最终还是没搜到匹配的文件,说明该文件名下没有消息,直接返回空 |
| 677 | if len(fileIDs) == 0 { |
| 678 | c.JSON(http.StatusOK, model.Success.ToResponse(&MessagesResponse{ |
nothing calls this directly
no test coverage detected