REST V1 APP - API для мобильных приложений
RestV1APP — это REST API специально для мобильных приложений и фронтенда. Возвращает агрегированные данные, готовые к отображению на экране.
Сравнение подходов APP и M2M RestV1M2M:
- ✅ V1 APP — бизнес-ориентированные endpoints (getHome, postCart, placeOrder)
- ✅ V1 M2M — универсальный CRUD для любых таблиц
Общая архитектура REST: REST Architecture (авторизация, конфиг, валидация).
Endpoints RestV1APP
| Endpoint | Метод | Описание | Требует Auth |
|---|---|---|---|
| /rest/v1/home | GET | Главный экран (слайды, категории, новости, товары, избранное, заказы) | Опционально |
| /rest/v1/goods | GET | Каталог товаров с фильтрами и поиском | Нет |
| /rest/v1/goods.item | GET | Один товар (название, цена, описание, изображения) | Нет |
| /rest/v1/goods.categories | GET | Категории товаров | Нет |
| /rest/v1/goods.filters | GET | Доступные свойства-фильтры для списка товаров | Нет |
| /rest/v1/goods.favorites | GET | Избранные товары текущего пользователя | Да |
| /rest/v1/orders | GET | Заказы пользователя по статусам | Да |
| /rest/v1/orders.item | GET | Один заказ | Да |
| /rest/v1/orders.messages | GET | Сообщения по заказу | Да |
| /rest/v1/news | GET | Новости с пагинацией | Нет |
| /rest/v1/news.item | GET | Одна новость | Нет |
| /rest/v1/slides | GET | Активные слайды | Нет |
| /rest/v1/cart | GET | Корзина пользователя с позициями и итогами | Да |
| /rest/v1/cart.metrics | GET | Счётчики: количество позиций, их id | Опционально |
| /rest/v1/cart.checkout | GET | Полные данные оформления (города, доставки, платежи) | Да |
| /rest/v1/cart.city | GET | Поиск городов по строке ?q= (мин. 2 символа) |
Да |
| /rest/v1/cart.delivery | GET | Способы доставки для города ?citiesId= |
Да |
| /rest/v1/profile | GET | Профиль пользователя | Да |
| /rest/v1/profile.settings | GET | Настройки приложения пользователя | Да |
| /rest/v1/auth.login | POST | Аутентификация (access + refresh токены) | Нет |
| /rest/v1/auth.refresh | POST | Обновление access-токена | Нет |
| /rest/v1/auth.confirm | POST | Подтверждение входа по коду (режим CONFIRM_AUTH) | Нет |
| /rest/v1/auth.logout | POST | Завершение сессии | Да |
| /rest/v1/register | POST | Инициация регистрации (письмо с подтверждением) | Нет |
| /rest/v1/register.confirm | POST | Завершение регистрации по токену | Нет |
| /rest/v1/profile.password-reset | POST | Запрос восстановления пароля | Нет |
| /rest/v1/cart | POST | Добавить товар в корзину | Да |
| /rest/v1/cart.placeOrder | POST | Создать заказ | Да |
| /rest/v1/orders.messages | POST | Добавить сообщение к заказу | Да |
| /rest/v1/goods | POST | Создать товар(ы) (batch, роль 1-2) | Да (роль) |
| /rest/v1/cart | PUT | Обновить количество / активность товара | Да |
| /rest/v1/cart.city | PUT | Выбрать город доставки (шаг 1) | Да |
| /rest/v1/cart.delivery | PUT | Выбрать способ доставки (шаг 2) | Да |
| /rest/v1/cart.deliveryOperations | PUT | Сохранить параметры доставки (ПВЗ, адрес) | Да |
| /rest/v1/cart.payment | PUT | Выбрать способ оплаты | Да |
| /rest/v1/profile | PUT | Обновить ФИО и адрес | Да |
| /rest/v1/profile.email | PUT | Смена email (2 шага) | Да |
| /rest/v1/profile.phone | PUT | Смена телефона (2 шага) | Да |
| /rest/v1/profile.settings | PUT | Обновить настройки приложения | Да |
| /rest/v1/profile.password | PUT | Смена пароля (2 шага) | Да |
| /rest/v1/orders.status | PUT | Обновить статус заказа (роль 1-2) | Да (роль) |
| /rest/v1/goods | PUT | Обновить товар (роль 1-2) | Да (роль) |
| /rest/v1/cart | DELETE | Удалить позицию(и) из корзины (?id= или {"ids": [...]}) |
Да |
| /rest/v1/goods | DELETE | Удалить товар (?id= или {"ids": [...]}, роль 1-2) |
Да (роль) |
| /rest/v1/orders | DELETE | Отменить заказ(ы) (?id= или {"ids": [...]}) |
Да |
| /rest/v1/profile | DELETE | Удалить аккаунт (2 шага: «УДАЛИТЬ» → код) | Да |
Примеры использования REST API
Checkout Flow (полный цикл оформления заказа)
Типичный сценарий: пользователь добавляет товары в корзину и оформляет заказ с доставкой ПВЗ CDEK.
Шаг 1️⃣: Добавить товары в корзину
POST /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"data": {
"id": "325",
"quantity": 2
}
}
Response (200 OK):
{
"status": 200,
"message": "Cart updated",
"data": {
"items": [
{ "id": "325", "qu": 2, "ac": 1 }
],
"sum": 5000,
"quantityActive": 2
}
}
Response (404 Not Found - товар не существует):
{
"status": 404,
"message": "Product not found",
"data": null
}
Что делать если 404?
- Товар был удалён из каталога
- Ошибка в ID товара
- Предложить пользователю выбрать другой товар
💡 Формат
id:"325"— обычный товар,"325-555"— товар с вариацией (товар-вариация).quantityпо умолчанию1. Повторный POST с тем жеidувеличивает количество в существующей позиции.
Шаг 2️⃣: Получить список городов доставки
GET /rest/v1/cart.checkout HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Response (200 OK):
{
"status": 200,
"message": "OK",
"data": {
"items": [{ "id": "325", "qu": 2, "ac": 1 }],
"sum": 5000,
"city": { "id": 8, "title": "Москва" },
"delivery": [
{ "id": 1, "name": "CDEK", "price": 299, "days": 3 },
{ "id": 2, "name": "Яндекс Доставка", "price": 199, "days": 1 }
],
"deliveryActive": "0",
"deliveryOperations": [],
"payments": [],
"paymentsActive": "0"
}
}
Из ответа видно:
city— текущий город (если установлен)delivery— доступные методы доставкиdeliveryActive: "0"— доставка не выбрана
💡 Важно: список доставок (
delivery) появляется только после выбора города черезPUT /rest/v1/cart.city(шаг 1b ниже). Если город не задан —deliveryбудет пустым.
Шаг 3️⃣: Выбрать способ доставки (например, CDEK)
PUT /rest/v1/cart.delivery HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"data": {
"deliveryId": "1"
}
}
Response (200 OK):
{
"status": 200,
"message": "OK",
"data": {
"delivery": [
{ "id": 1, "name": "CDEK", "price": 299 }
],
"deliveryActive": "1",
"deliveryOperations": [
{
"id": "136",
"tariff": "ПВЗ",
"allowOrderBtn": false,
"list": [
{ "id": "12345", "title": "ПВЗ №12345 на ул. Примерная, 1" },
{ "id": "12346", "title": "ПВЗ №12346 на пр. Ленина, 5" }
]
}
],
"payments": [
{ "id": 1, "name": "Карта", "description": "Банковская карта" }
],
"paymentsActive": "0"
}
}
Из ответа видно:
deliveryActive: "1"— доставка выбранаdeliveryOperations[0].allowOrderBtn = false— нельзя оформить заказ пока не выберешь ПВЗlist— доступные ПВЗ для выбранной доставки
Шаг 4️⃣: Выбрать ПВЗ (сохранить параметры доставки)
PUT /rest/v1/cart.deliveryOperations HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"data": {
"operations-id": "12345",
"operations-title": "ПВЗ №12345",
"operations-city": "Москва",
"operations-address-short": "ул. Примерная, 1",
"operations-postal-code": "109012"
}
}
Response (200 OK):
{
"status": 200,
"message": "OK",
"data": null
}
Response (400 Validation Error):
{
"status": 400,
"message": "Validation errors",
"data": {
"operations-id": "Не заполнено",
"operations-address-short": "Не заполнено"
}
}
Если 400:
- Не все обязательные поля заполнены
- Исправить ошибки и отправить заново
Шаг 5️⃣: Проверить что allowOrderBtn = true
GET /rest/v1/cart.checkout HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Response (200 OK):
{
"status": 200,
"message": "OK",
"data": {
...
"deliveryOperations": [
{
"id": "136",
"tariff": "ПВЗ",
"allowOrderBtn": true, // ✅ ТЕПЕРЬ МОЖНО ОФОРМИТЬ ЗАКАЗ
"list": [...]
}
],
"paymentsActive": "1"
}
}
Важно:
allowOrderBtn: true— все параметры доставки заполнены, можно оформлять заказpaymentsActive: "1"— способ оплаты выбран
Шаг 6️⃣: Оформить заказ
POST /rest/v1/cart.placeOrder HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"data": {}
}
Response (200 OK):
{
"status": 200,
"message": "Order created",
"data": {
"id": 5001,
"sum": 2999,
"status": 1,
"odate": "2026-05-03 15:30:00"
}
}
Response (400 Missing Delivery):
{
"status": 400,
"message": "Delivery method not selected",
"data": null
}
Response (400 Validation Error):
{
"status": 400,
"message": "Validation error",
"data": {
"operations-id": "Не заполнено"
}
}
Если ошибка:
- Вернуться на шаги 3-5 и заполнить недостающие данные
- Попробовать оформить заказ заново
Дополнительные сценарии
Сценарий: Изменить количество товара
PUT /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"data": {
"id": "325",
"quantity": 5,
"active": 1
}
}
Response:
{
"status": 200,
"message": "Cart updated",
"data": {
"items": [
{ "id": "325", "qu": 5, "ac": 1 }
],
"sum": 12500
}
}
Сценарий: Временно отключить товар (не удалять)
PUT /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"data": {
"id": "325",
"quantity": 5,
"active": 0
}
}
Response:
{
"status": 200,
"message": "Cart updated",
"data": {
"items": [
{ "id": "325", "qu": 5, "ac": 0 }
],
"sum": 0,
"quantityActive": 0
}
}
Результат:
- Товар остаётся в корзине (
ac: 0= отключен) sum: 0— товар не учитывается в сумме- Пользователь может включить обратно (
active: 1)
Сценарий: Удалить товар из корзины
DELETE /rest/v1/cart?id=325 HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Response:
{
"status": 200,
"message": "Item removed",
"data": {
"items": [],
"sum": 0,
"quantityActive": 0
}
}
Сценарий: Удалить несколько позиций (batch)
DELETE /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"ids": ["325", "325-555"]
}
Сценарий: Добавить товар с вариацией
POST /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"data": {
"id": "325-555",
"quantity": 1
}
}
Response (200 OK):
{
"status": 200,
"message": "Cart updated",
"data": {
"items": [
{ "id": "325-555", "qu": 1, "ac": 1 }
],
"sum": 2500
}
}
Response (404 Variation Not Found):
{
"status": 404,
"message": "Variation not found",
"data": null
}
Сценарий: Получить метрики корзины (простая версия)
GET /rest/v1/cart.metrics HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Response:
{
"status": 200,
"message": "OK",
"data": {
"count": 3,
"quantityActive": 3,
"sum": 5000,
"items": [
{ "id": "325", "qu": 2, "ac": 1 },
{ "id": "200", "qu": 1, "ac": 1 }
]
}
}
💡
cart.metricsработает как для авторизованных, так и для анонимных пользователей (auth_optional). Если токен не передан — возвращаются метрики пустой корзины.
1. Получить главный экран приложения
GET /rest/v1/home HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Response:
{
"status": 200,
"message": "OK",
"data": {
"slides": [...],
"categories": [...],
"news": [...],
"goods": [...],
"goods_favorites": [...],
"active_orders": [...],
"cart_metrics": { "count": 3, "sum": 5000 }
}
}
💡
homeиспользуетauth_optional— для анонима блокиgoods_favorites,active_orders,cart_metricsбудут пустыми.
1b. Каталог товаров (с фильтрами и поиском)
GET /rest/v1/goods?page=1&limit=24&category=8&f_1=red|blue&sort=priceasc&search=футбол HTTP/1.1
Response (200 OK):
{
"status": 200,
"message": "OK",
"data": [ ... ],
"pagination": { "page": 1, "limit": 24, "count": 120 }
}
Параметры GET (все необязательные):
page,limit— пагинация (по умолчаниюpage=1,limit=20)category—NavigatorIdкатегорииf_{PropertyId}— фильтр по свойству, несколько значений через|(напримерf_1=red|blue)sort—priceasc|pricedesc|nameasc(пусто = по приоритету)search— поиск по началу названия
Список доступных свойств-фильтров: GET /rest/v1/goods.filters?category=8&search=... — вернёт значения с количеством товаров для построения UI-фильтров.
2. Добавить товар в корзину
POST /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"data": {
"id": "325",
"quantity": 2
}
}
Response (200 OK):
{
"status": 200,
"message": "Cart updated",
"data": {
"items": [
{ "id": "325", "qu": 2, "ac": 1 },
{ "id": "200", "qu": 1, "ac": 1 }
],
"sum": 5000,
"quantityActive": 3
}
}
Response (404 Not Found):
{
"status": 404,
"message": "Product not found",
"data": null
}
3. Добавить товар с вариацией
POST /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"data": {
"id": "325-555",
"quantity": 1
}
}
Response (200 OK):
{
"status": 200,
"message": "Cart updated",
"data": { ... }
}
Response (404 Not Found - если вариация не существует):
{
"status": 404,
"message": "Variation not found",
"data": null
}
4. Обновить товар в корзине
PUT /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"data": {
"id": "325",
"quantity": 3,
"active": 1
}
}
Response:
{
"status": 200,
"message": "Cart updated",
"data": { ... }
}
5. Отключить товар в корзине (без удаления)
PUT /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"data": {
"id": "325",
"quantity": 3,
"active": 0
}
}
Response:
{
"status": 200,
"message": "Cart updated",
"data": {
"items": [
{ "id": "325", "qu": 3, "ac": 0 }
]
}
}
6. Удалить товар из корзины
DELETE /rest/v1/cart?id=325 HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Response:
{
"status": 200,
"message": "Item removed",
"data": { ... }
}
7. Выбрать город доставки
PUT /rest/v1/cart.city HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"data": {
"citiesId": 8
}
}
Response:
{
"status": 200,
"message": "OK",
"data": {
"city": { "id": 8, "title": "Москва" },
"delivery": [...],
"deliveryActive": "0",
"deliveryOperations": [],
"payments": [],
"paymentsActive": "0"
}
}
7b. Поиск городов (GET)
GET /rest/v1/cart.city?q=Мос HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Response:
{
"status": 200,
"message": "OK",
"data": [
{ "id": 8, "title": "Москва" },
{ "id": 12, "title": "Мосальск" }
]
}
💡 Поиск городов работает по
?q=...(минимум 2 символа).
7c. Способы доставки для города (GET)
GET /rest/v1/cart.delivery?citiesId=8 HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Response:
{
"status": 200,
"message": "OK",
"data": [
{ "id": 1, "name": "CDEK", "price": 299, "days": 3 },
{ "id": 2, "name": "Яндекс Доставка", "price": 199, "days": 1 }
]
}
8. Выбрать способ доставки
PUT /rest/v1/cart.delivery HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"data": {
"deliveryId": "1"
}
}
Response:
{
"status": 200,
"message": "OK",
"data": {
"delivery": [...],
"deliveryActive": "1",
"deliveryOperations": [
{
"id": "136",
"tariff": "ПВЗ",
"allowOrderBtn": false,
"list": [...]
}
],
"payments": [...]
}
}
9. Сохранить параметры доставки (ПВЗ)
PUT /rest/v1/cart.deliveryOperations HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"data": {
"operations-id": "12345",
"operations-title": "ПВЗ №12345",
"operations-city": "Москва",
"operations-address-short": "ул. Примерная, 1",
"operations-postal-code": "109012"
}
}
Response (200 OK):
{
"status": 200,
"message": "OK",
"data": null
}
Response (400 Validation Error):
{
"status": 400,
"message": "Validation errors",
"data": {
"operations-city": "Не заполнено",
"operations-address-short": "Не заполнено"
}
}
💡 Валидация параметров доставки выполняется через класс расширения Delivery (метод
getErrors).
10. Выбрать способ оплаты
PUT /rest/v1/cart.payment HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"data": {
"paymentsId": "1"
}
}
Response:
{
"status": 200,
"message": "OK",
"data": { ... }
}
11. Оформить заказ
POST /rest/v1/cart.placeOrder HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"data": {}
}
Response (200 OK):
{
"status": 200,
"message": "Order created",
"data": {
"id": 5001,
"sum": 2999,
"status": 1,
"odate": "2026-05-03 15:30:00"
}
}
Response (400 Validation Error):
{
"status": 400,
"message": "Validation error",
"data": {
"operations-id": "Не заполнено"
}
}
Response (400 Empty Cart):
{
"status": 400,
"message": "Cart is empty",
"data": null
}
Response (400 Delivery Not Selected):
{
"status": 400,
"message": "Delivery method not selected",
"data": null
}
Response (400 Payment Not Selected):
{
"status": 400,
"message": "Payment method not selected",
"data": null
}
12. Получить профиль пользователя
GET /rest/v1/profile HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Response:
{
"status": 200,
"message": "OK",
"data": {
"id": 123,
"login": "user@example.com",
"email": "user@example.com",
"name": "Иванов Иван Иванович",
"nameSurname": "Иванов",
"nameFirst": "Иван",
"namePatronymic": "Иванович",
"phone": "9123456789",
"city": "Москва",
"address": "ул. Примерная, 1"
}
}
💡 Профиль возвращается в camelCase. Смена email/телефона/пароля — 2 шага: сначала отправка кода подтверждения, затем подтверждение кодом.
13. Получить метрики корзины
GET /rest/v1/cart.metrics HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Response:
{
"status": 200,
"message": "OK",
"data": {
"count": 3,
"quantityActive": 3,
"sum": 5000,
"items": [
{ "id": "325", "qu": 2, "ac": 1 },
{ "id": "200", "qu": 1, "ac": 1 }
]
}
}
14. Получить данные для оформления заказа
GET /rest/v1/cart.checkout HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Response:
{
"status": 200,
"message": "OK",
"data": {
"items": [
{ "id": "325", "qu": 2, "ac": 1 }
],
"sum": 5000,
"city": { "id": 8, "title": "Москва" },
"delivery": [
{ "id": 1, "name": "CDEK", "price": 299 },
{ "id": 2, "name": "Яндекс", "price": 199 }
],
"deliveryActive": "0",
"deliveryOperations": [],
"payments": [
{ "id": 1, "name": "Карта", "description": "Банковская карта" },
{ "id": 2, "name": "Наличные", "description": "При доставке" }
],
"paymentsActive": "0"
}
}
15. Заказы пользователя
GET /rest/v1/orders?page=1&limit=20 HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Response:
{
"status": 200,
"message": "OK",
"data": [
{
"id": 5001,
"status": "processing",
"sum": 2999,
"odate": "2026-04-01 10:00:00",
"delivery": "cdek",
"payment": "card"
},
{
"id": 5002,
"status": "shipped",
"sum": 1499,
"odate": "2026-03-28 12:30:00",
"delivery": "yandex",
"payment": "card"
}
],
"pagination": {
"count": 2,
"limit": 20,
"page": 1
}
}
💡 Поля заказов конвертируются в camelCase:
OStatus→status,OSum→sum,ODate→odate.
16. Авторизация (auth.login)
POST /rest/v1/auth.login HTTP/1.1
Content-Type: application/json
{
"data": {
"login": "user@example.com",
"password": "password123"
}
}
Response (200 OK):
{
"status": 200,
"message": "Login successful",
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"access_exp": 1774567890,
"refresh_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_exp": 1777159890
}
}
💡 Режим CONFIRM_AUTH: если на сервере включён
CONFIRM_AUTH, тоauth.loginвместо пары токенов вернётconfirm_tokenиconfirm_exp, а на почту придёт код подтверждения. Тогда токены выдаются черезPOST /rest/v1/auth.confirm:{ "data": { "token": "eyJhbGciOiJIUzI1NiIs...", // confirm_token из ответа auth.login "code": 154566 // код из письма (необязателен, для 2FA) } }
17. Регистрация (2 шага)
# Шаг 1: инициация — валидация данных и письмо с токеном подтверждения
POST /rest/v1/register HTTP/1.1
Content-Type: application/json
{
"data": {
"login": "user@example.com",
"phone": "9123456789",
"nameSurname": "Иванов",
"nameFirst": "Иван",
"namePatronymic": "Иванович"
}
}
# Шаг 2: подтверждение — токен из письма + новый пароль
POST /rest/v1/register.confirm HTTP/1.1
Content-Type: application/json
{
"data": {
"token": "eyJhbGciOiJIUzI1NiIs...",
"password": "password123",
"password2": "password123"
}
}
Response (200 OK):
{
"status": 200,
"message": "Registration confirmed",
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"access_exp": 1774567890,
"refresh_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_exp": 1777159890
}
}
Сравнение RestV1APP и RestV1M2M
| Аспект | RestV1APP | RestV1M2M |
|---|---|---|
| Назначение | APP-Specific API для фронтенда | Universal CRUD для любых таблиц |
| Типичный usecase | Мобильное приложение | Интеграция с внешними системами |
| URL | /rest/v1/... |
/rest/m2m/... |
| Методы | Бизнес-функции (getHome, placeOrder) | Явные CRUD на таблицу (users, goods, orders) |
| Логика | Сложная, специфичная для приложения | Простая, универсальная |
| Данные | Агрегированы из нескольких таблиц | Берутся как есть из таблицы |
| Размер кода | Большой (500-1000+ строк) | Маленький (180-200 строк) |
| Авторизация | Часто требуется | Всегда требуется (auth_required) |
| Роли | Разные (гость, пользователь, админ) | Только роль 1 |
| Фильтры | Complex (свойства, сортировка) | Simple (page, limit, search) |
| Utils dependency | Много (CartUtils, DeliveryUtils и т.д.) | Использует стандартный RestV1M2MUtils |
Key Features
RestV1APP поддерживает:
- Валидация товаров — все операции с товарами (добавить, обновить, удалить) проверяют существование товара перед выполнением
- Управление активностью — параметр
activeпозволяет отключать товары из расчёта суммы без удаления - Параметры доставки — сохранение параметров (ПВЗ, адрес) перед оформлением заказа с валидацией
- Формат товаров — поддержка простых товаров (ID: "325") и товаров с вариациями (ID: "325-555")
- 2-шаговые операции — смена email/телефона/пароля, удаление аккаунта (слово «УДАЛИТЬ» → код подтверждения)
- Auth 2-фактор — access + refresh токены,
register→register.confirm,auth.confirm(CONFIRM_AUTH)
Примеры HTTP Request/Response
Когда расширять RestV1APP
Добавляйте новые методы в RestV1APP когда:
- ✅ Нужен новый endpoint для приложения
- ✅ Логика специфична для приложения (не generic)
- ✅ Требуется авторизация и фильтрация данных по пользователю
- ✅ Нужна агрегация из нескольких таблиц в один запрос
Пример: добавить обработчик для рецензий товаров
/**
* GET /rest/v1/goods.item.reviews?id=100&page=1&limit=10
* Получить рецензии на товар
*/
public function getGoodsItemReviews(): array
{
$id = (int) ($this->get['id'] ?? 0);
$page = max(1, (int) ($this->get['page'] ?? 1));
$limit = min(50, max(1, (int) ($this->get['limit'] ?? 10)));
if (!$id) {
return ['status' => 400, 'message' => 'Product ID required', 'data' => null];
}
$data = new Data('Reviews');
$result = $data->fetch('ProductId = ? AND IsHidden = 0', $limit, $page);
$result = array_map(fn($r) => [
'id' => $r['Id'],
'author' => $r['AuthorName'],
'rating' => $r['Rating'],
'text' => $r['Text'],
'date' => $r['CreateDate'],
'helpful' => $r['HelpfullCount'] ?? 0,
], $result);
return ['status' => 200, 'message' => 'OK', 'data' => $result];
}
Затем зарегистрировать в RestConfig.php:
'v1' => [
'get' => [
'goods.item.reviews' => [
'class' => RestV1APP::class,
'method' => 'getGoodsItemReviews',
],
],
]
Выводы
RestV1APP — это специализированный REST API для приложений:
- Бизнес-ориентированность — методы отвечают на вопросы приложения ("Дай мне главный экран", "Оформи заказ")
- Агрегация — один запрос может собрать данные из нескольких таблиц
- Сложная логика — фильтры по свойствам, расчёт доставки, интеграция с платёжными системами
- Авторизация — часто нужна проверка прав пользователя
- Масштабируемость — используется множество специализированных Utils классов
- Валидация — все операции с товарами и доставкой валидируются перед выполнением
- Гибкость — управление активностью товаров, сохранение параметров доставки, минимальные ответы
Ключевые функции:
- ✅ Валидация товаров — ProductsUtils::validateProductId() предотвращает добавление несуществующих товаров
- ✅ Управление активностью — параметр
activeпозволяет отключать товары без удаления - ✅ Параметры доставки — PUT /rest/v1/cart.deliveryOperations сохраняет параметры выбранной доставки
- ✅ Checkout — город → доставка → параметры → оплата → оформление
- ✅ 2-шаговый auth — access + refresh токены, подтверждение email/телефона/пароля
- ✅ CRUD для админов — POST/PUT/DELETE goods и PUT orders.status (роль 1-2)
Используйте:
- RestV1APP — для мобильный приложений и фронтенда (бизнес-функции)
- RestV1M2M — для внешних систем и интеграций (универсальный CRUD)