Appearance
Backend Contract: OEM-номера и комплекты запчастей
Контекст
Фронтенд добавил поддержку режима "комплект запчастей" — пользователь может указать несколько OEM-номеров при создании/редактировании объявления. Первый OEM в массиве считается основным.
Что фронтенд отправляет
Обычный товар (одна запчасть)
json
POST /vendor/products
PUT /vendor/products/{id}
{
"title": "Фара левая BMW E46",
"price": 5000,
"oem_number": "51117140396",
...
}Поведение без изменений.
Комплект (несколько запчастей)
json
POST /vendor/products
PUT /vendor/products/{id}
{
"title": "Комплект тормозных колодок передние + задние",
"price": 12000,
"oem_numbers": ["31311096855", "31316785589", "04465-33471"],
...
}Важно:
oem_numbersиoem_numberвзаимоисключающие — фронт отправляет только один из них- Если передан
oem_numbers, полеoem_numberне отправляется - Если передан
oem_number, полеoem_numbersне отправляется - Первый элемент
oem_numbers[0]= основной OEM (синхронизируется в денормализованное полеoem_numberна продукте)
Что фронтенд ожидает в ответе
GET /vendor/products/{id} и GET /store/products/{id}
json
{
"oem_number": "31311096855",
"oem_numbers": [
{ "id": 1, "product_id": 42, "oem_number": "31311096855", "oem_display": "31311096855" },
{ "id": 2, "product_id": 42, "oem_number": "31316785589", "oem_display": "31316785589" },
{ "id": 3, "product_id": 42, "oem_number": "04465-33471", "oem_display": "04465-33471" }
]
}Логика фронтенда:
oem_numbers.length > 1→ показывает режим комплекта (список всех OEM)oem_numbers.length <= 1→ обычный режим (показываетoem_numberкак одну строку)
Что может потребовать доработки на бэкенде
Валидация
oem_numbers:- Максимум 20 элементов в массиве
- Максимум 50 символов на один OEM-номер
- Каждый элемент — непустая строка
Стратегия обновления:
- При
PUTсoem_numbers— replace-all (аналогичноcategory_idsиcompatibility) - Удалить все старые записи в
product_oem_numbers, создать новые
- При
Приоритет полей:
- Если пришёл
oem_numbers— игнорироватьoem_number - Первый элемент массива
oem_numbers[0]→ записать в денормализованноеproduct.oem_number - Если пришёл только
oem_number— создать одну запись вproduct_oem_numbers
- Если пришёл
Обратная совместимость:
- Старые клиенты продолжают отправлять
oem_number— должно работать как раньше - Поле
oem_numberв ответе всегда содержит первый (основной) OEM-номер
- Старые клиенты продолжают отправлять