Просмотр исходного кода

refs 112131: save unsaved questionnaire and delete finished questionnaire

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

+ 0 - 2
packages/app/.env.development

@@ -18,8 +18,6 @@ HACKMD_URI="http://localhost:3010"
 HACKMD_URI_FOR_SERVER="http://hackmd:3000"
 OGP_URI="http://ogp:8088"
 GROWI_QUESTIONNAIRE_URI="http://host.docker.internal:3003"
-QUESTIONNAIRE_CRON_SCHEDULE="* * * * *"
-QUESTIONNAIRE_CRON_MAX_HOURS_UNTIL_REQUEST=1/60
 # DRAWIO_URI="http://localhost:8080/?offline=1&https=0"
 # S2SMSG_PUBSUB_SERVER_TYPE=nchan
 # PUBLISH_OPEN_API=true

+ 2 - 1
packages/app/src/interfaces/questionnaire/questionnaire-order.ts

@@ -1,7 +1,8 @@
-import { ICondition } from './questionnaire/condition';
+import { ICondition } from './condition';
 import { IQuestion } from './question';
 
 export interface IQuestionnaireOrder {
+  orderId: string // growi-questionnaire での mongoDB の id
   showFrom: Date
   showUntil: Date
   questions: IQuestion[]

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

@@ -308,6 +308,8 @@ Crowi.prototype.setupModels = async function() {
 };
 
 Crowi.prototype.setupCron = function() {
+  console.log(this.configManager?.getConfig('crowi', 'app:questionnaireCronSchedule'));
+  console.log(this.configManager?.getConfig('crowi', 'app:questionnaireCronMaxHoursUntilRequest'));
   new QuestionnaireCronService(this).setUpCron();
 };
 

+ 9 - 7
packages/app/src/server/models/questionnaire/questionnaire-order.ts

@@ -10,14 +10,16 @@ export interface QuestionnaireOrderDocument extends IQuestionnaireOrder, Documen
 
 export type QuestionnaireOrderModel = Model<QuestionnaireOrderDocument>
 
-function showDateValidator(value) {
-  // `this` is the mongoose document
-  return this.showFrom <= value;
-}
-
-const questionnaireOrderSchema = new Schema<IQuestionnaireOrder>({
+const questionnaireOrderSchema = new Schema<QuestionnaireOrderDocument>({
+  orderId: { type: String, required: true },
   showFrom: { type: Date, required: true },
-  showUntil: { type: Date, required: true, validate: [showDateValidator, 'showFrom must be before showUntil'] },
+  showUntil: {
+    type: Date,
+    required: true,
+    validate: [function(value) {
+      return this.showFrom <= value;
+    }, 'showFrom must be before showUntil'],
+  },
   questions: [questionSchema],
   condition: { type: conditionSchema, required: true },
 }, { timestamps: true });

+ 30 - 5
packages/app/src/server/service/questionnaire-cron.ts

@@ -1,6 +1,7 @@
+import { IQuestionnaireOrder } from '~/interfaces/questionnaire/questionnaire-order';
 import axios from '~/utils/axios';
 
-import { QuestionnaireOrderDocument } from '../models/questionnaire/questionnaire-order';
+import QuestionnaireOrder from '../models/questionnaire/questionnaire-order';
 
 const nodeCron = require('node-cron');
 
@@ -28,11 +29,29 @@ class QuestionnaireCronService {
   }
 
   setUpCron(): void {
-    const maxSecondsUntilRequest = this.maxHoursUntilRequest * 60 * 60;
+    // const maxSecondsUntilRequest = this.maxHoursUntilRequest * 60 * 60;
+    const maxSecondsUntilRequest = 60;
     this.questionnaireOrderGetCron(this.cronSchedule, maxSecondsUntilRequest);
   }
 
   questionnaireOrderGetCron(cronSchedule: string, maxSecondsUntilRequest: number): void {
+    const saveOrders = async(questionnaireOrders: IQuestionnaireOrder[]) => {
+      const savedOrders = await QuestionnaireOrder.find();
+      const savedOrderIds = savedOrders.map(order => order.orderId);
+      // 渡されたアンケートのうち未保存のものを保存する
+      const nonSavedOrders = questionnaireOrders.filter(order => !savedOrderIds.includes(order.orderId));
+      QuestionnaireOrder.insertMany(nonSavedOrders);
+    };
+
+    const deleteFinishedOrders = () => {
+      const currentDate = new Date(Date.now());
+      QuestionnaireOrder.deleteMany({
+        showUntil: {
+          $lt: currentDate,
+        },
+      });
+    };
+
     nodeCron.schedule(cronSchedule, async() => {
       const secToSleep = getRandomInt(0, maxSecondsUntilRequest);
 
@@ -40,9 +59,15 @@ class QuestionnaireCronService {
 
       try {
         const response = await axios.get(`${this.growiQuestionnaireUri}/questionnaire-order/index`);
-        const questionnaireOrders: QuestionnaireOrderDocument[] = response.data.questionnaireOrders;
-        console.log(response.data);
-        console.log(questionnaireOrders);
+        const questionnaireOrdersJson = JSON.parse(JSON.stringify(response.data)).questionnaireQrders;
+        const questionnaireOrders: IQuestionnaireOrder[] = questionnaireOrdersJson.map((questionnaireOrder) => {
+          questionnaireOrder.orderId = questionnaireOrder._id;
+          delete questionnaireOrder._id;
+          return questionnaireOrder;
+        });
+
+        await saveOrders(questionnaireOrders);
+        deleteFinishedOrders();
       }
       catch (e) {
         console.log(e);