Клиенты и адреса

Клиент живёт в системе заведения: по номеру телефона к нему привязываются заказы, история и бонусы. Приложение подтверждает телефон кодом из SMS, получает client_id и дальше работает с адресами.

Как устроена авторизация

Отдельного токена клиента нет — сессию пользователя приложение держит у себя, а к нам ходит своим ключом и указывает client_id. SMS-код нужен для одного: убедиться, что номер действительно принадлежит человеку, который его вводит.

Клиент вводит телефон
        ↓
POST /clients/auth/send-code     → SMS с кодом
        ↓
Клиент вводит код
        ↓
POST /clients/auth/verify-code   → client_id, профиль, сохранённые адреса
        ↓
Приложение запоминает client_id и передаёт его в заказах

Отправка кода

POST /clients/auth/send-code
{ "phone": "998901112233" }
{ "message": "Код успешно отправлен" }

Телефон принимается в любом формате — лишние символы отбрасываются. SMS уходит через провайдера, подключённого у заведения.

Лимит — 20 запросов в минуту на ключ: защита от перебора номеров за ваш счёт.

Проверка кода

POST /clients/auth/verify-code
{ "phone": "998901112233", "otp": "123456", "name": "Азиз" }
{
  "client_id": 517090,
  "name": "Азиз",
  "phone": "998901112233",
  "language": "uz_latn",
  "loyalty_balance": 0,
  "orders_count": 12,
  "birthday": null,
  "addresses": [
    {
      "id": 119292,
      "name": "Амира Темура 15",
      "short_name": null,
      "latitude": 41.31793,
      "longitude": 69.25775,
      "apartment": "42",
      "floor": "4",
      "entrance": "2",
      "intercom": null,
      "navigate": null
    }
  ]
}

Если клиента с таким номером у заведения ещё не было, он заводится автоматически. name необязателен: при первом входе он станет именем клиента, при повторном — обновит его.

Неверный код — 400 с сообщением «Смс код неверный».

Сразу показывайте сохранённые адреса

В ответе приходят адреса, которые клиент использовал раньше — в том числе оставленные в других каналах заведения (сайт, Telegram-бот, колл-центр). Покажите их списком, чтобы человек не вводил адрес заново.

Профиль клиента

GET /clients/{client_id}

Тот же объект, что при проверке кода. Вызывайте, когда нужно обновить список адресов или показать баланс бонусов.

Добавление адреса

POST /clients/{client_id}/addresses
{
  "latitude": 41.32,
  "longitude": 69.26,
  "name": "Мустакиллик 5",
  "apartment": "12",
  "floor": "3",
  "entrance": "1",
  "intercom": "12K",
  "navigate": "Во дворе, вход со стороны аптеки"
}
ПолеОбязательноОписание
latitude / longitudeдаКоординаты точки на карте
nameнетАдрес текстом. Не передадите — определим по координатам
short_nameнетКороткая подпись для списка
apartment, floor, entrance, intercomнетКвартира, этаж, подъезд, домофон
navigateнетКак добраться — увидит курьер

В ответе — созданный адрес с id, его передавать в заказ не нужно: заказ принимает адрес целиком, а не ссылкой.

Адрес с теми же координатами не дублируется — обновляются поля существующего. Можно спокойно сохранять адрес при каждом заказе.

Удаление адреса

DELETE /clients/{client_id}/addresses/{id}

Адрес пропадает из списка клиента. Физически он остаётся в системе: на него ссылаются уже созданные заказы, и в истории они должны остаться читаемыми.

Что дальше

Адрес выбран — проверьте, доставляет ли туда заведение: POST /delivery/check. Это стоит делать до показа меню.