From 37dbdb0324e5a3bda35509ec1486273ab0c30d59 Mon Sep 17 00:00:00 2001 From: morecleverer Date: Sat, 25 Jan 2025 18:47:45 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=ED=88=AC=ED=91=9C=20=EC=A1=B0=EA=B8=B0=20?= =?UTF-8?q?=EC=A2=85=EB=A3=8C=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- snuvote/app/vote/errors.py | 4 ++++ snuvote/app/vote/service.py | 12 +++++++++++- snuvote/app/vote/store.py | 6 ++++++ snuvote/app/vote/views.py | 18 ++++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/snuvote/app/vote/errors.py b/snuvote/app/vote/errors.py index 7abe036..4ac32a5 100644 --- a/snuvote/app/vote/errors.py +++ b/snuvote/app/vote/errors.py @@ -69,6 +69,10 @@ class InvalidFileExtensionError(HTTPException): def __init__(self) -> None: super().__init__(HTTP_400_BAD_REQUEST, "Invalid file extension") +class VoteNotYoursError(HTTPException): + def __init__(self) -> None: + super().__init__(HTTP_403_FORBIDDEN, "Vote not yours") + class InvalidVoteListCategoryError(HTTPException): def __init__(self) -> None: diff --git a/snuvote/app/vote/service.py b/snuvote/app/vote/service.py index 6778854..095f1e1 100644 --- a/snuvote/app/vote/service.py +++ b/snuvote/app/vote/service.py @@ -3,7 +3,7 @@ from fastapi import Depends, UploadFile from snuvote.database.models import Vote, User, Choice, ChoiceParticipation, Comment from snuvote.app.vote.store import VoteStore -from snuvote.app.vote.errors import ChoiceNotFoundError, InvalidFieldFormatError, MultipleChoicesError, ParticipationCodeError, ParticipationCodeNotProvidedError, WrongParticipationCodeError, EndedVoteError, CommentNotYoursError, CommentNotInThisVoteError, InvalidFileExtensionError +from snuvote.app.vote.errors import ChoiceNotFoundError, VoteNotYoursError, MultipleChoicesError, ParticipationCodeError, ParticipationCodeNotProvidedError, WrongParticipationCodeError, EndedVoteError, CommentNotYoursError, CommentNotInThisVoteError, InvalidFileExtensionError from snuvote.app.vote.dto.requests import ParticipateVoteRequest, CommentRequest from datetime import datetime, timedelta, timezone @@ -138,6 +138,16 @@ def participate_vote(self, vote: Vote, user: User, participate_vote_request: Par return self.vote_store.participate_vote(vote=vote, user_id=user_id, choice_id_list=choice_id_list) + #투표 조기 종료하기 + def close_vote(self, vote:Vote, user: User)-> None: + + #만약 투표 작성자가 아닐 경우 + if vote.writer_id != user.id: + raise VoteNotYoursError() + + self.vote_store.close_vote(vote_id=vote.id) + + def create_comment(self, vote: Vote, user: User, comment_request: CommentRequest) -> None: self.vote_store.create_comment(vote_id=vote.id, writed_id=user.id, content=comment_request.content) diff --git a/snuvote/app/vote/store.py b/snuvote/app/vote/store.py index c95e6d3..2d14909 100644 --- a/snuvote/app/vote/store.py +++ b/snuvote/app/vote/store.py @@ -333,6 +333,12 @@ def participate_vote(self, vote: Vote, user_id: int, choice_id_list: List[int]) self.session.commit() return vote + #투표 조기 종료하기 + def close_vote(self, vote_id: int) -> None: + vote = self.get_vote_by_vote_id(vote_id) + vote.end_datetime = datetime.now(timezone.utc) + self.session.commit() + def create_comment(self, vote_id: int, writed_id: int, content: str) -> Vote: comment = Comment(vote_id=vote_id, writer_id=writed_id, content=content, create_datetime=datetime.now(timezone.utc), diff --git a/snuvote/app/vote/views.py b/snuvote/app/vote/views.py index 729ddcf..bf8a956 100644 --- a/snuvote/app/vote/views.py +++ b/snuvote/app/vote/views.py @@ -148,6 +148,24 @@ def paricipate_vote( return get_vote(vote.id, user, vote_service) +#투표 조기 종료하기 +@vote_router.patch("/{vote_id}/close", status_code=HTTP_200_OK) +def close_vote( + vote_id: int, + user: Annotated[User, Depends(login_with_access_token)], + vote_service: Annotated[VoteService, Depends()] +): + vote = vote_service.get_vote_by_vote_id(vote_id = vote_id) + + # 해당 vote_id에 해당하는 투표글이 없을 경우 404 Not Found + if not vote: + raise VoteNotFoundError() + + vote_service.close_vote(vote, user) + + return get_vote(vote.id, user, vote_service) + + # 댓글 추가하기 @vote_router.post("/{vote_id}/comment", status_code=HTTP_201_CREATED) def create_comment( From 8f13cba812484a026ecd9b25f2580e446dff59f3 Mon Sep 17 00:00:00 2001 From: odumag99 Date: Sun, 26 Jan 2025 17:27:08 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EC=9D=B4=EB=AF=B8=20=EC=A7=80=EB=82=9C=20?= =?UTF-8?q?=ED=88=AC=ED=91=9C=EC=9D=98=20=ED=88=AC=ED=91=9C=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=20=EC=8B=9C=EA=B0=84=20=EC=A1=B0=EC=9E=91=20=EB=B0=A9?= =?UTF-8?q?=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- snuvote/app/vote/service.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/snuvote/app/vote/service.py b/snuvote/app/vote/service.py index 095f1e1..db90978 100644 --- a/snuvote/app/vote/service.py +++ b/snuvote/app/vote/service.py @@ -145,6 +145,9 @@ def close_vote(self, vote:Vote, user: User)-> None: if vote.writer_id != user.id: raise VoteNotYoursError() + if vote.end_datetime <= datetime.now(tz=timezone.utc).replace(tzinfo=None): + raise EndedVoteError() + self.vote_store.close_vote(vote_id=vote.id)