Git Product home page Git Product logo

graphqlapi's Introduction

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

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

graphqlapi's People

Contributors

vadimright avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.