Skip to content

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 как одну строку)

Что может потребовать доработки на бэкенде

  1. Валидация oem_numbers:

    • Максимум 20 элементов в массиве
    • Максимум 50 символов на один OEM-номер
    • Каждый элемент — непустая строка
  2. Стратегия обновления:

    • При PUT с oem_numbers — replace-all (аналогично category_ids и compatibility)
    • Удалить все старые записи в product_oem_numbers, создать новые
  3. Приоритет полей:

    • Если пришёл oem_numbers — игнорировать oem_number
    • Первый элемент массива oem_numbers[0] → записать в денормализованное product.oem_number
    • Если пришёл только oem_number — создать одну запись в product_oem_numbers
  4. Обратная совместимость:

    • Старые клиенты продолжают отправлять oem_number — должно работать как раньше
    • Поле oem_number в ответе всегда содержит первый (основной) OEM-номер