Skip to content
This repository was archived by the owner on Feb 24, 2026. It is now read-only.

drillcoder/btlz-wb-test

Repository files navigation

WB Tariffs → PostgreSQL → Google Sheets

Фоновый сервис, который:

  1. Каждый час забирает тарифы коробов WB (/api/v1/tariffs/box) и сохраняет дневные срезы в PostgreSQL.
  2. Каждый час выгружает актуальные тарифы в указанные Google-таблицы (лист stocks_coefs), отсортированные по коэффициенту доставки.

Запуск — одной командой docker compose up.


Стек

  • Node.js 20 + TypeScript
  • PostgreSQL 16 (knex.js — миграции, запросы)
  • Google Sheets API v4 (googleapis)
  • Docker Compose — оркестрация

Быстрый старт

1. Склонируйте репозиторий

git clone <url> && cd btlz-wb-test

2. Создайте .env

cp example.env .env

Заполните WB_API_TOKEN — токен WB API.

Остальные переменные (POSTGRES_*, интервалы) уже имеют рабочие значения по умолчанию.

3. Положите credentials.json в корень проекта

Файл сервисного аккаунта Google (Service Account Key JSON). Должен содержать поля client_email и private_key.

Файл монтируется в контейнер через volume (см. compose.yaml) и добавлен в .gitignore.

4. Добавьте ID Google-таблиц

Отредактируйте 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.

5. Запуск

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

Структура БД

tariff_snapshots

Полный JSON-ответ WB API на дату. Обновляется при каждом сборе.

Колонка Тип
id serial PK
snapshot_date date, unique
payload jsonb
fetched_at timestamptz

box_tariffs_daily

Разобранные тарифы по складам на дату. В течение дня — 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).

spreadsheets

Список Google-таблиц для выгрузки.

Колонка Тип
spreadsheet_id varchar PK

Что попадает в Google Sheets

Лист 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 (коэффициент доставки) по возрастанию.

Проверка работоспособности

  1. После запуска в логах app должно быть:
    All migrations and seeds have been run
    Tariffs collected and stored
    Google Sheets synced
    
  2. В БД появятся записи в tariff_snapshots и box_tariffs_daily.
  3. В 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 builddist/).

About

Тестовое задание для ИП Козырев Артем Сергеевич. Вакансия Разработчик backend JavaScript (Node.js) 10Х

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors