From 7931e0a59644ffaeecbc6b846b02445a6433f3b3 Mon Sep 17 00:00:00 2001 From: morecleverer Date: Thu, 16 Jan 2025 21:45:50 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- snuvote/app/vote/service.py | 4 ++-- snuvote/app/vote/store.py | 25 +++++++++++++++++++++++-- snuvote/app/vote/views.py | 10 ++++++---- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/snuvote/app/vote/service.py b/snuvote/app/vote/service.py index d81205a..5b72848 100644 --- a/snuvote/app/vote/service.py +++ b/snuvote/app/vote/service.py @@ -43,8 +43,8 @@ def add_vote(self, choices=choices) # 진행 중인 투표 리스트 조회 - def get_ongoing_list(self) -> List[Vote]: - return self.vote_store.get_ongoing_list() + def get_ongoing_list(self, start_cursor: datetime|None) -> tuple[List[Vote], bool, datetime]: + return self.vote_store.get_ongoing_list(start_cursor) # 투표글 상세 내용 조회 def get_vote_by_vote_id(self, vote_id: int) -> Vote: diff --git a/snuvote/app/vote/store.py b/snuvote/app/vote/store.py index 95f7641..5a34ca1 100644 --- a/snuvote/app/vote/store.py +++ b/snuvote/app/vote/store.py @@ -56,8 +56,29 @@ def add_vote(self, return vote # 진행 중인 투표 리스트 조회 - def get_ongoing_list(self) -> List[Vote]: - return self.session.execute(select(Vote).where(Vote.end_datetime > datetime.now(timezone.utc))).scalars().all() + def get_ongoing_list(self, start_cursor: datetime|None) -> tuple[List[Vote], bool, datetime]: + + #커서가 none이면 가장 최신 것부터 40개 + if cursor is None: + cursor = datetime.now(timezone.utc) + + #생성 시간이 커서보다 최신인 것부터 오름차순(최신순)으로 40개 리턴 + query = ( + select(Vote) + .where(Vote.create_datetime < cursor) + .order_by(Vote.create_datetime.asc()) + .limit(40) + ) + + results = self.session.execute(query).scalars().all() + + #다음 커서는 40개 중 가장 과거에 생성된 것 + next_cursor = results[-1].create_datetime if results else None + + #만약 40개를 꽉 채웠다면 추가 내용이 있을 가능성 있음 + has_next = len(results) == 40 + + return results, has_next, next_cursor # 투표글 상세 내용 조회 def get_vote_by_vote_id(self, vote_id: int) -> Vote: diff --git a/snuvote/app/vote/views.py b/snuvote/app/vote/views.py index a3c7f49..0623299 100644 --- a/snuvote/app/vote/views.py +++ b/snuvote/app/vote/views.py @@ -8,6 +8,7 @@ from snuvote.app.vote.dto.requests import CreateVoteRequest, ParticipateVoteRequest, CommentRequest from snuvote.app.vote.dto.responses import OnGoingVotesListResponse, VotesListInfoResponse, VoteDetailResponse, ChoiceDetailResponse, CommentDetailResponse from snuvote.app.vote.errors import VoteNotFoundError, MultipleChoicesError, ChoiceNotFoundError, CommentNotFoundError +from datetime import datetime, timedelta, timezone from snuvote.database.models import User from snuvote.app.vote.service import VoteService @@ -45,13 +46,14 @@ def create_vote( @vote_router.get("/ongoing_list", status_code=HTTP_200_OK) def get_ongoing_list( user: Annotated[User, Depends(login_with_access_token)], + start_cursor: datetime|None, vote_service: Annotated[VoteService, Depends()] ): - votes = vote_service.get_ongoing_list() + votes, has_next, next_cursor = vote_service.get_ongoing_list(start_cursor) return OnGoingVotesListResponse( - votes_list = list(reversed([ VotesListInfoResponse.from_vote_user(vote, user) for vote in votes])), - has_next = True, - next_cursor = 'next_cursor' + votes_list = list([ VotesListInfoResponse.from_vote_user(vote, user) for vote in votes]), + has_next = has_next, + next_cursor = next_cursor ) From 6c6d6c816ad8d7094098eb57c8dcda764427ed70 Mon Sep 17 00:00:00 2001 From: odumag99 Date: Fri, 17 Jan 2025 20:11:01 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- snuvote/app/vote/dto/responses.py | 2 +- snuvote/app/vote/service.py | 2 +- snuvote/app/vote/store.py | 17 +++++++++-------- snuvote/app/vote/views.py | 4 ++-- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/snuvote/app/vote/dto/responses.py b/snuvote/app/vote/dto/responses.py index f2ed333..2488a19 100644 --- a/snuvote/app/vote/dto/responses.py +++ b/snuvote/app/vote/dto/responses.py @@ -55,7 +55,7 @@ def from_vote_user(vote: Vote, user: User) -> "VotesListInfoResponse": class OnGoingVotesListResponse(BaseModel): votes_list: List[VotesListInfoResponse] has_next: bool - next_cursor: str|None = None + next_cursor: datetime|None = None class ChoiceDetailResponse(BaseModel): choice_id: int diff --git a/snuvote/app/vote/service.py b/snuvote/app/vote/service.py index 5b72848..3420bb1 100644 --- a/snuvote/app/vote/service.py +++ b/snuvote/app/vote/service.py @@ -43,7 +43,7 @@ def add_vote(self, choices=choices) # 진행 중인 투표 리스트 조회 - def get_ongoing_list(self, start_cursor: datetime|None) -> tuple[List[Vote], bool, datetime]: + def get_ongoing_list(self, start_cursor: datetime|None) -> tuple[List[Vote], bool, datetime|None]: return self.vote_store.get_ongoing_list(start_cursor) # 투표글 상세 내용 조회 diff --git a/snuvote/app/vote/store.py b/snuvote/app/vote/store.py index 5a34ca1..7247923 100644 --- a/snuvote/app/vote/store.py +++ b/snuvote/app/vote/store.py @@ -56,28 +56,29 @@ def add_vote(self, return vote # 진행 중인 투표 리스트 조회 - def get_ongoing_list(self, start_cursor: datetime|None) -> tuple[List[Vote], bool, datetime]: + def get_ongoing_list(self, start_cursor: datetime|None) -> tuple[List[Vote], bool, datetime|None]: #커서가 none이면 가장 최신 것부터 40개 - if cursor is None: - cursor = datetime.now(timezone.utc) + if start_cursor is None: + start_cursor = datetime.now(timezone.utc) #생성 시간이 커서보다 최신인 것부터 오름차순(최신순)으로 40개 리턴 query = ( select(Vote) - .where(Vote.create_datetime < cursor) - .order_by(Vote.create_datetime.asc()) + .where(Vote.create_datetime < start_cursor) + .where(Vote.end_datetime > datetime.now(timezone.utc)) + .order_by(Vote.create_datetime.desc()) .limit(40) ) results = self.session.execute(query).scalars().all() - #다음 커서는 40개 중 가장 과거에 생성된 것 - next_cursor = results[-1].create_datetime if results else None - #만약 40개를 꽉 채웠다면 추가 내용이 있을 가능성 있음 has_next = len(results) == 40 + #다음 커서는 40개 중 가장 과거에 생성된 것 + next_cursor = results[-1].create_datetime if has_next else None + return results, has_next, next_cursor # 투표글 상세 내용 조회 diff --git a/snuvote/app/vote/views.py b/snuvote/app/vote/views.py index 0623299..a14a8ff 100644 --- a/snuvote/app/vote/views.py +++ b/snuvote/app/vote/views.py @@ -46,8 +46,8 @@ def create_vote( @vote_router.get("/ongoing_list", status_code=HTTP_200_OK) def get_ongoing_list( user: Annotated[User, Depends(login_with_access_token)], - start_cursor: datetime|None, - vote_service: Annotated[VoteService, Depends()] + vote_service: Annotated[VoteService, Depends()], + start_cursor: datetime|None = None ): votes, has_next, next_cursor = vote_service.get_ongoing_list(start_cursor) return OnGoingVotesListResponse(