summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Goldberg <george@gberg.me>2017-09-22 18:23:16 +0100
committerHarrison Healey <harrisonmhealey@gmail.com>2017-09-22 13:23:16 -0400
commite0d5703f721aafef1b55747cd09629860e86bfb4 (patch)
tree7b1555843f3577c8b804c47b1ebddb0dddcf2852
parent8bef94d250906851d924c16fc5293bbdae75cb98 (diff)
downloadchat-e0d5703f721aafef1b55747cd09629860e86bfb4.tar.gz
chat-e0d5703f721aafef1b55747cd09629860e86bfb4.tar.bz2
chat-e0d5703f721aafef1b55747cd09629860e86bfb4.zip
PLT-7619: Cleanup flags in data retention. (#7501)
-rw-r--r--i18n/en.json4
-rw-r--r--store/sql_preference_store.go52
-rw-r--r--store/sql_preference_store_test.go41
-rw-r--r--store/store.go1
4 files changed, 98 insertions, 0 deletions
diff --git a/i18n/en.json b/i18n/en.json
index 84162e6e9..cce135064 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -5888,6 +5888,10 @@
"translation": "We encountered an error permanently deleting the batch of posts"
},
{
+ "id": "store.sql_preference.cleanup_flags_batch.app_error",
+ "translation": "We encountered an error cleaning up the batch of flags"
+ },
+ {
"id": "store.sql_preference.delete.app_error",
"translation": "We encountered an error while deleting preferences"
},
diff --git a/store/sql_preference_store.go b/store/sql_preference_store.go
index bedf7a017..223a33001 100644
--- a/store/sql_preference_store.go
+++ b/store/sql_preference_store.go
@@ -372,3 +372,55 @@ func (s SqlPreferenceStore) DeleteCategoryAndName(category string, name string)
return storeChannel
}
+
+func (s SqlPreferenceStore) CleanupFlagsBatch(limit int64) StoreChannel {
+ storeChannel := make(StoreChannel, 1)
+
+ go func() {
+ result := StoreResult{}
+
+ query :=
+ `DELETE FROM
+ Preferences
+ WHERE
+ Category = :Category
+ AND Name IN (
+ SELECT
+ *
+ FROM (
+ SELECT
+ Preferences.Name
+ FROM
+ Preferences
+ LEFT JOIN
+ Posts
+ ON
+ Preferences.Name = Posts.Id
+ WHERE
+ Preferences.Category = :Category
+ AND Posts.Id IS null
+ LIMIT
+ :Limit
+ )
+ AS t
+ )`
+
+ sqlResult, err := s.GetMaster().Exec(query, map[string]interface{}{"Category": model.PREFERENCE_CATEGORY_FLAGGED_POST, "Limit": limit})
+ if err != nil {
+ result.Err = model.NewAppError("SqlPostStore.CleanupFlagsBatch", "store.sql_preference.cleanup_flags_batch.app_error", nil, ""+err.Error(), http.StatusInternalServerError)
+ } else {
+ rowsAffected, err1 := sqlResult.RowsAffected()
+ if err1 != nil {
+ result.Err = model.NewAppError("SqlPostStore.CleanupFlagsBatch", "store.sql_preference.cleanup_flags_batch.app_error", nil, ""+err.Error(), http.StatusInternalServerError)
+ result.Data = int64(0)
+ } else {
+ result.Data = rowsAffected
+ }
+ }
+
+ storeChannel <- result
+ close(storeChannel)
+ }()
+
+ return storeChannel
+}
diff --git a/store/sql_preference_store_test.go b/store/sql_preference_store_test.go
index ac8097a9e..0c537bb49 100644
--- a/store/sql_preference_store_test.go
+++ b/store/sql_preference_store_test.go
@@ -6,6 +6,8 @@ package store
import (
"testing"
+ "github.com/stretchr/testify/assert"
+
"github.com/mattermost/mattermost-server/model"
)
@@ -473,3 +475,42 @@ func TestPreferenceDeleteCategoryAndName(t *testing.T) {
t.Fatal("should've returned no preferences")
}
}
+
+func TestPreferenceCleanupFlagsBatch(t *testing.T) {
+ Setup()
+
+ category := model.PREFERENCE_CATEGORY_FLAGGED_POST
+ userId := model.NewId()
+
+ o1 := &model.Post{}
+ o1.ChannelId = model.NewId()
+ o1.UserId = userId
+ o1.Message = "zz" + model.NewId() + "AAAAAAAAAAA"
+ o1.CreateAt = 1000
+ o1 = (<-store.Post().Save(o1)).Data.(*model.Post)
+
+ preference1 := model.Preference{
+ UserId: userId,
+ Category: category,
+ Name: o1.Id,
+ Value: "true",
+ }
+
+ preference2 := model.Preference{
+ UserId: userId,
+ Category: category,
+ Name: model.NewId(),
+ Value: "true",
+ }
+
+ Must(store.Preference().Save(&model.Preferences{preference1, preference2}))
+
+ result := <-store.Preference().CleanupFlagsBatch(10000)
+ assert.Nil(t, result.Err)
+
+ result = <-store.Preference().Get(userId, category, preference1.Name)
+ assert.Nil(t, result.Err)
+
+ result = <-store.Preference().Get(userId, category, preference2.Name)
+ assert.NotNil(t, result.Err)
+}
diff --git a/store/store.go b/store/store.go
index f7962fa4f..d2c30318f 100644
--- a/store/store.go
+++ b/store/store.go
@@ -346,6 +346,7 @@ type PreferenceStore interface {
DeleteCategoryAndName(category string, name string) StoreChannel
PermanentDeleteByUser(userId string) StoreChannel
IsFeatureEnabled(feature, userId string) StoreChannel
+ CleanupFlagsBatch(limit int64) StoreChannel
}
type LicenseStore interface {