🎯 Введение
API для работы с каталогом офферов позволяет управлять источниками данных и товарными предложениями (офферами). Система поддерживает все базовые CRUD операции, массовые операции, фильтрацию, поиск и статистику.
📦 Базовый URL
Все запросы выполняются к базовому URL: https://gkt.itunity.dev:3000/api/
🔑 Аутентификация
В текущей версии API работает без аутентификации. В продакшн-режиме рекомендуется настроить аутентификацию через DRF.
📊 Формат данных
Все запросы и ответы используют JSON формат. Устанавливайте заголовок Content-Type: application/json для запросов с телом.
📌 Важные замечания
- Пагинация: Все списки поддерживают пагинацию. По умолчанию 20 элементов на странице.
- Сортировка: Используйте параметр
orderingс именем поля. Префикс-для обратной сортировки. - Поиск: Параметр
searchищет по текстовым полям модели. - Фильтрация: Используйте имена полей для точной фильтрации.
🏢 Источники (Sources)
Управление источниками данных. Источник - это поставщик или площадка, откуда поступают офферы.
📋 Поля модели Source
| Поле | Тип | Описание | Обязательное |
|---|---|---|---|
id |
Integer | Уникальный идентификатор источника | Только чтение |
name |
CharField | Наименование источника/поставщика | Обязательно |
url |
TextField | URL сайта источника | Опционально |
updated_at |
DateTimeField | Дата и время последнего обновления | Только чтение |
Эндпоинты
GET Получить список источников
Возвращает список всех источников с поддержкой пагинации и фильтрации.
Параметры запроса:
search |
Поиск по name и url | Опционально |
has_offers |
Фильтр по наличию офферов (true/false) | Опционально |
ordering |
Сортировка (name, -name, updated_at, -updated_at) | Опционально |
page |
Номер страницы | Опционально |
page_size |
Количество элементов на странице (по умолчанию 20) | Опционально |
Пример запроса:
Пример ответа:
POST Создать источник
Создает новый источник данных.
Тело запроса:
Пример ответа (201 Created):
GET Получить источник по ID
Возвращает детальную информацию об источнике.
Пример ответа:
PUT Полное обновление источника
Полностью обновляет информацию об источнике. Требует все обязательные поля.
Пример запроса:
PATCH Частичное обновление источника
Обновляет только указанные поля источника.
Пример запроса:
DELETE Удалить источник
Удаляет источник по ID. Вместе с источником удаляются все связанные офферы (каскадное удаление).
Пример ответа (204 No Content):
Пустой ответ с кодом 204 при успешном удалении.
📊 Дополнительные эндпоинты для источников
GET https://gkt.itunity.dev:3000/api/sources/stats/ |
Статистика по источникам (количество офферов, средние цены) |
POST https://gkt.itunity.dev:3000/api/sources/bulk-create/ |
Массовое создание источников |
POST https://gkt.itunity.dev:3000/api/sources/bulk-delete/ |
Массовое удаление источников по списку ID |
GET https://gkt.itunity.dev:3000/api/sources/{id}/offers/ |
Получить все офферы конкретного источника |
📦 Офферы (Offers)
Управление товарными предложениями. Оффер - это товарное предложение от источника с уникальной комбинацией source + pn_raw + condition_raw.
📋 Поля модели OfferRaw
| Поле | Тип | Описание | Обязательное |
|---|---|---|---|
id |
Integer | Уникальный идентификатор оффера | Только чтение |
source |
ForeignKey (Source) | Источник данных (связь с моделью Source) | Обязательно |
source_identifier |
CharField (write-only) | Идентификатор источника (имя, URL или ID) | Обязательно |
brand_raw |
CharField | Название бренда в сыром виде | Опционально |
pn_raw |
CharField | Номер детали/артикул в сыром виде | Обязательно |
condition_raw |
CharField | Состояние товара (new, used, refurbished и т.д.) | Опционально |
status_raw |
CharField | Статус оффера (active, inactive, sold и т.д.) | Опционально |
price_raw |
DecimalField | Цена товара | Опционально |
price_currency |
CharField | Валюта цены (USD, EUR, GBP и т.д.) | Опционально |
weight_value |
DecimalField | Вес товара | Опционально |
weight_unit |
CharField | Единица измерения веса (kg, g, lb и т.д.) | Опционально |
product_url |
TextField | URL страницы товара у источника | Опционально |
raw_payload |
JSONField | Сырые данные оффера в формате JSON | Опционально |
raw_hash |
CharField | SHA256 хеш raw_payload для отслеживания изменений | Опционально |
created_at |
DateTimeField | Дата и время создания оффера | Только чтение |
Основные эндпоинты
GET Получить список офферов
Возвращает список офферов с поддержкой фильтрации, поиска и сортировки.
Параметры запроса:
source |
ID источника | Опционально |
brand_raw |
Фильтр по бренду | Опционально |
pn_raw |
Фильтр по номеру детали | Опционально |
condition_raw |
Фильтр по состоянию | Опционально |
price_min |
Минимальная цена | Опционально |
price_max |
Максимальная цена | Опционально |
currency |
Фильтр по валюте (USD, EUR, GBP и т.д.) | Опционально |
search |
Поиск по brand_raw, pn_raw, condition_raw | Опционально |
ordering |
Сортировка (created_at, -price_raw, pn_raw) | Опционально |
Пример ответа:
POST Создать оффер
Создает новый оффер. Источник можно указать по имени, URL или ID (будет создан если не существует).
Тело запроса:
💡 Важная информация о source_identifier
source_identifier может быть:
- ✅ Имя существующего источника
- ✅ URL существующего источника
- ✅ ID существующего источника (число)
- ✅ Новое имя (источник будет создан)
- ✅ Новый URL (источник будет создан с именем из домена)
POST Создать оффер (строгий режим)
Создает оффер только с существующим источником (указывается по ID).
Тело запроса:
GET Получить оффер по ID
Возвращает детальную информацию об оффере.
PUT Полное обновление оффера
Полностью обновляет оффер. Требует все обязательные поля.
PATCH Частичное обновление оффера
Обновляет указанные поля оффера. Поддерживает изменение источника.
Примеры запросов:
Без изменения источника:
С изменением источника:
С изменением источника по ID:
DELETE Удалить оффер
Удаляет оффер по ID.
Специальные эндпоинты
POST Массовое создание офферов
Создает несколько офферов за один запрос. Возвращает статистику по созданным и пропущенным офферам.
Тело запроса:
Пример ответа:
POST Массовое обновление офферов
Обновляет несколько офферов за один запрос. Каждое обновление должно содержать ID оффера и данные для обновления.
Тело запроса:
Пример ответа:
PATCH Обновить только цену
Специальный эндпоинт для быстрого обновления цены без изменения других полей.
Тело запроса:
PATCH Изменить источник
Специальный эндпоинт для изменения источника оффера.
По имени/URL:
По ID:
GET Расширенный поиск
Расширенный поиск с дополнительными параметрами фильтрации.
Пример запроса:
GET Офферы по имени источника
Получает все офферы от источника по его имени (частичное совпадение).
Пример запроса:
GET Статистика по офферам
Возвращает подробную статистику по всем офферам.
Пример ответа:
POST Массовое удаление офферов
Удаляет несколько офферов по списку ID.
Тело запроса:
Пример ответа:
🚀 Примеры использования
Сценарий 1: Импорт данных от нового поставщика
Сценарий 2: Ежедневное обновление цен
Сценарий 3: Мониторинг и статистика
Сценарий 4: Поиск дубликатов
🗄️ Модели данных
Модель Source
📝 Описание полей
id (Integer) - Уникальный идентификатор источника
name (CharField) - Наименование источника/поставщика
Обязательно
Макс. длина: 255
url (TextField) - URL сайта источника
updated_at (DateTimeField) - Дата и время последнего обновления
Модель OfferRaw
📝 Описание полей
id (Integer) - Уникальный идентификатор оффера
source (ForeignKey (Source)) - Источник данных (связь с моделью Source)
Обязательно
source_identifier (CharField (write-only)) - Идентификатор источника (имя, URL или ID)
Обязательно
Макс. длина: 255
brand_raw (CharField) - Название бренда в сыром виде
Макс. длина: 255
pn_raw (CharField) - Номер детали/артикул в сыром виде
Обязательно
Макс. длина: 255
condition_raw (CharField) - Состояние товара (new, used, refurbished и т.д.)
Макс. длина: 255
status_raw (CharField) - Статус оффера (active, inactive, sold и т.д.)
Макс. длина: 255
price_raw (DecimalField) - Цена товара
price_currency (CharField) - Валюта цены (USD, EUR, GBP и т.д.)
Макс. длина: 16
weight_value (DecimalField) - Вес товара
(Вес)
weight_unit (CharField) - Единица измерения веса (kg, g, lb и т.д.)
Макс. длина: 16
(Единица веса)
product_url (TextField) - URL страницы товара у источника
raw_payload (JSONField) - Сырые данные оффера в формате JSON
raw_hash (CharField) - SHA256 хеш raw_payload для отслеживания изменений
Макс. длина: 64
created_at (DateTimeField) - Дата и время создания оффера
🔐 Уникальные ограничения
Офферы имеют уникальное ограничение по комбинации полей: source + pn_raw + condition_raw. Это означает, что не может быть двух офферов с одинаковым источником, номером детали и состоянием.
🗄️ Индексы базы данных
offer_raw_src_brand_idx- по source и brand_rawcatalog_offer_raw_pn_raw_idx- по pn_rawcatalog_sources_name_idx- по name в источниках
⚠️ Коды ошибок
| Код | Описание | Причина |
|---|---|---|
| 400 Bad Request | Некорректный запрос | Невалидные данные, отсутствие обязательных полей |
| 401 Unauthorized | Не авторизован | Отсутствует или недействителен токен авторизации |
| 403 Forbidden | Доступ запрещен | Недостаточно прав для выполнения операции |
| 404 Not Found | Ресурс не найден | Несуществующий ID или эндпоинт |
| 409 Conflict | Конфликт данных | Попытка создать дубликат оффера |
| 500 Internal Server Error | Внутренняя ошибка сервера | Проблемы с базой данных или логикой приложения |