diff --git a/packages/@n8n/api-types/src/frontend-settings.ts b/packages/@n8n/api-types/src/frontend-settings.ts index 40e26a4d0e..3c84777e8e 100644 --- a/packages/@n8n/api-types/src/frontend-settings.ts +++ b/packages/@n8n/api-types/src/frontend-settings.ts @@ -183,5 +183,7 @@ export interface FrontendSettings { }; insights: { enabled: boolean; + summary: boolean; + dashboard: boolean; }; } diff --git a/packages/cli/src/constants.ts b/packages/cli/src/constants.ts index dc557dec76..4e25d313fa 100644 --- a/packages/cli/src/constants.ts +++ b/packages/cli/src/constants.ts @@ -95,6 +95,9 @@ export const LICENSE_FEATURES = { COMMUNITY_NODES_CUSTOM_REGISTRY: 'feat:communityNodes:customRegistry', AI_CREDITS: 'feat:aiCredits', FOLDERS: 'feat:folders', + INSIGHTS_VIEW_SUMMARY: 'feat:insights:viewSummary', + INSIGHTS_VIEW_DASHBOARD: 'feat:insights:viewDashboard', + INSIGHTS_VIEW_HOURLY_DATA: 'feat:insights:viewHourlyData', } as const; export const LICENSE_QUOTAS = { @@ -104,6 +107,9 @@ export const LICENSE_QUOTAS = { WORKFLOW_HISTORY_PRUNE_LIMIT: 'quota:workflowHistoryPrune', TEAM_PROJECT_LIMIT: 'quota:maxTeamProjects', AI_CREDITS: 'quota:aiCredits', + INSIGHTS_MAX_HISTORY_DAYS: 'quota:insights:maxHistoryDays', + INSIGHTS_RETENTION_MAX_AGE_DAYS: 'quota:insights:retention:maxAgeDays', + INSIGHTS_RETENTION_PRUNE_INTERVAL_DAYS: 'quota:insights:retention:pruneIntervalDays', } as const; export const UNLIMITED_LICENSE_QUOTA = -1; diff --git a/packages/cli/src/controllers/e2e.controller.ts b/packages/cli/src/controllers/e2e.controller.ts index 449edc6a78..cf8e457225 100644 --- a/packages/cli/src/controllers/e2e.controller.ts +++ b/packages/cli/src/controllers/e2e.controller.ts @@ -102,6 +102,9 @@ export class E2EController { [LICENSE_FEATURES.ASK_AI]: false, [LICENSE_FEATURES.AI_CREDITS]: false, [LICENSE_FEATURES.FOLDERS]: false, + [LICENSE_FEATURES.INSIGHTS_VIEW_SUMMARY]: false, + [LICENSE_FEATURES.INSIGHTS_VIEW_DASHBOARD]: false, + [LICENSE_FEATURES.INSIGHTS_VIEW_HOURLY_DATA]: false, }; private static readonly numericFeaturesDefaults: Record = { @@ -111,6 +114,9 @@ export class E2EController { [LICENSE_QUOTAS.WORKFLOW_HISTORY_PRUNE_LIMIT]: -1, [LICENSE_QUOTAS.TEAM_PROJECT_LIMIT]: 0, [LICENSE_QUOTAS.AI_CREDITS]: 0, + [LICENSE_QUOTAS.INSIGHTS_MAX_HISTORY_DAYS]: 7, + [LICENSE_QUOTAS.INSIGHTS_RETENTION_MAX_AGE_DAYS]: 30, + [LICENSE_QUOTAS.INSIGHTS_RETENTION_PRUNE_INTERVAL_DAYS]: 180, }; private numericFeatures: Record = { @@ -124,6 +130,13 @@ export class E2EController { [LICENSE_QUOTAS.TEAM_PROJECT_LIMIT]: E2EController.numericFeaturesDefaults[LICENSE_QUOTAS.TEAM_PROJECT_LIMIT], [LICENSE_QUOTAS.AI_CREDITS]: E2EController.numericFeaturesDefaults[LICENSE_QUOTAS.AI_CREDITS], + + [LICENSE_QUOTAS.INSIGHTS_MAX_HISTORY_DAYS]: + E2EController.numericFeaturesDefaults[LICENSE_QUOTAS.INSIGHTS_MAX_HISTORY_DAYS], + [LICENSE_QUOTAS.INSIGHTS_RETENTION_MAX_AGE_DAYS]: + E2EController.numericFeaturesDefaults[LICENSE_QUOTAS.INSIGHTS_RETENTION_MAX_AGE_DAYS], + [LICENSE_QUOTAS.INSIGHTS_RETENTION_PRUNE_INTERVAL_DAYS]: + E2EController.numericFeaturesDefaults[LICENSE_QUOTAS.INSIGHTS_RETENTION_PRUNE_INTERVAL_DAYS], }; constructor( diff --git a/packages/cli/src/license.ts b/packages/cli/src/license.ts index 9ea1d69949..03ec52b9ec 100644 --- a/packages/cli/src/license.ts +++ b/packages/cli/src/license.ts @@ -315,6 +315,18 @@ export class License { return this.isFeatureEnabled(LICENSE_FEATURES.FOLDERS); } + isInsightsSummaryEnabled() { + return this.isFeatureEnabled(LICENSE_FEATURES.INSIGHTS_VIEW_SUMMARY); + } + + isInsightsDashboardEnabled() { + return this.isFeatureEnabled(LICENSE_FEATURES.INSIGHTS_VIEW_DASHBOARD); + } + + isInsightsHourlyDataEnabled() { + return this.getFeatureValue(LICENSE_FEATURES.INSIGHTS_VIEW_HOURLY_DATA); + } + getCurrentEntitlements() { return this.manager?.getCurrentEntitlements() ?? []; } @@ -377,6 +389,18 @@ export class License { ); } + getInsightsMaxHistory() { + return this.getFeatureValue(LICENSE_QUOTAS.INSIGHTS_MAX_HISTORY_DAYS) ?? 7; + } + + getInsightsRetentionMaxAge() { + return this.getFeatureValue(LICENSE_QUOTAS.INSIGHTS_RETENTION_MAX_AGE_DAYS) ?? 180; + } + + getInsightsRetentionPruneInterval() { + return this.getFeatureValue(LICENSE_QUOTAS.INSIGHTS_RETENTION_PRUNE_INTERVAL_DAYS) ?? 24; + } + getTeamProjectLimit() { return this.getFeatureValue(LICENSE_QUOTAS.TEAM_PROJECT_LIMIT) ?? 0; } diff --git a/packages/cli/src/services/frontend.service.ts b/packages/cli/src/services/frontend.service.ts index dced1453a6..f8597059e9 100644 --- a/packages/cli/src/services/frontend.service.ts +++ b/packages/cli/src/services/frontend.service.ts @@ -241,6 +241,8 @@ export class FrontendService { }, insights: { enabled: this.modulesConfig.modules.includes('insights'), + summary: true, + dashboard: false, }, }; } @@ -361,6 +363,12 @@ export class FrontendService { this.settings.aiCredits.credits = this.license.getAiCredits(); } + Object.assign(this.settings.insights, { + enabled: this.modulesConfig.modules.includes('insights'), + summary: this.license.isInsightsSummaryEnabled(), + dashboard: this.license.isInsightsDashboardEnabled(), + }); + this.settings.mfa.enabled = config.get('mfa.enabled'); this.settings.executionMode = config.getEnv('executions.mode'); diff --git a/packages/frontend/editor-ui/src/__tests__/defaults.ts b/packages/frontend/editor-ui/src/__tests__/defaults.ts index 935a7d071e..49f7141fbc 100644 --- a/packages/frontend/editor-ui/src/__tests__/defaults.ts +++ b/packages/frontend/editor-ui/src/__tests__/defaults.ts @@ -143,5 +143,7 @@ export const defaultSettings: FrontendSettings = { }, insights: { enabled: false, + summary: true, + dashboard: false, }, };