Quellcode durchsuchen

Merged in feature/cron (pull request #16)

Feature/cron

Approved-by: Alex Smith <alex.smith@mubaloo.com>
Fela Maslen vor 7 Jahren
Ursprung
Commit
9f87052571

+ 1 - 0
.env.example

@@ -7,3 +7,4 @@ WHOSOFF_API_KEY=whosoffapikey
 PASSWORD=yoursecretpassword
 MONGO_URL=mongodb://localhost:27017
 MONGO_DB_NAME=gurubot2
+SCHEDULE_ANNOY=10 1 * * *,30 14 * * */2

+ 19 - 0
package-lock.json

@@ -7042,6 +7042,15 @@
         "lower-case": "^1.1.1"
       }
     },
+    "node-cron": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-2.0.3.tgz",
+      "integrity": "sha512-eJI+QitXlwcgiZwNNSRbqsjeZMp5shyajMR81RZCqeW0ZDEj4zU9tpd4nTh/1JsBiKbF8d08FCewiipDmVIYjg==",
+      "requires": {
+        "opencollective-postinstall": "^2.0.0",
+        "tz-offset": "0.0.1"
+      }
+    },
     "node-gyp": {
       "version": "3.8.0",
       "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
@@ -7493,6 +7502,11 @@
         "mimic-fn": "^1.0.0"
       }
     },
+    "opencollective-postinstall": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.1.tgz",
+      "integrity": "sha512-saQQ9hjLwu/oS0492eyYotoh+bra1819cfAT5rjY/e4REWwuc8IgZ844Oo44SiftWcJuBiqp0SA0BFVbmLX0IQ=="
+    },
     "optionator": {
       "version": "0.8.2",
       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
@@ -11109,6 +11123,11 @@
       "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
       "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
     },
+    "tz-offset": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/tz-offset/-/tz-offset-0.0.1.tgz",
+      "integrity": "sha512-kMBmblijHJXyOpKzgDhKx9INYU4u4E1RPMB0HqmKSgWG8vEcf3exEfLh4FFfzd3xdQOw9EuIy/cP0akY6rHopQ=="
+    },
     "uglify-js": {
       "version": "3.4.9",
       "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",

+ 1 - 0
package.json

@@ -82,6 +82,7 @@
     "joi": "^14.3.1",
     "moment": "^2.23.0",
     "mongodb": "^3.1.10",
+    "node-cron": "^2.0.3",
     "react": "^16.7.0",
     "react-dom": "^16.7.0",
     "react-redux": "^6.0.0",

+ 1 - 0
src/server/config.js

@@ -9,6 +9,7 @@ if (__DEV__) {
 module.exports = () => ({
     __PROD__,
     __DEV__,
+    schedule: process.env.SCHEDULE_ANNOY || null,
     annoyMessage: '%s: please complete your time sheets for the previous week.',
     completeMessage: 'Everybody has done their time sheets. *High five*',
     slack: {

+ 3 - 0
src/server/index.js

@@ -10,6 +10,7 @@ const path = require('path');
 const getConfig = require('server/config');
 const { getLogger } = require('server/modules/logger');
 const { getDBConnection } = require('server/modules/db');
+const { setupCron } = require('server/modules/cron');
 const { apiRoutes } = require('server/routes');
 
 const webpackConfig = require('../../webpack.config');
@@ -72,6 +73,8 @@ async function run() {
 
         setupMiddleware(config, app);
 
+        setupCron(config, db, logger);
+
         app.use('/api1', apiRoutes(config, db, logger));
 
         setupDevServer(config, db, logger, app);

+ 30 - 0
src/server/modules/cron.js

@@ -0,0 +1,30 @@
+const cron = require('node-cron');
+
+const { annoyUsers } = require('server/routes/annoy');
+
+function setupCron(config, db, logger) {
+    if (!config.schedule) {
+        logger.warn('Not setting up schedule as it is not defined. Please define the SCHEDULE_ANNOY env variable as a cron schedule, e.g. SCHEDULE_ANNOY=10 1 * * *');
+
+        return;
+    }
+
+    const task = async () => {
+        logger.verbose('Running annoy on schedule!');
+
+        await annoyUsers(config, db, logger);
+    };
+
+    const schedules = config.schedule.split(',');
+
+    schedules.forEach(schedule => {
+        logger.verbose('Scheduling annoy at', schedule);
+
+        cron.schedule(schedule, task);
+    });
+}
+
+module.exports = {
+    setupCron
+};
+

+ 23 - 18
src/server/routes/annoy.js

@@ -29,33 +29,37 @@ function getPreviousWeekPeriod(now) {
     return { start, end };
 }
 
-function annoyUsers(config, db, logger) {
+async function annoyUsers(config, db, logger) {
     const userCrud = makeUserCrud();
     const phraseCrud = makePhraseCrud();
 
-    return async (req, res) => {
-        const now = moment();
+    const now = moment();
+
+    const range = getPreviousWeekPeriod(now);
 
-        const range = getPreviousWeekPeriod(now);
+    const validUsers = await userCrud.getDocs(db);
+    const phrases = await phraseCrud.getDocs(db);
 
-        const validUsers = await userCrud.getDocs(db);
-        const phrases = await phraseCrud.getDocs(db);
+    const validUserEmails = validUsers.map(({ email }) => email.toLowerCase());
 
-        const validUserEmails = validUsers.map(({ email }) => email.toLowerCase());
+    const [slackUsers, usersOnHoliday] = await Promise.all([
+        getAllSlackUsersWithNames(config, logger),
+        getAllUsersOnHoliday(config, logger, now)
+    ]);
 
-        const [slackUsers, usersOnHoliday] = await Promise.all([
-            getAllSlackUsersWithNames(config, logger),
-            getAllUsersOnHoliday(config, logger, now)
-        ]);
+    const users = slackUsers.filter(({ email }) =>
+        validUserEmails.includes(email) &&
+        !usersOnHoliday.includes(email)
+    );
 
-        const users = slackUsers.filter(({ email }) =>
-            validUserEmails.includes(email) &&
-            !usersOnHoliday.includes(email)
-        );
+    const usersMissingTimesheet = await getUsersWithMissingTimesheets(config, logger, range, users);
 
-        const usersMissingTimesheet = await getUsersWithMissingTimesheets(config, logger, range, users);
+    await annoySlackUsers(config, logger, now, usersMissingTimesheet, phrases);
+}
 
-        await annoySlackUsers(config, logger, now, usersMissingTimesheet, phrases);
+function annoyUsersRoute(config, db, logger) {
+    return async (req, res) => {
+        await annoyUsers(config, db, logger);
 
         res.json({ ok: true });
     };
@@ -63,6 +67,7 @@ function annoyUsers(config, db, logger) {
 
 module.exports = {
     getPreviousWeekPeriod,
-    annoyUsers
+    annoyUsers,
+    annoyUsersRoute
 };
 

+ 2 - 2
src/server/routes/index.js

@@ -5,7 +5,7 @@ const { makeCrudRoutes } = require('server/modules/crud');
 const { makeUserCrud } = require('server/modules/users');
 const { makePhraseCrud } = require('server/modules/phrases');
 
-const { annoyUsers } = require('server/routes/annoy');
+const { annoyUsersRoute } = require('server/routes/annoy');
 
 function apiRoutes(config, db, logger) {
     const router = new Router();
@@ -18,7 +18,7 @@ function apiRoutes(config, db, logger) {
 
     makeCrudRoutes(config, db, 'phrases', router, makePhraseCrud());
 
-    router.post('/annoy', annoyUsers(config, db, logger));
+    router.post('/annoy', annoyUsersRoute(config, db, logger));
 
     // eslint-disable-next-line no-unused-vars
     router.use((err, req, res, next) => {