From 139cb52c99ac525f44a280803447bbbd88369f23 Mon Sep 17 00:00:00 2001 From: enahum Date: Wed, 21 Dec 2016 16:20:11 -0300 Subject: Fix teams unread count (#4848) * Fix teams unread * Moving logic out of the store * fix unit test --- api/team.go | 33 +++++++++++++++++++++++++++++++-- model/channel_member.go | 8 ++++++++ store/sql_team_store.go | 20 ++++++++------------ store/sql_team_store_test.go | 23 ++++++++++++++++++----- 4 files changed, 65 insertions(+), 19 deletions(-) diff --git a/api/team.go b/api/team.go index e73eb66e1..730eb1d3d 100644 --- a/api/team.go +++ b/api/team.go @@ -751,8 +751,37 @@ func getMyTeamsUnread(c *Context, w http.ResponseWriter, r *http.Request) { c.Err = result.Err return } else { - data := result.Data.([]*model.TeamUnread) - w.Write([]byte(model.TeamsUnreadToJson(data))) + data := result.Data.([]*model.ChannelUnread) + var members []*model.TeamUnread + membersMap := make(map[string]*model.TeamUnread) + + unreads := func(cu *model.ChannelUnread, tu *model.TeamUnread) *model.TeamUnread { + tu.MentionCount += cu.MentionCount + + if cu.NotifyProps["mark_unread"] != model.CHANNEL_MARK_UNREAD_MENTION { + tu.MsgCount += (cu.TotalMsgCount - cu.MsgCount) + } + + return tu + } + + for i := range data { + id := data[i].TeamId + if mu, ok := membersMap[id]; ok { + membersMap[id] = unreads(data[i], mu) + } else { + membersMap[id] = unreads(data[i], &model.TeamUnread{ + MsgCount: 0, + MentionCount: 0, + TeamId: id, + }) + } + } + + for _, val := range membersMap { + members = append(members, val) + } + w.Write([]byte(model.TeamsUnreadToJson(members))) } } diff --git a/model/channel_member.go b/model/channel_member.go index 4180bb8e6..a607a5059 100644 --- a/model/channel_member.go +++ b/model/channel_member.go @@ -18,6 +18,14 @@ const ( CHANNEL_MARK_UNREAD_MENTION = "mention" ) +type ChannelUnread struct { + TeamId string + TotalMsgCount int64 + MsgCount int64 + MentionCount int64 + NotifyProps StringMap +} + type ChannelMember struct { ChannelId string `json:"channel_id"` UserId string `json:"user_id"` diff --git a/store/sql_team_store.go b/store/sql_team_store.go index cc6343169..023ce8a5a 100644 --- a/store/sql_team_store.go +++ b/store/sql_team_store.go @@ -589,24 +589,20 @@ func (s SqlTeamStore) GetTeamsUnreadForUser(teamId, userId string) StoreChannel go func() { result := StoreResult{} - var members []*model.TeamUnread - _, err := s.GetReplica().Select(&members, + var data []*model.ChannelUnread + _, err := s.GetReplica().Select(&data, `SELECT - Channels.TeamId, - SUM(Channels.TotalMsgCount - ChannelMembers.MsgCount) as MsgCount, - SUM(ChannelMembers.MentionCount) as MentionCount + Channels.TeamId, Channels.TotalMsgCount, ChannelMembers.MsgCount, ChannelMembers.MentionCount, ChannelMembers.NotifyProps FROM - Channels, - ChannelMembers + Channels, ChannelMembers WHERE - Channels.Id = ChannelMembers.ChannelId AND Channels.DeleteAt = 0 AND - ChannelMembers.UserId = :UserId AND Channels.TeamId != :TeamId - GROUP BY - Channels.TeamId`, map[string]interface{}{"UserId": userId, "TeamId": teamId}) + Id = ChannelId AND UserId = :UserId AND DeleteAt = 0 AND TeamId != :TeamId`, + map[string]interface{}{"UserId": userId, "TeamId": teamId}) + if err != nil { result.Err = model.NewLocAppError("SqlTeamStore.GetTeamsUnreadForUser", "store.sql_team.get_unread.app_error", nil, "userId="+userId+" "+err.Error()) } else { - result.Data = members + result.Data = data } storeChannel <- result diff --git a/store/sql_team_store_test.go b/store/sql_team_store_test.go index 5e6abd102..8a302a9e2 100644 --- a/store/sql_team_store_test.go +++ b/store/sql_team_store_test.go @@ -555,9 +555,15 @@ func TestMyTeamMembersUnread(t *testing.T) { if r1 := <-store.Team().GetTeamsUnreadForUser("", uid); r1.Err != nil { t.Fatal(r1.Err) } else { - ms := r1.Data.([]*model.TeamUnread) - - if len(ms) != 2 { + ms := r1.Data.([]*model.ChannelUnread) + membersMap := make(map[string]bool) + for i := range ms { + id := ms[i].TeamId + if _, ok := membersMap[id]; !ok { + membersMap[id] = true + } + } + if len(membersMap) != 2 { t.Fatal("Should be the unreads for all the teams") } } @@ -565,9 +571,16 @@ func TestMyTeamMembersUnread(t *testing.T) { if r2 := <-store.Team().GetTeamsUnreadForUser(teamId1, uid); r2.Err != nil { t.Fatal(r2.Err) } else { - ms := r2.Data.([]*model.TeamUnread) + ms := r2.Data.([]*model.ChannelUnread) + membersMap := make(map[string]bool) + for i := range ms { + id := ms[i].TeamId + if _, ok := membersMap[id]; !ok { + membersMap[id] = true + } + } - if len(ms) != 1 { + if len(membersMap) != 1 { t.Fatal("Should be the unreads for just one team") } } -- cgit v1.2.3-1-g7c22