Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PostHub

Сервис реализует систему для добавления и чтения постов и комментариев с использованием GraphQL, аналогичную комментариям к постам на популярных платформах, таких как Хабр или Reddit.

Возможности сервиса

Система постов:

  • Предоставляет возможность просмотра списка постов
  • Предоставляет возможность просмотра поста и комментариев под ним
  • Пользователь, написавший пост, может запретить оставление комментариев к своему посту

Система комментариев к постам:

  • Комментарии организованы иерархически, позволяя вложенность без ограничений
  • Длина текста комментария ограничена до 2000 символов
  • Предоставляет систему пагинации для получения списка комментариев к посту или же всех комментариев в целом

Дополнительные возможности:

  • Предоставляет возможность асинхронной доставки комментариев к постам через GraphQL Subscriptions. Клиенты, подписанные на определенный пост, получают уведомления о новых комментариях без необходимости повторного запроса

Реализация:

  • Сервис написан на языке Go
  • Используется Docker для распространения сервиса в виде Docker-образа
  • Хранение данных может быть как в памяти (in-memory), так и в PostgreSQL. Выбор хранилища определяется параметром при запуске сервиса
  • Реализованный функционал покрыт unit-тестами

Запуск и конфигурация

Перед запуском приложения, нужно прописать переменные в .env файл. Если же вы будете пользоваться хранением данных в PostgreSQL, необходимо дополнительно ввести параметры базы данных в bd/flyway/conf/flyway.conf

Запуск:

  1. Билд образа
    go build .
  2. Запуск контейнеров
    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
    }
}

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages