From 418d30895226bbb5cc03a70e8400c8a1907cdfd4 Mon Sep 17 00:00:00 2001 From: sm4640 Date: Fri, 16 May 2025 03:40:22 +0900 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Feat:=20[#56]=20=EB=A7=81=ED=81=AC?= =?UTF-8?q?=20=EC=B4=88=EB=8C=80,=20=ED=99=95=EC=9D=B8=20=EB=A1=9C?= =?UTF-8?q?=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 --- codes/views.py | 66 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 3 deletions(-) diff --git a/codes/views.py b/codes/views.py index 1457eb9..7bcf2d5 100644 --- a/codes/views.py +++ b/codes/views.py @@ -14,11 +14,21 @@ from common.models.choiceModels import CertificateCodeUseType from common.utils.codeManger import generate_code -certificate_use_type = { +CERTIFICATE_SERVICE_USE_TYPE = { "phone": SmsService, # "email": EmailService } +INVITE_USE_TYPE = { + "p": { + "word": "project", + "service": ProjectInviteService, + "model": Project, + "team_model": ProjectTeamList + } + # "h": HackathonInviteService +} + class CertificationAPIView(APIView): permission_classes = [AllowAny] @@ -26,7 +36,9 @@ class CertificationAPIView(APIView): @transaction.atomic def post(self, request): use_type = request.query_params.get("type") - serv = certificate_use_type[use_type] + if use_type not in CERTIFICATE_SERVICE_USE_TYPE: + return Response({"message": "Not defined use_type"}, status=status.HTTP_400_BAD_REQUEST) + serv = CERTIFICATE_SERVICE_USE_TYPE[use_type] serializer = CertificateCodeSerializer(data=request.data) if serializer.is_valid(): create_code = generate_code(6) @@ -44,7 +56,9 @@ class CertificationAPIView(APIView): @transaction.atomic def patch(self, request): use_type = request.query_params.get("type") - serv = certificate_use_type[use_type] + if use_type not in CERTIFICATE_SERVICE_USE_TYPE: + return Response({"message": "Not defined use_type"}, status=status.HTTP_400_BAD_REQUEST) + serv = CERTIFICATE_SERVICE_USE_TYPE[use_type] code = request.data.get('code', None) if not code: return Response({"message": "no code"}, status=status.HTTP_400_BAD_REQUEST) @@ -54,3 +68,49 @@ class CertificationAPIView(APIView): return Response({"message": "certificated successfully"}, status=status.HTTP_200_OK) return Response({"message": "wrong code, please retry"}, status=status.HTTP_400_BAD_REQUEST) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + +class InviteByLinkAPIView(APIView): + + # 링크 초대(복사) + @transaction.atomic + def post(self, request): + use_type = request.query_params.get("type") + if use_type not in INVITE_USE_TYPE: + return Response({"message": "Not defined use_type"}, status=status.HTTP_400_BAD_REQUEST) + + serv = INVITE_USE_TYPE[use_type]['service'] + user = request.user + serializer = InviteCodeSerializer(data=request.data) + if serializer.is_valid(): + work = get_object_or_404(INVITE_USE_TYPE[use_type]['model'], id=serializer.validated_data['identifier']) + if user != work.owner: # 유저 권한 추가될 시 수정 필요 + return Response({"message": "Not owner"}, status=status.HTTP_403_FORBIDDEN) + + create_code = generate_code(10) + invite_url = serv.create_invite_object_and_url(use_type, serializer.validated_data['identifier'], create_code) + return Response({"invite_url": invite_url}) + + # 링크 확인 + @transaction.atomic + def patch(self, request): + use_type = request.query_params.get("type") + if use_type not in INVITE_USE_TYPE: + return Response({"message": "Not defined use_type"}, status=status.HTTP_400_BAD_REQUEST) + + serv = INVITE_USE_TYPE[use_type]['service'] + user = request.user + serializer = InviteCodeSerializer(data=request.data) + if serializer.is_valid(): + if not serv.check_code(use_type, serializer.validated_data['identifier'], serializer.validated_data['code']): + return Response({"message": "Not correct or expired code"}, status=status.HTTP_400_BAD_REQUEST) + + work = get_object_or_404(INVITE_USE_TYPE[use_type]['model'], id=serializer.validated_data['identifier']) + filter_dict = {INVITE_USE_TYPE[use_type]['word']:work} + + if INVITE_USE_TYPE[use_type]['team_model'].objects.filter(user=user, **filter_dict).exists(): + return Response({"message": "already invited member"}, status=status.HTTP_400_BAD_REQUEST) + + if serv.add_member(user, work): + return Response({"message": "invite success"}, status=status.HTTP_200_OK) + return Response({"message": "invite failed"}, status=status.HTTP_400_BAD_REQUEST) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) \ No newline at end of file