Class: Cdek::WidgetServiceController
- Inherits:
-
ActionController::Base
- Object
- ActionController::Base
- Cdek::WidgetServiceController
- 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
#call ⇒ Object
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. }, status: :service_unavailable rescue Cdek::ApiError => e status = e.status.to_i.positive? ? e.status : 502 render json: { message: e., errors: e.errors, body: e.body }, status: status rescue Cdek::Error => e render json: { message: e. }, status: :bad_gateway end |