1 |
|
2 | const _ = require("lodash")
|
3 | const path = require("path")
|
4 | const glob = require("glob")
|
5 | const schedule = require('node-schedule-tz')
|
6 | const Debugger = require("./Debugger")
|
7 |
|
8 | const debug = new Debugger('motif:scheduler')
|
9 |
|
10 | class 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 |
|
122 | module.exports = Scheduler
|