Фоновый сервис, который:
- Каждый час забирает тарифы коробов WB (
/api/v1/tariffs/box) и сохраняет дневные срезы в PostgreSQL. - Каждый час выгружает актуальные тарифы в указанные Google-таблицы (лист
stocks_coefs), отсортированные по коэффициенту доставки.
Запуск — одной командой docker compose up.
- Node.js 20 + TypeScript
- PostgreSQL 16 (knex.js — миграции, запросы)
- Google Sheets API v4 (googleapis)
- Docker Compose — оркестрация
git clone <url> && cd btlz-wb-testcp example.env .envЗаполните WB_API_TOKEN — токен WB API.
Остальные переменные (POSTGRES_*, интервалы) уже имеют рабочие значения по умолчанию.
Файл сервисного аккаунта Google (Service Account Key JSON). Должен содержать поля client_email и private_key.
Файл монтируется в контейнер через volume (см.
compose.yaml) и добавлен в.gitignore.
Отредактируйте src/postgres/seeds/spreadsheets.js — впишите реальные spreadsheet_id таблиц, в которые нужно выгружать данные.
spreadsheet_id — часть URL таблицы:
https://docs.google.com/spreadsheets/d/<spreadsheet_id>/edit
Не забудьте расшарить каждую таблицу на email сервисного аккаунта (
client_emailизcredentials.json).
В каждой таблице должен быть лист с именем
stocks_coefs.
docker compose up --buildКонтейнер app автоматически:
- прогонит миграции
- засеет таблицу
spreadsheets - запустит сбор тарифов и синхронизацию с Google Sheets
| Переменная | Описание | По умолчанию |
|---|---|---|
WB_API_TOKEN |
Токен WB API | — (обязателен) |
POSTGRES_HOST |
Хост БД | postgres (в Docker) |
POSTGRES_PORT |
Порт БД | 5432 |
POSTGRES_DB |
Имя БД | postgres |
POSTGRES_USER |
Пользователь БД | postgres |
POSTGRES_PASSWORD |
Пароль БД | postgres |
TARIFFS_POLL_MINUTES |
Интервал сбора тарифов (мин) | 60 |
SHEETS_SYNC_MINUTES |
Интервал синхронизации с Sheets (мин) | 60 |
Полный JSON-ответ WB API на дату. Обновляется при каждом сборе.
| Колонка | Тип |
|---|---|
id |
serial PK |
snapshot_date |
date, unique |
payload |
jsonb |
fetched_at |
timestamptz |
Разобранные тарифы по складам на дату. В течение дня — upsert.
| Колонка | Тип |
|---|---|
id |
serial PK |
snapshot_date |
date |
warehouse_name |
varchar |
box_delivery_base |
decimal |
box_delivery_liter |
decimal |
box_delivery_coef |
decimal |
box_storage_base |
decimal |
box_storage_liter |
decimal |
box_storage_coef |
decimal |
raw |
jsonb |
updated_at |
timestamptz |
Уникальный ключ: (snapshot_date, warehouse_name).
Список Google-таблиц для выгрузки.
| Колонка | Тип |
|---|---|
spreadsheet_id |
varchar PK |
Лист stocks_coefs, столбцы:
| warehouse_name | box_delivery_base | box_delivery_liter | box_delivery_coef | box_storage_base | box_storage_liter | box_storage_coef | updated_at |
|---|
Данные отсортированы по box_delivery_coef (коэффициент доставки) по возрастанию.
- После запуска в логах
appдолжно быть:All migrations and seeds have been run Tariffs collected and stored Google Sheets synced - В БД появятся записи в
tariff_snapshotsиbox_tariffs_daily. - В Google-таблицах на листе
stocks_coefsпоявятся данные.
npm install
npm run dev # nodemon + tsx
npm run knex:dev migrate latest
npm run knex:dev seed run
npm run tsc:check # проверка типов- Пользователь/пароль/БД по условию задания:
postgres/postgres/postgres. credentials.jsonи.envдобавлены в.gitignore.- В Docker образ собирается через multi-stage build (
npm run build→dist/).