diff --git a/backend/api/v1/employees/views/auth.py b/backend/api/v1/employees/views/auth.py index cb911af9..e728885b 100644 --- a/backend/api/v1/employees/views/auth.py +++ b/backend/api/v1/employees/views/auth.py @@ -21,7 +21,7 @@ from rest_framework.views import APIView from ..serializers import (EmailSerializer, EmailVerifySerializer, RegisterSerializer) from ._helpers import Employee -from .mixins import LdapUserCreationMixin, _is_ldap_enabled +from .mixins import LdapUserCreationMixin logger = logging.getLogger(__name__) @@ -186,31 +186,18 @@ class RegisterAPIView(LdapUserCreationMixin, AnonymousAPIView): avatar_bytes = None avatar_name = None - ldap_enabled = _is_ldap_enabled() - - if ldap_enabled: - # Режим с LDAP: создаём disabled учётку в LDAP + пароль - emp, error_response = self.create_ldap_user( - first_name=v["first_name"], - last_name=v["last_name"], - email=email, - phone_e164=phone_norm, - password=password, - avatar_bytes=avatar_bytes, - is_active=False, # disabled до верификации email - ) - if error_response: - return error_response - else: - # Режим без LDAP: создаём пользователя напрямую в БД - emp = self.create_db_user( - first_name=v["first_name"], - last_name=v["last_name"], - email=email, - phone_number=phone_norm, - password=password, - is_active=False, # не активен до верификации email - ) + # Создаём пользователя (миксин сам выберет LDAP или БД режим) + emp, error_response = self.create_user( + first_name=v["first_name"], + last_name=v["last_name"], + email=email, + phone=phone_norm, + password=password, + avatar_bytes=avatar_bytes, + is_active=False, # не активен до верификации email + ) + if error_response: + return error_response # 2) Заполняем доп.поля БД if avatar_bytes: diff --git a/backend/api/v1/employees/views/mixins.py b/backend/api/v1/employees/views/mixins.py index 36f4efda..4f280233 100644 --- a/backend/api/v1/employees/views/mixins.py +++ b/backend/api/v1/employees/views/mixins.py @@ -28,10 +28,63 @@ class LdapUserCreationMixin: из основного метода регистрации. Методы: + create_user(): Создаёт пользователя (выбирает LDAP или БД автоматически) create_ldap_user(): Создаёт пользователя в LDAP через DirectoryService create_db_user(): Создаёт пользователя напрямую в БД (fallback без LDAP) """ + def create_user( + self, + *, + first_name: str, + last_name: str, + email: str, + phone: str, + password: str, + avatar_bytes: Optional[bytes] = None, + is_active: bool = False, + ) -> tuple[Optional['Employee'], Optional[Response]]: + """Создаёт пользователя - автоматически выбирает LDAP или БД режим. + + View не должен знать о режиме LDAP - вся логика инкапсулирована здесь. + + Args: + first_name: Имя + last_name: Фамилия + email: Email (нормализованный, lowercase) + phone: Телефон в E.164 формате + password: Пароль + avatar_bytes: Байты аватара (опционально) + is_active: False до верификации email + + Returns: + tuple[Employee | None, Response | None]: + - (Employee, None) при успехе + - (None, Response) при ошибке (Response для возврата клиенту) + """ + if _is_ldap_enabled(): + # Режим с LDAP: создаём disabled учётку в LDAP + пароль + return self.create_ldap_user( + first_name=first_name, + last_name=last_name, + email=email, + phone_e164=phone, + password=password, + avatar_bytes=avatar_bytes, + is_active=is_active, + ) + else: + # Режим без LDAP: создаём пользователя напрямую в БД + emp = self.create_db_user( + first_name=first_name, + last_name=last_name, + email=email, + phone_number=phone, + password=password, + is_active=is_active, + ) + return emp, None + def create_ldap_user( self, *,