From a73017748d03ff76d1076dce2c65fbd825c3b0ab Mon Sep 17 00:00:00 2001 From: rvbear Date: Mon, 3 Jun 2024 05:44:39 +0900 Subject: [PATCH 01/16] =?UTF-8?q?[feat]=20=EA=B8=B0=EA=B0=84=EB=B3=84=20?= =?UTF-8?q?=EC=9D=BC=EA=B8=B0=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diary/serializers.py | 6 ++++++ diary/urls.py | 1 + diary/views.py | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/diary/serializers.py b/diary/serializers.py index 40677c8..6251626 100644 --- a/diary/serializers.py +++ b/diary/serializers.py @@ -156,3 +156,9 @@ class AnswerSerializer(serializers.Serializer): class AnswerListRequest(serializers.Serializer): answers = AnswerSerializer(many=True) + + +class IsExistDiaryRequest(serializers.Serializer): + userId = serializers.IntegerField() + year = serializers.IntegerField() + month = serializers.IntegerField() \ No newline at end of file diff --git a/diary/urls.py b/diary/urls.py index dd178c2..1b1d259 100644 --- a/diary/urls.py +++ b/diary/urls.py @@ -9,4 +9,5 @@ path('//graph', GetNodeData.as_view()), path('/user/', GetDiaryByUserView.as_view()), path('/checkanswer', CheckAnswerView.as_view()), + path('/checkdiary', IsExistDiaryView.as_view()), ] diff --git a/diary/views.py b/diary/views.py index b7cbff8..8763188 100644 --- a/diary/views.py +++ b/diary/views.py @@ -10,6 +10,7 @@ from .graph import GraphDB from .graph_serializer import GraphDataSerializer +import calendar class DiaryCRUDView(APIView): @transaction.atomic @@ -249,3 +250,39 @@ def get(self, request): result=KeywordResultSerializer(findKeywords, many=True).data, response_status=status.HTTP_200_OK ) + + +class IsExistDiaryView(APIView): + @transaction.atomic + @swagger_auto_schema( + operation_id="기간별 일기 유무 리스트 가져오기", + operation_description="기간별 일기 유무 리스트 가져오기", + query_serializer=IsExistDiaryRequest(), + responses={status.HTTP_200_OK: ApiResponse.schema(ApiResponse)} + ) + @validator(request_type=REQUEST_QUERY, request_serializer=IsExistDiaryRequest, return_key='query') + def get(self, request): + # 요청 데이터에서 userId, year, month 추출 + userId = request.query.validated_data.get('userId') + year = request.query.validated_data.get('year') + month = request.query.validated_data.get('month') + + # 해당 월의 일수를 가져옴 + _, lastDay = calendar.monthrange(year, month) + + # 일기가 존재하는 날짜를 boolean 배열로 초기화 + Diaries = [False] * lastDay + + # 해당 userId, year, month에 해당하는 일기를 조회 + diaries = Diary.objects.filter(user_id=userId, createDate__year=year, createDate__month=month) + + # 조회된 일기의 날짜를 boolean 배열에 반영 + for diary in diaries: + Diaries[diary.createDate.day - 1] = True + + # 결과를 JSON 형식으로 반환 + result = {f'{year}년 {month}월': Diaries} + return ApiResponse.on_success( + result=result, + response_status=status.HTTP_200_OK + ) \ No newline at end of file From e8f5334d6519520b6a416c7c55d55dc66e755a43 Mon Sep 17 00:00:00 2001 From: rvbear Date: Mon, 3 Jun 2024 15:30:34 +0900 Subject: [PATCH 02/16] =?UTF-8?q?[refactor]=20checkdiary=20response=20?= =?UTF-8?q?=ED=98=95=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diary/views.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/diary/views.py b/diary/views.py index 8763188..0636577 100644 --- a/diary/views.py +++ b/diary/views.py @@ -270,18 +270,18 @@ def get(self, request): # 해당 월의 일수를 가져옴 _, lastDay = calendar.monthrange(year, month) - # 일기가 존재하는 날짜를 boolean 배열로 초기화 - Diaries = [False] * lastDay + # 일기가 존재하는 날짜를 dict으로 초기화 + Diaries = {day: False for day in range(1, lastDay + 1)} # 해당 userId, year, month에 해당하는 일기를 조회 diaries = Diary.objects.filter(user_id=userId, createDate__year=year, createDate__month=month) # 조회된 일기의 날짜를 boolean 배열에 반영 for diary in diaries: - Diaries[diary.createDate.day - 1] = True + Diaries[diary.createDate.day] = True # 결과를 JSON 형식으로 반환 - result = {f'{year}년 {month}월': Diaries} + result = {f'{year}-{month}': Diaries} return ApiResponse.on_success( result=result, response_status=status.HTTP_200_OK From 9547040e817ac614ac6cca4efe302998e5fad4f8 Mon Sep 17 00:00:00 2001 From: rvbear Date: Mon, 3 Jun 2024 16:39:17 +0900 Subject: [PATCH 03/16] =?UTF-8?q?[feat]=20=EA=B8=B0=EA=B0=84=EB=B3=84=20?= =?UTF-8?q?=EC=9D=BC=EA=B8=B0=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=ED=95=98=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diary/serializers.py | 8 +++++++- diary/urls.py | 1 + diary/views.py | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/diary/serializers.py b/diary/serializers.py index 6251626..8c80238 100644 --- a/diary/serializers.py +++ b/diary/serializers.py @@ -161,4 +161,10 @@ class AnswerListRequest(serializers.Serializer): class IsExistDiaryRequest(serializers.Serializer): userId = serializers.IntegerField() year = serializers.IntegerField() - month = serializers.IntegerField() \ No newline at end of file + month = serializers.IntegerField() + + +class GetDiaryByUserAndDateRequest(serializers.Serializer): + userId = serializers.IntegerField() + startDate = serializers.DateField() + finishDate = serializers.DateField() \ No newline at end of file diff --git a/diary/urls.py b/diary/urls.py index 1b1d259..83f13f3 100644 --- a/diary/urls.py +++ b/diary/urls.py @@ -10,4 +10,5 @@ path('/user/', GetDiaryByUserView.as_view()), path('/checkanswer', CheckAnswerView.as_view()), path('/checkdiary', IsExistDiaryView.as_view()), + path('/list', GetDiaryByUserAndDateView.as_view()), ] diff --git a/diary/views.py b/diary/views.py index 0636577..0a00cf1 100644 --- a/diary/views.py +++ b/diary/views.py @@ -282,6 +282,38 @@ def get(self, request): # 결과를 JSON 형식으로 반환 result = {f'{year}-{month}': Diaries} + return ApiResponse.on_success( + result=result, + response_status=status.HTTP_200_OK + ) + + +class GetDiaryByUserAndDateView(APIView): + @transaction.atomic + @swagger_auto_schema( + operation_id="기간별 일기 리스트 가져오기", + operation_description="기간별 일기 리스트 가져오기", + query_serializer=GetDiaryByUserAndDateRequest(), + responses={status.HTTP_200_OK: ApiResponse.schema(ApiResponse)} + ) + @validator(request_type=REQUEST_QUERY, request_serializer=GetDiaryByUserAndDateRequest, return_key='query') + def get(self, request): + # 요청 데이터에서 userId, year, month 추출 + userId = request.query.validated_data.get('userId') + startDate = request.query.validated_data.get('startDate') + finishDate = request.query.validated_data.get('finishDate') + + # 해당 userId, startDate, finishDate에 해당하는 일기를 조회 + diaries = Diary.objects.filter( + user_id=userId, + createDate__range=[startDate, finishDate] + ) + + # 일기 정보를 DiarySerializer를 사용하여 직렬화 + diary_list = DiarySerializer(diaries, many=True).data + + # 결과를 JSON 형식으로 반환 + result = {"diaries": diary_list} return ApiResponse.on_success( result=result, response_status=status.HTTP_200_OK From fd1f6ba2b22a48db4151734256807d8285ee5061 Mon Sep 17 00:00:00 2001 From: rvbear Date: Mon, 3 Jun 2024 16:44:38 +0900 Subject: [PATCH 04/16] =?UTF-8?q?[feat]=20=EA=B8=B0=EA=B0=84=EB=B3=84=20?= =?UTF-8?q?=EC=9D=BC=EA=B8=B0=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=EC=8B=9C=20=EC=A0=95=EB=A0=AC=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EC=98=B5=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diary/serializers.py | 3 ++- diary/views.py | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/diary/serializers.py b/diary/serializers.py index 8c80238..ca76879 100644 --- a/diary/serializers.py +++ b/diary/serializers.py @@ -167,4 +167,5 @@ class IsExistDiaryRequest(serializers.Serializer): class GetDiaryByUserAndDateRequest(serializers.Serializer): userId = serializers.IntegerField() startDate = serializers.DateField() - finishDate = serializers.DateField() \ No newline at end of file + finishDate = serializers.DateField() + sortBy = serializers.ChoiceField(choices=['createDate', '-createDate'], required=False, default='createDate') \ No newline at end of file diff --git a/diary/views.py b/diary/views.py index 0a00cf1..80455a9 100644 --- a/diary/views.py +++ b/diary/views.py @@ -302,18 +302,19 @@ def get(self, request): userId = request.query.validated_data.get('userId') startDate = request.query.validated_data.get('startDate') finishDate = request.query.validated_data.get('finishDate') + sortBy = request.query.validated_data.get('sortBy') # 해당 userId, startDate, finishDate에 해당하는 일기를 조회 diaries = Diary.objects.filter( user_id=userId, createDate__range=[startDate, finishDate] - ) + ).order_by(sortBy) # 일기 정보를 DiarySerializer를 사용하여 직렬화 - diary_list = DiarySerializer(diaries, many=True).data + diaryList = DiarySerializer(diaries, many=True).data # 결과를 JSON 형식으로 반환 - result = {"diaries": diary_list} + result = {"diaries": diaryList} return ApiResponse.on_success( result=result, response_status=status.HTTP_200_OK From fa0b875d0a1cd0dc010f8e8f76cd232f7df9cf96 Mon Sep 17 00:00:00 2001 From: rvbear Date: Sat, 8 Jun 2024 01:00:50 +0900 Subject: [PATCH 05/16] =?UTF-8?q?[refactor]=20=EC=A0=95=EB=A0=AC=EC=8B=9C?= =?UTF-8?q?=20=EC=98=B5=EC=85=98=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diary/serializers.py | 4 +++- diary/views.py | 12 ++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/diary/serializers.py b/diary/serializers.py index ca76879..e2bfc63 100644 --- a/diary/serializers.py +++ b/diary/serializers.py @@ -163,9 +163,11 @@ class IsExistDiaryRequest(serializers.Serializer): year = serializers.IntegerField() month = serializers.IntegerField() +DES_CREATEDATE = 'DES_CREATE_DATE' +ASC_CREATEDATE = 'ASC_CREATE_DATE' class GetDiaryByUserAndDateRequest(serializers.Serializer): userId = serializers.IntegerField() startDate = serializers.DateField() finishDate = serializers.DateField() - sortBy = serializers.ChoiceField(choices=['createDate', '-createDate'], required=False, default='createDate') \ No newline at end of file + sortBy = serializers.ChoiceField(choices=[DES_CREATEDATE, ASC_CREATEDATE], required=False, default=DES_CREATEDATE) \ No newline at end of file diff --git a/diary/views.py b/diary/views.py index 80455a9..152cdd6 100644 --- a/diary/views.py +++ b/diary/views.py @@ -286,7 +286,9 @@ def get(self, request): result=result, response_status=status.HTTP_200_OK ) - + +DES_CREATEDATE = 'DES_CREATE_DATE' +ASC_CREATEDATE = 'ASC_CREATE_DATE' class GetDiaryByUserAndDateView(APIView): @transaction.atomic @@ -304,11 +306,17 @@ def get(self, request): finishDate = request.query.validated_data.get('finishDate') sortBy = request.query.validated_data.get('sortBy') + sortMapping = { + DES_CREATEDATE: '-createDate', + ASC_CREATEDATE: 'createDate' + } + sortField = sortMapping.get(sortBy, 'createDate') # 기본값은 'createDate' + # 해당 userId, startDate, finishDate에 해당하는 일기를 조회 diaries = Diary.objects.filter( user_id=userId, createDate__range=[startDate, finishDate] - ).order_by(sortBy) + ).order_by(sortField) # 일기 정보를 DiarySerializer를 사용하여 직렬화 diaryList = DiarySerializer(diaries, many=True).data From 3b8600464baca8986ce25cc5dc3dcc866d614aca Mon Sep 17 00:00:00 2001 From: rvbear Date: Sat, 8 Jun 2024 01:07:13 +0900 Subject: [PATCH 06/16] =?UTF-8?q?[refactor]=20=EA=B8=B0=EA=B0=84=EB=B3=84?= =?UTF-8?q?=20=EC=9D=BC=EA=B8=B0=20=EC=A1=B0=ED=9A=8C=20Response=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diary/views.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/diary/views.py b/diary/views.py index 152cdd6..fae8d67 100644 --- a/diary/views.py +++ b/diary/views.py @@ -318,11 +318,16 @@ def get(self, request): createDate__range=[startDate, finishDate] ).order_by(sortField) - # 일기 정보를 DiarySerializer를 사용하여 직렬화 - diaryList = DiarySerializer(diaries, many=True).data + # 해당 userId를 가지고 있는 유저 정보 가져오기 + user = User.objects.get(id=userId) + + # 유저 정보를 UserSafeSerializer를 사용해서 구조화 + userInfo = UserSafeSerializer(user).data + # 일기 정보를 DiaryResultResponse를 사용하여 직렬화 + diaryList = DiaryResultResponse(diaries, many=True).data # 결과를 JSON 형식으로 반환 - result = {"diaries": diaryList} + result = {"user": userInfo, "diaries": diaryList} return ApiResponse.on_success( result=result, response_status=status.HTTP_200_OK From 1500e592a77a30105031c0df584e5c6bc3941026 Mon Sep 17 00:00:00 2001 From: rvbear Date: Sat, 8 Jun 2024 13:48:39 +0900 Subject: [PATCH 07/16] =?UTF-8?q?[feat]=20userId=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EC=8B=9C=20validator=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diary/serializers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/diary/serializers.py b/diary/serializers.py index e2bfc63..c3971c4 100644 --- a/diary/serializers.py +++ b/diary/serializers.py @@ -159,7 +159,7 @@ class AnswerListRequest(serializers.Serializer): class IsExistDiaryRequest(serializers.Serializer): - userId = serializers.IntegerField() + userId = serializers.IntegerField(validators=[exist_user_id]) year = serializers.IntegerField() month = serializers.IntegerField() @@ -167,7 +167,7 @@ class IsExistDiaryRequest(serializers.Serializer): ASC_CREATEDATE = 'ASC_CREATE_DATE' class GetDiaryByUserAndDateRequest(serializers.Serializer): - userId = serializers.IntegerField() + userId = serializers.IntegerField(validators=[exist_user_id]) startDate = serializers.DateField() finishDate = serializers.DateField() sortBy = serializers.ChoiceField(choices=[DES_CREATEDATE, ASC_CREATEDATE], required=False, default=DES_CREATEDATE) \ No newline at end of file From 16864e1402624eba1840e22d8859c29addc35585 Mon Sep 17 00:00:00 2001 From: rvbear Date: Sat, 8 Jun 2024 23:40:43 +0900 Subject: [PATCH 08/16] =?UTF-8?q?[refactor]=20=EC=A0=95=EB=A0=AC=20?= =?UTF-8?q?=EC=98=B5=EC=85=98=20=EB=AA=A8=EB=93=88=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/sort_options.py | 7 +++++++ diary/serializers.py | 6 ++---- diary/views.py | 10 ++-------- 3 files changed, 11 insertions(+), 12 deletions(-) create mode 100644 config/sort_options.py diff --git a/config/sort_options.py b/config/sort_options.py new file mode 100644 index 0000000..1672cce --- /dev/null +++ b/config/sort_options.py @@ -0,0 +1,7 @@ +DES_CREATEDATE = 'DES_CREATE_DATE' +ASC_CREATEDATE = 'ASC_CREATE_DATE' + +DATE_SORT_MAPPER = { + 'DES_CREATE_DATE': '-createDate', + 'ASC_CREATE_DATE': 'createDate' +} \ No newline at end of file diff --git a/diary/serializers.py b/diary/serializers.py index c3971c4..52e9009 100644 --- a/diary/serializers.py +++ b/diary/serializers.py @@ -1,6 +1,7 @@ from rest_framework import status from config.validator import positive_value +from config.sort_options import * from users.models import User from users.serializers import UserSafeSerializer from users.validator import exist_user_id @@ -163,11 +164,8 @@ class IsExistDiaryRequest(serializers.Serializer): year = serializers.IntegerField() month = serializers.IntegerField() -DES_CREATEDATE = 'DES_CREATE_DATE' -ASC_CREATEDATE = 'ASC_CREATE_DATE' - class GetDiaryByUserAndDateRequest(serializers.Serializer): userId = serializers.IntegerField(validators=[exist_user_id]) startDate = serializers.DateField() finishDate = serializers.DateField() - sortBy = serializers.ChoiceField(choices=[DES_CREATEDATE, ASC_CREATEDATE], required=False, default=DES_CREATEDATE) \ No newline at end of file + sortBy = serializers.ChoiceField(choices=[key for key in DATE_SORT_MAPPER.keys()], required=False, default=DES_CREATEDATE) \ No newline at end of file diff --git a/diary/views.py b/diary/views.py index fae8d67..83c3725 100644 --- a/diary/views.py +++ b/diary/views.py @@ -5,6 +5,7 @@ from config.basemodel import ApiResponse, validator from config.settings import REQUEST_BODY, REQUEST_PATH, REQUEST_QUERY +from config.sort_options import DATE_SORT_MAPPER from diary.serializers import * from users.models import User from .graph import GraphDB @@ -287,9 +288,6 @@ def get(self, request): response_status=status.HTTP_200_OK ) -DES_CREATEDATE = 'DES_CREATE_DATE' -ASC_CREATEDATE = 'ASC_CREATE_DATE' - class GetDiaryByUserAndDateView(APIView): @transaction.atomic @swagger_auto_schema( @@ -306,11 +304,7 @@ def get(self, request): finishDate = request.query.validated_data.get('finishDate') sortBy = request.query.validated_data.get('sortBy') - sortMapping = { - DES_CREATEDATE: '-createDate', - ASC_CREATEDATE: 'createDate' - } - sortField = sortMapping.get(sortBy, 'createDate') # 기본값은 'createDate' + sortField = DATE_SORT_MAPPER.get(sortBy) # 해당 userId, startDate, finishDate에 해당하는 일기를 조회 diaries = Diary.objects.filter( From 5b15f28ee22cb4f309c77a6175fd6afb62851a2c Mon Sep 17 00:00:00 2001 From: rvbear Date: Sat, 8 Jun 2024 23:42:57 +0900 Subject: [PATCH 09/16] =?UTF-8?q?[refactor]=20View=20class=EB=AA=85=20?= =?UTF-8?q?=EC=A7=81=EA=B4=80=ED=99=94=EB=A5=BC=20=EC=9C=84=ED=95=B4=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diary/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/diary/urls.py b/diary/urls.py index 83f13f3..cafc440 100644 --- a/diary/urls.py +++ b/diary/urls.py @@ -9,6 +9,6 @@ path('//graph', GetNodeData.as_view()), path('/user/', GetDiaryByUserView.as_view()), path('/checkanswer', CheckAnswerView.as_view()), - path('/checkdiary', IsExistDiaryView.as_view()), + path('/check', CheckDiaryEntriesView.as_view()), path('/list', GetDiaryByUserAndDateView.as_view()), ] From 1193ada7269c3ec9c51a0a6a0ec1b58e41a5682b Mon Sep 17 00:00:00 2001 From: rvbear Date: Sat, 8 Jun 2024 23:45:12 +0900 Subject: [PATCH 10/16] =?UTF-8?q?[refactor]=20=EC=A7=81=EA=B4=80=EC=84=B1?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20serializer=20class=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diary/serializers.py | 2 +- diary/views.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/diary/serializers.py b/diary/serializers.py index 52e9009..c7484f0 100644 --- a/diary/serializers.py +++ b/diary/serializers.py @@ -159,7 +159,7 @@ class AnswerListRequest(serializers.Serializer): answers = AnswerSerializer(many=True) -class IsExistDiaryRequest(serializers.Serializer): +class CheckDiaryEntriesRequest(serializers.Serializer): userId = serializers.IntegerField(validators=[exist_user_id]) year = serializers.IntegerField() month = serializers.IntegerField() diff --git a/diary/views.py b/diary/views.py index 83c3725..4a6c4e3 100644 --- a/diary/views.py +++ b/diary/views.py @@ -253,15 +253,15 @@ def get(self, request): ) -class IsExistDiaryView(APIView): +class CheckDiaryEntriesView(APIView): @transaction.atomic @swagger_auto_schema( operation_id="기간별 일기 유무 리스트 가져오기", operation_description="기간별 일기 유무 리스트 가져오기", - query_serializer=IsExistDiaryRequest(), + query_serializer=CheckDiaryEntriesRequest(), responses={status.HTTP_200_OK: ApiResponse.schema(ApiResponse)} ) - @validator(request_type=REQUEST_QUERY, request_serializer=IsExistDiaryRequest, return_key='query') + @validator(request_type=REQUEST_QUERY, request_serializer=CheckDiaryEntriesRequest, return_key='query') def get(self, request): # 요청 데이터에서 userId, year, month 추출 userId = request.query.validated_data.get('userId') From a2e3b81cb3d29120c60d3f80a226481e02282de2 Mon Sep 17 00:00:00 2001 From: rvbear Date: Sun, 9 Jun 2024 00:53:01 +0900 Subject: [PATCH 11/16] =?UTF-8?q?[feat]=20year,=20month=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=ED=95=98=EB=8A=94=20validator=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diary/serializers.py | 4 ++-- diary/validator.py | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/diary/serializers.py b/diary/serializers.py index c7484f0..6179c59 100644 --- a/diary/serializers.py +++ b/diary/serializers.py @@ -161,8 +161,8 @@ class AnswerListRequest(serializers.Serializer): class CheckDiaryEntriesRequest(serializers.Serializer): userId = serializers.IntegerField(validators=[exist_user_id]) - year = serializers.IntegerField() - month = serializers.IntegerField() + year = serializers.IntegerField(validators=[positive_year_value]) + month = serializers.IntegerField(validators=[positive_month_value]) class GetDiaryByUserAndDateRequest(serializers.Serializer): userId = serializers.IntegerField(validators=[exist_user_id]) diff --git a/diary/validator.py b/diary/validator.py index bccd987..a759339 100644 --- a/diary/validator.py +++ b/diary/validator.py @@ -16,3 +16,13 @@ def not_exist_diary_date(user_id, date): def exist_keyword_id(keyword_id): if not Keywords.objects.filter(id=keyword_id).exists(): raise serializers.ValidationError(f'keywordId: {keyword_id} 가 존재하지 않습니다.') + + +def positive_month_value(month): + if month < 0 or month > 12: + raise serializers.ValidationError(f'month의 입력이 잘못되었습니다.') + + +def positive_year_value(year): + if len(str(year)) is not 4: + raise serializers.ValidationError(f'year의 입력이 잘못되었습니다.') \ No newline at end of file From d9d17d1762b77b3d44e8a6ff81b8b30fb60abcf9 Mon Sep 17 00:00:00 2001 From: rvbear Date: Sun, 9 Jun 2024 01:08:45 +0900 Subject: [PATCH 12/16] =?UTF-8?q?[feat]=20=EC=A0=95=EB=A0=AC=EC=8B=9C=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=A0=20validator=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diary/serializers.py | 9 ++++++--- diary/validator.py | 12 +++++++++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/diary/serializers.py b/diary/serializers.py index 6179c59..8708f88 100644 --- a/diary/serializers.py +++ b/diary/serializers.py @@ -161,11 +161,14 @@ class AnswerListRequest(serializers.Serializer): class CheckDiaryEntriesRequest(serializers.Serializer): userId = serializers.IntegerField(validators=[exist_user_id]) - year = serializers.IntegerField(validators=[positive_year_value]) - month = serializers.IntegerField(validators=[positive_month_value]) + year = serializers.IntegerField(validators=[positive_year]) + month = serializers.IntegerField(validators=[positive_month]) class GetDiaryByUserAndDateRequest(serializers.Serializer): userId = serializers.IntegerField(validators=[exist_user_id]) startDate = serializers.DateField() finishDate = serializers.DateField() - sortBy = serializers.ChoiceField(choices=[key for key in DATE_SORT_MAPPER.keys()], required=False, default=DES_CREATEDATE) \ No newline at end of file + sortBy = serializers.ChoiceField(choices=[key for key in DATE_SORT_MAPPER.keys()], + required=False, + default=DES_CREATEDATE, + validators=[positive_sort_by]) \ No newline at end of file diff --git a/diary/validator.py b/diary/validator.py index a759339..3d2a657 100644 --- a/diary/validator.py +++ b/diary/validator.py @@ -1,6 +1,7 @@ from rest_framework import serializers from diary.models import Diary, Keywords +from config.sort_options import DATE_SORT_MAPPER def exist_diary_id(diary_id): @@ -18,11 +19,16 @@ def exist_keyword_id(keyword_id): raise serializers.ValidationError(f'keywordId: {keyword_id} 가 존재하지 않습니다.') -def positive_month_value(month): +def positive_month(month): if month < 0 or month > 12: raise serializers.ValidationError(f'month의 입력이 잘못되었습니다.') -def positive_year_value(year): +def positive_year(year): if len(str(year)) is not 4: - raise serializers.ValidationError(f'year의 입력이 잘못되었습니다.') \ No newline at end of file + raise serializers.ValidationError(f'year의 입력이 잘못되었습니다.') + + +def positive_sort_by(value): + if value not in DATE_SORT_MAPPER.keys(): + raise serializers.ValidationError(f'sortBy 값이 유효하지 않습니다.') \ No newline at end of file From bd8a567a9cf5efbb87fa189fd74add1054c680fe Mon Sep 17 00:00:00 2001 From: rvbear Date: Tue, 11 Jun 2024 21:11:01 +0900 Subject: [PATCH 13/16] =?UTF-8?q?[feat]=20NewResponse=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diary/serializers.py | 6 +++++- diary/views.py | 21 +++++++++++++++------ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/diary/serializers.py b/diary/serializers.py index 8708f88..136243e 100644 --- a/diary/serializers.py +++ b/diary/serializers.py @@ -171,4 +171,8 @@ class GetDiaryByUserAndDateRequest(serializers.Serializer): sortBy = serializers.ChoiceField(choices=[key for key in DATE_SORT_MAPPER.keys()], required=False, default=DES_CREATEDATE, - validators=[positive_sort_by]) \ No newline at end of file + validators=[positive_sort_by]) + +class NewResponse(serializers.Serializer): + user = UserSafeSerializer() + diaries = DiaryResultResponse(many=True) \ No newline at end of file diff --git a/diary/views.py b/diary/views.py index 4a6c4e3..6e64e5f 100644 --- a/diary/views.py +++ b/diary/views.py @@ -320,9 +320,18 @@ def get(self, request): # 일기 정보를 DiaryResultResponse를 사용하여 직렬화 diaryList = DiaryResultResponse(diaries, many=True).data - # 결과를 JSON 형식으로 반환 - result = {"user": userInfo, "diaries": diaryList} - return ApiResponse.on_success( - result=result, - response_status=status.HTTP_200_OK - ) \ No newline at end of file + response_data = {"user": userInfo, "diaries": diaryList} + result = NewResponse(data=response_data) + + # NewResponse의 유효성 검사 및 응답 생성 + if result.is_valid(): + valid_data = result.validated_data + return ApiResponse.on_success( + result=valid_data, + response_status=status.HTTP_200_OK + ) + else: + return ApiResponse.on_fail( + message="Invalid data provided", + response_status=status.HTTP_400_BAD_REQUEST + ) \ No newline at end of file From b0a6cf1d37560761c769c2247549c0789224194e Mon Sep 17 00:00:00 2001 From: rvbear Date: Tue, 11 Jun 2024 23:13:20 +0900 Subject: [PATCH 14/16] =?UTF-8?q?[fix]=20NewResponse=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0=20=EB=B0=8F=20?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diary/serializers.py | 9 ++++++++- diary/views.py | 27 +++++++++------------------ 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/diary/serializers.py b/diary/serializers.py index 136243e..fdcf86c 100644 --- a/diary/serializers.py +++ b/diary/serializers.py @@ -175,4 +175,11 @@ class GetDiaryByUserAndDateRequest(serializers.Serializer): class NewResponse(serializers.Serializer): user = UserSafeSerializer() - diaries = DiaryResultResponse(many=True) \ No newline at end of file + diaries = DiaryResultResponse(many=True) + + @staticmethod + def to_json(user_data, diaries_data): + return { + 'user': user_data, + 'diaries': diaries_data + } \ No newline at end of file diff --git a/diary/views.py b/diary/views.py index 6e64e5f..ced1138 100644 --- a/diary/views.py +++ b/diary/views.py @@ -316,22 +316,13 @@ def get(self, request): user = User.objects.get(id=userId) # 유저 정보를 UserSafeSerializer를 사용해서 구조화 - userInfo = UserSafeSerializer(user).data + user_info = UserSafeSerializer(user).data # 일기 정보를 DiaryResultResponse를 사용하여 직렬화 - diaryList = DiaryResultResponse(diaries, many=True).data - - response_data = {"user": userInfo, "diaries": diaryList} - result = NewResponse(data=response_data) - - # NewResponse의 유효성 검사 및 응답 생성 - if result.is_valid(): - valid_data = result.validated_data - return ApiResponse.on_success( - result=valid_data, - response_status=status.HTTP_200_OK - ) - else: - return ApiResponse.on_fail( - message="Invalid data provided", - response_status=status.HTTP_400_BAD_REQUEST - ) \ No newline at end of file + diary_list = DiaryResultResponse(diaries, many=True).data + + result = GetDiaryByUserAndDateResponse.to_json(user_data=user_info, diaries_data=diary_list) + + return ApiResponse.on_success( + result=result, + response_status=status.HTTP_200_OK + ) From c40fdcb132c99e640465893ba477ae2492a4f28c Mon Sep 17 00:00:00 2001 From: rvbear Date: Tue, 11 Jun 2024 23:24:48 +0900 Subject: [PATCH 15/16] =?UTF-8?q?[feat]=20=EA=B8=B0=EA=B0=84=EB=B3=84=20?= =?UTF-8?q?=EC=9D=BC=EA=B8=B0=20=EC=9C=A0=EB=AC=B4=20API=EC=9D=98=20Respon?= =?UTF-8?q?se=EC=97=90=20diaryId=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diary/views.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/diary/views.py b/diary/views.py index ced1138..8e9e371 100644 --- a/diary/views.py +++ b/diary/views.py @@ -272,17 +272,18 @@ def get(self, request): _, lastDay = calendar.monthrange(year, month) # 일기가 존재하는 날짜를 dict으로 초기화 - Diaries = {day: False for day in range(1, lastDay + 1)} + diary_dict = {day: {"isExist": False, "diaryId": None} for day in range(1, lastDay + 1)} # 해당 userId, year, month에 해당하는 일기를 조회 diaries = Diary.objects.filter(user_id=userId, createDate__year=year, createDate__month=month) # 조회된 일기의 날짜를 boolean 배열에 반영 for diary in diaries: - Diaries[diary.createDate.day] = True + diary_dict[diary.createDate.day]["isExist"] = True + diary_dict[diary.createDate.day]["diaryId"] = diary.id # 결과를 JSON 형식으로 반환 - result = {f'{year}-{month}': Diaries} + result = {f'{year}-{month}': diary_dict} return ApiResponse.on_success( result=result, response_status=status.HTTP_200_OK From bb9e820290a13e9860fee63b417268a9849d5287 Mon Sep 17 00:00:00 2001 From: rvbear Date: Tue, 11 Jun 2024 23:32:31 +0900 Subject: [PATCH 16/16] [feat] Rename Seralizer --- diary/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/diary/serializers.py b/diary/serializers.py index fdcf86c..57c9ba9 100644 --- a/diary/serializers.py +++ b/diary/serializers.py @@ -173,7 +173,7 @@ class GetDiaryByUserAndDateRequest(serializers.Serializer): default=DES_CREATEDATE, validators=[positive_sort_by]) -class NewResponse(serializers.Serializer): +class GetDiaryByUserAndDateResponse(serializers.Serializer): user = UserSafeSerializer() diaries = DiaryResultResponse(many=True)