Skip to content

VadimRight/GraphqlAPI

Repository files navigation

Задача проекта

Данный проект написан на языке 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

Покрытие юнит-тестами

Приложение обладает функционалом для автоматического тестирования резольверов. Мок-типы пользователей, постов и комментариев а также методы этих типов являются частью пакета usecase Сами же тесты расположены в пакете graph. Для тестирования используется внешняя библиотека testify.

Скриншоты

Регистрация пользователя image

Логин пользователя image

Создание поста пользователем image

Создание комментария к посту image

Создания комментария к комментарию image

Получения постов пользователя и комментариев к ним и комментариев к комментариям по username image

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published