UNPKG

2.76 kBJavaScriptView Raw
1
2const _ = require("lodash")
3const path = require("path")
4const glob = require("glob")
5const schedule = require('node-schedule-tz')
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 if (timezone) {
49 return schedule.scheduleJob(rule, timezone, (fireDate) => {
50 let controller = async () => {
51 try {
52 await handler.call(this, fireDate)
53 } catch (e) {
54 console.error(e)
55 }
56 }
57
58 controller.call(this, fireDate)
59 })
60 }
61 else {
62 return schedule.scheduleJob(rule, (fireDate) => {
63 let controller = async () => {
64 try {
65 await handler.call(this, fireDate)
66 } catch (e) {
67 console.error(e)
68 }
69 }
70
71 controller.call(this, fireDate)
72 })
73 }
74 })
75 })
76 }
77
78 constructor({ service }) {
79 debug.log("scheduler", service)
80
81 this._service = service
82 }
83
84 static __autoLoad( cwd, options = {}) {
85 let handlers = []
86 let { excludesAll, excludes, includes } = options
87 let rule = options.rule || "jobs/*.js"
88 let files = glob.sync(rule, { cwd: cwd })
89
90 _.each(files, file => {
91 let filePath = path.resolve(cwd, file)
92
93 let isIgnore = excludesAll === true
94
95 if (excludes) {
96 _.forEach(excludes, exclude => {
97 if (filePath.indexOf(exclude) !== -1) {
98 isIgnore = true
99 }
100 })
101 }
102
103 if (includes) {
104 _.forEach(includes || [], include => {
105 if (filePath.indexOf(include) !== -1) {
106 isIgnore = false
107 }
108 })
109 }
110
111 if (!isIgnore) {
112 delete require.cache[filePath]
113 let handler = require(filePath)
114 handlers.push(handler)
115 }
116 })
117
118 return handlers
119 }
120}
121
122module.exports = Scheduler