diff --git a/users/services.py b/users/services.py index 8dee258..74182e3 100644 --- a/users/services.py +++ b/users/services.py @@ -8,14 +8,19 @@ from datetime import timedelta # 30일 이전 일수 계산 thirty_days_ago = timezone.now() - timedelta(days=30) +DUPLICATE_CHECK = { + 'email': 'email', + 'nickname': 'nickname' +} + class CheckUserFieldDuplicateService: @staticmethod - def check_nickname_duplicate(query): - pass - - @staticmethod - def check_custom_url_duplicate(): - pass + def check_duplicate(field: str, value: str) -> bool: + if field not in DUPLICATE_CHECK: + raise ValueError(f"{field}는 지원하지 않는 필드입니다.") + + filter_dict = {DUPLICATE_CHECK[field]:value} + return User.objects.filter(**filter_dict).exists() diff --git a/users/urls.py b/users/urls.py index f7c8f47..3d84a25 100644 --- a/users/urls.py +++ b/users/urls.py @@ -9,7 +9,7 @@ urlpatterns = [ path('refresh-token/', RefreshAPIView.as_view()), path('join/', JoinAPIView.as_view()), path('login/', LoginAPIView.as_view()), - path('check/', NicknameAPIView.as_view()), + path('check/', CheckUserFieldDuplicateAPIView.as_view()), path('portfolio-info/', SetPortofolioRequiredInfoAPIView.as_view()), path('portfolio-info/check/', SetPortofolioRequiredInfoAPIView.as_view()), path('teamtag/', TagUserAPIView.as_view()), diff --git a/users/views.py b/users/views.py index 3c10136..d51fbe5 100644 --- a/users/views.py +++ b/users/views.py @@ -4,7 +4,7 @@ from django.shortcuts import get_object_or_404 from rest_framework.views import APIView from rest_framework.viewsets import ReadOnlyModelViewSet -from rest_framework_simplejwt.serializers import TokenObtainPairSerializer, TokenRefreshSerializer +from rest_framework_simplejwt.serializers import TokenObtainPairSerializer, TokenRefreshSerializer, TokenObtainSerializer from rest_framework_simplejwt.tokens import RefreshToken from rest_framework_simplejwt.exceptions import TokenError, InvalidToken @@ -53,8 +53,12 @@ class JoinAPIView(APIView): def post(self, request): serializer = JoinSerializer(data=request.data) if serializer.is_valid(): - serializer.save() - res = Response({"message": "회원가입이 완료되었습니다."}, status=status.HTTP_200_OK) + user = serializer.save() + access = str(RefreshToken.for_user(user).access_token) + res = Response({ + "message": "회원가입이 완료되었습니다.", + "access": access + }, status=status.HTTP_200_OK) return res return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) @@ -95,18 +99,22 @@ class LoginAPIView(APIView): else: # id, 비번 둘 중 하나가 틀렸을 때 return Response({"message": "아이디 혹은 비밀번호가 맞지 않습니다."}, status=status.HTTP_400_BAD_REQUEST) -class NicknameAPIView(APIView): +class CheckUserFieldDuplicateAPIView(APIView): permission_classes = [AllowAny] - # 닉네임 중복 체크 + # 유저 필드 중복 확인 def get(self, request): - nickname = request.GET.get('nickname', None) - if not nickname: - return Response({"message": "닉네임을 입력하세요."}, status=status.HTTP_400_BAD_REQUEST) + field = request.query_params.get('field') + value = request.query_params.get('value') + if not field or not value: + return Response({"message": "올바르지 않은 요청입니다."}, status=status.HTTP_400_BAD_REQUEST) try: - get_object_or_404(User, nickname=nickname) - return Response({"message": "해당 닉네임은 사용할 수 없습니다."}, status=status.HTTP_400_BAD_REQUEST) - except: - return Response({"message": "사용할 수 있는 닉네임입니다."}, status=status.HTTP_200_OK) + if CheckUserFieldDuplicateService.check_duplicate(field, value): + return Response({"message": f"존재하는 {field} 입니다."}, status=status.HTTP_400_BAD_REQUEST) + else: + return Response({"message": f"사용해도 되는 {field} 입니다."}, status=status.HTTP_200_OK) + except ValueError as e: + return Response({"message": str(e)}, status=status.HTTP_400_BAD_REQUEST) + class TagUserAPIView(APIView): def get(self, request):