По запросам @jack_martynov
Есть связка устройства и сервера. На устройстве создается заказ, у заказа есть есть id, который по умолчанию равен нулю. При первой отправке на сервер происходит выдача инкрементального уникального id
Затем заказ продают и создают локально ещё одну сущность 'продажа', у которой есть транзакции. Эта сущность не может быть отправлена на сервер до тех пор, пока не была отправлена первая
Есть статус заказа, который мы используем чтобы двигать его от InProgress/InDelivery/Delayed до Deleted/Done. Этот статус надо поменять после окончания продажи, чтобы заказ более не выдавался в активных и не было возможности его редактировать
Также есть статусы синхронизации заказа Syncing/Synced/Charging/Charged/Removing/Removed/Delayed/Failed/Blocked. Эти статусы исключительно локальны и о них не знает сервер
Плюс есть еще транзакции через наличку, терминал, чеки, подарочные карты и т.д., которыми можно оплатить заказ не в один присест, а в несколько
И все это время ты можешь находиться в оффлайне, один из запросов может оборваться посреди исполнения (когда сервер уже получил данные, но не успел отдать нам ответ), пользователь еще может удалить заказ или оплатить часть заказа и потом пойти дополнять его
И все это в условиях того, что большая часть сущностей не может просто создаться и отредактироваться локально и независимо друг от друга - нужно сохранять порядок перехода статусов, исполнения запросов и быть готовым ко всем этим неожиданностям
Плюс бэкенд часто любит игнорировать некоторые части сущностей - допустим, если заказ оплатили частично и пока еще нельзя создать экземпляр продажи - его транзакции хранятся только в нем. И при отправке на сервер - они их игнорят и не сохраняют
Также нельзя сначала закрыть заказ и затем сделать продажу, чтобы сразу скрыть заказ с радаров 'активных заказов'. Иначе получишь 423
В общем возникает две проблемы:
Мало того что несколько устройств могут менять данные одной сущности - это еще делает и сервер
Хранение данных на старом апи сделано очень неудачно (как по структуре, так и по скорости доступа)
Поэтому очень хочется перейти на новую версию апи, которую уже пользует iOS, где девайс стал куда самостоятельнее, а бэкэнд просто верит нам и хранит все как надо. То есть наконец то появился главный источник истины
Арсений Александров