Skip to content

Commit b10b8cd

Browse files
Feat #25 - 유치원 요약 정보 조회 API 구현 (#26)
- 유치원 요약 정보 조회 기능 구현 - PetKindergardenSelector 클래스의 get_queryset_by_user 메서드 반환 타입 수정 Close #25
1 parent 245a914 commit b10b8cd

File tree

6 files changed

+116
-8
lines changed

6 files changed

+116
-8
lines changed

mung_manager/pet_kindergardens/apis/api_managers.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from mung_manager.pet_kindergardens.apis.apis import (
77
PetKindergardenListAPI,
88
PetKindergardenSelectionAPI,
9+
PetKindergardenSummaryInfoAPI,
910
)
1011
from mung_manager.schemas.errors.authentications import (
1112
ErrorAuthenticationPasswordChangedSchema,
@@ -117,3 +118,43 @@ class PetKindergardenSelectionAPIManager(BaseAPIManager):
117118
)
118119
def post(self, request, *args, **kwargs):
119120
return self.VIEWS_BY_METHOD["POST"]()(request, *args, **kwargs)
121+
122+
123+
class PetKindergardenSummaryInfoAPIManager(BaseAPIManager):
124+
VIEWS_BY_METHOD = {
125+
"GET": PetKindergardenSummaryInfoAPI.as_view,
126+
}
127+
128+
@extend_schema(
129+
tags=["반려동물 유치원"],
130+
summary="반려동물 유치원 요약 정보 조회",
131+
description="""
132+
Rogic
133+
- 유저 토큰 클레임에 포함된 반려동물 유치원 아이디로 해당 반려동물 유치원의 요약 정보를 조회합니다.
134+
""",
135+
responses={
136+
status.HTTP_200_OK: VIEWS_BY_METHOD["GET"]().cls.OutputSerializer,
137+
status.HTTP_401_UNAUTHORIZED: OpenApiResponse(
138+
response=OpenApiTypes.OBJECT,
139+
examples=[
140+
ErrorAuthenticationFailedSchema,
141+
ErrorNotAuthenticatedSchema,
142+
ErrorInvalidTokenSchema,
143+
ErrorAuthorizationHeaderSchema,
144+
ErrorAuthenticationPasswordChangedSchema,
145+
ErrorAuthenticationUserDeletedSchema,
146+
ErrorAuthenticationUserInactiveSchema,
147+
ErrorAuthenticationUserNotFoundSchema,
148+
ErrorTokenIdentificationSchema,
149+
],
150+
),
151+
status.HTTP_403_FORBIDDEN: OpenApiResponse(
152+
response=OpenApiTypes.OBJECT, examples=[ErrorPermissionDeniedSchema]
153+
),
154+
status.HTTP_500_INTERNAL_SERVER_ERROR: OpenApiResponse(
155+
response=OpenApiTypes.OBJECT, examples=[ErrorUnknownServerSchema]
156+
),
157+
},
158+
)
159+
def get(self, request, *args, **kwargs):
160+
return self.VIEWS_BY_METHOD["GET"]()(request, *args, **kwargs)

mung_manager/pet_kindergardens/apis/apis.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from rest_framework.response import Response
44
from rest_framework.views import APIView
55

6-
from mung_manager.apis.mixins import APIAuthMixin
6+
from mung_manager.apis.mixins import APIAuthMixin, APIAuthWithPetKindergardenAccessMixin
77
from mung_manager.authentications.containers import AuthenticationContainer
88
from mung_manager.commons.base.serializers import BaseSerializer
99
from mung_manager.pet_kindergardens.containers import PetKindergardenContainer
@@ -56,3 +56,23 @@ def post(self, request: Request) -> Response:
5656
}
5757
).data
5858
return Response(data=auth_data, status=status.HTTP_200_OK)
59+
60+
61+
class PetKindergardenSummaryInfoAPI(APIAuthWithPetKindergardenAccessMixin, APIView):
62+
class OutputSerializer(BaseSerializer):
63+
id = serializers.IntegerField(label="유치원 아이디")
64+
name = serializers.CharField(label="유치원 이름")
65+
business_start_hour = serializers.TimeField(label="영업 시작 시간", format="%H:%M")
66+
business_end_hour = serializers.TimeField(label="영업 종료 시간", format="%H:%M")
67+
68+
def __init__(self, *args, **kwargs):
69+
super().__init__(*args, **kwargs)
70+
self._pet_kindergarden_selector = PetKindergardenContainer.pet_kindergarden_selector()
71+
72+
def get(self, request: Request) -> Response:
73+
pet_kindergarden_id = request.pet_kindergarden_id
74+
pet_kindergarden = self._pet_kindergarden_selector.get_by_pet_kindergarden_id_for_summary_info(
75+
pet_kindergarden_id
76+
).get()
77+
pet_kindergardens_data = self.OutputSerializer(pet_kindergarden).data
78+
return Response(data=pet_kindergardens_data, status=status.HTTP_200_OK)

mung_manager/pet_kindergardens/apis/urls.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from mung_manager.pet_kindergardens.apis.api_managers import (
44
PetkindergardenListAPIManager,
55
PetKindergardenSelectionAPIManager,
6+
PetKindergardenSummaryInfoAPIManager,
67
)
78

89
urlpatterns = [
@@ -16,4 +17,9 @@
1617
PetKindergardenSelectionAPIManager.as_view(),
1718
name="pet-kindergarden-selection",
1819
),
20+
path(
21+
"/summary",
22+
PetKindergardenSummaryInfoAPIManager.as_view(),
23+
name="pet-kindergarden-summary-info",
24+
),
1925
]
Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,27 @@
11
from abc import ABC, abstractmethod
22
from typing import Any
33

4-
from django.db.models.query import QuerySet
4+
from django.db.models import QuerySet
5+
from django_stubs_ext import ValuesQuerySet, WithAnnotations
56

67
from mung_manager.errors.exceptions import NotImplementedException
8+
from mung_manager.pet_kindergardens.models import PetKindergarden
9+
from mung_manager.pet_kindergardens.selectors.pet_kindergardens import (
10+
info_for_full_address,
11+
)
12+
from mung_manager.pet_kindergardens.types import info_for_summary
713

814

915
class AbstractPetKindergardenSelector(ABC):
1016

1117
@abstractmethod
1218
def get_queryset_by_user(
13-
self,
14-
user,
15-
) -> QuerySet[Any]:
19+
self, user
20+
) -> QuerySet[WithAnnotations[PetKindergarden, info_for_full_address], dict[str, Any]]:
21+
raise NotImplementedException()
22+
23+
@abstractmethod
24+
def get_by_pet_kindergarden_id_for_summary_info(
25+
self, pet_kindergarden_id: int
26+
) -> ValuesQuerySet[PetKindergarden, info_for_summary]:
1627
raise NotImplementedException()

mung_manager/pet_kindergardens/selectors/pet_kindergardens.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,53 @@
22

33
from django.db.models import F, QuerySet, Value
44
from django.db.models.functions import Concat
5+
from django_stubs_ext import WithAnnotations
6+
from django_stubs_ext.aliases import ValuesQuerySet
57

68
from mung_manager.pet_kindergardens.models import PetKindergarden
79
from mung_manager.pet_kindergardens.selectors.abstracts import (
810
AbstractPetKindergardenSelector,
911
)
12+
from mung_manager.pet_kindergardens.types import info_for_full_address, info_for_summary
1013

1114

1215
class PetKindergardenSelector(AbstractPetKindergardenSelector):
1316
"""
1417
이 클래스는 반려동물 유치원을 DB에서 PULL하는 비즈니스 로직을 담당합니다.
1518
"""
1619

17-
def get_queryset_by_user(self, user) -> QuerySet[Any]:
18-
"""이 함수는 사용자 정보로, 해당 사용자가 속한 유치원 목록을 조회합니다.
20+
def get_queryset_by_user(
21+
self, user
22+
) -> QuerySet[WithAnnotations[PetKindergarden, info_for_full_address], dict[str, Any]]:
23+
"""
24+
이 함수는 사용자 정보로, 해당 사용자가 속한 유치원 목록을 조회합니다.
1925
2026
Args:
2127
user: User: 유저 객체
2228
2329
Returns:
24-
QuerySet[Any]: 존재하지 않으면 빈 쿼리셋을 반환
30+
QuerySet[WithAnnotations[PetKindergarden, info_for_full_address], dict[str, Any]]: 정의된 응답 스키마
2531
"""
2632

2733
return (
2834
PetKindergarden.objects.filter(customers__user=user)
2935
.annotate(full_address=Concat(F("road_address"), Value(" "), F("detail_address")))
3036
.values("id", "name", "full_address", "profile_thumbnail_url")
3137
)
38+
39+
def get_by_pet_kindergarden_id_for_summary_info(
40+
self, pet_kindergarden_id: int
41+
) -> ValuesQuerySet[PetKindergarden, info_for_summary]:
42+
"""
43+
이 함수는 반려동물 유치원 아이디로 해당 반려동물 유치원의 요약 정보를 조회합니다.
44+
45+
Args:
46+
pet_kindergarden_id (int): 반려동물 유치원 아이디
47+
48+
Returns:
49+
ValuesQuerySet[PetKindergarden, info_for_summary]: 정의된 응답 스키마
50+
"""
51+
52+
return PetKindergarden.objects.filter(id=pet_kindergarden_id).values(
53+
"id", "name", "business_start_hour", "business_end_hour"
54+
)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from datetime import time
2+
from typing import TypedDict
3+
4+
info_for_full_address = TypedDict("info_for_full_address", {"full_address": str})
5+
info_for_summary = TypedDict(
6+
"info_for_summary", {"id": int, "name": str, "business_start_hour": time, "business_end_hour": time}
7+
)

0 commit comments

Comments
 (0)