questionnaire-cron.ts 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { IQuestionnaireOrder } from '~/interfaces/questionnaire/questionnaire-order';
  2. import axios from '~/utils/axios';
  3. import QuestionnaireOrder, { QuestionnaireOrderDocument } from '../models/questionnaire/questionnaire-order';
  4. const nodeCron = require('node-cron');
  5. const getRandomInt = (min: number, max: number): number => {
  6. const minInt = Math.ceil(min);
  7. const maxInt = Math.floor(max);
  8. return Math.floor(Math.random() * (maxInt - minInt) + minInt);
  9. };
  10. const sleep = msec => new Promise(resolve => setTimeout(resolve, msec));
  11. class QuestionnaireCronService {
  12. growiQuestionnaireUri: string;
  13. cronSchedule: string;
  14. maxHoursUntilRequest: number;
  15. // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
  16. constructor(crowi) {
  17. this.growiQuestionnaireUri = crowi.configManager?.getConfig('crowi', 'app:growiQuestionnaireUri');
  18. this.cronSchedule = crowi.configManager?.getConfig('crowi', 'app:questionnaireCronSchedule');
  19. this.maxHoursUntilRequest = crowi.configManager?.getConfig('crowi', 'app:questionnaireCronMaxHoursUntilRequest');
  20. }
  21. setUpCron(): void {
  22. // const maxSecondsUntilRequest = this.maxHoursUntilRequest * 60 * 60;
  23. const maxSecondsUntilRequest = 60;
  24. this.questionnaireOrderGetCron(this.cronSchedule, maxSecondsUntilRequest);
  25. }
  26. questionnaireOrderGetCron(cronSchedule: string, maxSecondsUntilRequest: number): void {
  27. const saveOrders = async(questionnaireOrders: QuestionnaireOrderDocument[]) => {
  28. const savedOrders: QuestionnaireOrderDocument[] = await QuestionnaireOrder.find();
  29. const savedOrderIds = savedOrders.map(order => order._id.toString());
  30. // 渡されたアンケートのうち未保存のものを保存する
  31. const nonSavedOrders = questionnaireOrders.filter(order => !savedOrderIds.includes(order._id));
  32. QuestionnaireOrder.insertMany(nonSavedOrders);
  33. };
  34. const deleteFinishedOrders = () => {
  35. const currentDate = new Date(Date.now());
  36. QuestionnaireOrder.deleteMany({
  37. showUntil: {
  38. $lt: currentDate,
  39. },
  40. });
  41. };
  42. nodeCron.schedule(cronSchedule, async() => {
  43. const secToSleep = getRandomInt(0, maxSecondsUntilRequest);
  44. await sleep(secToSleep * 1000);
  45. try {
  46. const response = await axios.get(`${this.growiQuestionnaireUri}/questionnaire-order/index`);
  47. const questionnaireOrders: QuestionnaireOrderDocument[] = JSON.parse(JSON.stringify(response.data)).questionnaireQrders;
  48. await saveOrders(questionnaireOrders);
  49. deleteFinishedOrders();
  50. }
  51. catch (e) {
  52. console.log(e);
  53. }
  54. }).start();
  55. }
  56. }
  57. export default QuestionnaireCronService;