Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 19 additions & 6 deletions rental_backend/routes/event.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
from typing import Optional

from auth_lib.fastapi import UnionAuth
Expand All @@ -7,7 +7,6 @@
from rental_backend.models.db import Event
from rental_backend.schemas.models import EventGet


event = APIRouter(prefix="/event", tags=["Event"])


Expand All @@ -19,14 +18,28 @@
user=Depends(UnionAuth(scopes=["rental.event.view"], auto_error=False)),
) -> list[EventGet]:
"""
Retrieves a list of events, with optional filtering.
Возвращает список событий с возможностью фильтрации.

Эндпоинт позволяет получить все события или отфильтровать их по пользователю,
администратору и сессии аренды.

Условия:
- Пользователь должен быть аутентифицирован
- Пользователь должен иметь право на просмотр событий

Скоупы:
- `rental.event.view`

Scopes: `["rental.event.view"]`
Параметры:
- `user_id` — (необязательный) фильтр по идентификатору пользователя
- `admin_id` — (необязательный) фильтр по идентификатору администратора
- `session_id` — (необязательный) фильтр по идентификатору сессии аренды

- **admin_id**: Filter events by admin ID.
- **session_id**: Filter events by session ID.
Возвращает:
- список объектов `Event`

Returns a list of events.
Ошибки:
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ахаххаха, забавно)
попробуй как минимум ввести -100

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ошибки отсутствуют лучше не писать никогда))

- отсутствуют
"""
query = db.session.query(Event)
if user_id is not None:
Expand Down
110 changes: 89 additions & 21 deletions rental_backend/routes/item.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
from auth_lib.fastapi import UnionAuth
from fastapi import APIRouter, Depends, Query
from fastapi_sqlalchemy import db
Expand All @@ -10,19 +10,29 @@
from rental_backend.settings import Settings, get_settings
from rental_backend.utils.action import ActionLogger


settings: Settings = get_settings()
item = APIRouter(prefix="/item", tags=["Items"])


@item.get("", response_model=list[ItemGet])
async def get_items(type_id: int = Query(None), user=Depends(UnionAuth())) -> list[ItemGet]:
"""
Retrieves a list of items. If `type_id` is specified, only items of that type are returned.
Возвращает список предметов. При указании `type_id` возвращаются только предметы заданного типа.

Условия:
- Пользователь должен быть аутентифицирован
Comment on lines +22 to +23
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

убрать
ты же ниже про скупы написал, что доступно любому авторизованному пользователю


Скоупы:
- отсутствуют (доступно любому авторизованному пользователю)

Параметры:
- `type_id` — (необязательный) идентификатор типа предмета для фильтрации

- **type_id**: The ID of the item type (optional).
Возвращает:
- список объектов `Item`

Returns a list of items.
Ошибки:
- отсутствуют
Comment on lines +34 to +35
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

аналогично
плюс пробуй ввести туда например текст

"""
query = Item.query(session=db.session)
if type_id is not None:
Expand All @@ -34,15 +44,27 @@
@item.post("", response_model=ItemGet)
async def create_item(item: ItemPost, user=Depends(UnionAuth(scopes=["rental.item.create"]))) -> ItemGet:
"""
Creates a new item.
Создает новый предмет.

Scopes: `["rental.item.create"]`
Перед созданием проверяется, существует ли тип предмета с указанным `type_id`.
После успешного создания действие логируется как `CREATE_ITEM`.

- **item**: The data for the new item.
Условия:
- Пользователь должен быть аутентифицирован
- Пользователь должен иметь право на создание предметов
- Тип предмета с указанным `type_id` должен существовать

Returns the created item.
Скоупы:
- `rental.item.create`

Raises **ObjectNotFound** if the item type with the specified `type_id` is not found.
Параметры:
- `item` — данные нового предмета
Comment on lines +60 to +61
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

это неправда, там параметры type_id и is_available


Возвращает:
- созданный объект `Item`

Ошибки:
- `ObjectNotFound` — тип предмета с указанным `type_id` не найден
Comment on lines +66 to +67
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

вот, в комментах выше что-то такое тоже надо делать

"""
item_type = ItemType.get(item.type_id, session=db.session)
if item_type is None:
Expand All @@ -65,16 +87,28 @@
user=Depends(UnionAuth(scopes=["rental.item.patch"])),
) -> ItemGet:
"""
Updates the availability status of an item by its ID.
Обновляет статус доступности предмета по его идентификатору.

Эндпоинт позволяет изменить только поле `is_available`.
После успешного обновления действие логируется как `UPDATE_ITEM`.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

логируется в event, из контекста это неочевидно


Условия:
- Пользователь должен быть аутентифицирован
- Пользователь должен иметь право на изменение предметов
- Предмет с указанным `id` должен существовать
Comment on lines +95 to +98
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

аналогично убрать


Scopes: `["rental.item.patch"]`
Скоупы:
- `rental.item.patch`

- **id**: The ID of the item.
- **is_available**: The new availability status for the item.
Параметры:
- `id` — идентификатор предмета
- `is_available` — новое значение доступности предмета

Returns the updated item.
Возвращает:
- обновленный объект `Item`

Raises **ObjectNotFound** if the item with the specified ID is not found.
Ошибки:
- `ObjectNotFound` — предмет с указанным `id` не найден
"""
item = Item.query(session=db.session).filter(Item.id == id).one_or_none()
if item is not None:
Expand All @@ -95,15 +129,34 @@
id: int, user=Depends(UnionAuth(scopes=["rental.item.delete"], allow_none=False))
) -> StatusResponseModel:
"""
Deletes an item by its ID.
Удаляет предмет по его идентификатору.

Scopes: `["rental.item.delete"]`
Перед удалением проверяется, что с предметом не связано активных,
зарезервированных или просроченных сессий аренды.
Если такие сессии существуют — удаление запрещено.

- **id**: The ID of the item.
При успешном удалении:
- удаляется сам предмет
- удаляются связанные сессии аренды (если они не помечены как удалённые)
- удаляются связанные страйки и события
- действие логируется как `DELETE_ITEM`
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

логируется в event, из контекста это неочевидно


Returns a status response.
Условия:
- Пользователь должен быть аутентифицирован
- Пользователь должен иметь право на удаление предметов
Comment on lines +145 to +146
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

только это убрать, про статусы оставить, там правильно

- У предмета не должно быть сессий в статусах ACTIVE / RESERVED / OVERDUE

Raises **ObjectNotFound** if the item with the specified ID is not found.
Скоупы:
- `rental.item.delete`

Параметры:
- `id` — идентификатор предмета

Возвращает:
- объект `StatusResponseModel` со статусом удаления

Ошибки:
- `ObjectNotFound` — предмет не найден или удаление запрещено из-за активных сессий
"""
rental_sessions = db.session.query(RentalSession).filter(RentalSession.item_id == id)
session = rental_sessions.filter(
Expand Down Expand Up @@ -134,7 +187,22 @@
@item.get("/{id}", response_model=ItemGet)
async def get_item(id: int) -> ItemGet:
"""
Получает предмет по его идентификатору.
Возвращает предмет по его идентификатору.

Условия:
- отсутствуют (доступно без авторизации)

Скоупы:
- отсутствуют
Comment on lines +192 to +196
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

условия и скоупы удалить, зачем про них писать если не требуется?


Параметры:
- `id` — идентификатор предмета

Возвращает:
- объект `Item`

Ошибки:
- возможна ошибка валидации, если предмет с указанным `id` не найден
"""
item = Item.get(id=id, session=db.session)
return ItemGet.model_validate(item)
Loading
Loading