summaryrefslogtreecommitdiffstats
path: root/store
diff options
context:
space:
mode:
authorenahum <nahumhbl@gmail.com>2016-10-27 12:24:30 -0300
committerHarrison Healey <harrisonmhealey@gmail.com>2016-10-27 11:24:30 -0400
commitf82667f3b86202dafff3a2a4ea56aec74c80316d (patch)
tree3785d9502505be528706e41b993a834c7bc00338 /store
parent14ce471311fee2830be3cbd3a90179015f513719 (diff)
downloadchat-f82667f3b86202dafff3a2a4ea56aec74c80316d.tar.gz
chat-f82667f3b86202dafff3a2a4ea56aec74c80316d.tar.bz2
chat-f82667f3b86202dafff3a2a4ea56aec74c80316d.zip
PLT-4430 improve slow channel switching (#4331)
* PLT-4430 improve slow channel switching * Update client side unit tests * Convert getChannelsUnread to getMyChannelMembers and address other feedback * Pull channel members on websocket reconnect
Diffstat (limited to 'store')
-rw-r--r--store/sql_channel_store.go55
-rw-r--r--store/sql_channel_store_test.go55
-rw-r--r--store/store.go1
3 files changed, 90 insertions, 21 deletions
diff --git a/store/sql_channel_store.go b/store/sql_channel_store.go
index f863d57fd..f1cf7f849 100644
--- a/store/sql_channel_store.go
+++ b/store/sql_channel_store.go
@@ -367,23 +367,16 @@ func (s SqlChannelStore) GetChannels(teamId string, userId string) StoreChannel
go func() {
result := StoreResult{}
- var data []channelWithMember
- _, err := s.GetReplica().Select(&data, "SELECT * FROM Channels, ChannelMembers WHERE Id = ChannelId AND UserId = :UserId AND DeleteAt = 0 AND (TeamId = :TeamId OR TeamId = '') ORDER BY DisplayName", map[string]interface{}{"TeamId": teamId, "UserId": userId})
+ data := &model.ChannelList{}
+ _, err := s.GetReplica().Select(data, "SELECT Channels.* FROM Channels, ChannelMembers WHERE Id = ChannelId AND UserId = :UserId AND DeleteAt = 0 AND (TeamId = :TeamId OR TeamId = '') ORDER BY DisplayName", map[string]interface{}{"TeamId": teamId, "UserId": userId})
if err != nil {
result.Err = model.NewLocAppError("SqlChannelStore.GetChannels", "store.sql_channel.get_channels.get.app_error", nil, "teamId="+teamId+", userId="+userId+", err="+err.Error())
} else {
- channels := &model.ChannelList{make([]*model.Channel, len(data)), make(map[string]*model.ChannelMember)}
- for i := range data {
- v := data[i]
- channels.Channels[i] = &v.Channel
- channels.Members[v.Channel.Id] = &v.ChannelMember
- }
-
- if len(channels.Channels) == 0 {
+ if len(*data) == 0 {
result.Err = model.NewLocAppError("SqlChannelStore.GetChannels", "store.sql_channel.get_channels.not_found.app_error", nil, "teamId="+teamId+", userId="+userId)
} else {
- result.Data = channels
+ result.Data = data
}
}
@@ -400,8 +393,8 @@ func (s SqlChannelStore) GetMoreChannels(teamId string, userId string) StoreChan
go func() {
result := StoreResult{}
- var data []*model.Channel
- _, err := s.GetReplica().Select(&data,
+ data := &model.ChannelList{}
+ _, err := s.GetReplica().Select(data,
`SELECT
*
FROM
@@ -426,7 +419,7 @@ func (s SqlChannelStore) GetMoreChannels(teamId string, userId string) StoreChan
if err != nil {
result.Err = model.NewLocAppError("SqlChannelStore.GetMoreChannels", "store.sql_channel.get_more_channels.get.app_error", nil, "teamId="+teamId+", userId="+userId+", err="+err.Error())
} else {
- result.Data = &model.ChannelList{data, make(map[string]*model.ChannelMember)}
+ result.Data = data
}
storeChannel <- result
@@ -918,11 +911,12 @@ func (s SqlChannelStore) IncrementMentionCount(channelId string, userId string)
`UPDATE
ChannelMembers
SET
- MentionCount = MentionCount + 1
+ MentionCount = MentionCount + 1,
+ LastUpdateAt = :LastUpdateAt
WHERE
UserId = :UserId
AND ChannelId = :ChannelId`,
- map[string]interface{}{"ChannelId": channelId, "UserId": userId})
+ map[string]interface{}{"ChannelId": channelId, "UserId": userId, "LastUpdateAt": model.GetMillis()})
if err != nil {
result.Err = model.NewLocAppError("SqlChannelStore.IncrementMentionCount", "store.sql_channel.increment_mention_count.app_error", nil, "channel_id="+channelId+", user_id="+userId+", "+err.Error())
}
@@ -1032,3 +1026,32 @@ func (s SqlChannelStore) ExtraUpdateByUser(userId string, time int64) StoreChann
return storeChannel
}
+
+func (s SqlChannelStore) GetMembersForUser(teamId string, userId string) StoreChannel {
+ storeChannel := make(StoreChannel, 1)
+
+ go func() {
+ result := StoreResult{}
+
+ members := &model.ChannelMembers{}
+ _, err := s.GetReplica().Select(members, `
+ SELECT cm.*
+ FROM ChannelMembers cm
+ INNER JOIN Channels c
+ ON c.Id = cm.ChannelId
+ AND c.TeamId = :TeamId
+ WHERE cm.UserId = :UserId
+ `, map[string]interface{}{"TeamId": teamId, "UserId": userId})
+
+ if err != nil {
+ result.Err = model.NewLocAppError("SqlChannelStore.GetMembersForUser", "store.sql_channel.get_members.app_error", nil, "teamId="+teamId+", userId="+userId+", err="+err.Error())
+ } else {
+ result.Data = members
+ }
+
+ storeChannel <- result
+ close(storeChannel)
+ }()
+
+ return storeChannel
+}
diff --git a/store/sql_channel_store_test.go b/store/sql_channel_store_test.go
index d80d54d52..8a51d2ae3 100644
--- a/store/sql_channel_store_test.go
+++ b/store/sql_channel_store_test.go
@@ -305,14 +305,14 @@ func TestChannelStoreDelete(t *testing.T) {
cresult := <-store.Channel().GetChannels(o1.TeamId, m1.UserId)
list := cresult.Data.(*model.ChannelList)
- if len(list.Channels) != 1 {
+ if len(*list) != 1 {
t.Fatal("invalid number of channels")
}
cresult = <-store.Channel().GetMoreChannels(o1.TeamId, m1.UserId)
list = cresult.Data.(*model.ChannelList)
- if len(list.Channels) != 1 {
+ if len(*list) != 1 {
t.Fatal("invalid number of channels")
}
}
@@ -514,7 +514,7 @@ func TestChannelStoreGetChannels(t *testing.T) {
cresult := <-store.Channel().GetChannels(o1.TeamId, m1.UserId)
list := cresult.Data.(*model.ChannelList)
- if list.Channels[0].Id != o1.Id {
+ if (*list)[0].Id != o1.Id {
t.Fatal("missing channel")
}
@@ -614,11 +614,11 @@ func TestChannelStoreGetMoreChannels(t *testing.T) {
cresult := <-store.Channel().GetMoreChannels(o1.TeamId, m1.UserId)
list := cresult.Data.(*model.ChannelList)
- if len(list.Channels) != 1 {
+ if len(*list) != 1 {
t.Fatal("wrong list")
}
- if list.Channels[0].Name != o3.Name {
+ if (*list)[0].Name != o3.Name {
t.Fatal("missing channel")
}
@@ -688,6 +688,51 @@ func TestChannelStoreGetChannelCounts(t *testing.T) {
}
}
+func TestChannelStoreGetMembersForUser(t *testing.T) {
+ Setup()
+
+ t1 := model.Team{}
+ t1.DisplayName = "Name"
+ t1.Name = model.NewId()
+ t1.Email = model.NewId() + "@nowhere.com"
+ t1.Type = model.TEAM_OPEN
+ Must(store.Team().Save(&t1))
+
+ o1 := model.Channel{}
+ o1.TeamId = t1.Id
+ o1.DisplayName = "Channel1"
+ o1.Name = "a" + model.NewId() + "b"
+ o1.Type = model.CHANNEL_OPEN
+ Must(store.Channel().Save(&o1))
+
+ o2 := model.Channel{}
+ o2.TeamId = o1.TeamId
+ o2.DisplayName = "Channel2"
+ o2.Name = "a" + model.NewId() + "b"
+ o2.Type = model.CHANNEL_OPEN
+ Must(store.Channel().Save(&o2))
+
+ m1 := model.ChannelMember{}
+ m1.ChannelId = o1.Id
+ m1.UserId = model.NewId()
+ m1.NotifyProps = model.GetDefaultChannelNotifyProps()
+ Must(store.Channel().SaveMember(&m1))
+
+ m2 := model.ChannelMember{}
+ m2.ChannelId = o2.Id
+ m2.UserId = m1.UserId
+ m2.NotifyProps = model.GetDefaultChannelNotifyProps()
+ Must(store.Channel().SaveMember(&m2))
+
+ cresult := <-store.Channel().GetMembersForUser(o1.TeamId, m1.UserId)
+ members := cresult.Data.(*model.ChannelMembers)
+
+ // no unread messages
+ if len(*members) != 2 {
+ t.Fatal("wrong number of members")
+ }
+}
+
func TestChannelStoreUpdateLastViewedAt(t *testing.T) {
Setup()
diff --git a/store/store.go b/store/store.go
index 51aada920..6cf216699 100644
--- a/store/store.go
+++ b/store/store.go
@@ -109,6 +109,7 @@ type ChannelStore interface {
IncrementMentionCount(channelId string, userId string) StoreChannel
AnalyticsTypeCount(teamId string, channelType string) StoreChannel
ExtraUpdateByUser(userId string, time int64) StoreChannel
+ GetMembersForUser(teamId string, userId string) StoreChannel
}
type PostStore interface {