From be5c96291355fef040cfbd73005707378fba3601 Mon Sep 17 00:00:00 2001 From: Sheshagiri Rao Mallipedhi Date: Thu, 20 Jun 2019 13:07:26 +0530 Subject: [PATCH] Migrate Channel.GetMemberForPost to Sync by default (#11244) * Migrate Channel.GetMemberForPost to Sync by default * fix indentation --- app/authorization.go | 9 +--- store/sqlstore/channel_store.go | 64 +++++++++++++-------------- store/store.go | 2 +- store/storetest/channel_store.go | 8 ++-- store/storetest/mocks/ChannelStore.go | 19 +++++--- 5 files changed, 52 insertions(+), 50 deletions(-) diff --git a/app/authorization.go b/app/authorization.go index 49372a5a3f..7c855b2f8f 100644 --- a/app/authorization.go +++ b/app/authorization.go @@ -66,9 +66,7 @@ func (a *App) SessionHasPermissionToChannel(session model.Session, channelId str } func (a *App) SessionHasPermissionToChannelByPost(session model.Session, postId string, permission *model.Permission) bool { - var channelMember *model.ChannelMember - if result := <-a.Srv.Store.Channel().GetMemberForPost(postId, session.UserId); result.Err == nil { - channelMember = result.Data.(*model.ChannelMember) + if channelMember, err := a.Srv.Store.Channel().GetMemberForPost(postId, session.UserId); err == nil { if a.RolesGrantPermission(channelMember.GetRoles(), permission.Id) { return true @@ -165,10 +163,7 @@ func (a *App) HasPermissionToChannel(askingUserId string, channelId string, perm } func (a *App) HasPermissionToChannelByPost(askingUserId string, postId string, permission *model.Permission) bool { - var channelMember *model.ChannelMember - if result := <-a.Srv.Store.Channel().GetMemberForPost(postId, askingUserId); result.Err == nil { - channelMember = result.Data.(*model.ChannelMember) - + if channelMember, err := a.Srv.Store.Channel().GetMemberForPost(postId, askingUserId); err == nil { if a.RolesGrantPermission(channelMember.GetRoles(), permission.Id) { return true } diff --git a/store/sqlstore/channel_store.go b/store/sqlstore/channel_store.go index a2402b2b52..38c0b0a8f6 100644 --- a/store/sqlstore/channel_store.go +++ b/store/sqlstore/channel_store.go @@ -1464,39 +1464,37 @@ func (s SqlChannelStore) IsUserInChannelUseCache(userId string, channelId string return false } -func (s SqlChannelStore) GetMemberForPost(postId string, userId string) store.StoreChannel { - return store.Do(func(result *store.StoreResult) { - var dbMember channelMemberWithSchemeRoles - if err := s.GetReplica().SelectOne(&dbMember, - ` - SELECT - ChannelMembers.*, - TeamScheme.DefaultChannelGuestRole TeamSchemeDefaultGuestRole, - TeamScheme.DefaultChannelUserRole TeamSchemeDefaultUserRole, - TeamScheme.DefaultChannelAdminRole TeamSchemeDefaultAdminRole, - ChannelScheme.DefaultChannelGuestRole ChannelSchemeDefaultGuestRole, - ChannelScheme.DefaultChannelUserRole ChannelSchemeDefaultUserRole, - ChannelScheme.DefaultChannelAdminRole ChannelSchemeDefaultAdminRole - FROM - ChannelMembers - INNER JOIN - Posts ON ChannelMembers.ChannelId = Posts.ChannelId - INNER JOIN - Channels ON ChannelMembers.ChannelId = Channels.Id - LEFT JOIN - Schemes ChannelScheme ON Channels.SchemeId = ChannelScheme.Id - LEFT JOIN - Teams ON Channels.TeamId = Teams.Id - LEFT JOIN - Schemes TeamScheme ON Teams.SchemeId = TeamScheme.Id - WHERE - ChannelMembers.UserId = :UserId - AND Posts.Id = :PostId`, map[string]interface{}{"UserId": userId, "PostId": postId}); err != nil { - result.Err = model.NewAppError("SqlChannelStore.GetMemberForPost", "store.sql_channel.get_member_for_post.app_error", nil, "postId="+postId+", err="+err.Error(), http.StatusInternalServerError) - return - } - result.Data = dbMember.ToModel() - }) +func (s SqlChannelStore) GetMemberForPost(postId string, userId string) (*model.ChannelMember, *model.AppError) { + var dbMember channelMemberWithSchemeRoles + query := ` + SELECT + ChannelMembers.*, + TeamScheme.DefaultChannelGuestRole TeamSchemeDefaultGuestRole, + TeamScheme.DefaultChannelUserRole TeamSchemeDefaultUserRole, + TeamScheme.DefaultChannelAdminRole TeamSchemeDefaultAdminRole, + ChannelScheme.DefaultChannelGuestRole ChannelSchemeDefaultGuestRole, + ChannelScheme.DefaultChannelUserRole ChannelSchemeDefaultUserRole, + ChannelScheme.DefaultChannelAdminRole ChannelSchemeDefaultAdminRole + FROM + ChannelMembers + INNER JOIN + Posts ON ChannelMembers.ChannelId = Posts.ChannelId + INNER JOIN + Channels ON ChannelMembers.ChannelId = Channels.Id + LEFT JOIN + Schemes ChannelScheme ON Channels.SchemeId = ChannelScheme.Id + LEFT JOIN + Teams ON Channels.TeamId = Teams.Id + LEFT JOIN + Schemes TeamScheme ON Teams.SchemeId = TeamScheme.Id + WHERE + ChannelMembers.UserId = :UserId + AND + Posts.Id = :PostId` + if err := s.GetReplica().SelectOne(&dbMember, query, map[string]interface{}{"UserId": userId, "PostId": postId}); err != nil { + return nil, model.NewAppError("SqlChannelStore.GetMemberForPost", "store.sql_channel.get_member_for_post.app_error", nil, "postId="+postId+", err="+err.Error(), http.StatusInternalServerError) + } + return dbMember.ToModel(), nil } func (s SqlChannelStore) GetAllChannelMembersForUser(userId string, allowFromCache bool, includeDeleted bool) store.StoreChannel { diff --git a/store/store.go b/store/store.go index 28af72799c..76c4a779b4 100644 --- a/store/store.go +++ b/store/store.go @@ -167,7 +167,7 @@ type ChannelStore interface { IsUserInChannelUseCache(userId string, channelId string) bool GetAllChannelMembersNotifyPropsForChannel(channelId string, allowFromCache bool) (map[string]model.StringMap, *model.AppError) InvalidateCacheForChannelMembersNotifyProps(channelId string) - GetMemberForPost(postId string, userId string) StoreChannel + GetMemberForPost(postId string, userId string) (*model.ChannelMember, *model.AppError) InvalidateMemberCount(channelId string) GetMemberCountFromCache(channelId string) int64 GetMemberCount(channelId string, allowFromCache bool) StoreChannel diff --git a/store/storetest/channel_store.go b/store/storetest/channel_store.go index 8713bf3552..3fec69e730 100644 --- a/store/storetest/channel_store.go +++ b/store/storetest/channel_store.go @@ -1865,13 +1865,13 @@ func testChannelStoreGetMemberForPost(t *testing.T, ss store.Store) { }) require.Nil(t, err) - if r1 := <-ss.Channel().GetMemberForPost(p1.Id, m1.UserId); r1.Err != nil { - t.Fatal(r1.Err) - } else if r1.Data.(*model.ChannelMember).ToJson() != m1.ToJson() { + if r1, err := ss.Channel().GetMemberForPost(p1.Id, m1.UserId); err != nil { + t.Fatal(err) + } else if r1.ToJson() != m1.ToJson() { t.Fatal("invalid returned channel member") } - if r2 := <-ss.Channel().GetMemberForPost(p1.Id, model.NewId()); r2.Err == nil { + if _, err := ss.Channel().GetMemberForPost(p1.Id, model.NewId()); err == nil { t.Fatal("shouldn't have returned a member") } } diff --git a/store/storetest/mocks/ChannelStore.go b/store/storetest/mocks/ChannelStore.go index 9547d3b26f..ba69f61ca4 100644 --- a/store/storetest/mocks/ChannelStore.go +++ b/store/storetest/mocks/ChannelStore.go @@ -705,19 +705,28 @@ func (_m *ChannelStore) GetMemberCountFromCache(channelId string) int64 { } // GetMemberForPost provides a mock function with given fields: postId, userId -func (_m *ChannelStore) GetMemberForPost(postId string, userId string) store.StoreChannel { +func (_m *ChannelStore) GetMemberForPost(postId string, userId string) (*model.ChannelMember, *model.AppError) { ret := _m.Called(postId, userId) - var r0 store.StoreChannel - if rf, ok := ret.Get(0).(func(string, string) store.StoreChannel); ok { + var r0 *model.ChannelMember + if rf, ok := ret.Get(0).(func(string, string) *model.ChannelMember); ok { r0 = rf(postId, userId) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(store.StoreChannel) + r0 = ret.Get(0).(*model.ChannelMember) } } - return r0 + var r1 *model.AppError + if rf, ok := ret.Get(1).(func(string, string) *model.AppError); ok { + r1 = rf(postId, userId) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*model.AppError) + } + } + + return r0, r1 } // GetMembers provides a mock function with given fields: channelId, offset, limit