refactor(api): создание базового AnonymousAPIView для DRY

ПРОБЛЕМА:
- ResendEmailAPIView, VerifyEmailAPIView, RegisterAPIView дублировали:
  • throttle_scope = "anon"
  • permission_classes = [AllowAny]
- Нарушение DRY принципа (6 строк повторяющегося кода)

РЕШЕНИЕ:
Создан базовый класс AnonymousAPIView(APIView):
  - throttle_scope = "anon"
  - permission_classes = [AllowAny]
  - Используется для всех публичных auth endpoints

ИЗМЕНЕНИЯ:
- ResendEmailAPIView(AnonymousAPIView) - удалены дубли
- VerifyEmailAPIView(AnonymousAPIView) - удалены дубли
- RegisterAPIView(LdapUserCreationMixin, AnonymousAPIView) - удалены дубли

РЕЗУЛЬТАТ:
- Убрано 8 строк дублирования
- Более чистая иерархия наследования
- Легче добавлять новые анонимные endpoints
- Единая точка для настройки throttling/permissions

Django check: успешно
This commit is contained in:
lizerk 2026-03-18 19:31:00 +03:00
parent aa70c23f0f
commit bebe61b727

View File

@ -26,12 +26,18 @@ from .mixins import LdapUserCreationMixin, _is_ldap_enabled
logger = logging.getLogger(__name__)
class ResendEmailAPIView(APIView):
"""POST /api/v1/auth/resend-email/ body: {"email": "..."}"""
class AnonymousAPIView(APIView):
"""Базовый класс для анонимных (публичных) API endpoints.
Все auth-related views наследуются от этого класса для DRY.
"""
throttle_scope = "anon"
permission_classes = [AllowAny]
class ResendEmailAPIView(AnonymousAPIView):
"""POST /api/v1/auth/resend-email/ body: {"email": "..."}"""
def post(self, request):
ser = EmailSerializer(data=request.data)
ser.is_valid(raise_exception=True)
@ -55,10 +61,7 @@ class ResendEmailAPIView(APIView):
return Response({"ok": True}, status=200)
class VerifyEmailAPIView(APIView):
throttle_scope = "anon"
permission_classes = [AllowAny]
class VerifyEmailAPIView(AnonymousAPIView):
def post(self, request):
"""Подтверждает email и активирует пользователя.
@ -94,14 +97,11 @@ class VerifyEmailAPIView(APIView):
return Response({"ok": True, "user_id": user.id}, status=200)
class RegisterAPIView(LdapUserCreationMixin, APIView):
class RegisterAPIView(LdapUserCreationMixin, AnonymousAPIView):
"""Регистрация: создаём учётку в LDAP (disabled) с паролем, в БД — set_unusable_password.
Использует LdapUserCreationMixin для вынесения LDAP-специфичной логики.
"""
throttle_scope = "anon"
permission_classes = [AllowAny]
parser_classes = (JSONParser, FormParser, MultiPartParser)
@transaction.atomic