Modified updateUserNotifyProps to directly update the field (#18097)

* Modified updateUserNotifyProps to directly update the field

The method was only being used during import and it unnecessarily
made multiple queries to the DB.

Changed to a separate query that just updated the props field.

https://community-daily.mattermost.com/plugins/focalboard/workspace/zyoahc9uapdn3xdptac6jb69ic?id=285b80a3-257d-41f6-8cf4-ed80ca9d92e5&v=495cdb4d-c13a-4992-8eb9-80cfee2819a4&c=e4f9a891-85d6-4886-8590-1e327f7f8b8f

```release-note
NONE
```

* invalidating cache

```release-note
NONE
```
Этот коммит содержится в:
Agniva De Sarker
2021-08-17 14:21:41 +05:30
коммит произвёл GitHub
родитель d181ae9262
Коммит 132f114793
12 изменённых файлов: 117 добавлений и 34 удалений

Просмотреть файл

@@ -10685,6 +10685,24 @@ func (s *OpenTracingLayerUserStore) UpdateMfaSecret(userID string, secret string
return err
}
func (s *OpenTracingLayerUserStore) UpdateNotifyProps(userID string, props map[string]string) error {
origCtx := s.Root.Store.Context()
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.UpdateNotifyProps")
s.Root.Store.SetContext(newCtx)
defer func() {
s.Root.Store.SetContext(origCtx)
}()
defer span.Finish()
err := s.UserStore.UpdateNotifyProps(userID, props)
if err != nil {
span.LogFields(spanlog.Error(err))
ext.Error.Set(span, true)
}
return err
}
func (s *OpenTracingLayerUserStore) UpdatePassword(userID string, newPassword string) error {
origCtx := s.Root.Store.Context()
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.UpdatePassword")

Просмотреть файл

@@ -11610,6 +11610,26 @@ func (s *RetryLayerUserStore) UpdateMfaSecret(userID string, secret string) erro
}
func (s *RetryLayerUserStore) UpdateNotifyProps(userID string, props map[string]string) error {
tries := 0
for {
err := s.UserStore.UpdateNotifyProps(userID, props)
if err == nil {
return nil
}
if !isRepeatableError(err) {
return err
}
tries++
if tries >= 3 {
err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
return err
}
}
}
func (s *RetryLayerUserStore) UpdatePassword(userID string, newPassword string) error {
tries := 0

Просмотреть файл

@@ -226,6 +226,18 @@ func (us SqlUserStore) Update(user *model.User, trustedUpdateData bool) (*model.
return &model.UserUpdate{New: user, Old: oldUser}, nil
}
func (us SqlUserStore) UpdateNotifyProps(userID string, props map[string]string) error {
if _, err := us.GetMaster().Exec(`UPDATE Users
SET NotifyProps = :NotifyProps
WHERE Id = :UserId`, map[string]interface{}{
"NotifyProps": model.MapToJson(props),
"UserId": userID}); err != nil {
return errors.Wrapf(err, "failed to update User with userId=%s", userID)
}
return nil
}
func (us SqlUserStore) UpdateLastPictureUpdate(userId string) error {
curTime := model.GetMillis()

Просмотреть файл

@@ -356,6 +356,7 @@ type PostStore interface {
type UserStore interface {
Save(user *model.User) (*model.User, error)
Update(user *model.User, allowRoleUpdate bool) (*model.UserUpdate, error)
UpdateNotifyProps(userID string, props map[string]string) error
UpdateLastPictureUpdate(userID string) error
ResetLastPictureUpdate(userID string) error
UpdatePassword(userID, newPassword string) error

Просмотреть файл

@@ -1383,6 +1383,20 @@ func (_m *UserStore) UpdateMfaSecret(userID string, secret string) error {
return r0
}
// UpdateNotifyProps provides a mock function with given fields: userID, props
func (_m *UserStore) UpdateNotifyProps(userID string, props map[string]string) error {
ret := _m.Called(userID, props)
var r0 error
if rf, ok := ret.Get(0).(func(string, map[string]string) error); ok {
r0 = rf(userID, props)
} else {
r0 = ret.Error(0)
}
return r0
}
// UpdatePassword provides a mock function with given fields: userID, newPassword
func (_m *UserStore) UpdatePassword(userID string, newPassword string) error {
ret := _m.Called(userID, newPassword)

Просмотреть файл

@@ -215,6 +215,22 @@ func testUserStoreUpdate(t *testing.T, ss store.Store) {
err = ss.User().UpdateLastPictureUpdate(u1.Id)
require.NoError(t, err, "Update should not have failed")
// Test UpdateNotifyProps
u1, err = ss.User().Get(context.Background(), u1.Id)
require.NoError(t, err)
props := u1.NotifyProps
props["hello"] = "world"
err = ss.User().UpdateNotifyProps(u1.Id, props)
require.NoError(t, err)
ss.User().InvalidateProfileCacheForUser(u1.Id)
uNew, err := ss.User().Get(context.Background(), u1.Id)
require.NoError(t, err)
assert.Equal(t, props, uNew.NotifyProps)
}
func testUserStoreUpdateUpdateAt(t *testing.T, ss store.Store) {

Просмотреть файл

@@ -9634,6 +9634,22 @@ func (s *TimerLayerUserStore) UpdateMfaSecret(userID string, secret string) erro
return err
}
func (s *TimerLayerUserStore) UpdateNotifyProps(userID string, props map[string]string) error {
start := timemodule.Now()
err := s.UserStore.UpdateNotifyProps(userID, props)
elapsed := float64(timemodule.Since(start)) / float64(timemodule.Second)
if s.Root.Metrics != nil {
success := "false"
if err == nil {
success = "true"
}
s.Root.Metrics.ObserveStoreMethodDuration("UserStore.UpdateNotifyProps", success, elapsed)
}
return err
}
func (s *TimerLayerUserStore) UpdatePassword(userID string, newPassword string) error {
start := timemodule.Now()