Сервис реализует систему для добавления и чтения постов и комментариев с использованием GraphQL, аналогичную комментариям к постам на популярных платформах, таких как Хабр или Reddit.
- Предоставляет возможность просмотра списка постов
- Предоставляет возможность просмотра поста и комментариев под ним
- Пользователь, написавший пост, может запретить оставление комментариев к своему посту
- Комментарии организованы иерархически, позволяя вложенность без ограничений
- Длина текста комментария ограничена до 2000 символов
- Предоставляет систему пагинации для получения списка комментариев к посту или же всех комментариев в целом
- Предоставляет возможность асинхронной доставки комментариев к постам через GraphQL Subscriptions. Клиенты, подписанные на определенный пост, получают уведомления о новых комментариях без необходимости повторного запроса
- Сервис написан на языке Go
- Используется Docker для распространения сервиса в виде Docker-образа
- Хранение данных может быть как в памяти (in-memory), так и в PostgreSQL. Выбор хранилища определяется параметром при запуске сервиса
- Реализованный функционал покрыт unit-тестами
Перед запуском приложения, нужно прописать переменные в .env файл. Если же вы будете пользоваться хранением данных в PostgreSQL, необходимо дополнительно ввести параметры базы данных в bd/flyway/conf/flyway.conf
Запуск:
- Билд образа
go build . - Запуск контейнеров
docker-compose up
Сервис предоставляет 2 enpoint
- /graphql : GraphQL ручка
- / : GraphQL Playground
Схемы GraphQL находится в папке internal/transport/graph/schemas
Запрос создания Post:
createPost(input: {
userID: 1,
timestamp: "2024-06-20T12:00:00Z",
content: "TestPost"
isOpen: true
}) {
id
userID
timestamp
content
}Ответ:
{
"data": {
"createPost": {
"id": 1,
"userID": 1,
"timestamp": "2024-06-20T12:00:00Z",
"content": "TestPost"
}
}
}Запрос на получение всех сообщений с параметрами пангинации:
query GetComments {
comments(limit: 3, offset: 0) {
ID
content
postID
parentID
userID
}
}Ответ:
{
"data": {
"comments": [
{
"ID": 4,
"content": "Hello!",
"postID": 5,
"parentID": null,
"userID": 2
},
{
"ID": 5,
"content": "How is going?",
"postID": 5,
"parentID": null,
"userID": 3
},
{
"ID": 6,
"content": "This post is amazing!",
"postID": 5,
"parentID": null,
"userID": 4
}
]
}
}Оформление подписки:
subscription {
newComment(userID: "1", postID: "3") {
parentID
postID
userID
content
timestamp
}
}