diff --git a/app/team.go b/app/team.go index c6251fd705..fedaa85562 100644 --- a/app/team.go +++ b/app/team.go @@ -675,11 +675,7 @@ func (a *App) GetTeamMember(teamId, userId string) (*model.TeamMember, *model.Ap } func (a *App) GetTeamMembersForUser(userId string) ([]*model.TeamMember, *model.AppError) { - result := <-a.Srv.Store.Team().GetTeamsForUser(userId) - if result.Err != nil { - return nil, result.Err - } - return result.Data.([]*model.TeamMember), nil + return a.Srv.Store.Team().GetTeamsForUser(userId) } func (a *App) GetTeamMembersForUserWithPagination(userId string, page, perPage int) ([]*model.TeamMember, *model.AppError) { diff --git a/store/sqlstore/session_store.go b/store/sqlstore/session_store.go index 7cb41b86f1..e063bd013b 100644 --- a/store/sqlstore/session_store.go +++ b/store/sqlstore/session_store.go @@ -52,7 +52,12 @@ func (me SqlSessionStore) Save(session *model.Session) (*model.Session, *model.A session.PreSave() - tcs := me.Team().GetTeamsForUser(session.UserId) + tcs := make(chan store.StoreResult, 1) + go func() { + teams, err := me.Team().GetTeamsForUser(session.UserId) + tcs <- store.StoreResult{Data: teams, Err: err} + close(tcs) + }() if err := me.GetMaster().Insert(session); err != nil { return nil, model.NewAppError("SqlSessionStore.Save", "store.sql_session.save.app_error", nil, "id="+session.Id+", "+err.Error(), http.StatusInternalServerError) @@ -85,11 +90,10 @@ func (me SqlSessionStore) Get(sessionIdOrToken string) (*model.Session, *model.A } session := sessions[0] - rtcs := <-me.Team().GetTeamsForUser(sessions[0].UserId) - if rtcs.Err != nil { - return nil, model.NewAppError("SqlSessionStore.Get", "store.sql_session.get.app_error", nil, "sessionIdOrToken="+sessionIdOrToken+", "+rtcs.Err.Error(), http.StatusInternalServerError) + tempMembers, err := me.Team().GetTeamsForUser(sessions[0].UserId) + if err != nil { + return nil, model.NewAppError("SqlSessionStore.Get", "store.sql_session.get.app_error", nil, "sessionIdOrToken="+sessionIdOrToken+", "+err.Error(), http.StatusInternalServerError) } - tempMembers := rtcs.Data.([]*model.TeamMember) sessions[0].TeamMembers = make([]*model.TeamMember, 0, len(tempMembers)) for _, tm := range tempMembers { if tm.DeleteAt == 0 { @@ -102,7 +106,12 @@ func (me SqlSessionStore) Get(sessionIdOrToken string) (*model.Session, *model.A func (me SqlSessionStore) GetSessions(userId string) ([]*model.Session, *model.AppError) { var sessions []*model.Session - tcs := me.Team().GetTeamsForUser(userId) + tcs := make(chan store.StoreResult, 1) + go func() { + teams, err := me.Team().GetTeamsForUser(userId) + tcs <- store.StoreResult{Data: teams, Err: err} + close(tcs) + }() if _, err := me.GetReplica().Select(&sessions, "SELECT * FROM Sessions WHERE UserId = :UserId ORDER BY LastActivityAt DESC", map[string]interface{}{"UserId": userId}); err != nil { return nil, model.NewAppError("SqlSessionStore.GetSessions", "store.sql_session.get_sessions.app_error", nil, err.Error(), http.StatusInternalServerError) } diff --git a/store/sqlstore/team_store.go b/store/sqlstore/team_store.go index 4511d7be2b..5d7ae5c848 100644 --- a/store/sqlstore/team_store.go +++ b/store/sqlstore/team_store.go @@ -684,26 +684,22 @@ func (s SqlTeamStore) GetMembersByIds(teamId string, userIds []string, restricti return dbMembers.ToModel(), nil } -func (s SqlTeamStore) GetTeamsForUser(userId string) store.StoreChannel { - return store.Do(func(result *store.StoreResult) { - query := s.getTeamMembersWithSchemeSelectQuery(). - Where(sq.Eq{"TeamMembers.UserId": userId}) +func (s SqlTeamStore) GetTeamsForUser(userId string) ([]*model.TeamMember, *model.AppError) { + query := s.getTeamMembersWithSchemeSelectQuery(). + Where(sq.Eq{"TeamMembers.UserId": userId}) - queryString, args, err := query.ToSql() - if err != nil { - result.Err = model.NewAppError("SqlTeamStore.GetMembers", "store.sql_team.get_members.app_error", nil, err.Error(), http.StatusInternalServerError) - return - } + queryString, args, err := query.ToSql() + if err != nil { + return nil, model.NewAppError("SqlTeamStore.GetMembers", "store.sql_team.get_members.app_error", nil, err.Error(), http.StatusInternalServerError) + } - var dbMembers teamMemberWithSchemeRolesList - _, err = s.GetReplica().Select(&dbMembers, queryString, args...) - if err != nil { - result.Err = model.NewAppError("SqlTeamStore.GetMembers", "store.sql_team.get_members.app_error", nil, "userId="+userId+" "+err.Error(), http.StatusInternalServerError) - return - } + var dbMembers teamMemberWithSchemeRolesList + _, err = s.GetReplica().Select(&dbMembers, queryString, args...) + if err != nil { + return nil, model.NewAppError("SqlTeamStore.GetMembers", "store.sql_team.get_members.app_error", nil, "userId="+userId+" "+err.Error(), http.StatusInternalServerError) + } - result.Data = dbMembers.ToModel() - }) + return dbMembers.ToModel(), nil } func (s SqlTeamStore) GetTeamsForUserWithPagination(userId string, page, perPage int) store.StoreChannel { diff --git a/store/store.go b/store/store.go index 3906444f9d..b79ea001c2 100644 --- a/store/store.go +++ b/store/store.go @@ -107,7 +107,7 @@ type TeamStore interface { GetMembersByIds(teamId string, userIds []string, restrictions *model.ViewUsersRestrictions) ([]*model.TeamMember, *model.AppError) GetTotalMemberCount(teamId string) (int64, *model.AppError) GetActiveMemberCount(teamId string) (int64, *model.AppError) - GetTeamsForUser(userId string) StoreChannel + GetTeamsForUser(userId string) ([]*model.TeamMember, *model.AppError) GetTeamsForUserWithPagination(userId string, page, perPage int) StoreChannel GetChannelUnreadsForAllTeams(excludeTeamId, userId string) StoreChannel GetChannelUnreadsForTeam(teamId, userId string) ([]*model.ChannelUnread, *model.AppError) diff --git a/store/storetest/mocks/TeamStore.go b/store/storetest/mocks/TeamStore.go index f1740e6463..69b98eb6a6 100644 --- a/store/storetest/mocks/TeamStore.go +++ b/store/storetest/mocks/TeamStore.go @@ -475,19 +475,28 @@ func (_m *TeamStore) GetTeamsByUserId(userId string) store.StoreChannel { } // GetTeamsForUser provides a mock function with given fields: userId -func (_m *TeamStore) GetTeamsForUser(userId string) store.StoreChannel { +func (_m *TeamStore) GetTeamsForUser(userId string) ([]*model.TeamMember, *model.AppError) { ret := _m.Called(userId) - var r0 store.StoreChannel - if rf, ok := ret.Get(0).(func(string) store.StoreChannel); ok { + var r0 []*model.TeamMember + if rf, ok := ret.Get(0).(func(string) []*model.TeamMember); ok { r0 = rf(userId) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(store.StoreChannel) + r0 = ret.Get(0).([]*model.TeamMember) } } - return r0 + var r1 *model.AppError + if rf, ok := ret.Get(1).(func(string) *model.AppError); ok { + r1 = rf(userId) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*model.AppError) + } + } + + return r0, r1 } // GetTeamsForUserWithPagination provides a mock function with given fields: userId, page, perPage diff --git a/store/storetest/team_store.go b/store/storetest/team_store.go index 1eeaa48f86..598ddf73d5 100644 --- a/store/storetest/team_store.go +++ b/store/storetest/team_store.go @@ -797,10 +797,9 @@ func testTeamMembers(t *testing.T, ss store.Store) { require.Equal(t, m3.UserId, ms[0].UserId) } - if r1 := <-ss.Team().GetTeamsForUser(m1.UserId); r1.Err != nil { - t.Fatal(r1.Err) + if ms, err := ss.Team().GetTeamsForUser(m1.UserId); err != nil { + t.Fatal(err) } else { - ms := r1.Data.([]*model.TeamMember) require.Len(t, ms, 1) require.Equal(t, m1.TeamId, ms[0].TeamId) @@ -837,10 +836,9 @@ func testTeamMembers(t *testing.T, ss store.Store) { store.Must(ss.Team().SaveMember(m4, -1)) store.Must(ss.Team().SaveMember(m5, -1)) - if r1 := <-ss.Team().GetTeamsForUser(uid); r1.Err != nil { - t.Fatal(r1.Err) + if ms, err := ss.Team().GetTeamsForUser(uid); err != nil { + t.Fatal(err) } else { - ms := r1.Data.([]*model.TeamMember) require.Len(t, ms, 2) } @@ -849,10 +847,9 @@ func testTeamMembers(t *testing.T, ss store.Store) { t.Fatal(r1.Err) } - if r1 := <-ss.Team().GetTeamsForUser(m1.UserId); r1.Err != nil { - t.Fatal(r1.Err) + if ms, err := ss.Team().GetTeamsForUser(m1.UserId); err != nil { + t.Fatal(err) } else { - ms := r1.Data.([]*model.TeamMember) require.Len(t, ms, 0) }