{"version":3,"file":"weekly-metrics.mjs","sources":["../../../../server/src/services/metrics/weekly-metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { flow, map, sum, size, mean, max, defaultTo } from 'lodash/fp';\nimport { add } from 'date-fns';\nimport { getService } from '../../utils';\n\nconst ONE_WEEK = 7 * 24 * 60 * 60 * 1000;\n\nconst getWeeklyCronScheduleAt = (date: Date) =>\n  `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n  const metrics = getService('workflow-metrics', { strapi });\n  const workflowsService = getService('workflows', { strapi });\n\n  const getMetricsStoreValue = async () => {\n    const value = await strapi.store.get({ type: 'plugin', name: 'ee', key: 'metrics' });\n    return defaultTo({}, value);\n  };\n\n  const setMetricsStoreValue = (value: unknown) =>\n    strapi.store.set({ type: 'plugin', name: 'ee', key: 'metrics', value });\n\n  return {\n    async computeMetrics() {\n      // There will never be more than 200 workflow, so we can safely fetch them all\n      const workflows = await workflowsService.find({ populate: 'stages' });\n\n      const stagesCount = flow(\n        map('stages'), // Number of stages per workflow\n        map(size)\n      )(workflows);\n\n      const contentTypesCount = flow(\n        map('contentTypes'), // Number of content types per workflow\n        map(size)\n      )(workflows);\n\n      return {\n        numberOfActiveWorkflows: size(workflows),\n        avgStagesCount: mean(stagesCount),\n        maxStagesCount: max(stagesCount),\n        activatedContentTypes: sum(contentTypesCount),\n      };\n    },\n\n    async sendMetrics() {\n      const computedMetrics = await this.computeMetrics();\n      metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);\n\n      const metricsInfoStored = await getMetricsStoreValue();\n      // @ts-expect-error metricsInfoStored can use spread\n      await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() });\n    },\n\n    async ensureWeeklyStoredCronSchedule() {\n      const metricsInfoStored: any = await getMetricsStoreValue();\n      const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;\n\n      const now = new Date();\n      let weeklySchedule = currentSchedule;\n\n      if (!currentSchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {\n        weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 15 }));\n        await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });\n      }\n\n      return weeklySchedule;\n    },\n\n    async registerCron() {\n      const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();\n\n      strapi.cron.add({\n        reviewWorkflowsWeekly: {\n          task: this.sendMetrics.bind(this),\n          options: weeklySchedule,\n        },\n      });\n    },\n  };\n};\n"],"names":["ONE_WEEK","getWeeklyCronScheduleAt","date","getSeconds","getMinutes","getHours","getDay","strapi","metrics","getService","workflowsService","getMetricsStoreValue","value","store","get","type","name","key","defaultTo","setMetricsStoreValue","set","computeMetrics","workflows","find","populate","stagesCount","flow","map","size","contentTypesCount","numberOfActiveWorkflows","avgStagesCount","mean","maxStagesCount","max","activatedContentTypes","sum","sendMetrics","computedMetrics","sendDidSendReviewWorkflowPropertiesOnceAWeek","metricsInfoStored","lastWeeklyUpdate","Date","getTime","ensureWeeklyStoredCronSchedule","weeklySchedule","currentSchedule","now","add","seconds","registerCron","cron","reviewWorkflowsWeekly","task","bind","options"],"mappings":";;;;AAKA,MAAMA,QAAAA,GAAW,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,IAAA;AAEpC,MAAMC,uBAAAA,GAA0B,CAACC,IAAAA,GAC/B,CAAA,EAAGA,KAAKC,UAAU,EAAA,CAAG,CAAC,EAAED,IAAAA,CAAKE,UAAU,EAAA,CAAG,CAAC,EAAEF,IAAAA,CAAKG,QAAQ,GAAG,KAAK,EAAEH,IAAAA,CAAKI,MAAM,EAAA,CAAA,CAAI;AAErF,mCAAe,CAAA,CAAC,EAAEC,MAAM,EAA2B,GAAA;IACjD,MAAMC,OAAAA,GAAUC,WAAW,kBAAA,EAAoB;AAAEF,QAAAA;AAAO,KAAA,CAAA;IACxD,MAAMG,gBAAAA,GAAmBD,WAAW,WAAA,EAAa;AAAEF,QAAAA;AAAO,KAAA,CAAA;AAE1D,IAAA,MAAMI,oBAAAA,GAAuB,UAAA;AAC3B,QAAA,MAAMC,QAAQ,MAAML,MAAAA,CAAOM,KAAK,CAACC,GAAG,CAAC;YAAEC,IAAAA,EAAM,QAAA;YAAUC,IAAAA,EAAM,IAAA;YAAMC,GAAAA,EAAK;AAAU,SAAA,CAAA;QAClF,OAAOC,SAAAA,CAAU,EAAC,EAAGN,KAAAA,CAAAA;AACvB,IAAA,CAAA;AAEA,IAAA,MAAMO,uBAAuB,CAACP,KAAAA,GAC5BL,OAAOM,KAAK,CAACO,GAAG,CAAC;YAAEL,IAAAA,EAAM,QAAA;YAAUC,IAAAA,EAAM,IAAA;YAAMC,GAAAA,EAAK,SAAA;AAAWL,YAAAA;AAAM,SAAA,CAAA;IAEvE,OAAO;QACL,MAAMS,cAAAA,CAAAA,GAAAA;;AAEJ,YAAA,MAAMC,SAAAA,GAAY,MAAMZ,gBAAAA,CAAiBa,IAAI,CAAC;gBAAEC,QAAAA,EAAU;AAAS,aAAA,CAAA;AAEnE,YAAA,MAAMC,WAAAA,GAAcC,IAAAA,CAClBC,GAAAA,CAAI,QAAA,CAAA,EACJA,IAAIC,IAAAA,CAAAA,CAAAA,CACJN,SAAAA,CAAAA;AAEF,YAAA,MAAMO,iBAAAA,GAAoBH,IAAAA,CACxBC,GAAAA,CAAI,cAAA,CAAA,EACJA,IAAIC,IAAAA,CAAAA,CAAAA,CACJN,SAAAA,CAAAA;YAEF,OAAO;AACLQ,gBAAAA,uBAAAA,EAAyBF,IAAAA,CAAKN,SAAAA,CAAAA;AAC9BS,gBAAAA,cAAAA,EAAgBC,IAAAA,CAAKP,WAAAA,CAAAA;AACrBQ,gBAAAA,cAAAA,EAAgBC,GAAAA,CAAIT,WAAAA,CAAAA;AACpBU,gBAAAA,qBAAAA,EAAuBC,GAAAA,CAAIP,iBAAAA;AAC7B,aAAA;AACF,QAAA,CAAA;QAEA,MAAMQ,WAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,eAAAA,GAAkB,MAAM,IAAI,CAACjB,cAAc,EAAA;AACjDb,YAAAA,OAAAA,CAAQ+B,4CAA4C,CAACD,eAAAA,CAAAA;AAErD,YAAA,MAAME,oBAAoB,MAAM7B,oBAAAA,EAAAA;;AAEhC,YAAA,MAAMQ,oBAAAA,CAAqB;AAAE,gBAAA,GAAGqB,iBAAiB;gBAAEC,gBAAAA,EAAkB,IAAIC,OAAOC,OAAO;AAAG,aAAA,CAAA;AAC5F,QAAA,CAAA;QAEA,MAAMC,8BAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMJ,oBAAyB,MAAM7B,oBAAAA,EAAAA;AACrC,YAAA,MAAM,EAAEkC,cAAAA,EAAgBC,eAAe,EAAEL,gBAAgB,EAAE,GAAGD,iBAAAA;AAE9D,YAAA,MAAMO,MAAM,IAAIL,IAAAA,EAAAA;AAChB,YAAA,IAAIG,cAAAA,GAAiBC,eAAAA;YAErB,IAAI,CAACA,mBAAmB,CAACL,gBAAAA,IAAoBA,mBAAmBzC,QAAAA,GAAW+C,GAAAA,CAAIJ,OAAO,EAAA,EAAI;gBACxFE,cAAAA,GAAiB5C,uBAAAA,CAAwB+C,IAAID,GAAAA,EAAK;oBAAEE,OAAAA,EAAS;AAAG,iBAAA,CAAA,CAAA;AAChE,gBAAA,MAAM9B,oBAAAA,CAAqB;AAAE,oBAAA,GAAGqB,iBAAiB;AAAEK,oBAAAA;AAAe,iBAAA,CAAA;AACpE,YAAA;YAEA,OAAOA,cAAAA;AACT,QAAA,CAAA;QAEA,MAAMK,YAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAML,cAAAA,GAAiB,MAAM,IAAI,CAACD,8BAA8B,EAAA;YAEhErC,MAAAA,CAAO4C,IAAI,CAACH,GAAG,CAAC;gBACdI,qBAAAA,EAAuB;AACrBC,oBAAAA,IAAAA,EAAM,IAAI,CAAChB,WAAW,CAACiB,IAAI,CAAC,IAAI,CAAA;oBAChCC,OAAAA,EAASV;AACX;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;AACF,CAAA;;;;"}