refactor(editor): Move cloudPlans api to @n8n/rest-api-client (no-changelog) (#16182)

This commit is contained in:
Alex Grozav
2025-06-10 18:03:24 +02:00
committed by GitHub
parent b7c9d4e3b2
commit a54f0c8af7
9 changed files with 73 additions and 68 deletions

View File

@@ -0,0 +1,61 @@
import type { IRestApiContext } from '../types';
import { get, post } from '../utils';
export declare namespace Cloud {
export interface PlanData {
planId: number;
monthlyExecutionsLimit: number;
activeWorkflowsLimit: number;
credentialsLimit: number;
isActive: boolean;
displayName: string;
expirationDate: string;
metadata: PlanMetadata;
}
export interface PlanMetadata {
version: 'v1';
group: 'opt-out' | 'opt-in' | 'trial';
slug: 'pro-1' | 'pro-2' | 'starter' | 'trial-1';
trial?: Trial;
}
interface Trial {
length: number;
gracePeriod: number;
}
export type UserAccount = {
confirmed: boolean;
username: string;
email: string;
hasEarlyAccess?: boolean;
role?: string;
};
}
export interface InstanceUsage {
timeframe?: string;
executions: number;
activeWorkflows: number;
}
export async function getCurrentPlan(context: IRestApiContext): Promise<Cloud.PlanData> {
return await get(context.baseUrl, '/admin/cloud-plan');
}
export async function getCurrentUsage(context: IRestApiContext): Promise<InstanceUsage> {
return await get(context.baseUrl, '/cloud/limits');
}
export async function getCloudUserInfo(context: IRestApiContext): Promise<Cloud.UserAccount> {
return await get(context.baseUrl, '/cloud/proxy/user/me');
}
export async function sendConfirmationEmail(context: IRestApiContext): Promise<Cloud.UserAccount> {
return await post(context.baseUrl, '/cloud/proxy/user/resend-confirmation-email');
}
export async function getAdminPanelLoginCode(context: IRestApiContext): Promise<{ code: string }> {
return await get(context.baseUrl, '/cloud/proxy/login/code');
}

View File

@@ -1,4 +1,5 @@
export * from './api-keys';
export * from './cloudPlans';
export * from './communityNodes';
export * from './ctas';
export * from './eventbus.ee';

View File

@@ -46,6 +46,7 @@ import type {
ISourceData,
} from 'n8n-workflow';
import type { Version, VersionNode } from '@n8n/rest-api-client/api/versions';
import type { Cloud, InstanceUsage } from '@n8n/rest-api-client/api/cloudPlans';
import type {
AI_NODE_CREATOR_VIEW,
@@ -1300,39 +1301,6 @@ export type ExecutionsQueryFilter = {
vote?: ExecutionFilterVote;
};
export declare namespace Cloud {
export interface PlanData {
planId: number;
monthlyExecutionsLimit: number;
activeWorkflowsLimit: number;
credentialsLimit: number;
isActive: boolean;
displayName: string;
expirationDate: string;
metadata: PlanMetadata;
}
export interface PlanMetadata {
version: 'v1';
group: 'opt-out' | 'opt-in' | 'trial';
slug: 'pro-1' | 'pro-2' | 'starter' | 'trial-1';
trial?: Trial;
}
interface Trial {
length: number;
gracePeriod: number;
}
export type UserAccount = {
confirmed: boolean;
username: string;
email: string;
hasEarlyAccess?: boolean;
role?: string;
};
}
export interface CloudPlanState {
initialized: boolean;
data: Cloud.PlanData | null;
@@ -1340,12 +1308,6 @@ export interface CloudPlanState {
loadingPlan: boolean;
}
export interface InstanceUsage {
timeframe?: string;
executions: number;
activeWorkflows: number;
}
export type CloudPlanAndUsageData = Cloud.PlanData & { usage: InstanceUsage };
export interface ExternalSecretsProviderSecret {

View File

@@ -1,23 +0,0 @@
import type { Cloud, InstanceUsage } from '@/Interface';
import type { IRestApiContext } from '@n8n/rest-api-client';
import { get, post } from '@n8n/rest-api-client';
export async function getCurrentPlan(context: IRestApiContext): Promise<Cloud.PlanData> {
return await get(context.baseUrl, '/admin/cloud-plan');
}
export async function getCurrentUsage(context: IRestApiContext): Promise<InstanceUsage> {
return await get(context.baseUrl, '/cloud/limits');
}
export async function getCloudUserInfo(context: IRestApiContext): Promise<Cloud.UserAccount> {
return await get(context.baseUrl, '/cloud/proxy/user/me');
}
export async function sendConfirmationEmail(context: IRestApiContext): Promise<Cloud.UserAccount> {
return await post(context.baseUrl, '/cloud/proxy/user/resend-confirmation-email');
}
export async function getAdminPanelLoginCode(context: IRestApiContext): Promise<{ code: string }> {
return await get(context.baseUrl, '/cloud/proxy/login/code');
}

View File

@@ -5,7 +5,7 @@ import { usePageRedirectionHelper } from './usePageRedirectionHelper';
import { defaultSettings } from '@/__tests__/defaults';
import { useUsersStore } from '@/stores/users.store';
import { createPinia, setActivePinia } from 'pinia';
import * as cloudPlanApi from '@/api/cloudPlans';
import * as cloudPlanApi from '@n8n/rest-api-client/api/cloudPlans';
import { useVersionsStore } from '@/stores/versions.store';
import { useTelemetry } from './useTelemetry';

View File

@@ -1,4 +1,4 @@
import type { Cloud } from '@/Interface';
import type { Cloud } from '@n8n/rest-api-client/api/cloudPlans';
// Mocks cloud plan API responses with different trial expiration dates
function getUserPlanData(trialExpirationDate: Date, isTrial = true): Cloud.PlanData {

View File

@@ -5,7 +5,11 @@ import { useRootStore } from '@n8n/stores/useRootStore';
import { useSettingsStore } from '@/stores/settings.store';
import { useUIStore } from '@/stores/ui.store';
import { useUsersStore } from '@/stores/users.store';
import { getAdminPanelLoginCode, getCurrentPlan, getCurrentUsage } from '@/api/cloudPlans';
import {
getAdminPanelLoginCode,
getCurrentPlan,
getCurrentUsage,
} from '@n8n/rest-api-client/api/cloudPlans';
import { DateTime } from 'luxon';
import { CLOUD_TRIAL_CHECK_INTERVAL } from '@/constants';
import { STORES } from '@n8n/stores';

View File

@@ -4,7 +4,7 @@ import { useSettingsStore } from '@/stores/settings.store';
import { useUsersStore } from '@/stores/users.store';
import merge from 'lodash/merge';
import { useCloudPlanStore } from '@/stores/cloudPlan.store';
import * as cloudPlanApi from '@/api/cloudPlans';
import * as cloudPlanApi from '@n8n/rest-api-client/api/cloudPlans';
import { defaultSettings } from '../__tests__/defaults';
import {
getTrialExpiredUserResponse,

View File

@@ -10,13 +10,13 @@ import { BROWSER_ID_STORAGE_KEY } from '@n8n/constants';
import { PERSONALIZATION_MODAL_KEY, ROLE } from '@/constants';
import { STORES } from '@n8n/stores';
import type {
Cloud,
IPersonalizationLatestVersion,
IUser,
IUserResponse,
CurrentUserResponse,
InvitableRoleName,
} from '@/Interface';
import type { Cloud } from '@n8n/rest-api-client/api/cloudPlans';
import { getPersonalizedNodeTypes } from '@/utils/userUtils';
import { defineStore } from 'pinia';
import { useRootStore } from '@n8n/stores/useRootStore';
@@ -24,7 +24,7 @@ import { usePostHog } from './posthog.store';
import { useUIStore } from './ui.store';
import { useCloudPlanStore } from './cloudPlan.store';
import * as mfaApi from '@n8n/rest-api-client/api/mfa';
import * as cloudApi from '@/api/cloudPlans';
import * as cloudApi from '@n8n/rest-api-client/api/cloudPlans';
import { useRBACStore } from '@/stores/rbac.store';
import type { Scope } from '@n8n/permissions';
import * as invitationsApi from '@/api/invitation';