diff --git a/modal_backend/routes/notes.py b/modal_backend/routes/notes.py index 2b04efb..b7793bf 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,19 @@ 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: + """ + Архивирует модалку, если она активна + + Возвращает модалку в активное состояние, если она в архиве + + Права: `["modal.note.patch"]` + + Исключение **ObjectNotFound**, если `id` не найден + + """ + 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..8717068 100644 --- a/modal_backend/utils/services.py +++ b/modal_backend/utils/services.py @@ -1,7 +1,9 @@ +from datetime import datetime + 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,26 @@ 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) + group_ids = note.group_ids + for group_id in group_ids: + Group.get(session=db.session, id=group_id) + service_ids = note.service_ids + for service_id in service_ids: + Service.get(session=db.session, id=service_id) + end_ts = note.end_ts + time = datetime.utcnow() + if note.is_always == False and time >= end_ts: + raise ForbiddenAction(Note) + else: + if note.status == ModalStatus.ACTIVE: + updated_note = Note.update(id=id, session=db.session, status=ModalStatus.ARCHIVED) + else: + updated_note = Note.update(id=id, session=db.session, status=ModalStatus.ACTIVE) + return updated_note + class NoteTypeService: """