Futa Arai 3 лет назад
Родитель
Сommit
8fd914b43b

+ 2 - 6
packages/app/src/server/crowi/index.js

@@ -29,7 +29,6 @@ import PageGrantService from '../service/page-grant';
 import PageOperationService from '../service/page-operation';
 // eslint-disable-next-line import/no-cycle
 import { PluginService } from '../service/plugin';
-import QuestionnaireCronService from '../service/questionnnaire-cron-service';
 import SearchService from '../service/search';
 import { SlackIntegrationService } from '../service/slack-integration';
 import { UserNotificationService } from '../service/user-notification';
@@ -308,11 +307,8 @@ Crowi.prototype.setupModels = async function() {
 };
 
 Crowi.prototype.setupCron = function() {
-  new QuestionnaireCronService(
-    this.configManager.getConfig('crowi', 'app:growiQuestionnaireUri'),
-    this.configManager.getConfig('crowi', 'app:questionnaireCronSchedule'),
-    this.configManager.getConfig('crowi', 'app:questionnaireCronMaxHoursUntilRequest'),
-  ).setUpCron();
+  const QuestionnaireCronService = require('../service/questionnaire-cron');
+  new QuestionnaireCronService(this).setUpCron();
 };
 
 Crowi.prototype.scanRuntimeVersions = async function() {

+ 53 - 0
packages/app/src/server/service/questionnaire-cron.ts

@@ -0,0 +1,53 @@
+import axios from '~/utils/axios';
+
+import Crowi from '../crowi';
+
+const nodeCron = require('node-cron');
+
+const getRandomInt = (min: number, max: number): number => {
+  const minInt = Math.ceil(min);
+  const maxInt = Math.floor(max);
+  return Math.floor(Math.random() * (maxInt - minInt) + minInt);
+};
+
+const sleep = msec => new Promise(resolve => setTimeout(resolve, msec));
+
+class QuestionnaireCronService {
+
+  growiQuestionnaireUri: string;
+
+  cronSchedule: string;
+
+  maxHoursUntilRequest: number;
+
+  constructor(crowi: Crowi) {
+    this.growiQuestionnaireUri = crowi.configManager?.getConfig('crowi', 'app:growiQuestionnaireUri');
+    this.cronSchedule = crowi.configManager?.getConfig('crowi', 'app:questionnaireCronSchedule');
+    this.maxHoursUntilRequest = crowi.configManager?.getConfig('crowi', 'app:questionnaireCronMaxHoursUntilRequest');
+  }
+
+  setUpCron(): void {
+    const maxSecondsUntilRequest = this.maxHoursUntilRequest * 60 * 60;
+    this.questionnaireOrderGetCron(this.cronSchedule, maxSecondsUntilRequest);
+  }
+
+  questionnaireOrderGetCron(cronSchedule: string, maxSecondsUntilRequest: number): void {
+    nodeCron.schedule(cronSchedule, async() => {
+      const secToSleep = getRandomInt(0, maxSecondsUntilRequest);
+
+      await sleep(secToSleep * 1000);
+
+      try {
+        const response = await axios.get(`${this.growiQuestionnaireUri}/questionnaire-order/index`);
+        console.log(response.data);
+      }
+      catch (e) {
+        console.log(e);
+      }
+
+    }).start();
+  }
+
+}
+
+export default QuestionnaireCronService;