Skip to content

KirillSenkov/nodejs-pg-wb-api-tariffs

Repository files navigation

Сервис синхронизации тарифов WB

Сервис получает тарифы коробов из API Wildberries, сохраняет их в PostgreSQL и выгружает актуальные данные в Google Sheets.

Приложение запускается в Docker-контейнерах одной командой и затем:

  • при старте сразу выполняет синхронизацию;
  • далее повторяет её каждый час.

Что делает сервис

  1. Запрашивает тарифы коробов из WB API:

    • https://common-api.wildberries.ru/api/v1/tariffs/box
  2. Сохраняет данные в PostgreSQL:

    • данные хранятся по дням;
    • для одного и того же дня запись по складу обновляется, а не дублируется.
  3. Выгружает актуальные тарифы в Google Sheets (добавить .env.GOOGLE_SPREADSHEET_ID):

    • в лист stocks_coefs (изменить - .env.GOOGLE_SHEETS_RANGE);
    • с сортировкой по коэффициенту доставки по возрастанию.

Стек

  • Node.js
  • TypeScript
  • PostgreSQL
  • Knex.js
  • Google Sheets API
  • Docker / Docker Compose

Запуск

1. Подготовить переменные окружения

Скопировать example.env в .env и заполнить нужные значения.

Пример:

POSTGRES_PORT=5432
POSTGRES_DB=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres

APP_PORT=5000

WB_API_TOKEN=

GOOGLE_SERVICE_ACCOUNT_PATH=/run/secrets/sa.json
GOOGLE_SPREADSHEET_ID=
GOOGLE_SHEETS_RANGE=stocks_coefs!A1

Обязательно заполнить:

  • WB_API_TOKEN
  • GOOGLE_SPREADSHEET_ID

2. Подготовить Google service account key

Положить файл сервисного ключа Google в папку:

secrets/service-account.json

В контейнере этот файл будет доступен по пути:

/run/secrets/sa.json

3. Настроить Google Sheets

Нужно создать Google-таблицу и лист:

stocks_coefs

Потом:

взять GOOGLE_SPREADSHEET_ID из URL таблицы;

выдать сервисному аккаунту доступ Editor к этой таблице.

Пример URL:

https://docs.google.com/spreadsheets/d/1vButBOsfRp0Z_qHceFfW2gq1pM_MIy8mq8fasQXDLVk/edit

В этом случае GOOGLE_SPREADSHEET_ID:

1vButBOsfRp0Z_qHceFfW2gq1pM_MIy8mq8fasQXDLVk

4. Запустить проект

docker compose up

После запуска сервис:

  • применит миграции;
  • выполнит сиды;
  • сразу выполнит синхронизацию WB → PostgreSQL → Google Sheets;
  • затем будет повторять её каждый час.

Как работает сохранение в БД

Основная таблица:

wb_box_tariffs_daily

Уникальность записи определяется по:

tariff_date + warehouse_name

Это значит:

  • на один день и один склад хранится одна запись;
  • при повторной синхронизации в течение дня запись обновляется через UPSERT.

Что выгружается в Google Sheets

В лист stocks_coefs записываются актуальные данные за текущий день.

Основные колонки:

  • warehouse
  • delivery_coef
  • storage_coef

Строки без коэффициентов тоже сохраняются как пустые значения, без дополнительной фильтрации.

Структура проекта

src/
  config/
  postgres/
  services/

secrets/
  README.md

compose.yaml
Dockerfile
example.env

Проверка работы

После запуска можно проверить:

  1. В логах контейнера app должен появиться успешный результат синхронизации.
  2. В PostgreSQL должна наполняться таблица wb_box_tariffs_daily.
  3. В Google Sheets на листе stocks_coefs должны появиться актуальные тарифы.

UPD

  • изменил время запуска, теперь оно жестко привязано к началу следующего часа, исключает дрейф расписания
  • оставил имя в контейнере, как было в шаблоне к ТЗ. это может вызвать конфликт имён. если возникнет, перед запуском: docker stop postgres app docker rm postgres app

About

Sync service of WB tariffs via API Wildberries with Google Sheets and local PostgreSQL DB.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors