Необходимо разработать бэкенд для сервиса комментариев. Описать предложенное решение, выбранные механизмы хранения и обработки данных, оценить его плюсы и минусы. Исходный код проекта нужно разместить на Github или Bitbucket. В исходных текстах и имени проекта не должно быть упоминания компании
- Каждый комментарий имеет привязку к определенному пользователю.
- У каждого комментария есть дата создания.
- Коментарии имеют древовидную структуру - есть возможность оставлять комментарии на комментарии с неограниченной степенью вложенности.
- Каждой комментарий имеет привязку к определенной сущности (пост в блоге, страница пользователя, другой комментарий и т.п.), которая однозначно идентифицируется парой значений (идентификатор типа сущности, идентификатор сущности).
- Бэкенд должен предоставлять следующие интерфейсы:
- a. Создание комментария к определенной сущности с указанием сущности, к которой он относится.
- b. Получение комментариев первого уровня для определенной сущности с пагинацией.
- c. Получение всех дочерних комментариев для заданного комментария или сущности без ограничения по уровню вложенности. Корнем может являться пара идентифицирующая сущность или id комментария, являющегося корневым для данной ветки. Ответ должен быть таким, чтобы на клиенте можно было воссоздать иерархию комментариев.
- d. Получение истории комментариев определенного пользователя.
- e. Выгрузка в файл (например в xml-формате) всей истории комментариев по пользователю или сущности с возможностью указания интервала времени, в котором был создан комментарий пользователя (если не задан - выводить всё). Время ответа на первичный запрос не должно зависеть от объема данных в итоговой выгрузке.
- Время ответа на все запросы ограничено 1 секундной. С условием:
- a. Глубина дерева не менее 100.
- b. Количество узлов (элементов, имеющих дочерние элементы) в дереве не менее 10^4.
- Комментарии могут редактироваться и удаляться. Удаление возможно только, если у комментария нет дочерних комментариев. Реализовать хранение исторических данных с возможностью получения истории для определенного комментария: информация о том, кем и когда был изменен/удален комментарий, что изменилось в комментарии.
- Возможность подписки на события комментирования определенной сущности - при создании/редактировании/удалении комментария к этой сущности с сервера уходит PUSH-уведомление клиенту с информацией о созданном/отредактированным/удаленным комментарием в таком виде, чтобы клиент имел возможность динамически добавить/обновить/удалить его в интерфейсе.
- Для пункта 5.е требований реализовать гибкий механизм с возможностью добавления различных форматов файлов
- Аутентификация/авторизация на уровне бэкенда не обязательна, все данные о пользователях, там, где это нужно, могут приходить в теле запроса одним из параметров.
- При решении должна использоваться реляционная СУБД (PostgreSQL, MySQL, SQLite и т.п.)