Class: Cdek::WidgetServiceController

Inherits:
ActionController::Base
  • Object
show all
Defined in:
app/controllers/cdek/widget_service_controller.rb

Overview

Прокси-эндпоинт для JS-виджета ПВЗ СДЭК (cdek-it/widget@3).

Виджет ожидает servicePath, который умеет:

* GET  ?action=offices&<фильтры>     -> CDEK API /deliverypoints
* POST {"action":"calculate", ...}   -> CDEK API /calculator/tarifflist

Это Ruby-аналог dist/service.php из репозитория cdek-it/widget, построенный поверх нашего тонкого клиента (он же берёт на себя OAuth2 и маппинг ошибок).

Эндпоинт публичный read-only — не меняет состояние хост-приложения, авторизация выполняется на нашей стороне CDEK-токенами. CSRF полностью пропускаем (skip_forgery_protection) — виджет не знает о Rails-токенах, а raise/null_session засоряют логи строкой “Can’t verify CSRF token authenticity” на каждый POST виджета.

ВАЖНО: wrap_parameters принудительно отключён. По умолчанию Rails для JSON-запросов оборачивает body в ключ, совпадающий с именем контроллера (‘widget_service`), и это удваивает все поля запроса. Удвоенные поля утекали в CDEK API как лишний ключ “widget_service” — CDEK его молча игнорировал (200 OK), но логи и сетевой трафик засорялись копией.

Instance Method Summary collapse

Instance Method Details

#callObject



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'app/controllers/cdek/widget_service_controller.rb', line 41

def call
  cdek_action = cdek_request_action

  case cdek_action
  when "offices"
    render json: Cdek.client.get("/deliverypoints", params: cdek_filtered_params)
  when "calculate"
    render json: Cdek.client.post("/calculator/tarifflist", body: cdek_filtered_params)
  else
    render json: { message: "Unknown action: #{cdek_action.inspect}" }, status: :bad_request
  end
rescue Cdek::ConfigurationError => e
  render json: { message: e.message }, status: :service_unavailable
rescue Cdek::ApiError => e
  status = e.status.to_i.positive? ? e.status : 502
  render json: { message: e.message, errors: e.errors, body: e.body }, status: status
rescue Cdek::Error => e
  render json: { message: e.message }, status: :bad_gateway
end