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 .serializers import ProjectListViewSerializer, ProjectCreateSerializer, ProjectTeamSerializer
from .paginations import ProjectPagination from .paginations import ProjectPagination
from .filters import ProjectFilter from .filters import ProjectFilter
from .services import ProjectStateChangeService, ProjectBeforeRelCheckService from .services import *
from django.db import transaction from django.db import transaction
from notifications.services import *
class ProjectListView(ListAPIView): class ProjectListView(ListAPIView):
queryset = Project.objects.filter(is_published=True).order_by('-created_at') queryset = Project.objects.filter(is_published=True).order_by('-created_at')
@@ -29,6 +31,7 @@ class ProjectListView(ListAPIView):
class ProjectCreateAPIView(APIView): class ProjectCreateAPIView(APIView):
@transaction.atomic @transaction.atomic
def post(self, request): def post(self, request):
user = request.user
serializer = ProjectCreateSerializer(data=request.data, context={"request": request}) serializer = ProjectCreateSerializer(data=request.data, context={"request": request})
if serializer.is_valid(): if serializer.is_valid():
serializer.save() serializer.save()
@@ -36,7 +39,7 @@ class ProjectCreateAPIView(APIView):
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class ProjectTeamManageAPIView(APIView): class ProjectTeamManageAPIView(APIView):
# 팀원 초대 # 팀원 초대 및 알림
@transaction.atomic @transaction.atomic
def post(self, request, pk): def post(self, request, pk):
user = request.user user = request.user
@@ -47,11 +50,14 @@ class ProjectTeamManageAPIView(APIView):
new_member = get_object_or_404(User, nickname=nickname) new_member = get_object_or_404(User, nickname=nickname)
if ProjectTeamList.objects.filter(project=project, user=new_member).exists(): if ProjectTeamList.objects.filter(project=project, user=new_member).exists():
return Response({"message": "already team member"}, status=status.HTTP_400_BAD_REQUEST) return Response({"message": "already team member"}, status=status.HTTP_400_BAD_REQUEST)
serializer = ProjectTeamSerializer(data={'user':new_member.id, 'project':project.id}) new_notification = NotifiationService.create_notification(user=new_member, note_type=NotificationType.INVITE)
if serializer.is_valid(): ProjectInvitationService.create_project_invitation(
serializer.save() project=project,
from_user=user,
to_user=new_member,
notification=new_notification
)
return Response({"message": "invite success"}, status=status.HTTP_200_OK) return Response({"message": "invite success"}, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# 팀원 추방 # 팀원 추방
@transaction.atomic @transaction.atomic
@@ -141,3 +147,26 @@ class ProjectChangeState(APIView):
'message': f'{action_type} {"added" if add else "removed"}' 'message': f'{action_type} {"added" if add else "removed"}'
}, status=status.HTTP_200_OK) }, 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)