github.com/jlevesy/mattermost-server@v5.3.2-0.20181003190404-7468f35cb0c8+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  }