1818@item .get ("" , response_model = list [ItemGet ])
1919async def get_items (type_id : int = Query (None ), user = Depends (UnionAuth ())) -> list [ItemGet ]:
2020 """
21- Retrieves a list of items. If `type_id` is specified, only items of that type are returned .
21+ Возвращает список предметов. При указании `type_id` возвращаются только предметы заданного типа .
2222
23- - **type_id**: The ID of the item type (optional).
23+ Условия:
24+ - Пользователь должен быть аутентифицирован
2425
25- Returns a list of items.
26+ Скоупы:
27+ - отсутствуют (доступно любому авторизованному пользователю)
28+
29+ Параметры:
30+ - `type_id` — (необязательный) идентификатор типа предмета для фильтрации
31+
32+ Возвращает:
33+ - список объектов `Item`
34+
35+ Ошибки:
36+ - отсутствуют
2637 """
2738 query = Item .query (session = db .session )
2839 if type_id is not None :
@@ -34,15 +45,27 @@ async def get_items(type_id: int = Query(None), user=Depends(UnionAuth())) -> li
3445@item .post ("" , response_model = ItemGet )
3546async def create_item (item : ItemPost , user = Depends (UnionAuth (scopes = ["rental.item.create" ]))) -> ItemGet :
3647 """
37- Creates a new item.
48+ Создает новый предмет.
49+
50+ Перед созданием проверяется, существует ли тип предмета с указанным `type_id`.
51+ После успешного создания действие логируется как `CREATE_ITEM`.
3852
39- Scopes: `["rental.item.create"]`
53+ Условия:
54+ - Пользователь должен быть аутентифицирован
55+ - Пользователь должен иметь право на создание предметов
56+ - Тип предмета с указанным `type_id` должен существовать
4057
41- - **item**: The data for the new item.
58+ Скоупы:
59+ - `rental.item.create`
4260
43- Returns the created item.
61+ Параметры:
62+ - `item` — данные нового предмета
4463
45- Raises **ObjectNotFound** if the item type with the specified `type_id` is not found.
64+ Возвращает:
65+ - созданный объект `Item`
66+
67+ Ошибки:
68+ - `ObjectNotFound` — тип предмета с указанным `type_id` не найден
4669 """
4770 item_type = ItemType .get (item .type_id , session = db .session )
4871 if item_type is None :
@@ -65,16 +88,28 @@ async def update_item(
6588 user = Depends (UnionAuth (scopes = ["rental.item.patch" ])),
6689) -> ItemGet :
6790 """
68- Updates the availability status of an item by its ID.
91+ Обновляет статус доступности предмета по его идентификатору.
92+
93+ Эндпоинт позволяет изменить только поле `is_available`.
94+ После успешного обновления действие логируется как `UPDATE_ITEM`.
6995
70- Scopes: `["rental.item.patch"]`
96+ Условия:
97+ - Пользователь должен быть аутентифицирован
98+ - Пользователь должен иметь право на изменение предметов
99+ - Предмет с указанным `id` должен существовать
71100
72- - **id**: The ID of the item.
73- - **is_available**: The new availability status for the item.
101+ Скоупы:
102+ - `rental. item.patch`
74103
75- Returns the updated item.
104+ Параметры:
105+ - `id` — идентификатор предмета
106+ - `is_available` — новое значение доступности предмета
76107
77- Raises **ObjectNotFound** if the item with the specified ID is not found.
108+ Возвращает:
109+ - обновленный объект `Item`
110+
111+ Ошибки:
112+ - `ObjectNotFound` — предмет с указанным `id` не найден
78113 """
79114 item = Item .query (session = db .session ).filter (Item .id == id ).one_or_none ()
80115 if item is not None :
@@ -95,15 +130,34 @@ async def delete_item(
95130 id : int , user = Depends (UnionAuth (scopes = ["rental.item.delete" ], allow_none = False ))
96131) -> StatusResponseModel :
97132 """
98- Deletes an item by its ID.
133+ Удаляет предмет по его идентификатору.
134+
135+ Перед удалением проверяется, что с предметом не связано активных,
136+ зарезервированных или просроченных сессий аренды.
137+ Если такие сессии существуют — удаление запрещено.
99138
100- Scopes: `["rental.item.delete"]`
139+ При успешном удалении:
140+ - удаляется сам предмет
141+ - удаляются связанные сессии аренды (если они не помечены как удалённые)
142+ - удаляются связанные страйки и события
143+ - действие логируется как `DELETE_ITEM`
101144
102- - **id**: The ID of the item.
145+ Условия:
146+ - Пользователь должен быть аутентифицирован
147+ - Пользователь должен иметь право на удаление предметов
148+ - У предмета не должно быть сессий в статусах ACTIVE / RESERVED / OVERDUE
103149
104- Returns a status response.
150+ Скоупы:
151+ - `rental.item.delete`
105152
106- Raises **ObjectNotFound** if the item with the specified ID is not found.
153+ Параметры:
154+ - `id` — идентификатор предмета
155+
156+ Возвращает:
157+ - объект `StatusResponseModel` со статусом удаления
158+
159+ Ошибки:
160+ - `ObjectNotFound` — предмет не найден или удаление запрещено из-за активных сессий
107161 """
108162 rental_sessions = db .session .query (RentalSession ).filter (RentalSession .item_id == id )
109163 session = rental_sessions .filter (
@@ -134,7 +188,22 @@ async def delete_item(
134188@item .get ("/{id}" , response_model = ItemGet )
135189async def get_item (id : int ) -> ItemGet :
136190 """
137- Получает предмет по его идентификатору.
191+ Возвращает предмет по его идентификатору.
192+
193+ Условия:
194+ - отсутствуют (доступно без авторизации)
195+
196+ Скоупы:
197+ - отсутствуют
198+
199+ Параметры:
200+ - `id` — идентификатор предмета
201+
202+ Возвращает:
203+ - объект `Item`
204+
205+ Ошибки:
206+ - возможна ошибка валидации, если предмет с указанным `id` не найден
138207 """
139208 item = Item .get (id = id , session = db .session )
140209 return ItemGet .model_validate (item )
0 commit comments