Skip to content

Commit c46ad6f

Browse files
committed
updated swagger descriptions
1 parent 50d2b08 commit c46ad6f

1 file changed

Lines changed: 186 additions & 58 deletions

File tree

rental_backend/routes/rental_session.py

Lines changed: 186 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -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
)
301346
async 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)
476578
async 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
)
507616
async 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

Comments
 (0)