- Для хранения в БД комментариев используются подход Closure Table использующий две таблицы, в первой хранятся сами комментарии, а во второй связи между ними.
- Плюсы данного подхода:
- Быстрое получение предков или потомков для любого узла не зависимо от глубины дерева.
- При данном подходе операции вставки в БД менее ресурсозатратные по сравнению с другими древовиными структурами.
- Плюсы данного подхода:
- Для реализации использовал Django, т.к. использую его каждый день.
- Точку входа для подписки на уведомления не делал, т.к. считаю что она относится к сущностям родителям комментариев, а они в решение задания представлены абстрактно и производить над ними какие либо действия нет возможности, но проверка подписчиков на уведомления реализованна, уведомления проверяются и создаются.
- Не использовал никаких RESTFul фреймворков для того, чтобы показать понимание того как это работает.
- /comments/
- GET - получение списка комментариев с фильтрацией по 'id', 'owner_type_id', 'owner_id'. (параметр full_tree=1 вернет список с развернутым деревом)
- POST - добавление нового комментария.
- /comments/<comment_pk>/
- GET - получение информации о комментарии. (параметр full_tree=1 вернет список с развернутым деревом)
- PUT - редактирование комментария.
- DELETE - удаление комментария.
- /comments/user/<user_pk>/
- GET - получение списка комментариев пользователя.
- /comments/dump/
- GET - список выгрузок для пользователя или объекта.
- POST - запрос на создане выгрузки, в ответ приходит id выгрузки с которым далее нужно запрашивать статус выгрузки в следующей точке входа (5). В качестве параметров принимает <user_id> или <owner_type_id> и <owner_id>
- /comments/dump/<dump_pk>/
- GET - запрос результата выполнения выгрузки, если готова вернет ссылку на файл выгрузки.
На скорую руку накидал несколько простых тестов (comments/tests.py), для запуска потребутся:
cd <project_path>
virtualenv env --no-site-packages
source env/bin/activate
pip install -r requirements.txt
python manage.py test
P.S. Возможно тесты не покрывают должым образовм весь сервис ;-)