Skip to content

N0fail/price-tracker

Repository files navigation

Трэкер цен

Трэкер цен предполагает запись истории цен на какой то товар и просмотр этой истории

В качестве интерфейса реализованы:

  • Телеграм бо
  • GRPC
  • REST

Конфигурация БД

Для запуска Postresql понадобятся

docker https://docs.docker.com/engine/install/ 
docker-compose https://docs.docker.com/compose/install/

При возникновении проблем с установкой docker-compose на debian-based linux

https://stackoverflow.com/a/49839172

БД поднимается с помощью

make up_db

Миграции

Для миграций используется утилита goose, она компилируется в папку bin при вызове

make .deps

Все миграции описаны в папке migrations

Для запуска миграций можно использовать скрипт

./migrate.sh

Для добавления свей миграции можно использовать

make migration NAME=migration_name

В результате будет создан файл в папке migrations, в котором нужно описать новую миграцию

Генерация тестовых данных

Также можно сгенерировать тестовые данные для этого можно вызывать

./migrate.sh --generate

Удалить сгенерированные данные можно с помощью

./migrate.sh --generate --down

Добавлять свои данные для генерации рекомедуется с помощью

make generation NAME=generation_name

В результате будет создан файл в папке migrations/generations, в котором нужно описать новую генерация

Запуск проекта

  1. скачать зависимости
    go get ./...
    
  2. задать переменную окружения PriceTrackerApiKey с API ключом бота
     export PriceTrackerApiKey=your_key
    
    1. Ключ можно получить у https://t.me/botfather прислав ему сообщение /newbot
  3. запустить
    1. Используя БД постгрес
      make run_server
      
    2. Используя кэш (данные пропадают после завершения работы сервера)
      make run_server_cache
      
  4. Отправлять запросы рекомендуется через price-tracker-validator

Доступные команды телеграм бота

Доступные команды описаны в internal/pkg/bot/command/

  • /help выводит краткую информацию о доступных коммандах

  • /add <product_code>_<product_name> добавляет продукт для отслеживания
    product_code - строка-ключ продукта, при попытке добавления продуктов с одинаковым product_code возникнет ошибка, о которой бот сообщит
    product_name - строка "читаемое" имя продукта, должна быть не короче, чем config.MinNameLength(4)
    пример: /add qwer1234_Guitar - добавит продукт с кодом qwer1234 и именем Guitar

  • /add_price <product_code> добавляет запись о цене продукта
    product_code - строка-ключ продукта, при попытке записи для неотслеживаемого продукта возникнет ошибка, о которой бот сообщит
    date - дата, в которую была записана цена, формат указан в config.DateFormat(2 Jan 2006 15:04)
    price - цена продукта, является целым неотрицательным числом
    пример: /add_price qwer1234_2 Jan 2006 15:04_3000 - добавит для продукта qwer1234 запись о цене 3000 второго января 2006 в 15:04

  • /price_history <product_code> выводит историю цен продукта в хронологическом порядке
    product_code - строка-ключ продукта, при попытке вывести историю для неотслеживаемого продукта возникнет ошибка, о которой бот сообщит
    пример: /price_history qwer1234

  • /list выводит список всех отслеживаемых продуктов с последней ценой(в хронологическом смысле) ограничивает выборку 20(config.DefaultResultsPerPage) продуктами

  • /delete <product_code> удаляет продукт из отслеживания
    product_code - строка-ключ продукта, при попытке удаления неотслеживаемого продукта возникнет ошибка, о которой бот сообщит
    вместе с продуктом удаляется и его история цен
    пример: /delete qwer1234

Доступные GRPC процедуры

Доступные GRPC функции описаны в файле api/api.proto

  • ProductCreate - добавляет продукт для отслеживания, аналог /add комманды бота

  • PriceTimeStampAdd - добавляет запись о цене продукта, аналог /add_price комманды бота

  • PriceHistory выводит историю цен продукта в хронологическом порядке, аналог /price_history комманды бота

  • ProductList выводит список отслеживаемых продуктов на странице page_number с последней ценой(в хронологическом смысле), аналог /list комманды бота

  • ProductDelete удаляет продукт из отслеживания, аналог /delete комманды бота

Пример GRPC клиента

В проект добавлен пример GRPC клиента в client/client.go

Для запуска можно использовать

make run_client

Генерацию кода по протофайлу можно выполнить с помощью

make gen

Возможно понадобится перекомпилировать модули протобафа, для этого можно выполнить

make .deps

SWAGGER

Для проекта также запускается сваггер по адресу http://localhost:8100/swagger/

Примеры запросов к REST

  • Получение списка продуктов с последней ценой
curl -X GET 'http://localhost:8100/v1/product?pageNumber=2&resultsPerPage=5&orderBy=code'
  • Добавление продукта
curl -X POST localhost:8100/v1/product -d '{"code":"qwer1234", "name":"Guitar"}'
  • Добавление цены продукта
curl -X PUT localhost:8100/v1/price -d '{"code":"1", "price":123, "ts":1234567}'
  • Получение истории цен продукта
curl -X GET 'localhost:8100/v1/price?code=1'
  • Удаление продукта
curl -X DELETE 'localhost:8100/v1/product?code=1'

Общение с другими сервисами

Предполагается, что все аргументы валидируются с помощью price-tracker-validator в случае работы по grpc Либо на уровне бота при обработке его запросов

Тесты

Юнит тесты

Юнит тесты лежат в тестируемых пакетах

Юнит тесты написаны для бд и для grpc ручек

Интеграционные тесты

Для интеграционных тестов предполагается создание отдельной бд

Для ее поднятия можно использовать

make db_up_test
sh migrate_test.sh

Интеграционные тесты находятся в папке tests

Kafka

Запросы от валидатора к основному сервису на создание/удаление продукта и добавление цен переведены на kafka Для запуска kafka нужно выполнить

make up_kafka

Kafka-ui запускается по адресу

http://localhost:8080/ui/

Также добавлены счетчики запросов и ошибок(requestsCounter, errorsCounter), их можно посмотреть по адресу

http://127.0.0.1:8200/debug/vars

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published