diff --git a/backend/src/ee/services/EELicenseService.ts b/backend/src/ee/services/EELicenseService.ts index 527a84730..c98a5a449 100644 --- a/backend/src/ee/services/EELicenseService.ts +++ b/backend/src/ee/services/EELicenseService.ts @@ -95,6 +95,13 @@ class EELicenseService { return this.globalFeatureSet; } + + public async refreshOrganizationPlan(organizationId: string) { + if (this.instanceType === 'cloud') { + this.localFeatureSet.del(organizationId); + await this.getOrganizationPlan(organizationId); + } + } public async initGlobalFeatureSet() { const licenseServerKey = await getLicenseServerKey(); diff --git a/backend/src/helpers/organization.ts b/backend/src/helpers/organization.ts index 71e8c15ce..3e7f169d0 100644 --- a/backend/src/helpers/organization.ts +++ b/backend/src/helpers/organization.ts @@ -153,22 +153,24 @@ export const updateSubscriptionOrgQuantity = async ({ EELicenseService.localFeatureSet.del(organizationId); } - - if (EELicenseService.instanceType === 'enterprise-self-hosted') { - // instance of Infisical is an enterprise self-hosted instance - - const usedSeats = await MembershipOrg.countDocuments({ - status: ACCEPTED - }); - - await licenseKeyRequest.patch( - `${await getLicenseServerUrl()}/api/license/v1/license`, - { - usedSeats - } - ); - } } + if (EELicenseService.instanceType === 'enterprise-self-hosted') { + // instance of Infisical is an enterprise self-hosted instance + + const usedSeats = await MembershipOrg.countDocuments({ + status: ACCEPTED + }); + + await licenseKeyRequest.patch( + `${await getLicenseServerUrl()}/api/license/v1/license`, + { + usedSeats + } + ); + } + + await EELicenseService.refreshOrganizationPlan(organizationId); + return stripeSubscription; }; \ No newline at end of file diff --git a/backend/src/helpers/workspace.ts b/backend/src/helpers/workspace.ts index a1d71e920..8b15d1baf 100644 --- a/backend/src/helpers/workspace.ts +++ b/backend/src/helpers/workspace.ts @@ -6,6 +6,7 @@ import { Secret } from '../models'; import { createBot } from '../helpers/bot'; +import { EELicenseService } from '../ee/services'; import { SecretService } from '../services'; /** @@ -22,24 +23,25 @@ export const createWorkspace = async ({ name: string; organizationId: string; }) => { - // create workspace - const workspace = await new Workspace({ - name, - organization: organizationId, - autoCapitalization: true - }).save(); + // create workspace + const workspace = await new Workspace({ + name, + organization: organizationId, + autoCapitalization: true + }).save(); - // initialize bot for workspace - await createBot({ - name: 'Infisical Bot', - workspaceId: workspace._id - }); + // initialize bot for workspace + await createBot({ + name: 'Infisical Bot', + workspaceId: workspace._id + }); - // initialize blind index salt for workspace - await SecretService.createSecretBlindIndexData({ - workspaceId: workspace._id - }); + // initialize blind index salt for workspace + await SecretService.createSecretBlindIndexData({ + workspaceId: workspace._id + }); + await EELicenseService.refreshOrganizationPlan(organizationId); return workspace; }; diff --git a/frontend/src/hooks/api/subscriptions/types.ts b/frontend/src/hooks/api/subscriptions/types.ts index 5d01611bd..61736b4f4 100644 --- a/frontend/src/hooks/api/subscriptions/types.ts +++ b/frontend/src/hooks/api/subscriptions/types.ts @@ -1,7 +1,7 @@ export type SubscriptionPlan = { _id: string; membersUsed: number; - membersLimit: number; + memberLimit: number; auditLogs: boolean; customAlerts: boolean; customRateLimits: boolean; diff --git a/frontend/src/layouts/AppLayout/AppLayout.tsx b/frontend/src/layouts/AppLayout/AppLayout.tsx index be04e0bad..7ce1f33d2 100644 --- a/frontend/src/layouts/AppLayout/AppLayout.tsx +++ b/frontend/src/layouts/AppLayout/AppLayout.tsx @@ -61,7 +61,7 @@ export const AppLayout = ({ children }: LayoutProps) => { const { subscription } = useSubscription(); const host = window.location.origin; - const isAddingProjectsAllowed = ((subscription?.workspacesUsed || 1) < (subscription?.workspaceLimit || 3)) || host !== 'https://app.infisical.com'; + const isAddingProjectsAllowed = subscription?.workspaceLimit ? (subscription.workspacesUsed < subscription.workspaceLimit) : true; const createWs = useCreateWorkspace(); const uploadWsKey = useUploadWsKey(); diff --git a/frontend/src/views/Settings/OrgSettingsPage/OrgSettingsPage.tsx b/frontend/src/views/Settings/OrgSettingsPage/OrgSettingsPage.tsx index edf4e98a7..a0097b6aa 100644 --- a/frontend/src/views/Settings/OrgSettingsPage/OrgSettingsPage.tsx +++ b/frontend/src/views/Settings/OrgSettingsPage/OrgSettingsPage.tsx @@ -60,7 +60,7 @@ export const OrgSettingsPage = () => { const [completeInviteLink, setcompleteInviteLink] = useState(''); - const isMoreUsersNotAllowed = ((subscription?.membersUsed || 0) >= (subscription?.membersLimit || 1)) && host === 'https://app.infisical.com'; + const isMoreUsersNotAllowed = subscription?.memberLimit ? (subscription.membersUsed >= subscription.memberLimit) : false; const onRenameOrg = async (name: string) => { if (!currentOrg?._id) return;