Конфигурация - Products (продукты)
Источник: config/products.json. Доступ к данным: infrastructure/config/products.go (через ConfigFactory().Products()).
Схема данных (фактическая):
- products: массив Product
- Product:
- id: int
- title: map<locale, string>
- description: map<locale, string>
- image: string (путь к изображению)
- prices: map<string, { currency: string, value: number, merchant?: string }>
- Ключ карты:
- строковый
api_type("100","30","930", ...); - или тип платформы (
"vk","ok","fs", ...); - для профилей мерчанта используется суффикс
/profile:"930/default","930/xsolla_ptr","vk/promo". Именно ключ профиля (merchant_profiles.<profile>) участвует в маршруте/ext/{api_type}/{profile}/....
- строковый
- Поле
merchantвнутри значения позволяет явно указать профиль, если используется универсальный ключ без суффикса (например,"930"без/profile).
- Ключ карты:
Логика разрешения цены (см. Product.GetPrice(apiType, platformType)):
- Ищется точное совпадение по
api_type/profile, если передан профиль (например,"930/xsolla_secondary"). - Далее — просто
api_type(например,"930"). - Затем —
platformType/profile. - И в конце — просто
platformType(например,"vk"). Если ничего не найдено, цена не определена.
Пример (фрагмент из реального products.json):
json
{
"products": [
{
"id": 2001,
"title": { "en": "Coins: x200", "ru": "Монеты: x200" },
"description": { "en": "Coins: x200", "ru": "Монеты: x200" },
"image": "/logo.png",
"prices": {
"ok": { "currency": "OK", "value": 19 },
"vk": { "currency": "VK", "value": 3 },
"fs": { "currency": "FS", "value": 1 },
"mm": { "currency": "MM", "value": 19 },
"fb": { "currency": "USD", "value": 0.99 },
"tg": { "currency": "XTR", "value": 3 },
"100": { "currency": "RUB", "value": 19 },
"930/default": { "currency": "RUB", "value": 379 },
"930/xsolla_ptr": { "currency": "USD", "value": 4.99 },
"vk": { "currency": "VK", "value": 3 }
}
}
]
}Выдача в API:
- V1:
/v1/products/fetch— плоский список продуктов с локализованными полями и ценой профиляdefault. - V2:
/v2/products— помимо базовой цены возвращает массивprofile_prices[], где указаны все найденные профили (ключprofile, цена, валюта и флагdefault). Клиент может выбрать нужный профиль, не делая дополнительных запросов.
Рекомендации:
- Соблюдайте консистентность по ключам: если для платформы есть отдельное ценообразование, указывайте платформенный ключ; для общих случаев -
api_type. - Локализуйте
title/description; язык по умолчанию -en(см.DefaultProductLanguage).
Полная JSON Schema расположена в infrastructure/config/koanf/schemas/products.schema.json.
