# README
Задача проекта
Данный проект написан на языке Go с серверной архитектурой GraphQL. Сервер предоставляет возможность оставлять посты и комментарии для его пользователей. Коментарии можно оставлять к другим коментариям.
Структура комментариев
Комментарий имеет следующие поля в модели:
Сущность комментария, определяемая в model/mode.go
- ID: Уникальный идентификатор комментария.
- Comment: Текст комментария.
- AuthorID: Идентификатор автора комментария.
- PostID: Идентификатор поста, к которому относится комментарий.
- ParentCommentID: Идентификатор родительского комментария, если комментарий является ответом на другой комментарий. Если комментарий является корневым, то это поле пустое (null).
- AuthorComment: Объект пользователя, который является автором комментария.
- Replies: Список ответов на данный комментарий, реализующий иерархическую структуру.
- Модули и зависимости: Модули организованы логически, зависимости инвертированы, что облегчает тестирование и модификацию кода.
Задание на то, чтобы пользователь мог запрещать комментирование своего поста
Данная фича реализована путем запонения в базе данных или памяти поля commentable при создании поста - если значение true, то другие пользователи могут оставлять комментарии под постом. Если же значение false, то другие пользователи не могут оставлять свои комментарии.
Коментарии в хранилище (либо postgres, либо in-memory)
Комментарии хранятся и обрабатываются как в базе данных, так и в памяти, с поддержкой иерархической структуры данных. Иерархия достигается с помощью поля parent_comment_id, которое указывает на родительский комментарий. Методы для создания и получения комментариев обеспечивают возможность работы с вложенными комментариями, создавая дерево комментариев.
Пагинации комментариев
При работе с базой данных PostgreSQL пагинация реализована путем добавления параметров LIMIT и OFFSET к SQL-запросам.
Общий процесс использования пагинации
- Клиент отправляет запрос: В запросе могут быть указаны параметры limit и offset для указания количества записей и смещения.
- Сервер обрабатывает запрос: На сервере параметры limit и offset используются для модификации запросов к базе данных или к in-memory хранилищу.
- Возвращение результатов: Сервер возвращает запрашиваемое количество записей, начиная с указанного смещения.
Хранилища и возможность выбора между Postgres и In-memory
В проекте реализована возможность выбора между двумя типами хранилищ данных: in-memory и PostgreSQL. Это полезно для различных окружений и сценариев использования, например, для тестирования и разработки можно использовать in-memory хранилище, а для продакшена - PostgreSQL.
- Интерфейс Storage: Определяет методы, которые должны быть реализованы любым хранилищем данных.
- Реализации InMemoryStorage и PostgresStorage: Обеспечивают хранение данных в памяти и в базе данных PostgreSQL соответственно.
- Инициализация хранилища при запуске сервера: На основе конфигурации или переменных окружения выбирается соответствующее хранилище.
- Такой подход обеспечивает гибкость и позволяет легко переключаться между различными типами хранилищ в зависимости от окружения и требований.
Чтение и получение комментариев
В системе есть возможность получать комментарии, посты и ответы на комментарии через запросы, связанные с пользователями. Это добавляет гибкость и удобство при работе с данными, особенно когда требуется отображать полную активность пользователя на платформе.
Удобство использования системы комментариев
-
Получение всех комментариев. Система позволяет удобно получать все комментарии с поддержкой пагинации. Это значит, что вы можете запрашивать комментарии порциями, что особенно полезно при работе с большими объемами данных. При запросе всех комментариев также автоматически подгружаются авторы комментариев и ответы на комментарии, обеспечивая полную иерархию комментариев.
-
Получение комментариев по идентификатору. Вы можете запросить конкретный комментарий по его идентификатору. При этом система также подгружает автора комментария и все ответы на этот комментарий. Это удобно, если вам нужно отобразить дерево ответов на конкретный комментарий.
-
Получение комментариев для поста. Запрашивая комментарии для конкретного поста, вы также получаете всех авторов этих комментариев и ответы на них. Это позволяет вам отобразить полную дискуссию под постом, включая вложенные ответы. Пагинация также поддерживается, что позволяет эффективно работать с большим количеством комментариев.
-
Получение комментариев пользователя. Система позволяет получать все комментарии, оставленные конкретным пользователем. Это может быть полезно для отображения активности пользователя на платформе.
Логичность использования
-
Единый интерфейс для всех типов комментариев: Независимо от того, какие комментарии вы запрашиваете (все комментарии, комментарии для поста, комментарии пользователя или конкретный комментарий), система использует единый интерфейс и подход для получения данных. Это упрощает работу с системой и снижает вероятность ошибок.
-
Автоматическая подгрузка авторов: При запросе комментариев система автоматически подгружает данные об авторах комментариев. Это означает, что вам не нужно делать дополнительные запросы для получения информации об авторах, что упрощает работу с данными и улучшает производительность.
-
Поддержка вложенных комментариев: Система поддерживает иерархию комментариев, позволяя легко работать с вложенными комментариями. При запросе комментариев вы получаете все ответы на каждый комментарий, что позволяет отображать полную структуру дискуссий.
-
Пагинация: Поддержка пагинации делает систему более эффективной при работе с большими объемами данных. Вы можете запрашивать данные порциями, что снижает нагрузку на сервер и улучшает пользовательский опыт.
Docker
Реализована возможнсть сборки образа приложения.
Способ реализации наличия двух типов хранилища
Приложение имеет два docker-compose файла
- docker-compose.postgres.yml - для приложения с postgres хранилищем
- docker-compose.memory.yml - для приложения с in-memory хранилищем
Образы на Docker Hub
Образы приложения с разными хранилищами опубликованы на Docker Hub
- https://hub.docker.com/repository/docker/vadimright/graphqlozon-app-postgres/general
- https://hub.docker.com/repository/docker/vadimright/graphqlozon-app-memory/general
Покрытие юнит-тестами
Приложение обладает функционалом для автоматического тестирования резольверов. Мок-типы пользователей, постов и комментариев а также методы этих типов являются частью пакета usecase Сами же тесты расположены в пакете graph. Для тестирования используется внешняя библиотека testify.
Скриншоты
Регистрация пользователя
Логин пользователя
Создание поста пользователем
Создание комментария к посту
Создания комментария к комментарию
Получения постов пользователя и комментариев к ним и комментариев к комментариям по username