Skip to content

Сравнение и избранное

Оба списка привязаны к сессии браузера, а у вошедшего покупателя ещё и к его профилю. Запросы без cookie сессии видят пустой список.

Актуальные адреса — /front_api/compares.json и /front_api/favorites.json. Старый GET /compares.json тоже отдаёт { "products": [] }. GET /favorites.json отвечает HTML-страницей избранного, не JSON.

В карточках товаров те же поля, что у списка товаров.

Сравнение

Добавление передаёт id товара. Повторный запрос с тем же id не создаёт вторую карточку.

POST/front_api/compares.json
Параметр Описание
product[id] обязательный
число
id товара. Повторный запрос с тем же id не создаёт вторую карточку.
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;

const response = await fetch("/front_api/compares.json", {
  method: "POST",
  credentials: "same-origin",
  headers: {
    Accept: "application/json",
    "Content-Type": "application/json",
    "X-CSRF-Token": csrfToken
  },
  body: JSON.stringify({ product: { id: 761 } })
});
const data = await response.json();

Ответ · 200

{
  "status": "ok",
  "products": [
    {
      "id": 761,
      "title": "Apple iPhone 16 128 ГБ",
      "url": "/product/apple-iphone-16-128-gb",
      "available": true,
      "price_min": 84990.0
    }
  ]
}

GET /front_api/compares.json возвращает тот же список без поля status: { "products": [] }, если сравнение пустое.

Удаление одного товара. id в адресе — id товара.

DELETE/front_api/compares/761.json
Параметр Описание
id обязательный
число
id товара в адресе.
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
const body = new URLSearchParams({ _method: "delete" });

const response = await fetch("/front_api/compares/761.json", {
  method: "POST",
  credentials: "same-origin",
  headers: {
    Accept: "application/json",
    "Content-Type": "application/x-www-form-urlencoded",
    "X-CSRF-Token": csrfToken
  },
  body
});
const data = await response.json();

Ответ · 200

{
  "status": "ok",
  "products": []
}

Очистка: POST /front_api/compares/clear.json с тем же заголовком CSRF. Ответ снова { "status": "ok", "products": [] }.

Старый POST /compares.json с телом product[id] отвечает только { "status": "ok" }, без списка товаров. Удаление — POST /compares/:id.json с _method=delete, ответ тот же короткий объект.

Избранное

Тело и адреса совпадают со сравнением, путь другой: /front_api/favorites.json.

POST/front_api/favorites.json
Параметр Описание
product[id] обязательный
число
id товара. Тело совпадает со сравнением.
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;

const response = await fetch("/front_api/favorites.json", {
  method: "POST",
  credentials: "same-origin",
  headers: {
    Accept: "application/json",
    "Content-Type": "application/json",
    "X-CSRF-Token": csrfToken
  },
  body: JSON.stringify({ product: { id: 761 } })
});
const data = await response.json();

Ответ · 200

{
  "status": "ok",
  "products": [
    {
      "id": 761,
      "title": "Apple iPhone 16 128 ГБ",
      "url": "/product/apple-iphone-16-128-gb",
      "available": true
    }
  ]
}

GET /front_api/favorites.json без товаров: { "products": [] }.

POST /front_api/favorites/:id.json с _method=delete возвращает список без удалённого товара и status: "ok".

Очистка отвечает короче, чем очистка сравнения:

POST/front_api/favorites/clear.json
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;

const response = await fetch("/front_api/favorites/clear.json", {
  method: "POST",
  credentials: "same-origin",
  headers: {
    Accept: "application/json",
    "X-CSRF-Token": csrfToken
  }
});
const data = await response.json();

Ответ · 200

{ "status": "ok" }