diff options
author | George Goldberg <george@gberg.me> | 2017-09-15 17:53:48 +0100 |
---|---|---|
committer | Christopher Speller <crspeller@gmail.com> | 2017-09-15 09:53:48 -0700 |
commit | 7243aa6751c266ecd342a41cbef390c71a962425 (patch) | |
tree | 9402bc13b51a3394284a1c6d56247f586c158016 /model | |
parent | fd878bd50c1c36f90962776ebb9626d016239540 (diff) | |
download | chat-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.go | 48 | ||||
-rw-r--r-- | model/license.go | 7 | ||||
-rw-r--r-- | model/license_test.go | 7 |
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` |