✨ Feat: [#41] 팀원 초대 수락/거절 로직 구현
This commit is contained in:
@@ -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()
|
||||
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)
|
||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
# 팀원 추방
|
||||
@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)
|
||||
Reference in New Issue
Block a user