[MM-15296] Migrate "Preference.Save" to Sync by default (#10866)

* response format changes

* Generated mocks
Fixed all references of Preferences.Save

* Remove old code from store.go (incorrect merge)

* Review change - Add validations on count and error

* Review change - return from root level

* Review change - return 0 as nil value for int

* fix initialisation of err in preference_store
This commit is contained in:
Ishank Gulati
2019-05-26 18:36:33 +05:30
committed by Jesús Espino
parent c05cf5b033
commit fb6c1debf0
15 changed files with 150 additions and 86 deletions

View File

@@ -54,31 +54,25 @@ func (s SqlPreferenceStore) DeleteUnusedFeatures() {
s.GetMaster().Exec(sql, queryParams)
}
func (s SqlPreferenceStore) Save(preferences *model.Preferences) store.StoreChannel {
return store.Do(func(result *store.StoreResult) {
// wrap in a transaction so that if one fails, everything fails
transaction, err := s.GetMaster().Begin()
if err != nil {
result.Err = model.NewAppError("SqlPreferenceStore.Save", "store.sql_preference.save.open_transaction.app_error", nil, err.Error(), http.StatusInternalServerError)
} else {
defer finalizeTransaction(transaction)
for _, preference := range *preferences {
if upsertResult := s.save(transaction, &preference); upsertResult.Err != nil {
*result = upsertResult
break
}
}
func (s SqlPreferenceStore) Save(preferences *model.Preferences) (int, *model.AppError) {
// wrap in a transaction so that if one fails, everything fails
transaction, err := s.GetMaster().Begin()
if err != nil {
return 0, model.NewAppError("SqlPreferenceStore.Save", "store.sql_preference.save.open_transaction.app_error", nil, err.Error(), http.StatusInternalServerError)
}
if result.Err == nil {
if err := transaction.Commit(); err != nil {
// don't need to rollback here since the transaction is already closed
result.Err = model.NewAppError("SqlPreferenceStore.Save", "store.sql_preference.save.commit_transaction.app_error", nil, err.Error(), http.StatusInternalServerError)
} else {
result.Data = len(*preferences)
}
}
defer finalizeTransaction(transaction)
for _, preference := range *preferences {
if upsertResult := s.save(transaction, &preference); upsertResult.Err != nil {
return 0, upsertResult.Err
}
})
}
if err := transaction.Commit(); err != nil {
// don't need to rollback here since the transaction is already closed
return 0, model.NewAppError("SqlPreferenceStore.Save", "store.sql_preference.save.commit_transaction.app_error", nil, err.Error(), http.StatusInternalServerError)
}
return len(*preferences), nil
}
func (s SqlPreferenceStore) save(transaction *gorp.Transaction, preference *model.Preference) store.StoreResult {

View File

@@ -9,6 +9,8 @@ import (
"github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/store"
"github.com/mattermost/mattermost-server/store/storetest"
"github.com/stretchr/testify/require"
)
func TestPreferenceStore(t *testing.T) {
@@ -50,7 +52,9 @@ func TestDeleteUnusedFeatures(t *testing.T) {
},
}
store.Must(ss.Preference().Save(&features))
count, err := ss.Preference().Save(&features)
require.Nil(t, err)
require.Equal(t, 4, count)
ss.Preference().(*SqlPreferenceStore).DeleteUnusedFeatures()

View File

@@ -428,7 +428,7 @@ type CommandWebhookStore interface {
}
type PreferenceStore interface {
Save(preferences *model.Preferences) StoreChannel
Save(preferences *model.Preferences) (int, *model.AppError)
GetCategory(userId string, category string) (model.Preferences, *model.AppError)
Get(userId string, category string, name string) (*model.Preference, *model.AppError)
GetAll(userId string) StoreChannel

View File

@@ -183,17 +183,24 @@ func (_m *PreferenceStore) PermanentDeleteByUser(userId string) *model.AppError
}
// Save provides a mock function with given fields: preferences
func (_m *PreferenceStore) Save(preferences *model.Preferences) store.StoreChannel {
func (_m *PreferenceStore) Save(preferences *model.Preferences) (int, *model.AppError) {
ret := _m.Called(preferences)
var r0 store.StoreChannel
if rf, ok := ret.Get(0).(func(*model.Preferences) store.StoreChannel); ok {
var r0 int
if rf, ok := ret.Get(0).(func(*model.Preferences) int); ok {
r0 = rf(preferences)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.StoreChannel)
r0 = ret.Get(0).(int)
}
var r1 *model.AppError
if rf, ok := ret.Get(1).(func(*model.Preferences) *model.AppError); ok {
r1 = rf(preferences)
} else {
if ret.Get(1) != nil {
r1 = ret.Get(1).(*model.AppError)
}
}
return r0
return r0, r1
}

View File

@@ -8,6 +8,8 @@ import (
"github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/store"
"github.com/stretchr/testify/require"
)
func TestOAuthStore(t *testing.T, ss store.Store) {
@@ -333,7 +335,9 @@ func testOAuthGetAuthorizedApps(t *testing.T, ss store.Store) {
p.Category = model.PREFERENCE_CATEGORY_AUTHORIZED_OAUTH_APP
p.Name = a1.Id
p.Value = "true"
store.Must(ss.Preference().Save(&model.Preferences{p}))
count, err := ss.Preference().Save(&model.Preferences{p})
require.Nil(t, err)
require.Equal(t, 1, count)
if result := <-ss.OAuth().GetAuthorizedApps(a1.CreatorId, 0, 1000); result.Err != nil {
t.Fatal(result.Err)
@@ -359,7 +363,9 @@ func testOAuthGetAccessDataByUserForApp(t *testing.T, ss store.Store) {
p.Category = model.PREFERENCE_CATEGORY_AUTHORIZED_OAUTH_APP
p.Name = a1.Id
p.Value = "true"
store.Must(ss.Preference().Save(&model.Preferences{p}))
count, err := ss.Preference().Save(&model.Preferences{p})
require.Nil(t, err)
require.Equal(t, 1, count)
if result := <-ss.OAuth().GetAuthorizedApps(a1.CreatorId, 0, 1000); result.Err != nil {
t.Fatal(result.Err)

View File

@@ -1389,7 +1389,9 @@ func testPostStoreGetFlaggedPostsForTeam(t *testing.T, ss store.Store, s SqlSupp
},
}
store.Must(ss.Preference().Save(&preferences))
count, err := ss.Preference().Save(&preferences)
require.Nil(t, err)
require.Equal(t, 1, count)
r2 := (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 2)).Data.(*model.PostList)
@@ -1406,7 +1408,9 @@ func testPostStoreGetFlaggedPostsForTeam(t *testing.T, ss store.Store, s SqlSupp
},
}
store.Must(ss.Preference().Save(&preferences))
count, err = ss.Preference().Save(&preferences)
require.Nil(t, err)
require.Equal(t, 1, count)
r3 := (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 1)).Data.(*model.PostList)
@@ -1441,7 +1445,9 @@ func testPostStoreGetFlaggedPostsForTeam(t *testing.T, ss store.Store, s SqlSupp
},
}
store.Must(ss.Preference().Save(&preferences))
count, err = ss.Preference().Save(&preferences)
require.Nil(t, err)
require.Equal(t, 1, count)
r4 = (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 2)).Data.(*model.PostList)
@@ -1457,7 +1463,9 @@ func testPostStoreGetFlaggedPostsForTeam(t *testing.T, ss store.Store, s SqlSupp
Value: "true",
},
}
store.Must(ss.Preference().Save(&preferences))
count, err = ss.Preference().Save(&preferences)
require.Nil(t, err)
require.Equal(t, 1, count)
r4 = (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 2)).Data.(*model.PostList)
@@ -1479,7 +1487,9 @@ func testPostStoreGetFlaggedPostsForTeam(t *testing.T, ss store.Store, s SqlSupp
Value: "true",
},
}
store.Must(ss.Preference().Save(&preferences))
count, err = ss.Preference().Save(&preferences)
require.Nil(t, err)
require.Equal(t, 1, count)
r4 = (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 10)).Data.(*model.PostList)
@@ -1529,7 +1539,9 @@ func testPostStoreGetFlaggedPosts(t *testing.T, ss store.Store) {
},
}
store.Must(ss.Preference().Save(&preferences))
count, err := ss.Preference().Save(&preferences)
require.Nil(t, err)
require.Equal(t, 1, count)
r2 := (<-ss.Post().GetFlaggedPosts(o1.UserId, 0, 2)).Data.(*model.PostList)
@@ -1546,7 +1558,9 @@ func testPostStoreGetFlaggedPosts(t *testing.T, ss store.Store) {
},
}
store.Must(ss.Preference().Save(&preferences))
count, err = ss.Preference().Save(&preferences)
require.Nil(t, err)
require.Equal(t, 1, count)
r3 := (<-ss.Post().GetFlaggedPosts(o1.UserId, 0, 1)).Data.(*model.PostList)
@@ -1581,7 +1595,9 @@ func testPostStoreGetFlaggedPosts(t *testing.T, ss store.Store) {
},
}
store.Must(ss.Preference().Save(&preferences))
count, err = ss.Preference().Save(&preferences)
require.Nil(t, err)
require.Equal(t, 1, count)
r4 = (<-ss.Post().GetFlaggedPosts(o1.UserId, 0, 2)).Data.(*model.PostList)
@@ -1634,7 +1650,9 @@ func testPostStoreGetFlaggedPostsForChannel(t *testing.T, ss store.Store) {
Value: "true",
}
store.Must(ss.Preference().Save(&model.Preferences{preference}))
count, err := ss.Preference().Save(&model.Preferences{preference})
require.Nil(t, err)
require.Equal(t, 1, count)
r = (<-ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 10)).Data.(*model.PostList)
@@ -1643,10 +1661,14 @@ func testPostStoreGetFlaggedPostsForChannel(t *testing.T, ss store.Store) {
}
preference.Name = o2.Id
store.Must(ss.Preference().Save(&model.Preferences{preference}))
count, err = ss.Preference().Save(&model.Preferences{preference})
require.Nil(t, err)
require.Equal(t, 1, count)
preference.Name = o3.Id
store.Must(ss.Preference().Save(&model.Preferences{preference}))
count, err = ss.Preference().Save(&model.Preferences{preference})
require.Nil(t, err)
require.Equal(t, 1, count)
r = (<-ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 1)).Data.(*model.PostList)
@@ -1673,7 +1695,9 @@ func testPostStoreGetFlaggedPostsForChannel(t *testing.T, ss store.Store) {
}
preference.Name = o4.Id
store.Must(ss.Preference().Save(&model.Preferences{preference}))
count, err = ss.Preference().Save(&model.Preferences{preference})
require.Nil(t, err)
require.Equal(t, 1, count)
r = (<-ss.Post().GetFlaggedPostsForChannel(o1.UserId, o4.ChannelId, 0, 10)).Data.(*model.PostList)

View File

@@ -4,6 +4,7 @@
package storetest
import (
"github.com/stretchr/testify/require"
"testing"
"github.com/stretchr/testify/assert"
@@ -42,8 +43,10 @@ func testPreferenceSave(t *testing.T, ss store.Store) {
Value: "value1b",
},
}
if count := store.Must(ss.Preference().Save(&preferences)); count != 2 {
if count, err := ss.Preference().Save(&preferences); count != 2 {
t.Fatal("got incorrect number of rows saved")
} else if err != nil {
t.Fatal("saving preference returned error")
}
for _, preference := range preferences {
@@ -54,8 +57,10 @@ func testPreferenceSave(t *testing.T, ss store.Store) {
preferences[0].Value = "value2a"
preferences[1].Value = "value2b"
if count := store.Must(ss.Preference().Save(&preferences)); count != 2 {
if count, err := ss.Preference().Save(&preferences); count != 2 {
t.Fatal("got incorrect number of rows saved")
} else if err != nil {
t.Fatal("saving preference returned error")
}
for _, preference := range preferences {
@@ -93,7 +98,9 @@ func testPreferenceGet(t *testing.T, ss store.Store) {
},
}
store.Must(ss.Preference().Save(&preferences))
count, err := ss.Preference().Save(&preferences)
require.Nil(t, err)
require.Equal(t, 4, count)
if data, err := ss.Preference().Get(userId, category, name); err != nil {
t.Fatal(err)
@@ -138,7 +145,9 @@ func testPreferenceGetCategory(t *testing.T, ss store.Store) {
},
}
store.Must(ss.Preference().Save(&preferences))
count, err := ss.Preference().Save(&preferences)
require.Nil(t, err)
require.Equal(t, 4, count)
if preferencesByCategory, err := ss.Preference().GetCategory(userId, category); err != nil {
t.Fatal(err)
@@ -187,7 +196,9 @@ func testPreferenceGetAll(t *testing.T, ss store.Store) {
},
}
store.Must(ss.Preference().Save(&preferences))
count, err := ss.Preference().Save(&preferences)
require.Nil(t, err)
require.Equal(t, 4, count)
if result := <-ss.Preference().GetAll(userId); result.Err != nil {
t.Fatal(result.Err)
@@ -233,7 +244,9 @@ func testPreferenceDeleteByUser(t *testing.T, ss store.Store) {
},
}
store.Must(ss.Preference().Save(&preferences))
count, err := ss.Preference().Save(&preferences)
require.Nil(t, err)
require.Equal(t, 4, count)
if err := ss.Preference().PermanentDeleteByUser(userId); err != nil {
t.Fatal(err)
@@ -281,7 +294,9 @@ func testIsFeatureEnabled(t *testing.T, ss store.Store) {
},
}
store.Must(ss.Preference().Save(&features))
count, err := ss.Preference().Save(&features)
require.Nil(t, err)
require.Equal(t, 5, count)
if result := <-ss.Preference().IsFeatureEnabled(feature1, userId); result.Err != nil {
t.Fatal(result.Err)
@@ -318,7 +333,9 @@ func testPreferenceDelete(t *testing.T, ss store.Store) {
Value: "value1a",
}
store.Must(ss.Preference().Save(&model.Preferences{preference}))
count, err := ss.Preference().Save(&model.Preferences{preference})
require.Nil(t, err)
require.Equal(t, 1, count)
if prefs := store.Must(ss.Preference().GetAll(preference.UserId)).(model.Preferences); len([]model.Preference(prefs)) != 1 {
t.Fatal("should've returned 1 preference")
@@ -351,7 +368,9 @@ func testPreferenceDeleteCategory(t *testing.T, ss store.Store) {
Value: "value1a",
}
store.Must(ss.Preference().Save(&model.Preferences{preference1, preference2}))
count, err := ss.Preference().Save(&model.Preferences{preference1, preference2})
require.Nil(t, err)
require.Equal(t, 2, count)
if prefs := store.Must(ss.Preference().GetAll(userId)).(model.Preferences); len([]model.Preference(prefs)) != 2 {
t.Fatal("should've returned 2 preferences")
@@ -386,7 +405,9 @@ func testPreferenceDeleteCategoryAndName(t *testing.T, ss store.Store) {
Value: "value1a",
}
store.Must(ss.Preference().Save(&model.Preferences{preference1, preference2}))
count, err := ss.Preference().Save(&model.Preferences{preference1, preference2})
require.Nil(t, err)
require.Equal(t, 2, count)
if prefs := store.Must(ss.Preference().GetAll(userId)).(model.Preferences); len([]model.Preference(prefs)) != 1 {
t.Fatal("should've returned 1 preference")
@@ -434,9 +455,11 @@ func testPreferenceCleanupFlagsBatch(t *testing.T, ss store.Store) {
Value: "true",
}
store.Must(ss.Preference().Save(&model.Preferences{preference1, preference2}))
count, err := ss.Preference().Save(&model.Preferences{preference1, preference2})
require.Nil(t, err)
require.Equal(t, 2, count)
_, err := ss.Preference().CleanupFlagsBatch(10000)
_, err = ss.Preference().CleanupFlagsBatch(10000)
assert.Nil(t, err)
_, err = ss.Preference().Get(userId, category, preference1.Name)