From 25adc0410dc6ec42f9ae7770559c72c51186e43e Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 15 Apr 2025 15:09:46 +0200 Subject: [PATCH] feat(assist-api): added counter support --- ee/backend/pkg/assist/service/assist.go | 11 +++++- ee/backend/pkg/sessionmanager/manager.go | 45 +++++++++++++++++++----- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/ee/backend/pkg/assist/service/assist.go b/ee/backend/pkg/assist/service/assist.go index 90b2fb3ae..da4bc1bd1 100644 --- a/ee/backend/pkg/assist/service/assist.go +++ b/ee/backend/pkg/assist/service/assist.go @@ -120,7 +120,16 @@ func (a *assistImpl) GetAll(projectKey string, request *Request) (interface{}, e Operator: f.Operator == "is", }) } - return a.sessions.GetAll(strconv.Itoa(int(project.ProjectID)), filters, order, request.Pagination.Page, request.Pagination.Limit) + sessions, total, counter, err := a.sessions.GetAll(strconv.Itoa(int(project.ProjectID)), filters, order, request.Pagination.Page, request.Pagination.Limit) + if err != nil { + return nil, fmt.Errorf("failed to get sessions: %s", err) + } + resp := map[string]interface{}{ + "total": total, + "counter": counter, + "sessions": sessions, + } + return resp, nil } func (a *assistImpl) GetByID(projectKey, sessionID string, filters *Request) (interface{}, error) { diff --git a/ee/backend/pkg/sessionmanager/manager.go b/ee/backend/pkg/sessionmanager/manager.go index bd1127fb4..160c3e5c3 100644 --- a/ee/backend/pkg/sessionmanager/manager.go +++ b/ee/backend/pkg/sessionmanager/manager.go @@ -44,7 +44,7 @@ type SessionManager interface { Start() Stop() GetByID(projectID, sessionID string) (*SessionData, error) - GetAll(projectID string, filters []*Filter, sort SortOrder, page, limit int) ([]*SessionData, error) + GetAll(projectID string, filters []*Filter, sort SortOrder, page, limit int) ([]*SessionData, int, map[string]map[string]int, error) Autocomplete(projectID string, key FilterType, value string) ([]string, error) } @@ -375,7 +375,7 @@ func (sm *sessionManagerImpl) GetByID(projectID, sessionID string) (*SessionData return sessionData, nil } -func (sm *sessionManagerImpl) GetAll(projectID string, filters []*Filter, sort SortOrder, page, limit int) ([]*SessionData, error) { +func (sm *sessionManagerImpl) GetAll(projectID string, filters []*Filter, sort SortOrder, page, limit int) ([]*SessionData, int, map[string]map[string]int, error) { if page < 1 || limit < 1 { page, limit = 1, 10 // Set default values } @@ -383,12 +383,23 @@ func (sm *sessionManagerImpl) GetAll(projectID string, filters []*Filter, sort S sm.mutex.RLock() defer sm.mutex.RUnlock() + // Prepare filter counter + counter := make(map[string]map[string]int) + for _, filter := range filters { + if _, ok := counter[string(filter.Type)]; !ok { + counter[string(filter.Type)] = make(map[string]int) + } + for _, value := range filter.Value { + counter[string(filter.Type)][value] = 0 + } + } filtered := make([]*SessionData, 0, limit) for _, session := range sm.sorted { + sm.log.Info(sm.ctx, "projectID: %s, sessionID: %s", session.ProjectID, session.SessionID) if session.ProjectID != projectID { continue } - if matchesFilters(session, filters) { + if matchesFilters(session, filters, counter) { filtered = append(filtered, session) } } @@ -396,19 +407,24 @@ func (sm *sessionManagerImpl) GetAll(projectID string, filters []*Filter, sort S start := (page - 1) * limit end := start + limit if start > len(filtered) { - return []*SessionData{}, nil + return []*SessionData{}, 0, make(map[string]map[string]int), nil } if end > len(filtered) { end = len(filtered) } - return filtered[start:end], nil + return filtered[start:end], len(filtered), counter, nil } -func matchesFilters(session *SessionData, filters []*Filter) bool { +func matchesFilters(session *SessionData, filters []*Filter, counter map[string]map[string]int) bool { if filters == nil || len(filters) == 0 { return true } + matchedFilters := make(map[string][]string, len(filters)) for _, filter := range filters { + name := string(filter.Type) + if _, ok := matchedFilters[name]; !ok { + matchedFilters[name] = make([]string, 0, len(filter.Value)) + } var value string switch filter.Type { @@ -449,17 +465,28 @@ func matchesFilters(session *SessionData, filters []*Filter) bool { value = *session.UserCity } default: - if val, ok := (*session.Metadata)[string(filter.Type)]; ok { + if val, ok := (*session.Metadata)[name]; ok { value = val } } + matched := false for _, filterValue := range filter.Value { if filter.Operator == Is && value != filterValue { - return false + continue } else if filter.Operator == Contains && !strings.Contains(strings.ToLower(value), strings.ToLower(filterValue)) { - return false + continue } + matched = true + matchedFilters[name] = append(matchedFilters[name], value) + } + if !matched { + return false + } + } + for values, filter := range matchedFilters { + for _, value := range filter { + counter[values][value]++ } } return true