@@ -88,13 +88,26 @@ async def create_rental_session(
8888 user = Depends (UnionAuth (scopes = ["rental.session.create" ], enable_userdata = True )),
8989):
9090 """
91- Создает новую сессию аренды для указанного типа предмета.
91+ Создает новую сессию аренды для указанного типа предмета и резервирует его.
9292
93- Cкоупы: `["rental.session.create"]`
93+ Условия:
94+ - У пользователя нет активной / зарезервированной / просроченной сессии
95+ - Есть доступный предмет
96+ - Не превышен лимит на частоту создания сессий
9497
95- :param item_type_id: Идентификатор типа предмета.
96- :raises NoneAvailable: Если нет доступных предметов указанного типа.
97- :raises SessionExists: Если у пользователя уже есть сессия с указанным типом предмета.
98+ Скоупы:
99+ - `rental.session.create`
100+
101+ Параметры:
102+ - `item_type_id` — идентификатор типа предмета
103+
104+ Возвращает:
105+ - созданную `RentalSession`
106+
107+ Ошибки:
108+ - `SessionExists` — уже есть активная сессия
109+ - `NoneAvailable` — нет доступных предметов
110+ - `RateLimiterError` — превышен лимит
98111 """
99112 exist_session_item : list [RentalSession ] = RentalSession .query (session = db .session ).filter (
100113 RentalSession .user_id == user .get ("id" ), RentalSession .item_type_id == item_type_id
@@ -179,15 +192,30 @@ async def start_rental_session(
179192 session_id , deadline_ts = Depends (validate_deadline_ts ), user = Depends (UnionAuth (scopes = ["rental.session.admin" ]))
180193):
181194 """
182- Starts a rental session, changing its status to ACTIVE.
195+ Запускает сессию аренды и переводит её из статуса `RESERVED` в `ACTIVE`.
196+
197+ После запуска:
198+ - устанавливается время начала аренды (`start_ts`)
199+ - сохраняется идентификатор администратора (`admin_open_id`)
200+ - устанавливается дедлайн возврата (`deadline_ts`), если он не был передан
201+
202+ Условия:
203+ - Сессия должна существовать
204+ - Сессия должна находиться в статусе `RESERVED`
183205
184- Scopes: `["rental.session.admin"]`
206+ Скоупы:
207+ - `rental.session.admin`
185208
186- - **session_id**: The ID of the rental session to start.
209+ Параметры:
210+ - `session_id` — идентификатор сессии аренды
211+ - `deadline_ts` — (опционально) дедлайн возврата, если не указан — вычисляется автоматически
187212
188- Returns the updated rental session.
213+ Возвращает:
214+ - обновленную `RentalSession` со статусом `ACTIVE`
189215
190- Raises **ObjectNotFound** if the session with the specified ID is not found.
216+ Ошибки:
217+ - `ObjectNotFound` — сессия с указанным id не найдена
218+ - `ForbiddenAction` — сессию нельзя запустить (неверный статус)
191219 """
192220 session : RentalSession = RentalSession .get (session_id , session = db .session )
193221 if not session :
@@ -233,19 +261,36 @@ async def accept_end_rental_session(
233261 user = Depends (UnionAuth (scopes = ["rental.session.admin" ])),
234262):
235263 """
236- Ends a rental session, changing its status to RETURNED. Issues a strike if specified .
264+ Завершает сессию аренды и переводит её в статус ` RETURNED` .
237265
238- Scopes: `["rental.session.admin"]`
266+ После завершения:
267+ - устанавливается фактическое время возврата (`actual_return_ts`)
268+ - сохраняется идентификатор администратора, завершившего аренду (`admin_close_id`)
269+ - предмет снова становится доступным для аренды (`item.is_available = True`)
239270
240- - **session_id**: The ID of the rental session to end.
241- - **with_strike**: A flag indicating whether to issue a strike.
242- - **strike_reason**: The reason for the strike.
271+ Дополнительно можно выдать страйк пользователю:
272+ - если `with_strike=True`, создается новый страйк
273+ - причина страйка передается через `strike_reason`
274+ - созданный страйк привязывается к завершенной сессии
243275
244- Returns the updated rental session.
276+ Условия:
277+ - Сессия должна существовать
278+ - Сессия должна находиться в статусе `ACTIVE` или `OVERDUE`
245279
246- Raises:
247- - **ObjectNotFound**: If the session with the specified ID is not found.
248- - **InactiveSession**: If the session is not active.
280+ Скоупы:
281+ - `rental.session.admin`
282+
283+ Параметры:
284+ - `session_id` — идентификатор сессии аренды
285+ - `with_strike` — нужно ли выдать страйк при завершении аренды
286+ - `strike_reason` — причина выдачи страйка
287+
288+ Возвращает:
289+ - обновленную `RentalSession` со статусом `RETURNED`
290+
291+ Ошибки:
292+ - `ObjectNotFound` — сессия с указанным id не найдена
293+ - `InactiveSession` — сессию нельзя завершить, так как она не находится в статусе `ACTIVE` или `OVERDUE`
249294 """
250295 rent_session = RentalSession .get (id = session_id , session = db .session )
251296 if not rent_session :
@@ -299,6 +344,28 @@ async def accept_end_rental_session(
299344 dependencies = [Depends (check_sessions_expiration ), Depends (check_sessions_overdue )],
300345)
301346async def get_rental_session (session_id : int , user = Depends (UnionAuth (scopes = ["rental.session.admin" ]))):
347+ """
348+ Возвращает сессию аренды по её идентификатору.
349+
350+ Перед получением сессии выполняется проверка истекших и просроченных сессий, чтобы вернуть
351+ актуальное состояние данных. В ответ также включается информация о страйке, если он привязан
352+ к данной сессии.
353+
354+ Условия:
355+ - Сессия должна существовать
356+
357+ Скоупы:
358+ - `rental.session.admin`
359+
360+ Параметры:
361+ - `session_id` — идентификатор сессии аренды
362+
363+ Возвращает:
364+ - объект `RentalSession` с данными о сессии и `strike_id`, если для нее существует страйк
365+
366+ Ошибки:
367+ - `ObjectNotFound` — сессия с указанным id не найдена
368+ """
302369
303370 rental_session : RentalSession | None = (
304371 RentalSession .query (session = db .session )
@@ -401,19 +468,37 @@ async def get_rental_sessions(
401468 user = Depends (UnionAuth (scopes = ["rental.session.admin" ])),
402469):
403470 """
404- Retrieves a list of rental sessions with optional status filtering.
405-
406- Scopes: `["rental.session.admin"]`
407-
408- - **is_reserved**: Filter by reserved sessions.
409- - **is_canceled**: Filter by canceled sessions.
410- - **is_dismissed**: Filter by dismissed sessions.
411- - **is_overdue**: Filter by overdue sessions.
412- - **is_returned**: Filter by returned sessions.
413- - **is_active**: Filter by active sessions.
414- - **is_expired**: Filter by expired sessions.
415- - **user_id**: User_id to get sessions
416- Returns a list of rental sessions.
471+ Возвращает список сессий аренды с возможностью фильтрации по статусам, пользователю и типу предмета.
472+
473+ Перед выполнением запроса автоматически обновляются истекшие и просроченные сессии,
474+ чтобы вернуть актуальные данные.
475+
476+ Фильтрация:
477+ - Можно указать один или несколько флагов статусов (`is_reserved`, `is_active` и т.д.)
478+ - Если ни один статус не указан — возвращаются все сессии
479+ - Можно дополнительно отфильтровать по `user_id` и `item_type_id`
480+
481+ Результат сортируется по статусу и времени создания (reservation_ts).
482+
483+ Скоупы:
484+ - `rental.session.admin`
485+
486+ Параметры:
487+ - `is_reserved` — показывать сессии со статусом `RESERVED`
488+ - `is_canceled` — показывать сессии со статусом `CANCELED`
489+ - `is_dismissed` — показывать сессии со статусом `DISMISSED`
490+ - `is_overdue` — показывать сессии со статусом `OVERDUE`
491+ - `is_returned` — показывать сессии со статусом `RETURNED`
492+ - `is_active` — показывать сессии со статусом `ACTIVE`
493+ - `is_expired` — показывать сессии со статусом `EXPIRED`
494+ - `item_type_id` — фильтр по типу предмета
495+ - `user_id` — фильтр по пользователю
496+
497+ Возвращает:
498+ - список объектов `RentalSession`, удовлетворяющих условиям фильтрации
499+
500+ Ошибки:
501+ - отсутствуют (пустой список, если ничего не найдено)
417502 """
418503 return await get_rental_sessions_common (
419504 db_session = db .session ,
@@ -447,16 +532,33 @@ async def get_my_sessions(
447532 user = Depends (UnionAuth ()),
448533):
449534 """
450- Retrieves a list of rental sessions for the user with optional status filtering.
451-
452- - **is_reserved**: Filter by reserved sessions.
453- - **is_canceled**: Filter by canceled sessions.
454- - **is_dismissed**: Filter by dismissed sessions.
455- - **is_overdue**: Filter by overdue sessions.
456- - **is_returned**: Filter by returned sessions.
457- - **is_active**: Filter by active sessions.
458- - **is_expired**: Filter by expired sessions.
459- Returns a list of rental sessions.
535+ Возвращает список сессий аренды текущего пользователя с возможностью фильтрации.
536+
537+ Перед выполнением запроса автоматически обновляются истекшие и просроченные сессии,
538+ чтобы вернуть актуальные данные.
539+
540+ Фильтрация:
541+ - Можно указать один или несколько флагов статусов (`is_reserved`, `is_active` и т.д.)
542+ - Если ни один статус не указан — возвращаются все сессии пользователя
543+ - Можно дополнительно отфильтровать по `item_type_id`
544+
545+ В отличие от административного эндпоинта, возвращаются только сессии текущего пользователя.
546+
547+ Параметры:
548+ - `is_reserved` — показывать сессии со статусом `RESERVED`
549+ - `is_canceled` — показывать сессии со статусом `CANCELED`
550+ - `is_dismissed` — показывать сессии со статусом `DISMISSED`
551+ - `is_overdue` — показывать сессии со статусом `OVERDUE`
552+ - `is_returned` — показывать сессии со статусом `RETURNED`
553+ - `is_active` — показывать сессии со статусом `ACTIVE`
554+ - `is_expired` — показывать сессии со статусом `EXPIRED`
555+ - `item_type_id` — фильтр по типу предмета
556+
557+ Возвращает:
558+ - список объектов `RentalSession`, принадлежащих текущему пользователю
559+
560+ Ошибки:
561+ - отсутствуют (пустой список, если ничего не найдено)
460562 """
461563 return await get_rental_sessions_common (
462564 db_session = db .session ,
@@ -475,16 +577,23 @@ async def get_my_sessions(
475577@rental_session .delete ("/{session_id}" , response_model = StatusResponseModel )
476578async def delete_rental_session (session_id : int , user = Depends (UnionAuth (scopes = ["rental.session.admin" ]))):
477579 """
478- Deletes a session.
580+ Удаляет сессию аренды по её идентификатору.
581+
582+ Удаление возможно только для завершённых или неактивных сессий.
583+ Сессии в статусах `RESERVED`, `ACTIVE` или `OVERDUE` удалить нельзя.
479584
480- Scopes: `["rental.session.admin"]`
585+ Скоупы:
586+ - `rental.session.admin`
481587
482- - **session_id**: The ID of the rental session to delete.
588+ Параметры:
589+ - `session_id` — идентификатор сессии аренды
483590
484- Returns the deleted rental session.
591+ Возвращает:
592+ - объект `StatusResponseModel` с информацией об успешном удалении
485593
486- Raises **ForbiddenAction** if the session is in RESERVED, ACTIVE, OVERDUE status.
487- Raises **ObjectNotFound** if the session does not exist.
594+ Ошибки:
595+ - `ObjectNotFound` — сессия с указанным id не найдена
596+ - `ForbiddenAction` — сессию нельзя удалить (она находится в активном или блокирующем статусе)
488597 """
489598 session = RentalSession .get (id = session_id , session = db .session )
490599 if (
@@ -506,13 +615,23 @@ async def delete_rental_session(session_id: int, user=Depends(UnionAuth(scopes=[
506615)
507616async def cancel_rental_session (session_id : int , user = Depends (UnionAuth ())):
508617 """
509- Cancels a session in the RESERVED status. Can only be canceled by the user who created it .
618+ Отменяет сессию аренды, переводя её в статус `CANCELED` .
510619
511- - **session_id**: The ID of the rental session to cancel.
620+ Отмена возможна только для сессий в статусе `RESERVED` и только пользователем,
621+ который создал эту сессию.
512622
513- Returns the canceled rental session.
623+ После отмены:
624+ - устанавливается время завершения (`end_ts`)
625+ - предмет снова становится доступным для аренды (`item.is_available = True`)
514626
515- Raises **ForbiddenAction** if the user is not the owner or the session is not in RESERVED status.
627+ Параметры:
628+ - `session_id` — идентификатор сессии аренды
629+
630+ Возвращает:
631+ - обновленную `RentalSession` со статусом `CANCELED`
632+
633+ Ошибки:
634+ - `ForbiddenAction` — пользователь не является владельцем сессии или сессия не в статусе `RESERVED`
516635 """
517636 session = RentalSession .get (id = session_id , session = db .session )
518637
@@ -546,16 +665,25 @@ async def update_rental_session(
546665 session_id : int , update_data : RentalSessionPatch , user = Depends (UnionAuth (scopes = ["rental.session.admin" ]))
547666):
548667 """
549- Updates the information of a rental session.
668+ Обновляет данные сессии аренды по её идентификатору.
669+
670+ Эндпоинт позволяет частично изменить поля сессии аренды, переданные в `update_data`.
671+ Обновляются только те значения, которые были явно указаны в запросе.
672+
673+ После обновления действие логируется как `UPDATE_SESSION`.
550674
551- Scopes: `["rental.session.admin"]`
675+ Скоупы:
676+ - `rental.session.admin`
552677
553- - **session_id**: The ID of the rental session to update.
554- - **update_data**: The data to update the session with.
678+ Параметры:
679+ - `session_id` — идентификатор сессии аренды
680+ - `update_data` — набор полей для частичного обновления сессии
555681
556- Returns the updated rental session.
682+ Возвращает:
683+ - обновленный объект `RentalSession`
557684
558- Raises **ObjectNotFound** if the session with the specified ID is not found.
685+ Ошибки:
686+ - `ObjectNotFound` — сессия с указанным id не найдена
559687 """
560688 session = RentalSession .get (id = session_id , session = db .session )
561689 if not session :
0 commit comments