From 3603418bc631bfe680ff4da9aba594ba29dc74c7 Mon Sep 17 00:00:00 2001 From: zhangx1n Date: Sun, 30 Mar 2025 00:26:28 +0800 Subject: [PATCH] feat(license): add license checks for workspace and team member limits --- api/controllers/console/workspace/members.py | 7 +++++++ api/services/account_service.py | 3 +++ api/services/feature_service.py | 12 ++++++++++++ 3 files changed, 22 insertions(+) diff --git a/api/controllers/console/workspace/members.py b/api/controllers/console/workspace/members.py index a2b41c1d38..667c215582 100644 --- a/api/controllers/console/workspace/members.py +++ b/api/controllers/console/workspace/members.py @@ -54,6 +54,13 @@ class MemberInviteEmailApi(Resource): inviter = current_user invitation_results = [] console_web_url = dify_config.CONSOLE_WEB_URL + if (FeatureService.get_system_features().license.product_id == "DIFY_ENTERPRISE_STANDARD" and + len(invitee_emails) > FeatureService.get_system_features().available_team_members): + return { + "code": "limit-exceeded", + "message": "Limit exceeded", + }, 400 + for invitee_email in invitee_emails: try: token = RegisterService.invite_new_member( diff --git a/api/services/account_service.py b/api/services/account_service.py index dd1cc5f94f..49d1c937c7 100644 --- a/api/services/account_service.py +++ b/api/services/account_service.py @@ -585,6 +585,9 @@ class TenantService: if not FeatureService.get_system_features().is_allow_create_workspace and not is_setup: raise WorkSpaceNotAllowedCreateError() + if FeatureService.get_system_features().license.product_id == "DIFY_ENTERPRISE_STANDARD" and FeatureService.get_system_features().available_workspaces == 0: + raise WorkSpaceNotAllowedCreateError() + if name: tenant = TenantService.create_tenant(name=name, is_setup=is_setup) else: diff --git a/api/services/feature_service.py b/api/services/feature_service.py index 959e0221b5..66555e78d1 100644 --- a/api/services/feature_service.py +++ b/api/services/feature_service.py @@ -34,6 +34,9 @@ class LicenseStatus(StrEnum): class LicenseModel(BaseModel): status: LicenseStatus = LicenseStatus.NONE expired_at: str = "" + product_id: str = "" + available_team_members: int = 0 + available_workspaces: int = 0 class BrandingModel(BaseModel): @@ -202,3 +205,12 @@ class FeatureService: if "expiredAt" in license_info: features.license.expired_at = license_info["expiredAt"] + + if "productId" in license_info: + features.license.product_id = license_info["productId"] + + if "availableTeamMembers" in license_info: + features.license.available_team_members = license_info["availableTeamMembers"] + + if "availableWorkspaces" in license_info: + features.license.available_workspaces = license_info["availableWorkspaces"]