github.com/levb/mattermost-server@v5.3.1+incompatible/model/job.go (about) 1 // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package model 5 6 import ( 7 "encoding/json" 8 "io" 9 "net/http" 10 "time" 11 ) 12 13 const ( 14 JOB_TYPE_DATA_RETENTION = "data_retention" 15 JOB_TYPE_MESSAGE_EXPORT = "message_export" 16 JOB_TYPE_ELASTICSEARCH_POST_INDEXING = "elasticsearch_post_indexing" 17 JOB_TYPE_ELASTICSEARCH_POST_AGGREGATION = "elasticsearch_post_aggregation" 18 JOB_TYPE_LDAP_SYNC = "ldap_sync" 19 JOB_TYPE_MIGRATIONS = "migrations" 20 21 JOB_STATUS_PENDING = "pending" 22 JOB_STATUS_IN_PROGRESS = "in_progress" 23 JOB_STATUS_SUCCESS = "success" 24 JOB_STATUS_ERROR = "error" 25 JOB_STATUS_CANCEL_REQUESTED = "cancel_requested" 26 JOB_STATUS_CANCELED = "canceled" 27 ) 28 29 type Job struct { 30 Id string `json:"id"` 31 Type string `json:"type"` 32 Priority int64 `json:"priority"` 33 CreateAt int64 `json:"create_at"` 34 StartAt int64 `json:"start_at"` 35 LastActivityAt int64 `json:"last_activity_at"` 36 Status string `json:"status"` 37 Progress int64 `json:"progress"` 38 Data map[string]string `json:"data"` 39 } 40 41 func (j *Job) IsValid() *AppError { 42 if len(j.Id) != 26 { 43 return NewAppError("Job.IsValid", "model.job.is_valid.id.app_error", nil, "id="+j.Id, http.StatusBadRequest) 44 } 45 46 if j.CreateAt == 0 { 47 return NewAppError("Job.IsValid", "model.job.is_valid.create_at.app_error", nil, "id="+j.Id, http.StatusBadRequest) 48 } 49 50 switch j.Type { 51 case JOB_TYPE_DATA_RETENTION: 52 case JOB_TYPE_ELASTICSEARCH_POST_INDEXING: 53 case JOB_TYPE_ELASTICSEARCH_POST_AGGREGATION: 54 case JOB_TYPE_LDAP_SYNC: 55 case JOB_TYPE_MESSAGE_EXPORT: 56 case JOB_TYPE_MIGRATIONS: 57 default: 58 return NewAppError("Job.IsValid", "model.job.is_valid.type.app_error", nil, "id="+j.Id, http.StatusBadRequest) 59 } 60 61 switch j.Status { 62 case JOB_STATUS_PENDING: 63 case JOB_STATUS_IN_PROGRESS: 64 case JOB_STATUS_SUCCESS: 65 case JOB_STATUS_ERROR: 66 case JOB_STATUS_CANCEL_REQUESTED: 67 case JOB_STATUS_CANCELED: 68 default: 69 return NewAppError("Job.IsValid", "model.job.is_valid.status.app_error", nil, "id="+j.Id, http.StatusBadRequest) 70 } 71 72 return nil 73 } 74 75 func (js *Job) ToJson() string { 76 b, _ := json.Marshal(js) 77 return string(b) 78 } 79 80 func JobFromJson(data io.Reader) *Job { 81 var job Job 82 if err := json.NewDecoder(data).Decode(&job); err == nil { 83 return &job 84 } else { 85 return nil 86 } 87 } 88 89 func JobsToJson(jobs []*Job) string { 90 b, _ := json.Marshal(jobs) 91 return string(b) 92 } 93 94 func JobsFromJson(data io.Reader) []*Job { 95 var jobs []*Job 96 if err := json.NewDecoder(data).Decode(&jobs); err == nil { 97 return jobs 98 } else { 99 return nil 100 } 101 } 102 103 func (js *Job) DataToJson() string { 104 b, _ := json.Marshal(js.Data) 105 return string(b) 106 } 107 108 type Worker interface { 109 Run() 110 Stop() 111 JobChannel() chan<- Job 112 } 113 114 type Scheduler interface { 115 Name() string 116 JobType() string 117 Enabled(cfg *Config) bool 118 NextScheduleTime(cfg *Config, now time.Time, pendingJobs bool, lastSuccessfulJob *Job) *time.Time 119 ScheduleJob(cfg *Config, pendingJobs bool, lastSuccessfulJob *Job) (*Job, *AppError) 120 }