Enhance chat retrieval in Xun by adding filtering and validation

- Updated GetChats method to filter out empty chat IDs, ensuring only valid chats are processed.
- Improved date handling by refining the logic for grouping chats into "This Week" and "Last Week" categories.
- Enhanced error handling for created_at field parsing, supporting multiple date formats for better robustness.
- Streamlined chat grouping logic for clearer organization of chat data in responses.
This commit is contained in:
Max 2024-12-17 11:18:00 +08:00
parent fe8b3df163
commit 9598d000cd

View file

@ -262,7 +262,8 @@ func (conv *Xun) GetChats(sid string, filter ChatFilter) (*ChatGroupResponse, er
// Build base query // Build base query
qb := conv.newQueryChat(). qb := conv.newQueryChat().
Select("chat_id", "title", "created_at"). Select("chat_id", "title", "created_at").
Where("sid", userID) Where("sid", userID).
Where("chat_id", "!=", "")
// Add keyword filter // Add keyword filter
if filter.Keywords != "" { if filter.Keywords != "" {
@ -296,6 +297,7 @@ func (conv *Xun) GetChats(sid string, filter ChatFilter) (*ChatGroupResponse, er
yesterday := today.AddDate(0, 0, -1) yesterday := today.AddDate(0, 0, -1)
thisWeekStart := today.AddDate(0, 0, -int(today.Weekday())) thisWeekStart := today.AddDate(0, 0, -int(today.Weekday()))
lastWeekStart := thisWeekStart.AddDate(0, 0, -7) lastWeekStart := thisWeekStart.AddDate(0, 0, -7)
lastWeekEnd := thisWeekStart.AddDate(0, 0, -1)
groups := map[string][]map[string]interface{}{ groups := map[string][]map[string]interface{}{
"Today": {}, "Today": {},
@ -306,23 +308,32 @@ func (conv *Xun) GetChats(sid string, filter ChatFilter) (*ChatGroupResponse, er
} }
for _, row := range rows { for _, row := range rows {
chatID := row.Get("chat_id")
if chatID == nil || chatID == "" {
continue
}
chat := map[string]interface{}{ chat := map[string]interface{}{
"chat_id": row.Get("chat_id"), "chat_id": chatID,
"title": row.Get("title"), "title": row.Get("title"),
} }
createdAt, ok := row.Get("created_at").(time.Time) var createdAt time.Time
if !ok { switch v := row.Get("created_at").(type) {
// Try to parse string if it's not already time.Time case time.Time:
if timeStr, ok := row.Get("created_at").(string); ok { createdAt = v
var err error case string:
createdAt, err = time.Parse(time.RFC3339, timeStr) parsed, err := time.Parse("2006-01-02 15:04:05.999999-07:00", v)
if err != nil {
// Try alternative format
parsed, err = time.Parse(time.RFC3339, v)
if err != nil { if err != nil {
continue continue
} }
} else {
continue
} }
createdAt = parsed
default:
continue
} }
createdDate := createdAt.Truncate(24 * time.Hour) createdDate := createdAt.Truncate(24 * time.Hour)
@ -332,9 +343,9 @@ func (conv *Xun) GetChats(sid string, filter ChatFilter) (*ChatGroupResponse, er
groups["Today"] = append(groups["Today"], chat) groups["Today"] = append(groups["Today"], chat)
case createdDate.Equal(yesterday): case createdDate.Equal(yesterday):
groups["Yesterday"] = append(groups["Yesterday"], chat) groups["Yesterday"] = append(groups["Yesterday"], chat)
case createdDate.After(thisWeekStart) || createdDate.Equal(thisWeekStart): case createdDate.After(thisWeekStart) && createdDate.Before(today):
groups["This Week"] = append(groups["This Week"], chat) groups["This Week"] = append(groups["This Week"], chat)
case createdDate.After(lastWeekStart) || createdDate.Equal(lastWeekStart): case createdDate.After(lastWeekStart) && createdDate.Before(lastWeekEnd.AddDate(0, 0, 1)):
groups["Last Week"] = append(groups["Last Week"], chat) groups["Last Week"] = append(groups["Last Week"], chat)
default: default:
groups["Even Earlier"] = append(groups["Even Earlier"], chat) groups["Even Earlier"] = append(groups["Even Earlier"], chat)