Categorygithub.com/VadimRight/GraphQLOzon
module
0.0.0-20240609124354-527f01840a11
Repository: https://github.com/vadimright/graphqlozon.git
Documentation: pkg.go.dev

# 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

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

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

Скриншоты

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

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

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

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

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

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

# Packages

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author