summaryrefslogtreecommitdiffstats
path: root/model
diff options
context:
space:
mode:
authorGeorge Goldberg <george@gberg.me>2017-09-15 17:53:48 +0100
committerChristopher Speller <crspeller@gmail.com>2017-09-15 09:53:48 -0700
commit7243aa6751c266ecd342a41cbef390c71a962425 (patch)
tree9402bc13b51a3394284a1c6d56247f586c158016 /model
parentfd878bd50c1c36f90962776ebb9626d016239540 (diff)
downloadchat-7243aa6751c266ecd342a41cbef390c71a962425.tar.gz
chat-7243aa6751c266ecd342a41cbef390c71a962425.tar.bz2
chat-7243aa6751c266ecd342a41cbef390c71a962425.zip
PLT-6558: Basic data retention job scheduler/worker implementation. (#7449)
* PLT-7639: Batch delete methods for data retention. * PLT-6558: Basic data retention job worker/scheduler implementation.
Diffstat (limited to 'model')
-rw-r--r--model/config.go48
-rw-r--r--model/license.go7
-rw-r--r--model/license_test.go7
3 files changed, 57 insertions, 5 deletions
diff --git a/model/config.go b/model/config.go
index 40ab7c018..27fdb90ce 100644
--- a/model/config.go
+++ b/model/config.go
@@ -138,6 +138,10 @@ const (
ELASTICSEARCH_SETTINGS_DEFAULT_POST_INDEX_SHARDS = 1
ELASTICSEARCH_SETTINGS_DEFAULT_AGGREGATE_POSTS_AFTER_DAYS = 365
ELASTICSEARCH_SETTINGS_DEFAULT_POSTS_AGGREGATOR_JOB_START_TIME = "03:00"
+
+ DATA_RETENTION_SETTINGS_DEFAULT_MESSAGE_RETENTION_DAYS = 365
+ DATA_RETENTION_SETTINGS_DEFAULT_FILE_RETENTION_DAYS = 365
+ DATA_RETENTION_SETTINGS_DEFAULT_DELETION_JOB_START_TIME = "02:00"
)
type ServiceSettings struct {
@@ -480,7 +484,11 @@ type ElasticsearchSettings struct {
}
type DataRetentionSettings struct {
- Enable *bool
+ EnableMessageDeletion *bool
+ EnableFileDeletion *bool
+ MessageRetentionDays *int
+ FileRetentionDays *int
+ DeletionJobStartTime *string
}
type JobSettings struct {
@@ -1555,9 +1563,29 @@ func (o *Config) SetDefaults() {
*o.ElasticsearchSettings.PostsAggregatorJobStartTime = ELASTICSEARCH_SETTINGS_DEFAULT_POSTS_AGGREGATOR_JOB_START_TIME
}
- if o.DataRetentionSettings.Enable == nil {
- o.DataRetentionSettings.Enable = new(bool)
- *o.DataRetentionSettings.Enable = false
+ if o.DataRetentionSettings.EnableMessageDeletion == nil {
+ o.DataRetentionSettings.EnableMessageDeletion = new(bool)
+ *o.DataRetentionSettings.EnableMessageDeletion = false
+ }
+
+ if o.DataRetentionSettings.EnableFileDeletion == nil {
+ o.DataRetentionSettings.EnableFileDeletion = new(bool)
+ *o.DataRetentionSettings.EnableMessageDeletion = false
+ }
+
+ if o.DataRetentionSettings.MessageRetentionDays == nil {
+ o.DataRetentionSettings.MessageRetentionDays = new(int)
+ *o.DataRetentionSettings.MessageRetentionDays = DATA_RETENTION_SETTINGS_DEFAULT_MESSAGE_RETENTION_DAYS
+ }
+
+ if o.DataRetentionSettings.FileRetentionDays == nil {
+ o.DataRetentionSettings.FileRetentionDays = new(int)
+ *o.DataRetentionSettings.FileRetentionDays = DATA_RETENTION_SETTINGS_DEFAULT_FILE_RETENTION_DAYS
+ }
+
+ if o.DataRetentionSettings.DeletionJobStartTime == nil {
+ o.DataRetentionSettings.DeletionJobStartTime = new(string)
+ *o.DataRetentionSettings.DeletionJobStartTime = DATA_RETENTION_SETTINGS_DEFAULT_DELETION_JOB_START_TIME
}
if o.JobSettings.RunJobs == nil {
@@ -1816,6 +1844,18 @@ func (o *Config) IsValid() *AppError {
return NewAppError("Config.IsValid", "model.config.is_valid.elastic_search.posts_aggregator_job_start_time.app_error", nil, err.Error(), http.StatusBadRequest)
}
+ if *o.DataRetentionSettings.MessageRetentionDays <= 0 {
+ return NewAppError("Config.IsValid", "model.config.is_valid.data_retention.message_retention_days_too_low.app_error", nil, "", http.StatusBadRequest)
+ }
+
+ if *o.DataRetentionSettings.FileRetentionDays <= 0 {
+ return NewAppError("Config.IsValid", "model.config.is_valid.data_retention.file_retention_days_too_low.app_error", nil, "", http.StatusBadRequest)
+ }
+
+ if _, err := time.Parse("03:04", *o.DataRetentionSettings.DeletionJobStartTime); err != nil {
+ return NewAppError("Config.IsValid", "model.config.is_valid.data_retention.deletion_job_start_time.app_error", nil, err.Error(), http.StatusBadRequest)
+ }
+
return nil
}
diff --git a/model/license.go b/model/license.go
index 5126f7c3e..9e25dd882 100644
--- a/model/license.go
+++ b/model/license.go
@@ -54,6 +54,7 @@ type Features struct {
Announcement *bool `json:"announcement"`
ThemeManagement *bool `json:"theme_management"`
EmailNotificationContents *bool `json:"email_notification_contents"`
+ DataRetention *bool `json:"data_retention"`
// after we enabled more features for webrtc we'll need to control them with this
FutureFeatures *bool `json:"future_features"`
@@ -74,6 +75,7 @@ func (f *Features) ToMap() map[string]interface{} {
"password": *f.PasswordRequirements,
"elastic_search": *f.Elasticsearch,
"email_notification_contents": *f.EmailNotificationContents,
+ "data_retention": *f.DataRetention,
"future": *f.FutureFeatures,
}
}
@@ -163,6 +165,11 @@ func (f *Features) SetDefaults() {
f.EmailNotificationContents = new(bool)
*f.EmailNotificationContents = *f.FutureFeatures
}
+
+ if f.DataRetention == nil {
+ f.DataRetention = new(bool)
+ *f.DataRetention = *f.FutureFeatures
+ }
}
func (l *License) IsExpired() bool {
diff --git a/model/license_test.go b/model/license_test.go
index 2338c9b93..f953d47b3 100644
--- a/model/license_test.go
+++ b/model/license_test.go
@@ -26,8 +26,9 @@ func TestLicenseFeaturesToMap(t *testing.T) {
CheckTrue(t, m["saml"].(bool))
CheckTrue(t, m["password"].(bool))
CheckTrue(t, m["elastic_search"].(bool))
- CheckTrue(t, m["future"].(bool))
CheckTrue(t, m["email_notification_contents"].(bool))
+ CheckTrue(t, m["data_retention"].(bool))
+ CheckTrue(t, m["future"].(bool))
}
func TestLicenseFeaturesSetDefaults(t *testing.T) {
@@ -48,6 +49,7 @@ func TestLicenseFeaturesSetDefaults(t *testing.T) {
CheckTrue(t, *f.PasswordRequirements)
CheckTrue(t, *f.Elasticsearch)
CheckTrue(t, *f.EmailNotificationContents)
+ CheckTrue(t, *f.DataRetention)
CheckTrue(t, *f.FutureFeatures)
f = Features{}
@@ -67,6 +69,7 @@ func TestLicenseFeaturesSetDefaults(t *testing.T) {
*f.SAML = true
*f.PasswordRequirements = true
*f.Elasticsearch = true
+ *f.DataRetention = true
*f.EmailNotificationContents = true
f.SetDefaults()
@@ -85,6 +88,7 @@ func TestLicenseFeaturesSetDefaults(t *testing.T) {
CheckTrue(t, *f.PasswordRequirements)
CheckTrue(t, *f.Elasticsearch)
CheckTrue(t, *f.EmailNotificationContents)
+ CheckTrue(t, *f.DataRetention)
CheckFalse(t, *f.FutureFeatures)
}
@@ -166,6 +170,7 @@ func TestLicenseToFromJson(t *testing.T) {
CheckBool(t, *f1.SAML, *f.SAML)
CheckBool(t, *f1.PasswordRequirements, *f.PasswordRequirements)
CheckBool(t, *f1.Elasticsearch, *f.Elasticsearch)
+ CheckBool(t, *f1.DataRetention, *f.DataRetention)
CheckBool(t, *f1.FutureFeatures, *f.FutureFeatures)
invalid := `{"asdf`