diff --git a/modal_backend/routes/notes.py b/modal_backend/routes/notes.py index 2b04efb..4c535eb 100644 --- a/modal_backend/routes/notes.py +++ b/modal_backend/routes/notes.py @@ -16,6 +16,7 @@ NoteInfoPost, NoteRatingGet, NoteRatingPost, + NoteStatus, NoteTextGet, NoteTextPost, NotificationGet, @@ -185,3 +186,26 @@ async def create_note_images( session=db.session, type_id=5, **note.model_dump(), admin_id=user.get("id"), status=ModalStatus.ACTIVE ) return NoteImageGet.model_validate(new_note) + + +@note.patch("/{id}/status", response_model=NoteStatus) +async def update_note_status(id: int, user=Depends(UnionAuth(scopes=["modal.note.patch"]))) -> NoteStatus: + """ + Архивирует модалку, если она активна + + Если модалка в архиве, возвращает её в активное состояние, убирая из `group_ids` и `service_ids` ненайденные группы и сервисы + + Права: `["modal.note.patch"]` + + Исключение **ObjectNotFound**, если `id` не найден + + Исключения, которые могут возникнуть при возврате в активное состояние: + + Исключение **ForbiddenAction**, если ни одна группа из списка `group_ids` не найдена + + Исключение **ForbiddenAction**, если ни один сервис из списка `service_ids` не найден + + Исключение **ForbiddenAction**, если время модалки истекло + """ + updated_note = await NoteService.update_status(db, id=id) + return NoteStatus.model_validate(updated_note) diff --git a/modal_backend/schemas/models.py b/modal_backend/schemas/models.py index f10bfaa..2127bf4 100644 --- a/modal_backend/schemas/models.py +++ b/modal_backend/schemas/models.py @@ -119,3 +119,8 @@ class GroupGet(Base): class GroupPost(Base): group_id: int name: str + + +class NoteStatus(Base): + id: int + status: ModalStatus diff --git a/modal_backend/utils/services.py b/modal_backend/utils/services.py index 82eeeec..5c39c86 100644 --- a/modal_backend/utils/services.py +++ b/modal_backend/utils/services.py @@ -1,7 +1,9 @@ +from datetime import datetime, timezone + from requests import Session -from modal_backend.exceptions import AlreadyExists, ObjectNotFound -from modal_backend.models.db import Group, Note, NoteType, Service +from modal_backend.exceptions import AlreadyExists, ForbiddenAction, ObjectNotFound +from modal_backend.models.db import Group, ModalStatus, Note, NoteType, Service from modal_backend.schemas.base import StatusResponseModel from modal_backend.schemas.models import GroupPost, NoteTypePost, ServicePost @@ -41,6 +43,48 @@ async def get_notes_by_filters( return notes + @classmethod + async def update_status(cls, db: Session, id: int) -> Note: + note = Note.get(session=db.session, id=id) + if note.status == ModalStatus.ACTIVE: + updated_note = Note.update(id=id, session=db.session, status=ModalStatus.ARCHIVED) + return updated_note + else: + group_ids = note.group_ids + new_group_ids = [] + for group_id in group_ids: + group = db.session.query(Group).filter(Group.id == group_id, Group.is_deleted == False).one_or_none() + if group is not None: + new_group_ids.append(group.id) + if new_group_ids == []: + raise ForbiddenAction(Note) + + service_ids = note.service_ids + new_service_ids = [] + for service_id in service_ids: + service = ( + db.session.query(Service) + .filter(Service.id == service_id, Service.is_deleted == False) + .one_or_none() + ) + if service is not None: + new_service_ids.append(service.id) + if new_service_ids == []: + raise ForbiddenAction(Note) + + end_ts = note.end_ts + time = datetime.now(timezone.utc).replace(tzinfo=None) + if note.is_always == False and time >= end_ts: + raise ForbiddenAction(Note) + updated_note = Note.update( + id=id, + session=db.session, + group_ids=new_group_ids, + service_ids=new_service_ids, + status=ModalStatus.ACTIVE, + ) + return updated_note + class NoteTypeService: """