The Go implementation is preserved in the v1.0.0 tag. Its observable behaviour stays the API reference: responses recorded from the Go server live in tools/compatibility_expected.txt, and tools/compatibility.py now compares the Rust server against them (--update re-records after an intentional change). The Go SQLite schema is frozen in tests/fixtures/go_schema_v1.sql for the existing-database test. Move the web client from internal/httpapi/web to web/, drop the Go CI job and Go version pin, and update README, AGENTS.md and docs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3.6 KiB
Модель данных BalanceServer
Ниже описана серверная модель на основании исходного кода проекта. При изменении schema обновляйте этот документ.
Где определена schema
src/database.rs— создание и открытие схемы SQLite;tests/fixtures/go_schema_v1.sql— исходная схема Go-сервера v1.0.0; Rust обязан открывать такие базы без изменений;src/sync.rs— валидация и сериализация синхронизируемых записей;src/auth.rs— пользователи, пароли и refresh-сессии.
Общие сущности
Сервер должен различать как минимум следующие логические типы синхронизируемых данных, совместимые с клиентами 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 без периода совместимости.