diff --git a/users/views.py b/users/views.py index c382a2e..5713225 100644 --- a/users/views.py +++ b/users/views.py @@ -3,6 +3,7 @@ from django.conf import settings from django.shortcuts import get_object_or_404 from rest_framework.views import APIView +from rest_framework.viewsets import ReadOnlyModelViewSet from rest_framework_simplejwt.serializers import TokenObtainPairSerializer, TokenRefreshSerializer from rest_framework_simplejwt.tokens import RefreshToken from rest_framework_simplejwt.exceptions import TokenError, InvalidToken @@ -16,11 +17,18 @@ from django.db.models import Case, When, Value, IntegerField, Q from .models import * from .serializers import * +from .services import * + +from projects.serializers import * +from portfolios.serializers import * + +from django.db import transaction class RefreshAPIView(APIView): permission_classes = [AllowAny] # access token 재발급 + @transaction.atomic def post(self, request): refresh = request.COOKIES.get("refresh") if not refresh: @@ -41,6 +49,7 @@ class RefreshAPIView(APIView): class JoinAPIView(APIView): permission_classes = [AllowAny] # 회원가입 + @transaction.atomic def post(self, request): serializer = JoinSerializer(data=request.data) if serializer.is_valid(): @@ -52,6 +61,7 @@ class JoinAPIView(APIView): class LoginAPIView(APIView): permission_classes = [AllowAny] # 로그인 + @transaction.atomic def post(self, request): email=request.data.get("email", None) password=request.data.get("password", None) @@ -122,6 +132,7 @@ class SetPortofolioRequiredInfoAPIView(APIView): else: return Response({"message": "can use this url"}, status=status.HTTP_200_OK) + @transaction.atomic def patch(self, request): user = request.user serializer = SetPortofolioRequiredInfoSerializer(user, data=request.data) @@ -130,4 +141,129 @@ class SetPortofolioRequiredInfoAPIView(APIView): user.is_custom_url = True user.save() return Response({"message": "updated successfully"}, status=status.HTTP_202_ACCEPTED) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) \ No newline at end of file + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + + +# 마이페이지 관련 +class MyPageProfileAPIView(APIView): + + # 프로필 조회(안 읽은 알림 수) + def get(self, request, nickname): + target_user = get_object_or_404(User, nickname=nickname) + user = request.user + serializer = UserProfileSerializer(target_user) + data = serializer.data + data['represent_portfolio_id'] = UserToPortfolioService.get_represent_portfolio(target_user) + data['new_notification_count'] = UserToNotificationService.get_new_notification_count(user) + return Response(data, status=status.HTTP_200_OK) + + # 프로필 수정 + @transaction.atomic + def patch(self, request, nickname): + target_user = get_object_or_404(User, nickname=nickname) + user = request.user + if user == target_user: + serializer = UserProfileSerializer(user, request.data, partial=True) + if serializer.is_valid(): + serializer.save() + data = serializer.data + data['represent_portfolio_id'] = UserToPortfolioService.get_represent_portfolio(target_user) + data['new_notification_count'] = UserToNotificationService.get_new_notification_count(user) + return Response(data, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + else: + return Response({"message": "Not account owner"}, status=status.HTTP_400_BAD_REQUEST) + +class MyPageWorkListAPIView(APIView): + + # 포폴, 플젝, 작업중, 스크랩 조회(안 읽은 알림 수) + def get(self, request, nickname): + target_user = get_object_or_404(User, nickname=nickname) + user = request.user + retreive_type = request.query_params.get('type') + data = {} + if retreive_type == 'portfolio': + portfolios = UserToPortfolioService.get_published_portfolio(target_user) + serializer = PortfolioListViewSerializer(portfolios, many=True) + data = { + "portfolios": serializer.data + } + elif retreive_type == 'project': + solo_projects = UserToProjectService.get_published_solo_project(target_user) + team_projects = UserToProjectService.get_published_team_project(target_user) + sp_serializer = ProjectListViewSerializer(solo_projects, many=True) + tp_serializer = ProjectListViewSerializer(team_projects, many=True) + data = { + "solo_projects": sp_serializer.data, + "team_projects": tp_serializer.data, + } + elif retreive_type == 'working': + if user != target_user: + return Response({"message": "Not account owner"}, status=status.HTTP_400_BAD_REQUEST) + portfolios = UserToPortfolioService.get_unpublished_portfolio(target_user) + solo_projects = UserToProjectService.get_unpublished_solo_project(target_user) + team_projects = UserToProjectService.get_unpublished_team_project(target_user) + po_serializer = PortfolioListViewSerializer(portfolios, many=True) + sp_serializer = ProjectListViewSerializer(solo_projects, many=True) + tp_serializer = ProjectListViewSerializer(team_projects, many=True) + data = { + "portfolios": po_serializer.data, + "solo_projects": sp_serializer.data, + "team_projects": tp_serializer.data, + } + elif retreive_type == 'scrap': + if user != target_user: + return Response({"message": "Not account owner"}, status=status.HTTP_400_BAD_REQUEST) + portfolios = UserToPortfolioService.get_scrap_portfolio(target_user) + po_serializer = PortfolioListViewSerializer(portfolios, many=True) + projects = UserToProjectService.get_scrap_project(target_user) + pr_serializer = ProjectListViewSerializer(projects, many=True) + data = { + "portfolios": po_serializer.data, + "projects": pr_serializer.data, + } + else: + return Response({"message": "not allowed retreive_type"}, status=status.HTTP_400_BAD_REQUEST) + + data['new_notification_count'] = UserToNotificationService.get_new_notification_count(user) + return Response(data, status=status.HTTP_200_OK) + +class MyPageMemberInfoAPIView(APIView): + + # 내 정보 조회(안 읽은 알림 수) + def get(self, request): + user = request.user + serializer = UserMemberInfoSerializer(user) + data = serializer.data + data['new_notification_count'] = UserToNotificationService.get_new_notification_count(user) + return Response(data, status=status.HTTP_200_OK) + + # 내 정보 수정 + @transaction.atomic + def patch(self, request): + user = request.user + serializer = UserMemberInfoSerializer(user, request.data, partial=True) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + +class NotificationReadViewSet(ReadOnlyModelViewSet): + serializer_class = NotificationSerializer + + # 30일 이전 알림만 가져옴 + def get_queryset(self): + return UserToNotificationService.get_all_notification(self.request.user) + + def list(self, request, *args, **kwargs): + queryset = self.get_queryset() + serializer = self.get_serializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def retrieve(self, request, *args, **kwargs): + instance = self.get_object() + instance.is_read = True + instance.save() + serializer = self.get_serializer(instance) + return Response(serializer.data, status=status.HTTP_200_OK) \ No newline at end of file