Feat: [#41] 팀원 초대 수락/거절 로직 구현

This commit is contained in:
sm4640
2025-05-02 22:13:07 +09:00
parent 329dac7aea
commit 7e31c79963

View File

@@ -12,10 +12,12 @@ from rest_framework.generics import ListAPIView
from .serializers import ProjectListViewSerializer, ProjectCreateSerializer, ProjectTeamSerializer
from .paginations import ProjectPagination
from .filters import ProjectFilter
from .services import ProjectStateChangeService, ProjectBeforeRelCheckService
from .services import *
from django.db import transaction
from notifications.services import *
class ProjectListView(ListAPIView):
queryset = Project.objects.filter(is_published=True).order_by('-created_at')
@@ -29,6 +31,7 @@ class ProjectListView(ListAPIView):
class ProjectCreateAPIView(APIView):
@transaction.atomic
def post(self, request):
user = request.user
serializer = ProjectCreateSerializer(data=request.data, context={"request": request})
if serializer.is_valid():
serializer.save()
@@ -36,7 +39,7 @@ class ProjectCreateAPIView(APIView):
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class ProjectTeamManageAPIView(APIView):
# 팀원 초대
# 팀원 초대 및 알림
@transaction.atomic
def post(self, request, pk):
user = request.user
@@ -47,11 +50,14 @@ class ProjectTeamManageAPIView(APIView):
new_member = get_object_or_404(User, nickname=nickname)
if ProjectTeamList.objects.filter(project=project, user=new_member).exists():
return Response({"message": "already team member"}, status=status.HTTP_400_BAD_REQUEST)
serializer = ProjectTeamSerializer(data={'user':new_member.id, 'project':project.id})
if serializer.is_valid():
serializer.save()
return Response({"message": "invite success"}, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
new_notification = NotifiationService.create_notification(user=new_member, note_type=NotificationType.INVITE)
ProjectInvitationService.create_project_invitation(
project=project,
from_user=user,
to_user=new_member,
notification=new_notification
)
return Response({"message": "invite success"}, status=status.HTTP_200_OK)
# 팀원 추방
@transaction.atomic
@@ -141,3 +147,26 @@ class ProjectChangeState(APIView):
'message': f'{action_type} {"added" if add else "removed"}'
}, status=status.HTTP_200_OK)
class ProjectInvitationAPIView(APIView):
# 팀원 초대 수락/거절
@transaction.atomic
def post(self, request):
accept = request.data['accept']
project_invitation = get_object_or_404(ProjectInvitation, id=request.data['project_invitation_id'])
new_member = project_invitation.to_user
project = project_invitation.project
if request.user != new_member:
return Response({"message": "Not account owner"}, status=status.HTTP_403_FORBIDDEN)
if project_invitation.status != InvitationStatus.PENDING:
return Response({"message": "already handled invitation"}, status=status.HTTP_400_BAD_REQUEST)
if accept:
project_invitation.status = InvitationStatus.ACCEPTED
project_invitation.save()
serializer = ProjectTeamSerializer(data={'user':new_member.id, 'project':project.id})
if serializer.is_valid():
serializer.save()
return Response({"message": "invitation accepted"}, status=status.HTTP_200_OK)
else:
project_invitation.status = InvitationStatus.REJECTED
project_invitation.save()
return Response({"message": "invitation rejected"}, status=status.HTTP_200_OK)