From 368cbb1632b9f7b25dcf732a62f1265de16135af Mon Sep 17 00:00:00 2001 From: sm4640 Date: Tue, 6 May 2025 20:03:18 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix:=20[#48]=20user=20?= =?UTF-8?q?field=20=EC=A4=91=EB=B3=B5=20=EC=B2=B4=ED=81=AC=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- users/services.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) 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() From cc561b3e23b1f13e09041659e82a56b752707f57 Mon Sep 17 00:00:00 2001 From: sm4640 Date: Tue, 6 May 2025 20:03:58 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix:=20[#48]=20check?= =?UTF-8?q?=20url=EC=97=90=20=EC=A4=91=EB=B3=B5=20=EC=B2=B4=ED=81=AC=20api?= =?UTF-8?q?=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- users/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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()), From 7a7c4e9c71434fc8c629b5eed122e15035700316 Mon Sep 17 00:00:00 2001 From: sm4640 Date: Tue, 6 May 2025 20:04:49 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix:=20[#48]=20user=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EC=A4=91=EB=B3=B5=20=EC=B2=B4=ED=81=AC=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=EA=B8=B0?= =?UTF-8?q?=EC=A1=B4=20=EB=B6=84=EB=A6=AC=20api=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- users/views.py | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) 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):