3.7 KiB
Модель данных BalanceServer
Ниже описана серверная модель на основании исходного кода проекта. При изменении schema обновляйте этот документ.
Найденные определения моделей/schema
- internal/database/database.go
- internal/database/database.go
- internal/database/database.go
- internal/config/config.go
- internal/auth/tokens.go
- internal/auth/tokens.go
- internal/httpapi/auth_handlers.go
- internal/httpapi/auth_handlers.go
- internal/httpapi/auth_handlers.go
- internal/httpapi/server.go
- internal/httpapi/server.go
- internal/httpapi/server.go
- internal/httpapi/sync_handler.go
- internal/httpapi/sync_handler.go
- internal/httpapi/sync_handler.go
- internal/httpapi/web.go
- internal/httpapi/server_test.go
- internal/httpapi/server_test.go
- internal/httpapi/server_test.go
Общие сущности
Сервер должен различать как минимум следующие логические типы синхронизируемых данных, совместимые с клиентами Balance:
transaction
category
budget
Transaction
Логически содержит:
- стабильный ID;
- amount;
- date;
- note;
- category presentation data;
- transaction kind;
- balance-adjustment flag;
- update timestamp;
- принадлежность пользователю.
Category
Логически содержит:
- стабильный ID;
- name;
- icon/emoji;
- color;
- operation kind;
- creation/update metadata;
- принадлежность пользователю.
Budget
Логически содержит:
- стабильный ID;
- category information;
- monthly limit;
- month start;
- update timestamp;
- принадлежность пользователю.
Change metadata
Для sync необходима метаинформация:
user
entity
record ID
deleted
updatedAt
sequence
payload
sequence используется как серверный порядок изменений, а updatedAt — как timestamp версии самой записи.
Tombstones
Удаление нельзя реализовывать только физическим DELETE, если клиентам нужно узнать о нём при следующем pull.
Используется логическое изменение:
{
"entity": "transaction",
"id": "…",
"deleted": true,
"updatedAt": "…"
}
После того как tombstone перестанет быть нужен для поддерживаемого sync history window, сервер может применять retention policy. Такая политика должна быть согласована с cursor semantics.
Invariants
- Record ID стабилен между sync.
- Record принадлежит одному пользователю.
- Клиент не может читать/изменять чужую запись.
sequenceне должен уменьшаться.- Повторная доставка одного change не должна повреждать данные.
- Удаление должно быть видимо клиенту через sync.
- Timestamps должны храниться в UTC.
- Enum/string values должны быть совместимы с iOS и Android.
Миграции
Schema changes должны быть backward-compatible с активными версиями клиентов либо сопровождаться versioned API/миграцией.
Не переименовывайте JSON field без периода совместимости.