feat(editor): Add cloud ExecutionsUsage and API blocking using licenses (#6159)
* Add ExecutionsUsage component * set $sidebar-expanded-width back to 200px * add days using interpolation * Rename PlanData type to CloudPlanData * Rename Metadata type to PlanMetadata * Make prop block in the update button * Use variable in line-height * Remove progressBarSection class * fix trial expiration calculation * mock expirationDate and fix issue with days left * Remove unnecesary property from class .container * inject component data via props * Check for plan data during app mounting and keep data in the store * Remove mounted hook * redirect when upgrade plan is clicked * Remove computed properties * Remove instance property as it's not needed anymore * Flatten plan object * remove console.log * Add all cloud types within its own namespace * keep redirection inside component * get computed properties back * Improve polling logic * Move cloudData to its own store * Remove commented interfaces * remove cloudPlan from user store * fix imports * update logic for userIsTrialing method * centralize userIsTrialing method * redirect to production change plan page always * Call staging or production cloud api depending on base URL * remove setting store form ExecutionUsage.vue * fix linting issue * Add trial group to PlanMetadata group * Move helpers into the store * make staging url check more specific * make cloud state nullable * fix linting issue * swap mockup date for endpoint * Make getCurrentPlan async * asas * Improvements * small improvements * chore: resolve conflicts * make sure there is data before calculating trial expiration * Fix issue with component not loading on first page load * type safety improvements * apply component ui feedback * fix linting issue * chore: clean up unnecessary change from merge conflict * feat: Block api feature using licenses, show notice page for trial cloud users (#6187) * rename planSpec to plan * Remove instance property as it's not needed anymore * Flatten plan object * remove console.log * feat: disable api using license * feat: add api page * chore: resolve conflicts * chore: resolve conflicts * feat: update and refactor a bit * fix: update endpoints * fix: update endpoints * fix: use host * feat: update copy * fix linting issues --------- Co-authored-by: ricardo <ricardoespinoza105@gmail.com> * add pluralization to days left text --------- Co-authored-by: Mutasem <mutdmour@gmail.com> Co-authored-by: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com>
This commit is contained in:
@@ -132,6 +132,10 @@ export class License {
|
||||
return this.isFeatureEnabled(LICENSE_FEATURES.VERSION_CONTROL);
|
||||
}
|
||||
|
||||
isAPIDisabled() {
|
||||
return this.isFeatureEnabled(LICENSE_FEATURES.API_DISABLED);
|
||||
}
|
||||
|
||||
getCurrentEntitlements() {
|
||||
return this.manager?.getCurrentEntitlements() ?? [];
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ import * as Db from '@/Db';
|
||||
import { getInstanceBaseUrl } from '@/UserManagement/UserManagementHelper';
|
||||
import { Container } from 'typedi';
|
||||
import { InternalHooks } from '@/InternalHooks';
|
||||
import { License } from '@/License';
|
||||
|
||||
async function createApiRouter(
|
||||
version: string,
|
||||
@@ -151,3 +152,12 @@ export const loadPublicApiVersions = async (
|
||||
apiLatestVersion: Number(versions.pop()?.charAt(1)) ?? 1,
|
||||
};
|
||||
};
|
||||
|
||||
function isApiEnabledByLicense(): boolean {
|
||||
const license = Container.get(License);
|
||||
return !license.isAPIDisabled();
|
||||
}
|
||||
|
||||
export function isApiEnabled(): boolean {
|
||||
return !config.get('publicApi.disabled') && isApiEnabledByLicense();
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ import {
|
||||
|
||||
import { executionsController } from '@/executions/executions.controller';
|
||||
import { workflowStatsController } from '@/api/workflowStats.api';
|
||||
import { loadPublicApiVersions } from '@/PublicApi';
|
||||
import { isApiEnabled, loadPublicApiVersions } from '@/PublicApi';
|
||||
import {
|
||||
getInstanceBaseUrl,
|
||||
isEmailSetUp,
|
||||
@@ -277,7 +277,7 @@ export class Server extends AbstractServer {
|
||||
},
|
||||
},
|
||||
publicApi: {
|
||||
enabled: !config.getEnv('publicApi.disabled'),
|
||||
enabled: isApiEnabled(),
|
||||
latestVersion: 1,
|
||||
path: config.getEnv('publicApi.path'),
|
||||
swaggerUi: {
|
||||
@@ -538,7 +538,7 @@ export class Server extends AbstractServer {
|
||||
this.endpointWebhook,
|
||||
this.endpointWebhookTest,
|
||||
this.endpointPresetCredentials,
|
||||
config.getEnv('publicApi.disabled') ? publicApiEndpoint : '',
|
||||
isApiEnabled() ? '' : publicApiEndpoint,
|
||||
...excludeEndpoints.split(':'),
|
||||
].filter((u) => !!u);
|
||||
|
||||
@@ -564,7 +564,7 @@ export class Server extends AbstractServer {
|
||||
// Public API
|
||||
// ----------------------------------------
|
||||
|
||||
if (!config.getEnv('publicApi.disabled')) {
|
||||
if (isApiEnabled()) {
|
||||
const { apiRouters, apiLatestVersion } = await loadPublicApiVersions(publicApiEndpoint);
|
||||
this.app.use(...apiRouters);
|
||||
this.frontendSettings.publicApi.latestVersion = apiLatestVersion;
|
||||
|
||||
@@ -13,6 +13,7 @@ import {
|
||||
import { getN8nPackageJson, inDevelopment } from '@/constants';
|
||||
import type { WorkflowEntity } from '@db/entities/WorkflowEntity';
|
||||
import type { Risk, n8n } from '@/audit/types';
|
||||
import { isApiEnabled } from '@/PublicApi';
|
||||
|
||||
function getSecuritySettings() {
|
||||
if (config.getEnv('deployment.type') === 'cloud') return null;
|
||||
@@ -34,7 +35,7 @@ function getSecuritySettings() {
|
||||
communityPackagesEnabled: config.getEnv('nodes.communityPackages.enabled'),
|
||||
versionNotificationsEnabled: config.getEnv('versionNotifications.enabled'),
|
||||
templatesEnabled: config.getEnv('templates.enabled'),
|
||||
publicApiEnabled: !config.getEnv('publicApi.disabled'),
|
||||
publicApiEnabled: isApiEnabled(),
|
||||
userManagementEnabled,
|
||||
};
|
||||
|
||||
|
||||
@@ -78,6 +78,7 @@ export const enum LICENSE_FEATURES {
|
||||
ADVANCED_EXECUTION_FILTERS = 'feat:advancedExecutionFilters',
|
||||
VARIABLES = 'feat:variables',
|
||||
VERSION_CONTROL = 'feat:versionControl',
|
||||
API_DISABLED = 'feat:apiDisabled',
|
||||
}
|
||||
|
||||
export const enum LICENSE_QUOTAS {
|
||||
|
||||
Reference in New Issue
Block a user