Skip to content

Commit 2aabaf4

Browse files
authored
Merge pull request #20 from iolufemi/dev
Dev
2 parents d8cd202 + 3d55347 commit 2aabaf4

File tree

11 files changed

+299
-27
lines changed

11 files changed

+299
-27
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
<a name="0.5.0"></a>
2+
# [0.5.0](https://github.com/EnsembleLab/api-template/compare/0.4.1...0.5.0) (2018-05-02)
3+
4+
5+
16
<a name="0.4.1"></a>
27
## [0.4.1](https://github.com/EnsembleLab/api-template/compare/0.4.0...0.4.1) (2018-04-27)
38

Dockerfile

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
FROM node:carbon
2+
3+
WORKDIR /usr/src/app
4+
5+
COPY ../package*.json ./
6+
7+
RUN npm install
8+
9+
COPY . .
10+
11+
CMD [ "npm", "run", "clock" ]

TODO.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,4 @@
1313
| routes/index.js | 304 | Make Log requests testable and write unit tests for it
1414
| routes/index.js | 305 | Develop the route loader into a separate node module to be publish on npm
1515
| routes/index.js | 306 | Develop all services onto separate node module to be publish on npm
16-
| services/logger/index.js | 36 | Test Error Handler
17-
| services/queue/clock.js | 11 | work on a clock functionality so kue can support scheduled jobs
18-
| services/queue/clock.js | 12 | Use the cron package here https://www.npmjs.com/package/cron for timer
16+
| services/logger/index.js | 36 | Test Error Handler

clock/Dockerfile

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
FROM node:carbon
2+
3+
WORKDIR /usr/src/app
4+
5+
COPY ../package*.json ./
6+
7+
RUN npm install
8+
9+
COPY . .
10+
11+
CMD [ "npm", "run", "clock" ]

package-lock.json

Lines changed: 9 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
{
22
"name": "api-template",
3-
"version": "0.4.1",
3+
"version": "0.5.0",
44
"description": "A template for creating APIs Fast",
55
"main": "app.js",
66
"scripts": {
77
"test": "gulp sanity",
8-
"start": "node app"
8+
"start": "node app",
9+
"clock": "node ./services/queue/clock"
910
},
1011
"repository": {
1112
"type": "git",
@@ -54,6 +55,7 @@
5455
"cacheman-redis": "^1.1.2",
5556
"cluster": "^0.7.7",
5657
"cors": "^2.8.3",
58+
"cron": "^1.3.0",
5759
"crypto": "0.0.3",
5860
"debug": "^2.6.3",
5961
"express": "^4.15.2",

services/queue/Model.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
"use strict";
2+
3+
var db = require('../database').logMongo;
4+
5+
var collection = 'Clock';
6+
7+
var debug = require('debug')(collection);
8+
9+
var schemaObject = {
10+
job: {
11+
type: 'String'
12+
},
13+
crontab: {
14+
type: 'String'
15+
},
16+
name: {
17+
type: 'String',
18+
unique: true
19+
},
20+
enabled: {
21+
type: 'Boolean',
22+
default: true
23+
},
24+
arguments: {
25+
type: db._mongoose.Schema.Types.Mixed
26+
},
27+
lastRunAt: {
28+
type: db._mongoose.Schema.Types.Mixed
29+
}
30+
};
31+
32+
schemaObject.createdAt = {
33+
type: 'Date',
34+
default: Date.now
35+
};
36+
37+
schemaObject.updatedAt = {
38+
type: 'Date'
39+
// default: Date.now
40+
};
41+
42+
// Let us define our schema
43+
var Schema = new db._mongoose.Schema(schemaObject);
44+
45+
var Model = db.model(collection, Schema);
46+
47+
module.exports = Model;

services/queue/clock.js

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,46 @@
1-
// {
2-
// task
3-
// crontab
4-
// last runed at
5-
// next run at
6-
// name
7-
// enabled
8-
// arguments
9-
// }
1+
"use strict";
102

11-
// ToDo: work on a clock functionality so kue can support scheduled jobs
12-
// Todo: Use the cron package here https://www.npmjs.com/package/cron for timer
3+
var CronJob = require('cron').CronJob;
4+
var log = require('../logger');
5+
var Model = require('./Model');
6+
var queue = require('./');
7+
var _ = require('lodash');
8+
var config = require('../../config');
9+
10+
log.info('Starting Queue Clock...');
11+
Model.find({enabled: true})
12+
.then(function(jobs){
13+
_.forEach(jobs, function(job){
14+
log.info('Initializing '+job.name+'...');
15+
var cron = new CronJob({
16+
cronTime: job.crontab,
17+
onTick: function(){
18+
// run this
19+
// Check if job is enabled
20+
Model.findOne({_id: job._id, enabled: true})
21+
.then(function(resp){
22+
if(!resp){
23+
throw {notEnabled: true};
24+
}else{
25+
log.info('Pushing '+job.name+' to queue...');
26+
queue.create(job.job, job.arguments)
27+
.save();
28+
}
29+
})
30+
.catch(function(err){
31+
if(err.notEnabled){
32+
log.info(job.name+' is not enabled. Skipping...');
33+
}else{
34+
log.error('An error occured while running Job - '+job.name, err);
35+
}
36+
});
37+
38+
},
39+
start: true,
40+
timeZone: config.clockTimezone
41+
});
42+
});
43+
})
44+
.catch(function(err){
45+
log.error('An error occured while starting the queue clock: ', err);
46+
});

services/queue/index.js

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ var queue = kue.createQueue({
66
redis: config.redisURL
77
});
88
var log = require('../../services/logger');
9+
var Model = require('./Model');
910

1011
// Clean Up Completed Job
1112
queue
@@ -14,19 +15,19 @@ queue
1415
})
1516
.on('job complete', function(id, result){
1617
log.info('ID: ',id,' Result: ',result);
17-
kue.Job.get(id, function(err, job){
18-
if (err) {
19-
return false;
20-
}else{
21-
job.remove(function(err){
22-
if (err) {
23-
throw new Error(err.message);
18+
kue.Job.get(id, function(err, job){
19+
if (err) {
20+
return false;
2421
}else{
25-
log.info('removed completed job #%d', job.id);
22+
job.remove(function(err){
23+
if (err) {
24+
throw err;
25+
}else{
26+
log.info('removed completed job #%d', job.id);
27+
}
28+
});
2629
}
2730
});
28-
}
29-
});
3031
});
3132

3233
// Graceful Shutdown
@@ -57,3 +58,12 @@ queue.watchStuckJobs(1000);
5758
// Process Jobs Here
5859
module.exports = queue;
5960
module.exports.kue = kue;
61+
module.exports.addSchedule = function(crontab, name, job, data){
62+
Model.create({crontab: crontab, name: name, job: job, arguments: data})
63+
.then(function(){
64+
// Silencio es dorado
65+
})
66+
.catch(function(err){
67+
log.error('Error scheduling job - ', err);
68+
});
69+
};

services/request/Model.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
"use strict";
2+
3+
var db = require('../database').logMongo;
4+
5+
var collection = 'APICalls';
6+
7+
var debug = require('debug')(collection);
8+
9+
var schemaObject = {
10+
RequestId: {
11+
type: 'String',
12+
unique: true
13+
},
14+
uri: {
15+
type: 'String'
16+
},
17+
method: {
18+
type: 'String'
19+
},
20+
service: {
21+
type: 'String'
22+
},
23+
data: {
24+
type: db._mongoose.Schema.Types.Mixed
25+
},
26+
headers: {
27+
type: db._mongoose.Schema.Types.Mixed
28+
},
29+
response: {
30+
type: db._mongoose.Schema.Types.Mixed
31+
},
32+
responseStatusCode: {
33+
type: 'Number'
34+
}
35+
};
36+
37+
schemaObject.createdAt = {
38+
type: 'Date',
39+
default: Date.now
40+
};
41+
42+
schemaObject.updatedAt = {
43+
type: 'Date'
44+
// default: Date.now
45+
};
46+
47+
schemaObject.retriedAt = {
48+
type: 'Date'
49+
// default: Date.now
50+
};
51+
52+
// Let us define our schema
53+
var Schema = new db._mongoose.Schema(schemaObject);
54+
55+
var Model = db.model(collection, Schema);
56+
57+
module.exports = Model;

0 commit comments

Comments
 (0)