Skip to content

Commit a6f6b5a

Browse files
authored
Merge pull request #167 from profcomff/fix_documentation
2 parents 5b0282c + 7fa6eff commit a6f6b5a

2 files changed

Lines changed: 84 additions & 19 deletions

File tree

rating_api/routes/comment.py

Lines changed: 64 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,19 @@
3939
@comment.post("", response_model=CommentGet)
4040
async def create_comment(lecturer_id: int, comment_info: CommentPost, user=Depends(UnionAuth())) -> CommentGet:
4141
"""
42+
Scopes: `["rating.comment.create"]`
43+
4244
Создает комментарий к преподавателю в базе данных RatingAPI
43-
Для создания комментария нужно быть авторизованным
45+
46+
Комментарий создается со статусом PENDING (на модерации)
47+
48+
Исключение **TooManyCommentRequests**, если число комментариев превысило общий лимит
49+
50+
Исключение **TooManyCommentsToLecturer**, если число комментариев превысило лимит для лектора
51+
52+
Исключение **CommentTooLong**, если комментарий слишком длинный
53+
54+
Исключение **ForbiddenSymbol**, если в комментарии использованы запрещенные символы
4455
"""
4556
# Проверяем, что лектор с заданным id существует
4657
Lecturer.get(session=db.session, id=lecturer_id)
@@ -148,7 +159,8 @@ async def import_comments(
148159
) -> CommentGetAll:
149160
"""
150161
Scopes: `["rating.comment.import"]`
151-
Создает комментарии в базе данных RatingAPI
162+
163+
Создает комментарии в базе данных
152164
"""
153165
number_of_comments = len(comments_info.comments)
154166
result = CommentGetAll(limit=number_of_comments, offset=number_of_comments, total=number_of_comments)
@@ -165,7 +177,13 @@ async def import_comments(
165177
@comment.get("/{uuid}", response_model=CommentGet)
166178
async def get_comment(uuid: UUID, user=Depends(UnionAuth(auto_error=False, allow_none=False))) -> CommentGet:
167179
"""
180+
Scopes: `["rating.comment.read"]`
181+
168182
Возвращает комментарий по его UUID в базе данных RatingAPI
183+
184+
Если пользователь авторизован, добавляются флаги is_liked/is_disliked (реакция пользователя на комментарий)
185+
186+
Исключение **ObjectNotFound**, если `uuid` не найден
169187
"""
170188
comment: Comment = Comment.query(session=db.session).filter(Comment.uuid == uuid).one_or_none()
171189
if comment is None:
@@ -213,6 +231,15 @@ async def get_comments(
213231
`unreviewed` - вернет все непроверенные комментарии, если True. По дефолту False.
214232
215233
`asc_order` -Если передано true, сортировать в порядке возрастания. Иначе - в порядке убывания
234+
235+
Разные модели ответа в зависимости от прав пользователя:
236+
CommentGetAllWithAllInfo: для модераторов (со статусом комментария);
237+
CommentGetAllWithStatus: для авторов комментариев (со статусом);
238+
CommentGetAll: для всех остальных (только одобренные комментарии)
239+
240+
Исключение **ObjectNotFound**, если комментарий с введенными параметрами не найден
241+
242+
Исключение **ForbiddenAction**, если пользователь пытается получить непроверенный комментарий
216243
"""
217244
comments_query = (
218245
Comment.query(session=db.session)
@@ -288,6 +315,12 @@ async def review_comment(
288315
`review_status` - возможные значения
289316
`approved` - комментарий одобрен и возвращается при запросе лектора
290317
`dismissed` - комментарий отклонен, не отображается в запросе лектора
318+
319+
Комментарий может быть либо одобрен, либо отклонен
320+
321+
Отклоненные комментарии не отображаются в обычных GET-запросах(можно посмотреть только через `uuid`)
322+
323+
Исключение **ObjectNotFound**, если `uuid` не найден
291324
"""
292325
check_comment: Comment = Comment.query(session=db.session).filter(Comment.uuid == uuid).one_or_none()
293326

@@ -301,7 +334,17 @@ async def review_comment(
301334

302335
@comment.patch("/{uuid}", response_model=CommentGet)
303336
async def update_comment(uuid: UUID, comment_update: CommentUpdate, user=Depends(UnionAuth())) -> CommentGet:
304-
"""Позволяет изменить свой неанонимный комментарий"""
337+
"""
338+
Scopes: `["rating.comment.update"]`
339+
340+
Позволяет изменить свой неанонимный комментарий
341+
342+
После редактирования комментарий снова отправляется на модерацию
343+
344+
Исключение **ForbiddenAction** при попытке отредактировать чужой комментарий
345+
346+
Исключение **ForbiddenAction** при попытке отредактировать анонимный комментарий
347+
"""
305348
comment: Comment = Comment.get(session=db.session, id=uuid) # Ошибка, если не найден
306349

307350
if comment.user_id != user.get("id") or comment.user_id is None:
@@ -334,6 +377,16 @@ async def delete_comment(
334377
Scopes: `["rating.comment.delete"]`
335378
336379
Удаляет комментарий по его UUID в базе данных RatingAPI
380+
381+
Модератор может удалить любой комментарий
382+
383+
Обычный пользователь может удалить только свой неанонимный комментарий
384+
385+
Анонимные комментарии может удалить только модератор
386+
387+
Исключение **ObjectNotFound**, если `uuid` не найден
388+
389+
Исключение **ForbiddenAction** при попытке удалить комментарий пользователем без прав
337390
"""
338391
comment = Comment.get(uuid, session=db.session)
339392
if comment is None:
@@ -358,22 +411,18 @@ async def like_comment(
358411
user=Depends(UnionAuth()),
359412
) -> CommentGet:
360413
"""
361-
Handles like/dislike reactions for a comment.
414+
Scopes: `["rating.comment.write"]`
362415
363-
This endpoint allows authenticated users to react to a comment (like/dislike) or change their existing reaction.
364-
If the user has no existing reaction, a new one is created. If the user changes their reaction, it gets updated.
365-
If the user clicks the same reaction again, the reaction is removed.
416+
Ставит лайк или дизлайк на комментарий по его uuid
366417
367-
Args:
368-
uuid (UUID): The UUID of the comment to react to.
369-
reaction (Reaction): The reaction type (like/dislike).
370-
user (dict): Authenticated user data from UnionAuth dependency.
418+
Дизлайка и лайка не может быть одновременно
371419
372-
Returns:
373-
CommentGet: The updated comment with reactions in CommentGet format.
420+
Если реакции от пользователя на этот комментарий не было — создается новая;
421+
Если была противоположная реакция — она заменяется на новую;
422+
Если была такая же реакция — она удаляется;
423+
После операции поля is_liked/is_disliked в ответе отражают итоговое состояние
374424
375-
Raises:
376-
ObjectNotFound: If the comment with given UUID doesn't exist.
425+
Исключение **ObjectNotFound**, если `uuid` не найден
377426
"""
378427
comment = Comment.get(session=db.session, id=uuid)
379428
if not comment:

rating_api/routes/lecturer.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ async def create_lecturer(
3434
"""
3535
Scopes: `["rating.lecturer.create"]`
3636
37-
Создает преподавателя в базе данных RatingAPI
37+
Создает преподавателя в базе данных
38+
39+
Исключение **AlreadyExists**, если преподаватель с введеным `timetable_id` уже существует
3840
"""
3941
get_lecturer: Lecturer = (
4042
Lecturer.query(session=db.session).filter(Lecturer.timetable_id == lecturer_info.timetable_id).one_or_none()
@@ -54,7 +56,7 @@ async def update_lecturer_rating(
5456
"""
5557
Scopes: `["rating.lecturer.update_rating"]`
5658
57-
Обновляет рейтинг преподавателя в базе данных RatingAPI
59+
Обновляет рейтинг преподавателя в базе данных
5860
"""
5961
updated_lecturers = []
6062
response = {
@@ -95,6 +97,8 @@ async def update_lecturer_rating(
9597
async def get_lecturer_by_timetable_id(timetable_id: int) -> LecturerGet:
9698
"""
9799
Возвращает преподавателя по его timetable_id
100+
101+
Исключение **ObjectNotFound**, если `timetable_id` не найден
98102
"""
99103
lecturer: Lecturer = Lecturer.query(session=db.session).filter(Lecturer.timetable_id == timetable_id).one_or_none()
100104
if lecturer is None:
@@ -107,11 +111,13 @@ async def get_lecturer(id: int, info: list[Literal["comments"]] = Query(default=
107111
"""
108112
Scopes: `["rating.lecturer.read"]`
109113
110-
Возвращает преподавателя по его ID в базе данных RatingAPI
114+
Возвращает преподавателя по его ID в базе данных
111115
112116
*QUERY* `info: string` - возможные значения `'comments'`.
113117
Если передано `'comments'`, то возвращаются одобренные комментарии к преподавателю.
114-
Subject лектора возвращшается либо из базы данных, либо из любого аппрувнутого комментария
118+
Subject лектора возвращается либо из базы данных, либо из любого аппрувнутого комментария
119+
120+
Исключение **ObjectNotFound**, если `id` не найден
115121
"""
116122
lecturer: Lecturer = Lecturer.query(session=db.session).filter(Lecturer.id == id).one_or_none()
117123
if lecturer is None:
@@ -168,6 +174,8 @@ async def get_lecturers(
168174
`mark`
169175
Поле для оценки. Если передано, то возвращает только тех преподавателей, для которых средняя общая оценка ('general_mark')
170176
больше, чем переданный 'mark'.
177+
178+
Исключение **ObjectNotFound**, если преподаватель с введенными параметрами не найден
171179
"""
172180
lecturers_query = lecturer_filter.filter(
173181
Lecturer.query(session=db.session).outerjoin(Lecturer.comments).group_by(Lecturer.id)
@@ -212,6 +220,10 @@ async def update_lecturer(
212220
) -> LecturerGet:
213221
"""
214222
Scopes: `["rating.lecturer.update"]`
223+
224+
Обновляет данные о преподавателе по его id
225+
226+
Исключение **ObjectNotFound**, если `id` не найден
215227
"""
216228
lecturer = Lecturer.get(id, session=db.session)
217229
if lecturer is None:
@@ -238,6 +250,10 @@ async def delete_lecturer(
238250
):
239251
"""
240252
Scopes: `["rating.lecturer.delete"]`
253+
254+
Удаляет из базы данных преподавателя по его id
255+
256+
Исключение **ObjectNotFound**, если `id` не найден
241257
"""
242258
check_lecturer = Lecturer.get(session=db.session, id=id)
243259
if check_lecturer is None:

0 commit comments

Comments
 (0)