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