MM-43144: Add teams loader (#19960)
```release-note NONE ``` Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
16b1cbd6e3
Коммит
7f0d1cf0dd
@@ -8624,6 +8624,24 @@ func (s *OpenTracingLayerTeamStore) GetCommonTeamIDsForTwoUsers(userID string, o
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *OpenTracingLayerTeamStore) GetMany(ids []string) ([]*model.Team, error) {
|
||||
origCtx := s.Root.Store.Context()
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "TeamStore.GetMany")
|
||||
s.Root.Store.SetContext(newCtx)
|
||||
defer func() {
|
||||
s.Root.Store.SetContext(origCtx)
|
||||
}()
|
||||
|
||||
defer span.Finish()
|
||||
result, err := s.TeamStore.GetMany(ids)
|
||||
if err != nil {
|
||||
span.LogFields(spanlog.Error(err))
|
||||
ext.Error.Set(span, true)
|
||||
}
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *OpenTracingLayerTeamStore) GetMember(ctx context.Context, teamID string, userID string) (*model.TeamMember, error) {
|
||||
origCtx := s.Root.Store.Context()
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "TeamStore.GetMember")
|
||||
|
||||
@@ -9841,6 +9841,27 @@ func (s *RetryLayerTeamStore) GetCommonTeamIDsForTwoUsers(userID string, otherUs
|
||||
|
||||
}
|
||||
|
||||
func (s *RetryLayerTeamStore) GetMany(ids []string) ([]*model.Team, error) {
|
||||
|
||||
tries := 0
|
||||
for {
|
||||
result, err := s.TeamStore.GetMany(ids)
|
||||
if err == nil {
|
||||
return result, nil
|
||||
}
|
||||
if !isRepeatableError(err) {
|
||||
return result, err
|
||||
}
|
||||
tries++
|
||||
if tries >= 3 {
|
||||
err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
|
||||
return result, err
|
||||
}
|
||||
timepkg.Sleep(100 * timepkg.Millisecond)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (s *RetryLayerTeamStore) GetMember(ctx context.Context, teamID string, userID string) (*model.TeamMember, error) {
|
||||
|
||||
tries := 0
|
||||
|
||||
@@ -303,6 +303,29 @@ func (s SqlTeamStore) Get(id string) (*model.Team, error) {
|
||||
return &team, nil
|
||||
}
|
||||
|
||||
func (s SqlTeamStore) GetMany(ids []string) ([]*model.Team, error) {
|
||||
query := s.getQueryBuilder().
|
||||
Select("*").
|
||||
From("Teams").
|
||||
Where(sq.Eq{"Id": ids})
|
||||
sql, args, err := query.ToSql()
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "getmany_tosql")
|
||||
}
|
||||
|
||||
teams := []*model.Team{}
|
||||
err = s.GetReplicaX().Select(&teams, sql, args...)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to get teams with ids %v", ids)
|
||||
}
|
||||
|
||||
if len(teams) == 0 {
|
||||
return nil, store.NewErrNotFound("Team", fmt.Sprintf("ids=%v", ids))
|
||||
}
|
||||
|
||||
return teams, nil
|
||||
}
|
||||
|
||||
// GetByInviteId returns from the database the team that matches the inviteId provided as parameter.
|
||||
// If the parameter provided is empty or if there is no match in the database, it returns a model.AppError
|
||||
// with a http.StatusNotFound in the StatusCode field.
|
||||
|
||||
@@ -102,6 +102,7 @@ type TeamStore interface {
|
||||
Save(team *model.Team) (*model.Team, error)
|
||||
Update(team *model.Team) (*model.Team, error)
|
||||
Get(id string) (*model.Team, error)
|
||||
GetMany(ids []string) ([]*model.Team, error)
|
||||
GetByName(name string) (*model.Team, error)
|
||||
GetByNames(name []string) ([]*model.Team, error)
|
||||
SearchAll(opts *model.TeamSearch) ([]*model.Team, error)
|
||||
|
||||
@@ -374,6 +374,29 @@ func (_m *TeamStore) GetCommonTeamIDsForTwoUsers(userID string, otherUserID stri
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetMany provides a mock function with given fields: ids
|
||||
func (_m *TeamStore) GetMany(ids []string) ([]*model.Team, error) {
|
||||
ret := _m.Called(ids)
|
||||
|
||||
var r0 []*model.Team
|
||||
if rf, ok := ret.Get(0).(func([]string) []*model.Team); ok {
|
||||
r0 = rf(ids)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).([]*model.Team)
|
||||
}
|
||||
}
|
||||
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(1).(func([]string) error); ok {
|
||||
r1 = rf(ids)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetMember provides a mock function with given fields: ctx, teamID, userID
|
||||
func (_m *TeamStore) GetMember(ctx context.Context, teamID string, userID string) (*model.TeamMember, error) {
|
||||
ret := _m.Called(ctx, teamID, userID)
|
||||
|
||||
@@ -31,6 +31,7 @@ func TestTeamStore(t *testing.T, ss store.Store) {
|
||||
t.Run("Save", func(t *testing.T) { testTeamStoreSave(t, ss) })
|
||||
t.Run("Update", func(t *testing.T) { testTeamStoreUpdate(t, ss) })
|
||||
t.Run("Get", func(t *testing.T) { testTeamStoreGet(t, ss) })
|
||||
t.Run("GetMany", func(t *testing.T) { testTeamStoreGetMany(t, ss) })
|
||||
t.Run("GetByName", func(t *testing.T) { testTeamStoreGetByName(t, ss) })
|
||||
t.Run("GetByNames", func(t *testing.T) { testTeamStoreGetByNames(t, ss) })
|
||||
t.Run("SearchAll", func(t *testing.T) { testTeamStoreSearchAll(t, ss) })
|
||||
@@ -132,6 +133,37 @@ func testTeamStoreGet(t *testing.T, ss store.Store) {
|
||||
require.Error(t, err, "Missing id should have failed")
|
||||
}
|
||||
|
||||
func testTeamStoreGetMany(t *testing.T, ss store.Store) {
|
||||
o1, err := ss.Team().Save(&model.Team{
|
||||
DisplayName: "DisplayName",
|
||||
Name: NewTestId(),
|
||||
Email: MakeEmail(),
|
||||
Type: model.TeamOpen,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
o2, err := ss.Team().Save(&model.Team{
|
||||
DisplayName: "DisplayName2",
|
||||
Name: NewTestId(),
|
||||
Email: MakeEmail(),
|
||||
Type: model.TeamOpen,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
res, err := ss.Team().GetMany([]string{o1.Id, o2.Id})
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, res, 2)
|
||||
|
||||
res, err = ss.Team().GetMany([]string{o1.Id, "notexists"})
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, res, 1)
|
||||
|
||||
_, err = ss.Team().GetMany([]string{"whereisit", "notexists"})
|
||||
require.Error(t, err)
|
||||
var nfErr *store.ErrNotFound
|
||||
assert.True(t, errors.As(err, &nfErr))
|
||||
}
|
||||
|
||||
func testTeamStoreGetByNames(t *testing.T, ss store.Store) {
|
||||
o1 := model.Team{}
|
||||
o1.DisplayName = "DisplayName"
|
||||
|
||||
@@ -7768,6 +7768,22 @@ func (s *TimerLayerTeamStore) GetCommonTeamIDsForTwoUsers(userID string, otherUs
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *TimerLayerTeamStore) GetMany(ids []string) ([]*model.Team, error) {
|
||||
start := timemodule.Now()
|
||||
|
||||
result, err := s.TeamStore.GetMany(ids)
|
||||
|
||||
elapsed := float64(timemodule.Since(start)) / float64(timemodule.Second)
|
||||
if s.Root.Metrics != nil {
|
||||
success := "false"
|
||||
if err == nil {
|
||||
success = "true"
|
||||
}
|
||||
s.Root.Metrics.ObserveStoreMethodDuration("TeamStore.GetMany", success, elapsed)
|
||||
}
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *TimerLayerTeamStore) GetMember(ctx context.Context, teamID string, userID string) (*model.TeamMember, error) {
|
||||
start := timemodule.Now()
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user