Files
dify/api/services/account_initialization_service.py

66 lines
2.3 KiB
Python

"""Application service for initializing a newly admitted account."""
from collections.abc import Callable
from datetime import datetime
from machinery.context import RequestContext
from machinery.errors import ActiveWorkspaceRequiredError
from services.account_errors import (
AccountAlreadyInitializedError,
AccountNotFoundError,
InvalidInvitationCodeError,
MissingInvitationCodeError,
)
from services.account_ports import AccountRepository
from services.entities.account_entities import AccountInitialization, AccountInitializationStatus, AccountSnapshot
class AccountInitializationService:
def __init__(
self,
*,
accounts: AccountRepository,
invitation_required: bool,
now: Callable[[], datetime],
) -> None:
self._accounts = accounts
self._invitation_required = invitation_required
self._now = now
def initialize(
self,
context: RequestContext,
*,
interface_language: str,
timezone: str,
invitation_code: str | None,
) -> AccountSnapshot:
workspace_id: str | None = None
if self._invitation_required:
if invitation_code is None:
raise MissingInvitationCodeError("invitation_code is required")
workspace_id = context.active_workspace_id
if workspace_id is None:
raise ActiveWorkspaceRequiredError
result = self._accounts.initialize(
context.account_id,
AccountInitialization(
interface_language=interface_language,
interface_theme="light",
timezone=timezone,
initialized_at=self._now(),
),
invitation_code=invitation_code if self._invitation_required else None,
workspace_id=workspace_id,
)
if result.status == AccountInitializationStatus.ACCOUNT_NOT_FOUND:
raise AccountNotFoundError
if result.status == AccountInitializationStatus.ALREADY_INITIALIZED:
raise AccountAlreadyInitializedError
if result.status == AccountInitializationStatus.INVALID_INVITATION:
raise InvalidInvitationCodeError
if result.account is None:
raise RuntimeError("Account repository returned an initialized result without an account")
return result.account