Трэкер цен предполагает запись истории цен на какой то товар и просмотр этой истории
В качестве интерфейса реализованы:
- Телеграм бо
- 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, в котором нужно описать новую генерация
- скачать зависимости
go get ./... - задать переменную окружения PriceTrackerApiKey с API ключом бота
export PriceTrackerApiKey=your_key- Ключ можно получить у https://t.me/botfather прислав ему сообщение /newbot
- запустить
- Используя БД постгрес
make run_server - Используя кэш (данные пропадают после завершения работы сервера)
make run_server_cache
- Используя БД постгрес
- Отправлять запросы рекомендуется через 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 функции описаны в файле api/api.proto
-
ProductCreate - добавляет продукт для отслеживания, аналог /add комманды бота
-
PriceTimeStampAdd - добавляет запись о цене продукта, аналог /add_price комманды бота
-
PriceHistory выводит историю цен продукта в хронологическом порядке, аналог /price_history комманды бота
-
ProductList выводит список отслеживаемых продуктов на странице page_number с последней ценой(в хронологическом смысле), аналог /list комманды бота
-
ProductDelete удаляет продукт из отслеживания, аналог /delete комманды бота
В проект добавлен пример GRPC клиента в client/client.go
Для запуска можно использовать
make run_client
Генерацию кода по протофайлу можно выполнить с помощью
make gen
Возможно понадобится перекомпилировать модули протобафа, для этого можно выполнить
make .deps
Для проекта также запускается сваггер по адресу http://localhost:8100/swagger/
- Получение списка продуктов с последней ценой
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 нужно выполнить
make up_kafka
Kafka-ui запускается по адресу
http://localhost:8080/ui/
Также добавлены счетчики запросов и ошибок(requestsCounter, errorsCounter), их можно посмотреть по адресу
http://127.0.0.1:8200/debug/vars