diff --git a/packages/core/admin/ee/server/bootstrap.js b/packages/core/admin/ee/server/bootstrap.js index 678ce883e9..5467f8bc74 100644 --- a/packages/core/admin/ee/server/bootstrap.js +++ b/packages/core/admin/ee/server/bootstrap.js @@ -31,6 +31,8 @@ module.exports = async () => { // Decorate the entity service with review workflow logic const { decorator } = getService('review-workflows-decorator'); strapi.entityService.decorate(decorator); + + await getService('review-workflows-weekly-metrics').registerCron(); } await getService('seat-enforcement').seatEnforcementWorkflow(); diff --git a/packages/core/admin/ee/server/services/index.js b/packages/core/admin/ee/server/services/index.js index 11064d381a..d9f71e1b1b 100644 --- a/packages/core/admin/ee/server/services/index.js +++ b/packages/core/admin/ee/server/services/index.js @@ -12,4 +12,5 @@ module.exports = { 'review-workflows-validation': require('./review-workflows/validation'), 'review-workflows-decorator': require('./review-workflows/entity-service-decorator'), 'review-workflows-metrics': require('./review-workflows/metrics'), + 'review-workflows-weekly-metrics': require('./review-workflows/metrics/weekly-metrics'), }; diff --git a/packages/core/admin/ee/server/services/review-workflows/metrics.js b/packages/core/admin/ee/server/services/review-workflows/metrics/index.js similarity index 71% rename from packages/core/admin/ee/server/services/review-workflows/metrics.js rename to packages/core/admin/ee/server/services/review-workflows/metrics/index.js index 6e487588b2..7f64f18b3b 100644 --- a/packages/core/admin/ee/server/services/review-workflows/metrics.js +++ b/packages/core/admin/ee/server/services/review-workflows/metrics/index.js @@ -24,6 +24,16 @@ const sendDidEditWorkflow = async () => { strapi.telemetry.send('didEditWorkflow', {}); }; +const sendDidSendReviewWorkflowPropertiesOnceAWeek = async ( + numberOfActiveWorkflows, + activatedContentTypes +) => { + strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', { + numberOfActiveWorkflows, + activatedContentTypes, + }); +}; + module.exports = { sendDidCreateStage, sendDidEditStage, @@ -31,4 +41,5 @@ module.exports = { sendDidChangeEntryStage, sendDidCreateWorkflow, sendDidEditWorkflow, + sendDidSendReviewWorkflowPropertiesOnceAWeek, }; diff --git a/packages/core/admin/ee/server/services/review-workflows/metrics/weekly-metrics.js b/packages/core/admin/ee/server/services/review-workflows/metrics/weekly-metrics.js new file mode 100644 index 0000000000..ae9d782e6c --- /dev/null +++ b/packages/core/admin/ee/server/services/review-workflows/metrics/weekly-metrics.js @@ -0,0 +1,56 @@ +'use strict'; + +const { defaultTo } = require('lodash/fp'); +const { add } = require('date-fns'); + +const { ONE_WEEK, getWeeklyCronScheduleAt } = require('@strapi/utils').cron; +const { getService } = require('../../../../../server/utils'); + +const getMetricsStoreValue = async () => { + const value = await strapi.store.get({ type: 'plugin', name: 'ee', key: 'metrics' }); + return defaultTo({}, value); +}; +const setMetricsStoreValue = (value) => + strapi.store.set({ type: 'plugin', name: 'ee', key: 'metrics', value }); + +module.exports = ({ strapi }) => { + const metrics = getService('review-workflows-metrics', { strapi }); + + return { + async computeMetrics() { + /* + TODO: compute metrics + numberOfActiveWorkflows, + activatedContentTypes + */ + }, + + async sendMetrics() { + metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(); + + const metricsInfoStored = await getMetricsStoreValue(); + await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() }); + }, + + async ensureWeeklyStoredCronSchedule() { + const metricsInfoStored = await getMetricsStoreValue(); + const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored; + + const now = new Date(); + let weeklySchedule = currentSchedule; + + if (!currentSchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) { + weeklySchedule = getWeeklyCronScheduleAt(add(now, { minutes: 5 })); + await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule }); + } + + return weeklySchedule; + }, + + async registerCron() { + const weeklySchedule = await this.ensureWeeklyStoredCronSchedule(); + + strapi.cron.add({ [weeklySchedule]: this.sendMetrics.bind(this) }); + }, + }; +}; diff --git a/packages/core/upload/server/services/metrics/weekly-metrics.js b/packages/core/upload/server/services/metrics/weekly-metrics.js index a2074d3cc9..8c6afbeed7 100644 --- a/packages/core/upload/server/services/metrics/weekly-metrics.js +++ b/packages/core/upload/server/services/metrics/weekly-metrics.js @@ -2,10 +2,8 @@ const { defaultTo } = require('lodash/fp'); const { add } = require('date-fns'); +const { ONE_WEEK, getWeeklyCronScheduleAt } = require('@strapi/utils').cron; const { FOLDER_MODEL_UID, FILE_MODEL_UID } = require('../../constants'); -const { getWeeklyCronScheduleAt } = require('../../utils/cron'); - -const ONE_WEEK = 7 * 24 * 60 * 60 * 1000; const getMetricsStoreValue = async () => { const value = await strapi.store.get({ type: 'plugin', name: 'upload', key: 'metrics' }); diff --git a/packages/core/upload/server/utils/cron.js b/packages/core/upload/server/utils/cron.js deleted file mode 100644 index a9397f8759..0000000000 --- a/packages/core/upload/server/utils/cron.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict'; - -const getWeeklyCronScheduleAt = (date) => - `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`; - -module.exports = { - getWeeklyCronScheduleAt, -}; diff --git a/packages/core/upload/server/utils/__tests__/cron.test.js b/packages/core/utils/src/__tests__/cron.test.ts similarity index 81% rename from packages/core/upload/server/utils/__tests__/cron.test.js rename to packages/core/utils/src/__tests__/cron.test.ts index dbbd281238..09af6c029d 100644 --- a/packages/core/upload/server/utils/__tests__/cron.test.js +++ b/packages/core/utils/src/__tests__/cron.test.ts @@ -1,6 +1,4 @@ -'use strict'; - -const { getWeeklyCronScheduleAt } = require('../cron'); +import { getWeeklyCronScheduleAt } from '../cron'; describe('cron', () => { describe('getWeeklyCronScheduleAt', () => { diff --git a/packages/core/utils/src/cron.ts b/packages/core/utils/src/cron.ts new file mode 100644 index 0000000000..e843b4098d --- /dev/null +++ b/packages/core/utils/src/cron.ts @@ -0,0 +1,6 @@ +const ONE_WEEK: number = 7 * 24 * 60 * 60 * 1000; +const getWeeklyCronScheduleAt = (date: Date): string => `0 * * * * *`; +// TODO revert to this +// `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`; + +export { ONE_WEEK, getWeeklyCronScheduleAt }; diff --git a/packages/core/utils/src/index.ts b/packages/core/utils/src/index.ts index 350395a96a..fb5334466b 100644 --- a/packages/core/utils/src/index.ts +++ b/packages/core/utils/src/index.ts @@ -41,3 +41,4 @@ export * as file from './file'; export * as traverse from './traverse'; export { default as webhook } from './webhook'; export { isOperator, isOperatorOfType } from './operators'; +export * as cron from './cron';