В рамках третьего этапа проекта, реализовал функциональность комментариев. Пользователи могут делиться комментариями на любое опубликованное событие, редактировать и удалять свои комментарии, а также отвечать на уже существующие комментарии. Админы имеют возможность удалять и скрывать комментарии. Для упрощения модерации комментариев также реализована возможность для пользователей оставлять жалобу на комментарий другого пользователя, которую позже смогут рассмотреть модераторы.
- Публичные эндпоинты
-
GET: /comments- Получение списка комментариев к указанному событию Параметры запроса:Параметр Тип Обязателен Значение по умолчанию Описание eventint✅ — ID события fromint❌ 0Номер первого элемента для пагинации sizeint❌ 10Количество элементов на странице showHiddenboolean❌ falseПоказывать ли скрытые комментарии Метод: При обращении к эндпоинту вызывается метод
CommentPublicController.findAllByEvent()
Ответ: Список объектов CommentShortDto отсортированный по дате создания (от новых к старым)
Пример тела ответа:[ { "id": 8, "text": "Пойдет", "event": 5086, "author": { "id": 6506, "name": "Marjorie Trantow" }, "created": "2025-07-16 19:59:20", "updated": null }, { "id": 6, "text": "Отличное мероприятие", "event": 5086, "author": { "id": 6505, "name": "Elmer Schulist" }, "created": "2025-07-16 19:58:26", "updated": null } ] -
GET: /comments/{commentId}- Получение подробной информации о комментарии, включая родительский комментарий и ответы (если присутствуют)Параметры пути:
Параметр Тип Описание commentIdintID запрашиваемого комментария Параметры запроса:
Параметр Тип Обязателен Значение по умолчанию Описание showHiddenboolean❌ falseПоказывать ли скрытые комментарии Метод: При обращении к эндпоинту вызывается метод
CommentPublicController.findById()
Ответ: ОбъектCommentFullDtoс информацией о комментарии, его родителе и вложенных ответах
Пример тела ответа:{ "id": 6, "text": "Отличное мероприятие", "event": 5086, "author": { "id": 6505, "name": "Elmer Schulist" }, "created": "2025-07-16 19:58:26", "updated": null, "parent": null, "replies": [ { "id": 9, "text": "Согласен", "event": 5086, "author": { "id": 6506, "name": "Marjorie Trantow" }, "created": "2025-07-16 20:00:50", "updated": null } ] } -
GET: /comments/{commentId}/replies- Получение списка ответов на указанный комментарийПараметры пути:
Параметр Тип Описание commentIdintID родительского комментария Параметры запроса:
Параметр Тип Обязателен Значение по умолчанию Описание fromint❌ 0Номер первого элемента sizeint❌ 10Количество элементов на странице showHiddenboolean❌ falseПоказывать ли скрытые ответы Метод: При обращении к эндпоинту вызывается метод
CommentPublicController.findReplies()
Ответ: Список объектовCommentShortDto, представляющих собой ответы на указанный комментарий
Пример тела ответа:[ { "id": 9, "text": "Согласен", "event": 5086, "author": { "id": 6506, "name": "Marjorie Trantow" }, "created": "2025-07-16 20:00:50", "updated": null }, { "id": 10, "text": "Не согласен", "event": 5086, "author": { "id": 6507, "name": "Becky Nolan" }, "created": "2025-07-16 20:21:58", "updated": null } ]
-
-
Приватные эндпоинты (для пользователей)
-
POST: /users/{userId}/comments— Создание нового комментария к событиюПараметры пути:
Параметр Тип Описание userIdintID пользователя Параметры запроса:
Параметр Тип Обязателен Описание eventint✅ ID события Тело запроса (
CommentRequestDto):{ "text": "Не согласен", "parent": 6 }Метод:
CommentPrivateController.createNew()
Ответ: объектCommentFullDtoс данными созданного комментарием
Пример ответа:{ "id": 10, "text": "Не согласен", "event": 5086, "author": { "id": 6507, "name": "Becky Nolan" }, "created": "2025-07-16 20:21:58", "updated": null, "parent": { "id": 6, "text": "Отличное мероприятие", "event": 5086, "author": { "id": 6505, "name": "Elmer Schulist" }, "created": "2025-07-16 19:58:26", "updated": null }, "replies": [] } -
PATCH: /users/{userId}/comments/{commentId}— Редактирование текста комментарияПараметры пути:
Параметр Тип Описание userIdintID пользователя commentIdintID комментария Тело запроса (
CommentRequestDto):{ "text": "Смею возразить" }Метод:
CommentPrivateController.updateById()
Ответ: ОбъектCommentFullDtoс обновлённой информацией
Пример тела ответа:{ "id": 10, "text": "Смею возразить", "event": 5086, "author": { "id": 6507, "name": "Becky Nolan" }, "created": "2025-07-16 20:21:58", "updated": "2025-07-16 20:37:29", "parent": { "id": 6, "text": "Отличное мероприятие", "event": 5086, "author": { "id": 6505, "name": "Elmer Schulist" }, "created": "2025-07-16 19:58:26", "updated": null }, "replies": [] } -
DELETE: /users/{userId}/comments/{commentId}— Удаление собственного комментарияПараметры пути:
Параметр Тип Описание userIdintID пользователя commentIdintID комментария Метод:
CommentPrivateController.deleteById()
Ответ: HTTP статус204 No Contentпри успешном удалении. -
POST: /users/{userId}/comments/{commentId}/report— Пожаловаться на комментарийПараметры пути:
Параметр Тип Описание userIdintID пользователя commentIdintID комментария Тело запроса (
NewCommentReportDto):{ "reason": "Спам и нецензурная лексика" }Метод:
CommentPrivateController.createNewReport()
Ответ: объектCommentReportDto
Пример тела ответа:{ "id": 1, "reason": "Спам и нецензурная лексика", "created": "2025-07-16 20:47:29", "comment": 9, "reporter": { "id": 6507, "name": "Becky Nolan" }, "status": "PENDING" }
-
-
Админские эндпоинты
-
PATCH: /admin/comments/{commentId}— Обновление видимости комментария (меняет значение аттрибута hidden на true или false)Параметры пути:
Параметр Тип Описание commentIdintID комментария Параметры запроса:
Параметр Тип Обязателен Описание visibilitystring✅ Изменение видимости комментария ( HIDE/UNHIDE)Метод:
CommentAdminController.updateVisibility()
Пример тела ответа: ОбъектCommentFullDto:{ "id": 7, "text": "Ок", "event": 5090, "author": { "id": 6506, "name": "Marjorie Trantow" }, "created": "2025-07-16 19:58:54", "updated": null, "parent": null, "replies": [] } -
DELETE: /admin/comments/{commentId}— Удаление комментария администратором вручнуюПараметры пути:
Параметр Тип Описание commentIdintID комментария Метод:
CommentAdminController.deleteById()
Ответ: HTTP статус204 No Contentпри успешном удалении -
GET: /admin/comments/reports— Получение списка жалоб на все комментарииПараметры запроса:
Параметр Тип Обязателен Значение по умолчанию Описание sortstring❌ PENDINGФильтр: PENDING,APPROVED,REJECTED,ALLfromint❌ 0Индекс первого элемента sizeint❌ 10Количество элементов на странице Метод:
CommentAdminController.findReports()
Пример тела ответа: Список объектовCommentReportDto[ { "id": 1, "reason": "Спам и нецензурная лексика", "created": "2025-07-16 20:47:29", "comment": 9, "reporter": { "id": 6507, "name": "Becky Nolan" }, "status": "PENDING" }, { "id": 2, "reason": "Пропаганда терроризма", "created": "2025-07-16 21:15:12", "comment": 9, "reporter": { "id": 6510, "name": "Dennis Cummerata" }, "status": "PENDING" }, { "id": 3, "reason": "Нас держать подвал заставлять писать README.md ПОМОГИТ", "created": "2025-07-16 21:16:16", "comment": 6, "reporter": { "id": 6510, "name": "Dennis Cummerata" }, "status": "PENDING" } ] -
GET: /admin/comments/{commentId}/reports— Получение жалоб на конкретный комментарийПараметры пути:
Параметр Тип Описание commentIdintID комментария Параметры запроса:
Параметр Тип Обязателен Значение по умолчанию Описание fromint❌ 0Индекс первого элемента sizeint❌ 10Количество элементов на странице Метод:
CommentAdminController.findReportsByCommentId()
Ответ: СписокCommentReportDtoпо конкретному комментарию[ { "id": 3, "reason": "Нас держать подвал заставлять писать README.md ПОМОГИТ", "created": "2025-07-16 21:16:16", "comment": 6, "reporter": { "id": 6510, "name": "Dennis Cummerata" }, "status": "PENDING" } ] -
PATCH: /admin/comments/reports— Ответ на жалобы (массово)Пример тела запроса (
RespondToReportRequest):{ "reports": [1], "action": "HIDE" }Возможные значения
action:HIDE— скрыть комментарииDELETE— удалить комментарииREJECT— отклонить жалобы
Метод:
CommentAdminController.respondToReport()
Ответ: Список объектовCommentReportDtoс применённым действием[ { "id": 1, "reason": "Спам и нецензурная лексика", "created": "2025-07-16 20:47:29", "comment": 9, "reporter": { "id": 6507, "name": "Becky Nolan" }, "status": "APPROVED" }, { "id": 2, "reason": "Пропаганда терроризма", "created": "2025-07-16 21:15:12", "comment": 9, "reporter": { "id": 6510, "name": "Dennis Cummerata" }, "status": "APPROVED" } ]
-