1 |
|
2 | const _ = require("lodash")
|
3 | const path = require("path")
|
4 | const glob = require("glob")
|
5 | const schedule = require('node-schedule')
|
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 | 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 |
|
112 | module.exports = Scheduler
|