feat: add workspace/member limit errors and enforce email login restriction

- Add WorkspacesLimitExceededError and WorkspaceMembersLimitExceededError
- Add workspace creation limit for email login
This commit is contained in:
zhangx1n 2025-04-09 15:44:28 +08:00
parent 67b7d87cc9
commit 1c549ddbaa
7 changed files with 13 additions and 21 deletions

View File

@ -7,7 +7,12 @@ from flask_restful import Resource, reqparse # type: ignore
from constants.languages import languages from constants.languages import languages
from controllers.console import api from controllers.console import api
from controllers.console.auth.error import EmailCodeError, InvalidEmailError, InvalidTokenError, PasswordMismatchError from controllers.console.auth.error import EmailCodeError, InvalidEmailError, InvalidTokenError, PasswordMismatchError
from controllers.console.error import AccountInFreezeError, AccountNotFound, EmailSendIpLimitError from controllers.console.error import (
AccountInFreezeError,
AccountNotFound,
EmailSendIpLimitError,
WorkspacesLimitExceeded,
)
from controllers.console.wraps import setup_required from controllers.console.wraps import setup_required
from events.tenant_event import tenant_was_created from events.tenant_event import tenant_was_created
from extensions.ext_database import db from extensions.ext_database import db
@ -18,7 +23,6 @@ from services.account_service import AccountService, TenantService
from services.errors.account import AccountRegisterError from services.errors.account import AccountRegisterError
from services.errors.workspace import WorkSpaceNotAllowedCreateError, WorkspacesLimitExceededError from services.errors.workspace import WorkSpaceNotAllowedCreateError, WorkspacesLimitExceededError
from services.feature_service import FeatureService from services.feature_service import FeatureService
from controllers.console.error import WorkspacesLimitExceeded
class ForgotPasswordSendEmailApi(Resource): class ForgotPasswordSendEmailApi(Resource):

View File

@ -14,7 +14,7 @@ class EnterpriseMail(Resource):
@inner_api_only @inner_api_only
def post(self): def post(self):
parser = reqparse.RequestParser() parser = reqparse.RequestParser()
parser.add_argument("to", type=str, action='append', required=True) parser.add_argument("to", type=str, action="append", required=True)
parser.add_argument("subject", type=str, required=True) parser.add_argument("subject", type=str, required=True)
parser.add_argument("body", type=str, required=True) parser.add_argument("body", type=str, required=True)
parser.add_argument("substitutions", type=dict, required=False) parser.add_argument("substitutions", type=dict, required=False)

View File

@ -53,9 +53,7 @@ from services.errors.workspace import WorkSpaceNotAllowedCreateError, Workspaces
from services.feature_service import FeatureService from services.feature_service import FeatureService
from tasks.delete_account_task import delete_account_task from tasks.delete_account_task import delete_account_task
from tasks.mail_account_deletion_task import send_account_deletion_verification_code from tasks.mail_account_deletion_task import send_account_deletion_verification_code
from tasks.mail_email_code_login import send_email_code_login_mail_task
from tasks.mail_invite_member_task import send_invite_member_mail_task from tasks.mail_invite_member_task import send_invite_member_mail_task
from tasks.mail_reset_password_task import send_reset_password_mail_task
class TokenPair(BaseModel): class TokenPair(BaseModel):

View File

@ -1,4 +1,3 @@
from typing import Dict, List from typing import Dict, List
from pydantic import BaseModel from pydantic import BaseModel
@ -14,13 +13,8 @@ class DifyMail(BaseModel):
class EnterpriseMailService: class EnterpriseMailService:
@classmethod @classmethod
def send_mail(cls, mail: DifyMail): def send_mail(cls, mail: DifyMail):
send_enterprise_email_task.delay( send_enterprise_email_task.delay(
to=mail.to, to=mail.to, subject=mail.subject, body=mail.body, substitutions=mail.substitutions
subject=mail.subject,
body=mail.body,
substitutions=mail.substitutions
) )

View File

@ -13,9 +13,7 @@ def send_enterprise_email_task(to, subject, body, substitutions):
if not mail.is_inited(): if not mail.is_inited():
return return
logging.info( logging.info(click.style("Start enterprise mail to {} with subject {}".format(to, subject), fg="green"))
click.style("Start enterprise mail to {} with subject {}".format(to, subject), fg="green")
)
start_at = time.perf_counter() start_at = time.perf_counter()
try: try:
@ -29,9 +27,7 @@ def send_enterprise_email_task(to, subject, body, substitutions):
end_at = time.perf_counter() end_at = time.perf_counter()
logging.info( logging.info(
click.style( click.style("Send enterprise mail to {} succeeded: latency: {}".format(to, end_at - start_at), fg="green")
"Send enterprise mail to {} succeeded: latency: {}".format(to, end_at - start_at), fg="green"
)
) )
except Exception: except Exception:
logging.exception("Send enterprise mail to {} failed".format(to)) logging.exception("Send enterprise mail to {} failed".format(to))