summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreug-vs <eug-vs@keemail.me>2020-11-28 01:11:54 +0300
committereug-vs <eug-vs@keemail.me>2020-11-28 01:11:54 +0300
commit2a1b70edbdef4ab934d0091a92c14327dde8a256 (patch)
tree3c77e7fc98f23fc437a641da3a496bdc29c66f42
parent86f62a65c4f9ceac086b16fb290544caf2ed1da5 (diff)
downloadbsu-fantom-2a1b70edbdef4ab934d0091a92c14327dde8a256.tar.gz
feat: save logs to database
-rw-r--r--src/services/events/event.model.js48
-rw-r--r--src/services/events/event.schema.js1
-rw-r--r--src/services/events/event.service.js27
-rw-r--r--src/services/events/log.model.js7
-rw-r--r--src/services/events/log.schema.js7
5 files changed, 59 insertions, 31 deletions
diff --git a/src/services/events/event.model.js b/src/services/events/event.model.js
index b8a13bc..9ecacb7 100644
--- a/src/services/events/event.model.js
+++ b/src/services/events/event.model.js
@@ -1,20 +1,57 @@
const cron = require('cron');
const { model } = require('mongoose');
const schema = require('./event.schema.js');
+const LogModel = require('./log.model.js');
const CronJob = cron.CronJob;
+schema.methods.log = function(message) {
+ const dateOpts = { timeStyle: 'medium', dateStyle: 'short' };
+ const timestamp = new Date().toLocaleString('en', dateOpts);
+ console.log(`[${timestamp}] ${this.name}: ${message}`);
+
+ return LogModel.create({
+ eventId: this._id,
+ message
+ });
+};
+
+schema.methods.start = function() {
+ this.log('Event started')
+ this.lastRunAt = new Date();
+ this.status = 'running';
+ return this.save();
+};
+
+schema.methods.complete = function() {
+ this.log('Event complete')
+ this.status = 'complete';
+ return this.save();
+};
+
+schema.methods.fail = function(error) {
+ this.log(error);
+ this.error = error;
+ this.status = 'failed';
+ return this.save();
+};
+
+schema.methods.run = async function(handler) {
+ try {
+ this.start();
+ await handler(this);
+ return this.complete();
+ } catch (error) {
+ this.fail(error);
+ }
+};
+
schema.methods.computeNextRunAt = function() {
const job = new CronJob(this.schedule);
const nextRunAt = job.nextDates();
return new Date(nextRunAt);
};
-schema.methods.setStatus = function(status) {
- this.status = status;;
- this.save();
-};
-
schema.pre('save', function(next) {
this.nextRunAt = this.computeNextRunAt();
next();
@@ -33,7 +70,6 @@ schema.statics.findNextEvents = function(limit = 10) {
return this.find(
{
nextRunAt: {
- $exists: 1,
$gt: new Date()
},
},
diff --git a/src/services/events/event.schema.js b/src/services/events/event.schema.js
index 2250700..aff19f1 100644
--- a/src/services/events/event.schema.js
+++ b/src/services/events/event.schema.js
@@ -14,6 +14,7 @@ module.exports = new Schema({
type: String,
default: 'notStarted'
},
+ error: String,
context: {},
nextRunAt: Date,
lastRunAt: Date
diff --git a/src/services/events/event.service.js b/src/services/events/event.service.js
index 4d87c6c..227480d 100644
--- a/src/services/events/event.service.js
+++ b/src/services/events/event.service.js
@@ -42,37 +42,14 @@ class Events extends Service {
this.stopAllJobs();
const events = await this.Model.findNextEvents();
- if (!events.length) this.log('No upcoming events.');
+ if (!events.length) console.log('WARNING: no upcoming events');
this.jobs = events.map(event => new CronJob(
event.schedule,
- () => this.run(event._id)
+ () => event.run(handleTestJob)
));
this.startAllJobs();
}
-
- log(message) {
- const dateOpts = { timeStyle: 'medium', dateStyle: 'short' };
- const timestamp = new Date().toLocaleString('en', dateOpts);
- return console.log(`[${timestamp}] ${message}`);
- }
-
- async run(id) {
- const event = await this.Model.findById(id);
- event.lastRunAt = new Date();
- event.setStatus('running')
-
- try {
- this.log(`Event ${event.name} started`)
- await handleTestJob(event);
- this.log(`Event ${event.name} ended`)
- } catch (error) {
- event.setStatus('failed')
- }
- if (event.status === 'running') {
- event.setStatus('complete')
- }
- }
}
diff --git a/src/services/events/log.model.js b/src/services/events/log.model.js
new file mode 100644
index 0000000..64b7da6
--- /dev/null
+++ b/src/services/events/log.model.js
@@ -0,0 +1,7 @@
+const { model } = require('mongoose');
+const schema = require('./log.schema.js');
+
+const Model = model('Log', schema);
+
+
+module.exports = Model;
diff --git a/src/services/events/log.schema.js b/src/services/events/log.schema.js
new file mode 100644
index 0000000..bb8d4a5
--- /dev/null
+++ b/src/services/events/log.schema.js
@@ -0,0 +1,7 @@
+const { Schema, Types } = require('mongoose');
+
+module.exports = new Schema({
+ eventId: Types.ObjectId,
+ message: String
+}, { timestamps: true });
+