3939@comment .post ("" , response_model = CommentGet )
4040async 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 )
166178async 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 )
303336async 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 :
0 commit comments