🔥

Тред (Арсений Александров)


По запросам @jack_martynov Есть связка устройства и сервера. На устройстве создается заказ, у заказа есть есть id, который по умолчанию равен нулю. При первой отправке на сервер происходит выдача инкрементального уникального id

Затем заказ продают и создают локально ещё одну сущность 'продажа', у которой есть транзакции. Эта сущность не может быть отправлена на сервер до тех пор, пока не была отправлена первая

Есть статус заказа, который мы используем чтобы двигать его от InProgress/InDelivery/Delayed до Deleted/Done. Этот статус надо поменять после окончания продажи, чтобы заказ более не выдавался в активных и не было возможности его редактировать

Также есть статусы синхронизации заказа Syncing/Synced/Charging/Charged/Removing/Removed/Delayed/Failed/Blocked. Эти статусы исключительно локальны и о них не знает сервер

Плюс есть еще транзакции через наличку, терминал, чеки, подарочные карты и т.д., которыми можно оплатить заказ не в один присест, а в несколько

И все это время ты можешь находиться в оффлайне, один из запросов может оборваться посреди исполнения (когда сервер уже получил данные, но не успел отдать нам ответ), пользователь еще может удалить заказ или оплатить часть заказа и потом пойти дополнять его

И все это в условиях того, что большая часть сущностей не может просто создаться и отредактироваться локально и независимо друг от друга - нужно сохранять порядок перехода статусов, исполнения запросов и быть готовым ко всем этим неожиданностям

Плюс бэкенд часто любит игнорировать некоторые части сущностей - допустим, если заказ оплатили частично и пока еще нельзя создать экземпляр продажи - его транзакции хранятся только в нем. И при отправке на сервер - они их игнорят и не сохраняют

Также нельзя сначала закрыть заказ и затем сделать продажу, чтобы сразу скрыть заказ с радаров 'активных заказов'. Иначе получишь 423

В общем возникает две проблемы: Мало того что несколько устройств могут менять данные одной сущности - это еще делает и сервер Хранение данных на старом апи сделано очень неудачно (как по структуре, так и по скорости доступа)

Поэтому очень хочется перейти на новую версию апи, которую уже пользует iOS, где девайс стал куда самостоятельнее, а бэкэнд просто верит нам и хранит все как надо. То есть наконец то появился главный источник истины

Арсений АлександровАрсений Александров