From f0084229a5ca6a0c51addb888237f6eb42becbfb Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Thu, 25 Feb 2016 04:24:03 -0300 Subject: Member show on Activate and Hide on deactivate from channel member list and at_mention --- api/user.go | 2 + store/sql_channel_store.go | 22 ++++++++ store/sql_channel_store_test.go | 64 ++++++++++++++++++++++ store/store.go | 1 + web/react/components/member_list_team_item.jsx | 3 + .../components/suggestion/at_mention_provider.jsx | 2 +- 6 files changed, 93 insertions(+), 1 deletion(-) diff --git a/api/user.go b/api/user.go index 7919da168..140013f9a 100644 --- a/api/user.go +++ b/api/user.go @@ -1510,6 +1510,8 @@ func UpdateActive(c *Context, user *model.User, active bool) *model.User { RevokeAllSession(c, user.Id) } + <-Srv.Store.Channel().ExtraUpdateByUser(user.Id, model.GetMillis()) + ruser := result.Data.([2]*model.User)[0] options := utils.Cfg.GetSanitizeOptions() options["passwordupdate"] = false diff --git a/store/sql_channel_store.go b/store/sql_channel_store.go index 87ee2bb11..35322e061 100644 --- a/store/sql_channel_store.go +++ b/store/sql_channel_store.go @@ -924,3 +924,25 @@ func (s SqlChannelStore) AnalyticsTypeCount(teamId string, channelType string) S return storeChannel } + +func (s SqlChannelStore) ExtraUpdateByUser(userId string, time int64) StoreChannel { + storeChannel := make(StoreChannel) + + go func() { + result := StoreResult{} + + _, err := s.GetMaster().Exec( + `UPDATE Channels SET ExtraUpdateAt = :Time + WHERE Id IN (SELECT ChannelId FROM ChannelMembers WHERE UserId = :UserId);`, + map[string]interface{}{"UserId": userId, "Time": time}) + + if err != nil { + result.Err = model.NewLocAppError("SqlChannelStore.extraUpdated", "store.sql_channel.extra_updated.app_error", nil, "user_id="+userId+", "+err.Error()) + } + + storeChannel <- result + close(storeChannel) + }() + + return storeChannel +} diff --git a/store/sql_channel_store_test.go b/store/sql_channel_store_test.go index 816a85aef..2213aa795 100644 --- a/store/sql_channel_store_test.go +++ b/store/sql_channel_store_test.go @@ -868,3 +868,67 @@ func TestGetMemberCount(t *testing.T) { t.Fatal("got incorrect member count %v", result.Data) } } + +func TestUpdateExtrasByUser(t *testing.T) { + Setup() + + teamId := model.NewId() + + c1 := model.Channel{ + TeamId: teamId, + DisplayName: "Channel1", + Name: "a" + model.NewId() + "b", + Type: model.CHANNEL_OPEN, + } + Must(store.Channel().Save(&c1)) + + c2 := model.Channel{ + TeamId: teamId, + DisplayName: "Channel2", + Name: "a" + model.NewId() + "b", + Type: model.CHANNEL_OPEN, + } + Must(store.Channel().Save(&c2)) + + t.Logf("c1.Id = %v", c1.Id) + + u1 := model.User{ + TeamId: teamId, + Email: model.NewId(), + DeleteAt: 0, + } + Must(store.User().Save(&u1)) + + m1 := model.ChannelMember{ + ChannelId: c1.Id, + UserId: u1.Id, + NotifyProps: model.GetDefaultChannelNotifyProps(), + } + Must(store.Channel().SaveMember(&m1)) + + u1.DeleteAt = model.GetMillis() + Must(store.User().Update(&u1, true)) + + if result := <-store.Channel().ExtraUpdateByUser(u1.Id, u1.DeleteAt); result.Err != nil { + t.Fatal("failed to update extras by user: %v", result.Err) + } + + if result := <-store.Channel().GetExtraMembers(c1.Id, -1); result.Err != nil { + t.Fatal("failed to get extras: %v", result.Err) + } else if len(result.Data.([]model.ExtraMember)) != 0 { + t.Fatal("got incorrect member count %v", len(result.Data.([]model.ExtraMember))) + } + + u1.DeleteAt = 0 + Must(store.User().Update(&u1, true)) + + if result := <-store.Channel().ExtraUpdateByUser(u1.Id, u1.DeleteAt); result.Err != nil { + t.Fatal("failed to update extras by user: %v", result.Err) + } + + if result := <-store.Channel().GetExtraMembers(c1.Id, -1); result.Err != nil { + t.Fatal("failed to get extras: %v", result.Err) + } else if len(result.Data.([]model.ExtraMember)) != 1 { + t.Fatal("got incorrect member count %v", len(result.Data.([]model.ExtraMember))) + } +} diff --git a/store/store.go b/store/store.go index 952b96e87..397601543 100644 --- a/store/store.go +++ b/store/store.go @@ -85,6 +85,7 @@ type ChannelStore interface { UpdateLastViewedAt(channelId string, userId string) StoreChannel IncrementMentionCount(channelId string, userId string) StoreChannel AnalyticsTypeCount(teamId string, channelType string) StoreChannel + ExtraUpdateByUser(userId string, time int64) StoreChannel } type PostStore interface { diff --git a/web/react/components/member_list_team_item.jsx b/web/react/components/member_list_team_item.jsx index 7b1f6170d..23bc10781 100644 --- a/web/react/components/member_list_team_item.jsx +++ b/web/react/components/member_list_team_item.jsx @@ -2,6 +2,7 @@ // See License.txt for license information. import UserStore from '../stores/user_store.jsx'; +import ChannelStore from '../stores/channel_store.jsx'; import * as Client from '../utils/client.jsx'; import * as AsyncClient from '../utils/async_client.jsx'; import * as Utils from '../utils/utils.jsx'; @@ -71,6 +72,7 @@ export default class MemberListTeamItem extends React.Component { Client.updateActive(this.props.user.id, true, () => { AsyncClient.getProfiles(); + AsyncClient.getChannelExtraInfo(ChannelStore.getCurrentId()); }, (err) => { this.setState({serverError: err.message}); @@ -81,6 +83,7 @@ export default class MemberListTeamItem extends React.Component { Client.updateActive(this.props.user.id, false, () => { AsyncClient.getProfiles(); + AsyncClient.getChannelExtraInfo(ChannelStore.getCurrentId()); }, (err) => { this.setState({serverError: err.message}); diff --git a/web/react/components/suggestion/at_mention_provider.jsx b/web/react/components/suggestion/at_mention_provider.jsx index c4e1314c9..4dc72f69a 100644 --- a/web/react/components/suggestion/at_mention_provider.jsx +++ b/web/react/components/suggestion/at_mention_provider.jsx @@ -83,7 +83,7 @@ export default class AtMentionProvider { if (captured) { const usernamePrefix = captured[1]; - const users = UserStore.getProfiles(); + const users = UserStore.getActiveOnlyProfiles(true); let filtered = []; for (const id of Object.keys(users)) { -- cgit v1.2.3-1-g7c22 From 6a8df70e73d6422bee212f81f231403a10d03c26 Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Thu, 25 Feb 2016 13:46:17 -0300 Subject: Set Context Error if ExtraUpdateByUser fails --- api/user.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/api/user.go b/api/user.go index 140013f9a..cf0950804 100644 --- a/api/user.go +++ b/api/user.go @@ -1510,7 +1510,9 @@ func UpdateActive(c *Context, user *model.User, active bool) *model.User { RevokeAllSession(c, user.Id) } - <-Srv.Store.Channel().ExtraUpdateByUser(user.Id, model.GetMillis()) + if extra := <-Srv.Store.Channel().ExtraUpdateByUser(user.Id, model.GetMillis()); extra.Err != nil { + c.Err = exra.Err + } ruser := result.Data.([2]*model.User)[0] options := utils.Cfg.GetSanitizeOptions() -- cgit v1.2.3-1-g7c22 From 25d599747e6a6286a5943d63d12eb8e1b9eaa99d Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Thu, 25 Feb 2016 14:10:24 -0300 Subject: Fix typo --- api/user.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/user.go b/api/user.go index cf0950804..b7e6220d8 100644 --- a/api/user.go +++ b/api/user.go @@ -1511,7 +1511,7 @@ func UpdateActive(c *Context, user *model.User, active bool) *model.User { } if extra := <-Srv.Store.Channel().ExtraUpdateByUser(user.Id, model.GetMillis()); extra.Err != nil { - c.Err = exra.Err + c.Err = extra.Err } ruser := result.Data.([2]*model.User)[0] -- cgit v1.2.3-1-g7c22