UNPKG

2.46 kBJavaScriptView Raw
1
2const _ = require("lodash")
3const path = require("path")
4const glob = require("glob")
5const schedule = require('node-schedule')
6const Debugger = require("./Debugger")
7
8const debug = new Debugger('motif:scheduler')
9
10class Scheduler {
11 get service() {
12 return this._service
13 }
14
15 get config() {
16 return this._service._config
17 }
18
19 constants(key) {
20 let constants = process.motif.constants || {}
21 return constants[key.toUpperCase()] || {}
22 }
23
24 model(key, connection = null) {
25 let models = process.motif.models
26 let modelData = models[key]
27 if (!modelData) {
28 return null
29 }
30
31 let config = this.config
32 let design = modelData.design
33 let model = new modelData.constructor({design, config})
34 if (connection) {
35 model.setCollection(design.createCollection(connection))
36 }
37
38 return model
39 }
40
41 generateJobs(options) {
42 const { jobs } = options
43
44 jobs.map((jobOptions) => {
45 let { rule, timezone, controllers } = jobOptions
46
47 const tasks = controllers.map((handler) => {
48 let spec = {}
49
50 if (rule) { spec.rule = rule }
51 if (timezone) { spec.tz = timezone }
52
53 return schedule.scheduleJob(spec, (fireDate) => {
54 let controller = async () => {
55 try {
56 await handler.call(this, fireDate)
57 } catch (e) {
58 console.error(e)
59 }
60 }
61
62 controller.call(this, fireDate)
63 })
64 })
65 })
66 }
67
68 constructor({ service }) {
69 debug.log("scheduler", service)
70
71 this._service = service
72 }
73
74 static __autoLoad( cwd, options = {}) {
75 let handlers = []
76 let { excludesAll, excludes, includes } = options
77 let rule = options.rule || "jobs/*.js"
78 let files = glob.sync(rule, { cwd: cwd })
79
80 _.each(files, file => {
81 let filePath = path.resolve(cwd, file)
82
83 let isIgnore = excludesAll === true
84
85 if (excludes) {
86 _.forEach(excludes, exclude => {
87 if (filePath.indexOf(exclude) !== -1) {
88 isIgnore = true
89 }
90 })
91 }
92
93 if (includes) {
94 _.forEach(includes || [], include => {
95 if (filePath.indexOf(include) !== -1) {
96 isIgnore = false
97 }
98 })
99 }
100
101 if (!isIgnore) {
102 delete require.cache[filePath]
103 let handler = require(filePath)
104 handlers.push(handler)
105 }
106 })
107
108 return handlers
109 }
110}
111
112module.exports = Scheduler