feat: make server owner of tabs

This commit is contained in:
2026-10-20 16:15:14 +02:00
parent 5754ae742d
commit 93acfe15a9
26 changed files with 3654 additions and 389 deletions
+38 -1
View File
@@ -162,6 +162,9 @@ class RemoteSyncState extends Table {
TextColumn get serverCursor => text().nullable()();
/// Where the feed of settlements made anywhere in the venue left off.
TextColumn get settlementsCursor => text().nullable()();
DateTimeColumn get lastSuccessfulSyncAt => dateTime().nullable()();
DateTimeColumn get lastAttemptedSyncAt => dateTime().nullable()();
@@ -204,6 +207,26 @@ class TabEvents extends Table {
Set<Column> get primaryKey => {id};
}
/// Outcomes of the stock adjustments sent by the dashboard, waiting to be
/// reported. A row also records that its adjustment was handled, so it is
/// kept for a while after the server acknowledges it: the same adjustment
/// can still arrive in a response computed before the server saw the outcome.
@DataClassName('StockAdjustmentResultRow')
class StockAdjustmentResults extends Table {
/// The adjustment's id from the server.
TextColumn get id => text()();
/// The outcome as JSON, exactly as it is sent.
TextColumn get payload => text()();
BoolColumn get acknowledged => boolean().withDefault(const Constant(false))();
DateTimeColumn get createdAt => dateTime()();
@override
Set<Column> get primaryKey => {id};
}
@DriftDatabase(
tables: [
Products,
@@ -216,13 +239,14 @@ class TabEvents extends Table {
RemoteSyncState,
ProcessedRemoteCommands,
TabEvents,
StockAdjustmentResults,
],
)
class AppDatabase extends _$AppDatabase {
AppDatabase([QueryExecutor? executor]) : super(executor ?? _openConnection());
@override
int get schemaVersion => 15;
int get schemaVersion => 17;
@override
MigrationStrategy get migration {
@@ -325,6 +349,19 @@ class AppDatabase extends _$AppDatabase {
if (from < 15) {
await migrator.createTable(tabEvents);
}
if (from < 16) {
await migrator.createTable(stockAdjustmentResults);
}
if (from < 17 &&
await hasTableColumn('remote_sync_state', 'device_id') &&
!await hasTableColumn('remote_sync_state', 'settlements_cursor')) {
await migrator.addColumn(
remoteSyncState,
remoteSyncState.settlementsCursor,
);
}
},
);
}