Матриця змін даних

Єдиний реєстр даних, які можуть змінюватися у програмі. За цією таблицею пізніше визначаємо: звичайний запит, батч-синк, retry, локальна черга або відсутність збереження.

Зміни

СутністьПоле / даніДжерело зміниТипЛокальна діяЗбереження на серверПомилка / старі даніСтатус
Favorite TU+RUстворення фавоританова витрата у статистиці / Prime-логіціавтододати в FavoriteServiceTODOTODOджерело Prime не спроєктоване
Favorite TU+RUfirstPaidAt, lastPaidAt, profit, gifts, paidActionsстатистика / Prime-логікаавтооновити base/overlayGolden/Chathouse — серверна статистика; Prime — TODOлишити останній коректний станчастково визначено
Favorite TU+RUisActiveзміна lastPaidAt або часуавто, похіднеперерахуватиTODO: зберігати чи рахуватиповторно рахується з вихідних данихTODO
Favorite TU+RUisFreeloaderсума/тип кредитів/кількість платних дійавто, похіднеперерахуватиTODO: хто оновлює поле в БДTODOправила проєктів визначені
Favorite TU+RUisWhiteактивність, глобальний баланс, senderIgnoreавто, похіднеперерахуватиTODOTODOправила визначені
Favorite TU+RUisWhiteдія оператораручнаоновити у програміодразуTODO: rollback чи pending retryTODO
Favorite TU+RUblockedByTUдія оператораручнаоновити у програміодразуTODO: rollback чи pending retry; не перезаписати новіший серверний станTODO
Favorite TU+RUblockedByRUпартнерське API / dialogs / relationавтооновити FavoriteTODO: bulk змінTODO: повтор після помилкиTODO
Favorite TU+RUtype, note, language, contactDetailsдія оператораручнаоновити FavoriteTODO: одразу чи батчTODOперевірити однаковість полів
Global Favorite RUsenderIgnoreдія оператораручнаоновити глобальний стан RUодразуTODO: rollback чи pending retryTODO
Global RU profileім’я, вік, аватар, isSatelliteпрофіль із сайтуавтоupsert у RU-сервісTODO: батч змінених профілівне втратити зміну при закритті програми; не записати старіший профільTODO
Blocks TUblockedByRU не-фаворитівGolden block-list APIавто, повний знімокзамінити списокTODO: не зберігати / full snapshot / deltaпри помилці лишити останній коректний списокTODO
Task TU+RUстворення / закриття / зміна стануAPI, socket, таймер або операторавто / ручнаоновити Task FactoryTODOTODOбуде деталізовано в Task Factory
Sender history TU+RUуспішна чат/мейл-відправкасендеравто, подіязапис у SQLiteпоточний DataSync, 60 сdelete-on-ack; 3 фейли поспіль → закриття програмиреалізовано
Sender answer TU+RUвідповідь RU на sender-відправкувхідне повідомлення після sender externalMessageIdавто, подіязапис у SQLiteDataSync → SenderAnalyticsServicedelete-on-ack; серверний dedup за відправкоюспроєктовано
Operator actionsдія оператораUIавто, подіязапис у SQLiteпоточний DataSync, 60 сdelete-on-ack; 3 фейли поспіль → закриття програмиреалізовано
TU onlineінтервал онлайнуTU-online сервісавто, подіязапис у SQLiteпоточний DataSync, 60 сdelete-on-ack; 3 фейли поспіль → закриття програмиреалізовано
Golden streams/viewsінтервали / переглядиGolden-логікиавто, подіязапис у SQLiteпоточний DataSync, 60 сdelete-on-ack; 3 фейли поспіль → закриття програмиреалізовано
Critical logsлогусі сервісиавто, подіязапис у SQLiteпоточний DataSync, 60 сdelete-on-ack; 3 фейли поспіль → закриття програмиреалізовано

Що треба вирішити для кожної зміни

  1. Де source of truth.
  2. Чи потрібна зміна наступному оператору одразу.
  3. Чи важлива кожна подія, чи достатньо останнього значення.
  4. Допустима затримка збереження.
  5. Що бачить програма до відповіді сервера.
  6. Які помилки повторюємо, а які відкочують зміну.
  7. Як локальні дані після аварійного вимкнення звіряються з актуальним сервером.

Поки матриця не заповнена, не додаємо updatedAt / version у всі таблиці та не обираємо один складний механізм синку для всіх даних.