From 2e15556257fbb0eb1502c686dc724e3d3d14c38b Mon Sep 17 00:00:00 2001 From: nfebe Date: Sat, 15 Aug 2026 01:29:24 +0100 Subject: [PATCH 1/5] fix(sync): Recover stalled model synchronization Local writes and their pending changes now commit together without making saves wait for the network. Missing local changes are recovered across synchronized models, transfer downloads continue safely after transaction failures, and per-model attempts remain visible even when no records are returned. --- drift_schemas/default/drift_schema_v9.json | 1 + lib/core/sync/sync_database.dart | 80 +- lib/data/database/app_database.dart | 54 +- lib/data/database/app_database.g.dart | 116 +- lib/data/database/app_database.steps.dart | 550 + lib/data/database/tables/sync_meta_data.dart | 4 + .../repositories/budget_repository_impl.dart | 92 +- .../category_repository_impl.dart | 44 +- .../repositories/config_repository_impl.dart | 38 +- .../repositories/group_repository_impl.dart | 30 +- .../repositories/media_repository_impl.dart | 17 +- .../notification_repository_impl.dart | 7 +- .../repositories/party_repository_impl.dart | 43 +- .../reminder_repository_impl.dart | 48 +- .../transaction_repository_impl.dart | 70 +- .../transfer_repository_impl.dart | 14 +- .../repositories/wallet_repository_impl.dart | 43 +- lib/data/sync/transfer_sync_handler.dart | 3 + lib/presentation/sync_history_screen.dart | 43 +- pubspec.lock | 4 +- pubspec.yaml | 2 +- test/drift/default/generated/schema.dart | 5 +- test/drift/default/generated/schema_v9.dart | 10024 ++++++++++++++++ .../orphaned_change_reconciliation_test.dart | 16 +- 24 files changed, 11066 insertions(+), 282 deletions(-) create mode 100644 drift_schemas/default/drift_schema_v9.json create mode 100644 test/drift/default/generated/schema_v9.dart diff --git a/drift_schemas/default/drift_schema_v9.json b/drift_schemas/default/drift_schema_v9.json new file mode 100644 index 00000000..aa8549ab --- /dev/null +++ b/drift_schemas/default/drift_schema_v9.json @@ -0,0 +1 @@ +{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":true},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"wallets","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":true,"customConstraints":null,"defaultConstraints":"UNIQUE","dialectAwareDefaultConstraints":{"sqlite":"UNIQUE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unique"]},{"name":"user_id","getter_name":"userId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"client_id","getter_name":"clientId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'\\'')","default_client_dart":null,"dsl_features":[]},{"name":"rev","getter_name":"rev","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":"const CustomExpression('\\'1\\'')","default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"deleted_at","getter_name":"deletedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_synced_at","getter_name":"lastSyncedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const WalletTypeConverter()","dart_type_name":"WalletType"}},{"name":"balance","getter_name":"balance","moor_type":"double","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('0.0')","default_client_dart":null,"dsl_features":[]},{"name":"currency","getter_name":"currency","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"description","getter_name":"description","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"stats","getter_name":"stats","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const WalletStatsConverter()","dart_type_name":"WalletStats"}},{"name":"icon","getter_name":"icon","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MediaConverter()","dart_type_name":"Media"}}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["client_id"]}},{"id":1,"references":[],"type":"table","data":{"name":"parties","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":true,"customConstraints":null,"defaultConstraints":"UNIQUE","dialectAwareDefaultConstraints":{"sqlite":"UNIQUE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unique"]},{"name":"user_id","getter_name":"userId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"client_id","getter_name":"clientId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'\\'')","default_client_dart":null,"dsl_features":[]},{"name":"rev","getter_name":"rev","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":"const CustomExpression('\\'1\\'')","default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"deleted_at","getter_name":"deletedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_synced_at","getter_name":"lastSyncedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"description","getter_name":"description","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"icon","getter_name":"icon","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MediaConverter()","dart_type_name":"Media"}},{"name":"type","getter_name":"type","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const PartyTypeConverter()","dart_type_name":"PartyType"}}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["client_id"]}},{"id":2,"references":[],"type":"table","data":{"name":"groups","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":true,"customConstraints":null,"defaultConstraints":"UNIQUE","dialectAwareDefaultConstraints":{"sqlite":"UNIQUE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unique"]},{"name":"user_id","getter_name":"userId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"client_id","getter_name":"clientId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'\\'')","default_client_dart":null,"dsl_features":[]},{"name":"rev","getter_name":"rev","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":"const CustomExpression('\\'1\\'')","default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"deleted_at","getter_name":"deletedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_synced_at","getter_name":"lastSyncedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"description","getter_name":"description","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"icon","getter_name":"icon","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MediaConverter()","dart_type_name":"Media"}}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["client_id"]}},{"id":3,"references":[0,1,2],"type":"table","data":{"name":"transactions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":true,"customConstraints":null,"defaultConstraints":"UNIQUE","dialectAwareDefaultConstraints":{"sqlite":"UNIQUE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unique"]},{"name":"user_id","getter_name":"userId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"client_id","getter_name":"clientId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'\\'')","default_client_dart":null,"dsl_features":[]},{"name":"rev","getter_name":"rev","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":"const CustomExpression('\\'1\\'')","default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"deleted_at","getter_name":"deletedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_synced_at","getter_name":"lastSyncedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"amount","getter_name":"amount","moor_type":"double","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(TransactionType.values)","dart_type_name":"TransactionType"}},{"name":"intent","getter_name":"intent","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'regular\\'')","default_client_dart":null,"dsl_features":[]},{"name":"description","getter_name":"description","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"datetime","getter_name":"datetime","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"party_id","getter_name":"partyId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"wallet_id","getter_name":"walletId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"group_id","getter_name":"groupId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"wallet_client_id","getter_name":"walletClientId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES wallets (client_id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES wallets (client_id)"},"default_dart":null,"default_client_dart":null,"dsl_features":[{"foreign_key":{"to":{"table":"wallets","column":"client_id"},"initially_deferred":false,"on_update":null,"on_delete":null}}]},{"name":"party_client_id","getter_name":"partyClientId","moor_type":"string","nullable":true,"customConstraints":null,"defaultConstraints":"REFERENCES parties (client_id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES parties (client_id)"},"default_dart":null,"default_client_dart":null,"dsl_features":[{"foreign_key":{"to":{"table":"parties","column":"client_id"},"initially_deferred":false,"on_update":null,"on_delete":null}}]},{"name":"group_client_id","getter_name":"groupClientId","moor_type":"string","nullable":true,"customConstraints":null,"defaultConstraints":"REFERENCES \"groups\" (client_id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES \"groups\" (client_id)"},"default_dart":null,"default_client_dart":null,"dsl_features":[{"foreign_key":{"to":{"table":"groups","column":"client_id"},"initially_deferred":false,"on_update":null,"on_delete":null}}]},{"name":"transfer_id","getter_name":"transferId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"transfer_client_id","getter_name":"transferClientId","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"is_refund","getter_name":"isRefund","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"is_refund\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"is_refund\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"refund_of_transaction_id","getter_name":"refundOfTransactionId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"recurrence_period","getter_name":"recurrencePeriod","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"recurrence_interval","getter_name":"recurrenceInterval","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"recurrence_ends_at","getter_name":"recurrenceEndsAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"recurrence_next_scheduled_at","getter_name":"recurrenceNextScheduledAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["client_id"]}},{"id":4,"references":[],"type":"table","data":{"name":"categories","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":true,"customConstraints":null,"defaultConstraints":"UNIQUE","dialectAwareDefaultConstraints":{"sqlite":"UNIQUE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unique"]},{"name":"user_id","getter_name":"userId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"client_id","getter_name":"clientId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'\\'')","default_client_dart":null,"dsl_features":[]},{"name":"rev","getter_name":"rev","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":"const CustomExpression('\\'1\\'')","default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"deleted_at","getter_name":"deletedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_synced_at","getter_name":"lastSyncedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"UNIQUE","dialectAwareDefaultConstraints":{"sqlite":"UNIQUE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unique"]},{"name":"slug","getter_name":"slug","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"description","getter_name":"description","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(TransactionType.values)","dart_type_name":"TransactionType"}},{"name":"icon","getter_name":"icon","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MediaConverter()","dart_type_name":"Media"}}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["client_id"]}},{"id":5,"references":[],"type":"table","data":{"name":"configs","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":true,"customConstraints":null,"defaultConstraints":"UNIQUE","dialectAwareDefaultConstraints":{"sqlite":"UNIQUE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unique"]},{"name":"user_id","getter_name":"userId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"client_id","getter_name":"clientId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'\\'')","default_client_dart":null,"dsl_features":[]},{"name":"rev","getter_name":"rev","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":"const CustomExpression('\\'1\\'')","default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"deleted_at","getter_name":"deletedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_synced_at","getter_name":"lastSyncedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"key","getter_name":"key","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"UNIQUE","dialectAwareDefaultConstraints":{"sqlite":"UNIQUE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unique"]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ConfigType.values)","dart_type_name":"ConfigType"}},{"name":"value","getter_name":"value","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const ConfigValueConverter()","dart_type_name":"dynamic"}}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["client_id"]}},{"id":6,"references":[],"type":"table","data":{"name":"users","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"email","getter_name":"email","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"UNIQUE","dialectAwareDefaultConstraints":{"sqlite":"UNIQUE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unique"]},{"name":"first_name","getter_name":"firstName","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_name","getter_name":"lastName","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"username","getter_name":"username","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"phone","getter_name":"phone","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"avatar","getter_name":"avatar","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["id"]}},{"id":7,"references":[],"type":"table","data":{"name":"local_changes","was_declared_in_moor":false,"columns":[{"name":"entity_type","getter_name":"entityType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"entity_id","getter_name":"entityId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"entity_rev","getter_name":"entityRev","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"deleted","getter_name":"deleted","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"deleted\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"deleted\" IN (0, 1))"},"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"data","getter_name":"data","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const JsonMapConverter()","dart_type_name":"Map"}},{"name":"create_at","getter_name":"createAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"concluded","getter_name":"concluded","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"concluded\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"concluded\" IN (0, 1))"},"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"concluded_moment","getter_name":"concludedMoment","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"error","getter_name":"error","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"dismissed","getter_name":"dismissed","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"dismissed\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"dismissed\" IN (0, 1))"},"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"attempt_count","getter_name":"attemptCount","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"quarantined_at","getter_name":"quarantinedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["entity_id","entity_type"]}},{"id":8,"references":[],"type":"table","data":{"name":"sync_metadata","was_declared_in_moor":false,"columns":[{"name":"entity_type","getter_name":"entityType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_synced_at","getter_name":"lastSyncedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_attempted_at","getter_name":"lastAttemptedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_error","getter_name":"lastError","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["entity_type"]}},{"id":9,"references":[4],"type":"table","data":{"name":"categorizables","was_declared_in_moor":false,"columns":[{"name":"categorizable_id","getter_name":"categorizableId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"categorizable_type","getter_name":"categorizableType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(CategorizableType.values)","dart_type_name":"CategorizableType"}},{"name":"category_client_id","getter_name":"categoryClientId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES categories (client_id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES categories (client_id)"},"default_dart":null,"default_client_dart":null,"dsl_features":[{"foreign_key":{"to":{"table":"categories","column":"client_id"},"initially_deferred":false,"on_update":null,"on_delete":null}}]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["categorizable_id","categorizable_type","category_client_id"]}},{"id":10,"references":[],"type":"table","data":{"name":"notifications","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":true,"customConstraints":null,"defaultConstraints":"UNIQUE","dialectAwareDefaultConstraints":{"sqlite":"UNIQUE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unique"]},{"name":"user_id","getter_name":"userId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"client_id","getter_name":"clientId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'\\'')","default_client_dart":null,"dsl_features":[]},{"name":"rev","getter_name":"rev","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":"const CustomExpression('\\'1\\'')","default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"deleted_at","getter_name":"deletedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_synced_at","getter_name":"lastSyncedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(NotificationType.values)","dart_type_name":"NotificationType"}},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"body","getter_name":"body","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"data","getter_name":"data","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const JsonMapConverter()","dart_type_name":"Map"}},{"name":"read_at","getter_name":"readAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["client_id"]}},{"id":11,"references":[],"type":"table","data":{"name":"media_files","was_declared_in_moor":false,"columns":[{"name":"path","getter_name":"path","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"id","getter_name":"id","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"fileable_type","getter_name":"fileableType","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"fileable_id","getter_name":"fileableId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"local_fileable_type","getter_name":"localFileableType","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"local_fileable_id","getter_name":"localFileableId","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["path"]}},{"id":12,"references":[0,3],"type":"table","data":{"name":"transfers","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":true,"customConstraints":null,"defaultConstraints":"UNIQUE","dialectAwareDefaultConstraints":{"sqlite":"UNIQUE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unique"]},{"name":"user_id","getter_name":"userId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"client_id","getter_name":"clientId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'\\'')","default_client_dart":null,"dsl_features":[]},{"name":"rev","getter_name":"rev","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":"const CustomExpression('\\'1\\'')","default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"deleted_at","getter_name":"deletedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_synced_at","getter_name":"lastSyncedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"amount","getter_name":"amount","moor_type":"double","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"from_wallet_id","getter_name":"fromWalletId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"to_wallet_id","getter_name":"toWalletId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"from_wallet_client_id","getter_name":"fromWalletClientId","moor_type":"string","nullable":true,"customConstraints":null,"defaultConstraints":"REFERENCES wallets (client_id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES wallets (client_id)"},"default_dart":null,"default_client_dart":null,"dsl_features":[{"foreign_key":{"to":{"table":"wallets","column":"client_id"},"initially_deferred":false,"on_update":null,"on_delete":null}}]},{"name":"to_wallet_client_id","getter_name":"toWalletClientId","moor_type":"string","nullable":true,"customConstraints":null,"defaultConstraints":"REFERENCES wallets (client_id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES wallets (client_id)"},"default_dart":null,"default_client_dart":null,"dsl_features":[{"foreign_key":{"to":{"table":"wallets","column":"client_id"},"initially_deferred":false,"on_update":null,"on_delete":null}}]},{"name":"exchange_rate","getter_name":"exchangeRate","moor_type":"double","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"datetime","getter_name":"datetime","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"expense_transaction_client_id","getter_name":"expenseTransactionClientId","moor_type":"string","nullable":true,"customConstraints":null,"defaultConstraints":"REFERENCES transactions (client_id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES transactions (client_id)"},"default_dart":null,"default_client_dart":null,"dsl_features":[{"foreign_key":{"to":{"table":"transactions","column":"client_id"},"initially_deferred":false,"on_update":null,"on_delete":null}}]},{"name":"income_transaction_client_id","getter_name":"incomeTransactionClientId","moor_type":"string","nullable":true,"customConstraints":null,"defaultConstraints":"REFERENCES transactions (client_id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES transactions (client_id)"},"default_dart":null,"default_client_dart":null,"dsl_features":[{"foreign_key":{"to":{"table":"transactions","column":"client_id"},"initially_deferred":false,"on_update":null,"on_delete":null}}]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["client_id"]}},{"id":13,"references":[],"type":"table","data":{"name":"budgets","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":true,"customConstraints":null,"defaultConstraints":"UNIQUE","dialectAwareDefaultConstraints":{"sqlite":"UNIQUE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unique"]},{"name":"user_id","getter_name":"userId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"client_id","getter_name":"clientId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'\\'')","default_client_dart":null,"dsl_features":[]},{"name":"rev","getter_name":"rev","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":"const CustomExpression('\\'1\\'')","default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"deleted_at","getter_name":"deletedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_synced_at","getter_name":"lastSyncedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"slug","getter_name":"slug","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"description","getter_name":"description","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"amount","getter_name":"amount","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const StringToDoubleConverter()","dart_type_name":"double"}},{"name":"currency","getter_name":"currency","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"period_type","getter_name":"periodType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(BudgetPeriodType.values)","dart_type_name":"BudgetPeriodType"}},{"name":"start_date","getter_name":"startDate","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"end_date","getter_name":"endDate","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"rollover_enabled","getter_name":"rolloverEnabled","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"rollover_enabled\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"rollover_enabled\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"threshold_percent","getter_name":"thresholdPercent","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('80')","default_client_dart":null,"dsl_features":[]},{"name":"forecast_alerts_enabled","getter_name":"forecastAlertsEnabled","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"forecast_alerts_enabled\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"forecast_alerts_enabled\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"is_active","getter_name":"isActive","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"is_active\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"is_active\" IN (0, 1))"},"default_dart":"const CustomExpression('1')","default_client_dart":null,"dsl_features":[]},{"name":"owner_type","getter_name":"ownerType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'user\\'')","default_client_dart":null,"dsl_features":[]},{"name":"owner_id","getter_name":"ownerId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"progress","getter_name":"progress","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const BudgetProgressJsonConverter()","dart_type_name":"BudgetProgressEntity"}}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["client_id"]}},{"id":14,"references":[13],"type":"table","data":{"name":"budget_targets","was_declared_in_moor":false,"columns":[{"name":"budget_client_id","getter_name":"budgetClientId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES budgets (client_id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES budgets (client_id)"},"default_dart":null,"default_client_dart":null,"dsl_features":[{"foreign_key":{"to":{"table":"budgets","column":"client_id"},"initially_deferred":false,"on_update":null,"on_delete":null}}]},{"name":"target_type","getter_name":"targetType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(BudgetTargetType.values)","dart_type_name":"BudgetTargetType"}},{"name":"target_client_id","getter_name":"targetClientId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["budget_client_id","target_type","target_client_id"]}},{"id":15,"references":[13],"type":"table","data":{"name":"budget_period_states","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":true,"customConstraints":null,"defaultConstraints":"UNIQUE","dialectAwareDefaultConstraints":{"sqlite":"UNIQUE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unique"]},{"name":"user_id","getter_name":"userId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"client_id","getter_name":"clientId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'\\'')","default_client_dart":null,"dsl_features":[]},{"name":"rev","getter_name":"rev","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":"const CustomExpression('\\'1\\'')","default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"deleted_at","getter_name":"deletedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_synced_at","getter_name":"lastSyncedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"budget_client_id","getter_name":"budgetClientId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES budgets (client_id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES budgets (client_id)"},"default_dart":null,"default_client_dart":null,"dsl_features":[{"foreign_key":{"to":{"table":"budgets","column":"client_id"},"initially_deferred":false,"on_update":null,"on_delete":null}}]},{"name":"period_start","getter_name":"periodStart","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"period_end","getter_name":"periodEnd","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"net_spent","getter_name":"netSpent","moor_type":"double","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('0.0')","default_client_dart":null,"dsl_features":[]},{"name":"rollover_in","getter_name":"rolloverIn","moor_type":"double","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('0.0')","default_client_dart":null,"dsl_features":[]},{"name":"rollover_out","getter_name":"rolloverOut","moor_type":"double","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('0.0')","default_client_dart":null,"dsl_features":[]},{"name":"closed_at","getter_name":"closedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["client_id"]}},{"id":16,"references":[],"type":"table","data":{"name":"holdings","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"symbol","getter_name":"symbol","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"quantity","getter_name":"quantity","moor_type":"double","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('0.0')","default_client_dart":null,"dsl_features":[]},{"name":"currency","getter_name":"currency","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"unit_price","getter_name":"unitPrice","moor_type":"double","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('0.0')","default_client_dart":null,"dsl_features":[]},{"name":"value","getter_name":"value","moor_type":"double","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('0.0')","default_client_dart":null,"dsl_features":[]},{"name":"price_source","getter_name":"priceSource","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'manual\\'')","default_client_dart":null,"dsl_features":[]},{"name":"provider","getter_name":"provider","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"external_ref","getter_name":"externalRef","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_priced_at","getter_name":"lastPricedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["id"]}},{"id":17,"references":[],"type":"table","data":{"name":"financial_position_cache","was_declared_in_moor":false,"columns":[{"name":"cache_key","getter_name":"cacheKey","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"payload","getter_name":"payload","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"currency","getter_name":"currency","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"fetched_at","getter_name":"fetchedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["cache_key"]}},{"id":18,"references":[],"type":"table","data":{"name":"reminders","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":true,"customConstraints":null,"defaultConstraints":"UNIQUE","dialectAwareDefaultConstraints":{"sqlite":"UNIQUE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unique"]},{"name":"user_id","getter_name":"userId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"client_id","getter_name":"clientId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'\\'')","default_client_dart":null,"dsl_features":[]},{"name":"rev","getter_name":"rev","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":"const CustomExpression('\\'1\\'')","default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"deleted_at","getter_name":"deletedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_synced_at","getter_name":"lastSyncedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"description","getter_name":"description","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'custom\\'')","default_client_dart":null,"dsl_features":[]},{"name":"trigger_at","getter_name":"triggerAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"due_at","getter_name":"dueAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"repeat_rule","getter_name":"repeatRule","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"timezone","getter_name":"timezone","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"status","getter_name":"status","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'active\\'')","default_client_dart":null,"dsl_features":[]},{"name":"priority","getter_name":"priority","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"snoozed_until","getter_name":"snoozedUntil","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_triggered_at","getter_name":"lastTriggeredAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"next_trigger_at","getter_name":"nextTriggerAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["client_id"]}},{"id":19,"references":[],"type":"table","data":{"name":"deferred_remote_items","was_declared_in_moor":false,"columns":[{"name":"entity_type","getter_name":"entityType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"client_id","getter_name":"clientId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"data","getter_name":"data","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"parked_at","getter_name":"parkedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["entity_type","client_id"]}}]} \ No newline at end of file diff --git a/lib/core/sync/sync_database.dart b/lib/core/sync/sync_database.dart index 04e8f494..19d9760c 100644 --- a/lib/core/sync/sync_database.dart +++ b/lib/core/sync/sync_database.dart @@ -5,8 +5,17 @@ import 'package:drift_sync_core/drift_sync_core.dart'; import 'package:injectable/injectable.dart'; import 'package:trakli/core/utils/services/logger.dart' as app_logger; import 'package:trakli/data/database/app_database.dart'; +import 'package:trakli/data/sync/budget_sync_handler.dart'; +import 'package:trakli/data/sync/category_sync_handler.dart'; +import 'package:trakli/data/sync/config_sync_handler.dart'; +import 'package:trakli/data/sync/group_sync_handler.dart'; +import 'package:trakli/data/sync/media_sync_handler.dart'; +import 'package:trakli/data/sync/notification_sync_handler.dart'; +import 'package:trakli/data/sync/party_sync_handler.dart'; +import 'package:trakli/data/sync/reminder_sync_handler.dart'; import 'package:trakli/data/sync/transaction_sync_handler.dart'; import 'package:trakli/data/sync/transfer_sync_handler.dart'; +import 'package:trakli/data/sync/wallet_sync_handler.dart'; @lazySingleton class SynchAppDatabase extends DriftSynchronizer { @@ -22,10 +31,62 @@ class SynchAppDatabase extends DriftSynchronizer { classifyFailure: restFailureClassifier, ); - /// Entity types swept by [reconcileOrphanedLocalChanges] → backing tables. - static const Map reconciledEntityTables = { - TransactionSyncHandler.entity: 'transactions', - TransferSyncHandler.entity: 'transfers', + static const reconciledEntities = { + CategorySyncHandler.entity: ( + table: 'categories', + clientId: 'client_id', + deletedAt: 'deleted_at' + ), + ConfigSyncHandler.entity: ( + table: 'configs', + clientId: 'client_id', + deletedAt: 'deleted_at' + ), + WalletSyncHandler.entity: ( + table: 'wallets', + clientId: 'client_id', + deletedAt: 'deleted_at' + ), + PartySyncHandler.entity: ( + table: 'parties', + clientId: 'client_id', + deletedAt: 'deleted_at' + ), + GroupSyncHandler.entity: ( + table: 'groups', + clientId: 'client_id', + deletedAt: 'deleted_at' + ), + NotificationSyncHandler.entity: ( + table: 'notifications', + clientId: 'client_id', + deletedAt: 'deleted_at' + ), + TransactionSyncHandler.entity: ( + table: 'transactions', + clientId: 'client_id', + deletedAt: 'deleted_at' + ), + TransferSyncHandler.entity: ( + table: 'transfers', + clientId: 'client_id', + deletedAt: 'deleted_at' + ), + BudgetSyncHandler.entity: ( + table: 'budgets', + clientId: 'client_id', + deletedAt: 'deleted_at' + ), + ReminderSyncHandler.entity: ( + table: 'reminders', + clientId: 'client_id', + deletedAt: 'deleted_at' + ), + MediaSyncHandler.entity: ( + table: 'media_files', + clientId: 'path', + deletedAt: null + ), }; final _syncStateController = StreamController.broadcast(); @@ -45,13 +106,18 @@ class SynchAppDatabase extends DriftSynchronizer { /// Re-enqueues rows that have no server id and no local_changes entry. Future reconcileOrphanedLocalChanges() async { var enqueued = 0; - for (final entry in reconciledEntityTables.entries) { + for (final entry in reconciledEntities.entries) { final handler = typeHandlers.where((h) => h.entityType == entry.key).firstOrNull; if (handler == null) continue; - final orphanIds = - await appDatabase.getOrphanedClientIds(entry.value, entry.key); + final source = entry.value; + final orphanIds = await appDatabase.getOrphanedClientIds( + source.table, + entry.key, + clientIdColumn: source.clientId, + deletedAtColumn: source.deletedAt, + ); for (final clientId in orphanIds) { try { final entity = await handler.getLocalByClientId(clientId); diff --git a/lib/data/database/app_database.dart b/lib/data/database/app_database.dart index 937c2e9a..82044e7d 100644 --- a/lib/data/database/app_database.dart +++ b/lib/data/database/app_database.dart @@ -78,7 +78,7 @@ class AppDatabase extends _$AppDatabase with SynchronizerDb { super(executor ?? _openConnection()); @override - int get schemaVersion => 8; + int get schemaVersion => 9; @override MigrationStrategy get migration { @@ -132,8 +132,8 @@ class AppDatabase extends _$AppDatabase with SynchronizerDb { // in SQL. The remaining rows are filtered by their per-row exponential // backoff below (not expressible in SQL). final rows = await (select(localChanges) - ..where((lc) => - lc.quarantinedAt.isNull() & lc.dismissed.equals(false))) + ..where( + (lc) => lc.quarantinedAt.isNull() & lc.dismissed.equals(false))) .get(); return rows @@ -167,12 +167,20 @@ class AppDatabase extends _$AppDatabase with SynchronizerDb { /// Client ids with no server id and no local_changes row in any state. Future> getOrphanedClientIds( - String tableName, String entityType) async { + String tableName, + String entityType, { + String clientIdColumn = 'client_id', + String? deletedAtColumn = 'deleted_at', + }) async { + final activeRow = + deletedAtColumn == null ? '' : 'AND t.$deletedAtColumn IS NULL '; final rows = await customSelect( - 'SELECT t.client_id AS client_id FROM $tableName t ' - 'WHERE t.id IS NULL AND t.deleted_at IS NULL AND NOT EXISTS (' + 'SELECT t.$clientIdColumn AS client_id FROM $tableName t ' + 'WHERE t.id IS NULL $activeRow' + 'AND NOT EXISTS (' 'SELECT 1 FROM local_changes lc ' - 'WHERE lc.entity_type = ?1 AND lc.entity_id = t.client_id)', + 'WHERE lc.entity_type = ?1 ' + 'AND lc.entity_id = t.$clientIdColumn)', variables: [Variable.withString(entityType)], ).get(); return rows.map((r) => r.read('client_id')).toList(); @@ -329,6 +337,8 @@ class AppDatabase extends _$AppDatabase with SynchronizerDb { return LocalSyncMetadata( entityType: row.entityType, lastSyncedAt: row.lastSyncedAt, + lastAttemptedAt: row.lastAttemptedAt, + lastError: row.lastError, ); } @@ -339,6 +349,8 @@ class AppDatabase extends _$AppDatabase with SynchronizerDb { .map((row) => LocalSyncMetadata( entityType: row.entityType, lastSyncedAt: row.lastSyncedAt, + lastAttemptedAt: row.lastAttemptedAt, + lastError: row.lastError, )) .toList(); } @@ -354,6 +366,21 @@ class AppDatabase extends _$AppDatabase with SynchronizerDb { ); } + @override + Future recordEntitySyncAttempt( + String entityType, { + required DateTime attemptedAt, + Object? error, + }) async { + await into(syncMetadata).insertOnConflictUpdate( + SyncMetadataCompanion( + entityType: Value(entityType), + lastAttemptedAt: Value(attemptedAt), + lastError: Value(error?.toString()), + ), + ); + } + @override Future parkRemoteItem(ParkedRemoteItem item) async { await deferredRemoteItems.insertOne( @@ -368,8 +395,7 @@ class AppDatabase extends _$AppDatabase with SynchronizerDb { } @override - Future> getParkedRemoteItems( - String entityType) async { + Future> getParkedRemoteItems(String entityType) async { final rows = await (select(deferredRemoteItems) ..where((t) => t.entityType.equals(entityType))) .get(); @@ -473,5 +499,15 @@ extension Migrations on GeneratedDatabase { await m.addColumn( schema.localChanges, schema.localChanges.quarantinedAt); }, + from8To9: (Migrator m, Schema9 schema) async { + await m.addColumn( + schema.syncMetadata, + schema.syncMetadata.lastAttemptedAt, + ); + await m.addColumn( + schema.syncMetadata, + schema.syncMetadata.lastError, + ); + }, ); } diff --git a/lib/data/database/app_database.g.dart b/lib/data/database/app_database.g.dart index aa62ff0d..6767ad72 100644 --- a/lib/data/database/app_database.g.dart +++ b/lib/data/database/app_database.g.dart @@ -4715,7 +4715,16 @@ class $SyncMetadataTable extends SyncMetadata 'last_synced_at', aliasedName, true, type: DriftSqlType.dateTime, requiredDuringInsert: false); @override - List get $columns => [entityType, lastSyncedAt]; + late final GeneratedColumn lastAttemptedAt = + GeneratedColumn('last_attempted_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + @override + late final GeneratedColumn lastError = GeneratedColumn( + 'last_error', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + @override + List get $columns => + [entityType, lastSyncedAt, lastAttemptedAt, lastError]; @override String get aliasedName => _alias ?? actualTableName; @override @@ -4731,6 +4740,10 @@ class $SyncMetadataTable extends SyncMetadata .read(DriftSqlType.string, data['${effectivePrefix}entity_type'])!, lastSyncedAt: attachedDatabase.typeMapping.read( DriftSqlType.dateTime, data['${effectivePrefix}last_synced_at']), + lastAttemptedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_attempted_at']), + lastError: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}last_error']), ); } @@ -4743,7 +4756,13 @@ class $SyncMetadataTable extends SyncMetadata class SyncMetadatas extends DataClass implements Insertable { final String entityType; final DateTime? lastSyncedAt; - const SyncMetadatas({required this.entityType, this.lastSyncedAt}); + final DateTime? lastAttemptedAt; + final String? lastError; + const SyncMetadatas( + {required this.entityType, + this.lastSyncedAt, + this.lastAttemptedAt, + this.lastError}); @override Map toColumns(bool nullToAbsent) { final map = {}; @@ -4751,6 +4770,12 @@ class SyncMetadatas extends DataClass implements Insertable { if (!nullToAbsent || lastSyncedAt != null) { map['last_synced_at'] = Variable(lastSyncedAt); } + if (!nullToAbsent || lastAttemptedAt != null) { + map['last_attempted_at'] = Variable(lastAttemptedAt); + } + if (!nullToAbsent || lastError != null) { + map['last_error'] = Variable(lastError); + } return map; } @@ -4760,6 +4785,12 @@ class SyncMetadatas extends DataClass implements Insertable { lastSyncedAt: lastSyncedAt == null && nullToAbsent ? const Value.absent() : Value(lastSyncedAt), + lastAttemptedAt: lastAttemptedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastAttemptedAt), + lastError: lastError == null && nullToAbsent + ? const Value.absent() + : Value(lastError), ); } @@ -4769,6 +4800,8 @@ class SyncMetadatas extends DataClass implements Insertable { return SyncMetadatas( entityType: serializer.fromJson(json['entityType']), lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + lastAttemptedAt: serializer.fromJson(json['lastAttemptedAt']), + lastError: serializer.fromJson(json['lastError']), ); } @override @@ -4777,16 +4810,24 @@ class SyncMetadatas extends DataClass implements Insertable { return { 'entityType': serializer.toJson(entityType), 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'lastAttemptedAt': serializer.toJson(lastAttemptedAt), + 'lastError': serializer.toJson(lastError), }; } SyncMetadatas copyWith( {String? entityType, - Value lastSyncedAt = const Value.absent()}) => + Value lastSyncedAt = const Value.absent(), + Value lastAttemptedAt = const Value.absent(), + Value lastError = const Value.absent()}) => SyncMetadatas( entityType: entityType ?? this.entityType, lastSyncedAt: lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + lastAttemptedAt: lastAttemptedAt.present + ? lastAttemptedAt.value + : this.lastAttemptedAt, + lastError: lastError.present ? lastError.value : this.lastError, ); SyncMetadatas copyWithCompanion(SyncMetadataCompanion data) { return SyncMetadatas( @@ -4795,6 +4836,10 @@ class SyncMetadatas extends DataClass implements Insertable { lastSyncedAt: data.lastSyncedAt.present ? data.lastSyncedAt.value : this.lastSyncedAt, + lastAttemptedAt: data.lastAttemptedAt.present + ? data.lastAttemptedAt.value + : this.lastAttemptedAt, + lastError: data.lastError.present ? data.lastError.value : this.lastError, ); } @@ -4802,43 +4847,58 @@ class SyncMetadatas extends DataClass implements Insertable { String toString() { return (StringBuffer('SyncMetadatas(') ..write('entityType: $entityType, ') - ..write('lastSyncedAt: $lastSyncedAt') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('lastAttemptedAt: $lastAttemptedAt, ') + ..write('lastError: $lastError') ..write(')')) .toString(); } @override - int get hashCode => Object.hash(entityType, lastSyncedAt); + int get hashCode => + Object.hash(entityType, lastSyncedAt, lastAttemptedAt, lastError); @override bool operator ==(Object other) => identical(this, other) || (other is SyncMetadatas && other.entityType == this.entityType && - other.lastSyncedAt == this.lastSyncedAt); + other.lastSyncedAt == this.lastSyncedAt && + other.lastAttemptedAt == this.lastAttemptedAt && + other.lastError == this.lastError); } class SyncMetadataCompanion extends UpdateCompanion { final Value entityType; final Value lastSyncedAt; + final Value lastAttemptedAt; + final Value lastError; final Value rowid; const SyncMetadataCompanion({ this.entityType = const Value.absent(), this.lastSyncedAt = const Value.absent(), + this.lastAttemptedAt = const Value.absent(), + this.lastError = const Value.absent(), this.rowid = const Value.absent(), }); SyncMetadataCompanion.insert({ required String entityType, this.lastSyncedAt = const Value.absent(), + this.lastAttemptedAt = const Value.absent(), + this.lastError = const Value.absent(), this.rowid = const Value.absent(), }) : entityType = Value(entityType); static Insertable custom({ Expression? entityType, Expression? lastSyncedAt, + Expression? lastAttemptedAt, + Expression? lastError, Expression? rowid, }) { return RawValuesInsertable({ if (entityType != null) 'entity_type': entityType, if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (lastAttemptedAt != null) 'last_attempted_at': lastAttemptedAt, + if (lastError != null) 'last_error': lastError, if (rowid != null) 'rowid': rowid, }); } @@ -4846,10 +4906,14 @@ class SyncMetadataCompanion extends UpdateCompanion { SyncMetadataCompanion copyWith( {Value? entityType, Value? lastSyncedAt, + Value? lastAttemptedAt, + Value? lastError, Value? rowid}) { return SyncMetadataCompanion( entityType: entityType ?? this.entityType, lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + lastAttemptedAt: lastAttemptedAt ?? this.lastAttemptedAt, + lastError: lastError ?? this.lastError, rowid: rowid ?? this.rowid, ); } @@ -4863,6 +4927,12 @@ class SyncMetadataCompanion extends UpdateCompanion { if (lastSyncedAt.present) { map['last_synced_at'] = Variable(lastSyncedAt.value); } + if (lastAttemptedAt.present) { + map['last_attempted_at'] = Variable(lastAttemptedAt.value); + } + if (lastError.present) { + map['last_error'] = Variable(lastError.value); + } if (rowid.present) { map['rowid'] = Variable(rowid.value); } @@ -4874,6 +4944,8 @@ class SyncMetadataCompanion extends UpdateCompanion { return (StringBuffer('SyncMetadataCompanion(') ..write('entityType: $entityType, ') ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('lastAttemptedAt: $lastAttemptedAt, ') + ..write('lastError: $lastError, ') ..write('rowid: $rowid') ..write(')')) .toString(); @@ -13443,12 +13515,16 @@ typedef $$SyncMetadataTableCreateCompanionBuilder = SyncMetadataCompanion Function({ required String entityType, Value lastSyncedAt, + Value lastAttemptedAt, + Value lastError, Value rowid, }); typedef $$SyncMetadataTableUpdateCompanionBuilder = SyncMetadataCompanion Function({ Value entityType, Value lastSyncedAt, + Value lastAttemptedAt, + Value lastError, Value rowid, }); @@ -13466,6 +13542,13 @@ class $$SyncMetadataTableFilterComposer ColumnFilters get lastSyncedAt => $composableBuilder( column: $table.lastSyncedAt, builder: (column) => ColumnFilters(column)); + + ColumnFilters get lastAttemptedAt => $composableBuilder( + column: $table.lastAttemptedAt, + builder: (column) => ColumnFilters(column)); + + ColumnFilters get lastError => $composableBuilder( + column: $table.lastError, builder: (column) => ColumnFilters(column)); } class $$SyncMetadataTableOrderingComposer @@ -13483,6 +13566,13 @@ class $$SyncMetadataTableOrderingComposer ColumnOrderings get lastSyncedAt => $composableBuilder( column: $table.lastSyncedAt, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get lastAttemptedAt => $composableBuilder( + column: $table.lastAttemptedAt, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get lastError => $composableBuilder( + column: $table.lastError, builder: (column) => ColumnOrderings(column)); } class $$SyncMetadataTableAnnotationComposer @@ -13499,6 +13589,12 @@ class $$SyncMetadataTableAnnotationComposer GeneratedColumn get lastSyncedAt => $composableBuilder( column: $table.lastSyncedAt, builder: (column) => column); + + GeneratedColumn get lastAttemptedAt => $composableBuilder( + column: $table.lastAttemptedAt, builder: (column) => column); + + GeneratedColumn get lastError => + $composableBuilder(column: $table.lastError, builder: (column) => column); } class $$SyncMetadataTableTableManager extends RootTableManager< @@ -13529,21 +13625,29 @@ class $$SyncMetadataTableTableManager extends RootTableManager< updateCompanionCallback: ({ Value entityType = const Value.absent(), Value lastSyncedAt = const Value.absent(), + Value lastAttemptedAt = const Value.absent(), + Value lastError = const Value.absent(), Value rowid = const Value.absent(), }) => SyncMetadataCompanion( entityType: entityType, lastSyncedAt: lastSyncedAt, + lastAttemptedAt: lastAttemptedAt, + lastError: lastError, rowid: rowid, ), createCompanionCallback: ({ required String entityType, Value lastSyncedAt = const Value.absent(), + Value lastAttemptedAt = const Value.absent(), + Value lastError = const Value.absent(), Value rowid = const Value.absent(), }) => SyncMetadataCompanion.insert( entityType: entityType, lastSyncedAt: lastSyncedAt, + lastAttemptedAt: lastAttemptedAt, + lastError: lastError, rowid: rowid, ), withReferenceMapper: (p0) => p0 diff --git a/lib/data/database/app_database.steps.dart b/lib/data/database/app_database.steps.dart index cf751724..0452f935 100644 --- a/lib/data/database/app_database.steps.dart +++ b/lib/data/database/app_database.steps.dart @@ -3968,6 +3968,548 @@ i1.GeneratedColumn _column_121(String aliasedName) => i1.GeneratedColumn('parked_at', aliasedName, false, type: i1.DriftSqlType.dateTime, defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + +final class Schema9 extends i0.VersionedSchema { + Schema9({required super.database}) : super(version: 9); + @override + late final List entities = [ + wallets, + parties, + groups, + transactions, + categories, + configs, + users, + localChanges, + syncMetadata, + categorizables, + notifications, + mediaFiles, + transfers, + budgets, + budgetTargets, + budgetPeriodStates, + holdings, + financialPositionCache, + reminders, + deferredRemoteItems, + ]; + late final Shape0 wallets = Shape0( + source: i0.VersionedTable( + entityName: 'wallets', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(client_id)', + ], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + _column_4, + _column_5, + _column_6, + _column_7, + _column_8, + _column_9, + _column_10, + _column_11, + _column_12, + _column_13, + _column_14, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape1 parties = Shape1( + source: i0.VersionedTable( + entityName: 'parties', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(client_id)', + ], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + _column_4, + _column_5, + _column_6, + _column_7, + _column_8, + _column_12, + _column_14, + _column_15, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape2 groups = Shape2( + source: i0.VersionedTable( + entityName: 'groups', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(client_id)', + ], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + _column_4, + _column_5, + _column_6, + _column_7, + _column_8, + _column_12, + _column_14, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape20 transactions = Shape20( + source: i0.VersionedTable( + entityName: 'transactions', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(client_id)', + ], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + _column_4, + _column_5, + _column_6, + _column_7, + _column_16, + _column_9, + _column_89, + _column_12, + _column_17, + _column_18, + _column_19, + _column_20, + _column_21, + _column_22, + _column_23, + _column_59, + _column_60, + _column_102, + _column_103, + _column_104, + _column_105, + _column_106, + _column_107, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape4 categories = Shape4( + source: i0.VersionedTable( + entityName: 'categories', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(client_id)', + ], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + _column_4, + _column_5, + _column_6, + _column_7, + _column_24, + _column_25, + _column_12, + _column_9, + _column_14, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape5 configs = Shape5( + source: i0.VersionedTable( + entityName: 'configs', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(client_id)', + ], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + _column_4, + _column_5, + _column_6, + _column_7, + _column_26, + _column_9, + _column_27, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape6 users = Shape6( + source: i0.VersionedTable( + entityName: 'users', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(id)', + ], + columns: [ + _column_28, + _column_29, + _column_30, + _column_31, + _column_32, + _column_33, + _column_34, + _column_35, + _column_36, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape22 localChanges = Shape22( + source: i0.VersionedTable( + entityName: 'local_changes', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(entity_id, entity_type)', + ], + columns: [ + _column_37, + _column_38, + _column_39, + _column_40, + _column_41, + _column_42, + _column_43, + _column_44, + _column_45, + _column_46, + _column_118, + _column_119, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape24 syncMetadata = Shape24( + source: i0.VersionedTable( + entityName: 'sync_metadata', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(entity_type)', + ], + columns: [ + _column_37, + _column_7, + _column_122, + _column_123, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape9 categorizables = Shape9( + source: i0.VersionedTable( + entityName: 'categorizables', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(categorizable_id, categorizable_type, category_client_id)', + ], + columns: [ + _column_47, + _column_48, + _column_49, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape10 notifications = Shape10( + source: i0.VersionedTable( + entityName: 'notifications', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(client_id)', + ], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + _column_4, + _column_5, + _column_6, + _column_7, + _column_9, + _column_50, + _column_51, + _column_41, + _column_52, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape11 mediaFiles = Shape11( + source: i0.VersionedTable( + entityName: 'media_files', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(path)', + ], + columns: [ + _column_53, + _column_54, + _column_15, + _column_55, + _column_56, + _column_57, + _column_58, + _column_35, + _column_36, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape13 transfers = Shape13( + source: i0.VersionedTable( + entityName: 'transfers', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(client_id)', + ], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + _column_4, + _column_5, + _column_6, + _column_7, + _column_16, + _column_61, + _column_62, + _column_63, + _column_64, + _column_65, + _column_66, + _column_67, + _column_68, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape14 budgets = Shape14( + source: i0.VersionedTable( + entityName: 'budgets', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(client_id)', + ], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + _column_4, + _column_5, + _column_6, + _column_7, + _column_8, + _column_25, + _column_12, + _column_69, + _column_11, + _column_70, + _column_71, + _column_72, + _column_73, + _column_74, + _column_75, + _column_76, + _column_77, + _column_78, + _column_79, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape15 budgetTargets = Shape15( + source: i0.VersionedTable( + entityName: 'budget_targets', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(budget_client_id, target_type, target_client_id)', + ], + columns: [ + _column_80, + _column_81, + _column_82, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape16 budgetPeriodStates = Shape16( + source: i0.VersionedTable( + entityName: 'budget_period_states', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(client_id)', + ], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + _column_4, + _column_5, + _column_6, + _column_7, + _column_80, + _column_83, + _column_84, + _column_85, + _column_86, + _column_87, + _column_88, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape18 holdings = Shape18( + source: i0.VersionedTable( + entityName: 'holdings', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(id)', + ], + columns: [ + _column_28, + _column_8, + _column_90, + _column_91, + _column_11, + _column_92, + _column_93, + _column_94, + _column_95, + _column_96, + _column_97, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape19 financialPositionCache = Shape19( + source: i0.VersionedTable( + entityName: 'financial_position_cache', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(cache_key)', + ], + columns: [ + _column_98, + _column_99, + _column_100, + _column_101, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape21 reminders = Shape21( + source: i0.VersionedTable( + entityName: 'reminders', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(client_id)', + ], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + _column_4, + _column_5, + _column_6, + _column_7, + _column_50, + _column_12, + _column_108, + _column_109, + _column_110, + _column_111, + _column_112, + _column_113, + _column_114, + _column_115, + _column_116, + _column_117, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape23 deferredRemoteItems = Shape23( + source: i0.VersionedTable( + entityName: 'deferred_remote_items', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(entity_type, client_id)', + ], + columns: [ + _column_37, + _column_120, + _column_41, + _column_121, + ], + attachedDatabase: database, + ), + alias: null); +} + +class Shape24 extends i0.VersionedTable { + Shape24({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get entityType => + columnsByName['entity_type']! as i1.GeneratedColumn; + i1.GeneratedColumn get lastSyncedAt => + columnsByName['last_synced_at']! as i1.GeneratedColumn; + i1.GeneratedColumn get lastAttemptedAt => + columnsByName['last_attempted_at']! as i1.GeneratedColumn; + i1.GeneratedColumn get lastError => + columnsByName['last_error']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_122(String aliasedName) => + i1.GeneratedColumn('last_attempted_at', aliasedName, true, + type: i1.DriftSqlType.dateTime); +i1.GeneratedColumn _column_123(String aliasedName) => + i1.GeneratedColumn('last_error', aliasedName, true, + type: i1.DriftSqlType.string); i0.MigrationStepWithVersion migrationSteps({ required Future Function(i1.Migrator m, Schema2 schema) from1To2, required Future Function(i1.Migrator m, Schema3 schema) from2To3, @@ -3976,6 +4518,7 @@ i0.MigrationStepWithVersion migrationSteps({ required Future Function(i1.Migrator m, Schema6 schema) from5To6, required Future Function(i1.Migrator m, Schema7 schema) from6To7, required Future Function(i1.Migrator m, Schema8 schema) from7To8, + required Future Function(i1.Migrator m, Schema9 schema) from8To9, }) { return (currentVersion, database) async { switch (currentVersion) { @@ -4014,6 +4557,11 @@ i0.MigrationStepWithVersion migrationSteps({ final migrator = i1.Migrator(database, schema); await from7To8(migrator, schema); return 8; + case 8: + final schema = Schema9(database: database); + final migrator = i1.Migrator(database, schema); + await from8To9(migrator, schema); + return 9; default: throw ArgumentError.value('Unknown migration from $currentVersion'); } @@ -4028,6 +4576,7 @@ i1.OnUpgrade stepByStep({ required Future Function(i1.Migrator m, Schema6 schema) from5To6, required Future Function(i1.Migrator m, Schema7 schema) from6To7, required Future Function(i1.Migrator m, Schema8 schema) from7To8, + required Future Function(i1.Migrator m, Schema9 schema) from8To9, }) => i0.VersionedSchema.stepByStepHelper( step: migrationSteps( @@ -4038,4 +4587,5 @@ i1.OnUpgrade stepByStep({ from5To6: from5To6, from6To7: from6To7, from7To8: from7To8, + from8To9: from8To9, )); diff --git a/lib/data/database/tables/sync_meta_data.dart b/lib/data/database/tables/sync_meta_data.dart index c4b9cd8a..15429b75 100644 --- a/lib/data/database/tables/sync_meta_data.dart +++ b/lib/data/database/tables/sync_meta_data.dart @@ -6,6 +6,10 @@ class SyncMetadata extends Table { DateTimeColumn get lastSyncedAt => dateTime().nullable()(); + DateTimeColumn get lastAttemptedAt => dateTime().nullable()(); + + TextColumn get lastError => text().nullable()(); + @override Set get primaryKey => {entityType}; } diff --git a/lib/data/repositories/budget_repository_impl.dart b/lib/data/repositories/budget_repository_impl.dart index fd7c4401..3bcd7fdb 100644 --- a/lib/data/repositories/budget_repository_impl.dart +++ b/lib/data/repositories/budget_repository_impl.dart @@ -1,5 +1,3 @@ -import 'dart:async'; - import 'package:drift_sync_core/drift_sync_core.dart'; import 'package:fpdart/fpdart.dart'; import 'package:injectable/injectable.dart'; @@ -74,28 +72,26 @@ class BudgetRepositoryImpl List targets = const [], }) { return RepositoryErrorHandler.handleApiCall(() async { - final budget = await localDataSource.insertBudget( - name: name, - slug: _slugify(name), - amount: amount, - currency: currency, - periodType: periodType, - startDate: startDate, - endDate: endDate, - description: description, - rolloverEnabled: rolloverEnabled, - thresholdPercent: thresholdPercent, - forecastAlertsEnabled: forecastAlertsEnabled, - isActive: isActive, - targets: targets - .map((t) => BudgetTargetInput(type: t.type, clientId: t.clientId)) - .toList(), - ); - - final dto = await _composeDto(budget.clientId); - if (dto != null) { - unawaited(post(dto)); - } + await persistAndPost(() async { + final budget = await localDataSource.insertBudget( + name: name, + slug: _slugify(name), + amount: amount, + currency: currency, + periodType: periodType, + startDate: startDate, + endDate: endDate, + description: description, + rolloverEnabled: rolloverEnabled, + thresholdPercent: thresholdPercent, + forecastAlertsEnabled: forecastAlertsEnabled, + isActive: isActive, + targets: targets + .map((t) => BudgetTargetInput(type: t.type, clientId: t.clientId)) + .toList(), + ); + return (await _composeDto(budget.clientId))!; + }); return unit; }); } @@ -117,29 +113,28 @@ class BudgetRepositoryImpl List? targets, }) { return RepositoryErrorHandler.handleApiCall(() async { - await localDataSource.updateBudget( - clientId, - name: name, - slug: name != null ? _slugify(name) : null, - amount: amount, - currency: currency, - periodType: periodType, - startDate: startDate, - endDate: endDate, - description: description, - rolloverEnabled: rolloverEnabled, - thresholdPercent: thresholdPercent, - forecastAlertsEnabled: forecastAlertsEnabled, - isActive: isActive, - targets: targets - ?.map((t) => BudgetTargetInput(type: t.type, clientId: t.clientId)) - .toList(), - ); - - final dto = await _composeDto(clientId); - if (dto != null) { - unawaited(put(dto)); - } + await persistAndPut(() async { + await localDataSource.updateBudget( + clientId, + name: name, + slug: name != null ? _slugify(name) : null, + amount: amount, + currency: currency, + periodType: periodType, + startDate: startDate, + endDate: endDate, + description: description, + rolloverEnabled: rolloverEnabled, + thresholdPercent: thresholdPercent, + forecastAlertsEnabled: forecastAlertsEnabled, + isActive: isActive, + targets: targets + ?.map( + (t) => BudgetTargetInput(type: t.type, clientId: t.clientId)) + .toList(), + ); + return (await _composeDto(clientId))!; + }); return unit; }); } @@ -148,9 +143,8 @@ class BudgetRepositoryImpl Future> deleteBudget(String clientId) { return RepositoryErrorHandler.handleApiCall(() async { final dto = await _composeDto(clientId); - await localDataSource.deleteBudget(clientId); if (dto != null) { - unawaited(delete(dto)); + await delete(dto); } return unit; }); diff --git a/lib/data/repositories/category_repository_impl.dart b/lib/data/repositories/category_repository_impl.dart index 57badad9..7820de51 100644 --- a/lib/data/repositories/category_repository_impl.dart +++ b/lib/data/repositories/category_repository_impl.dart @@ -1,4 +1,3 @@ -import 'dart:async'; import 'package:fpdart/fpdart.dart'; import 'package:injectable/injectable.dart'; import 'package:trakli/data/database/app_database.dart' as db; @@ -40,17 +39,15 @@ class CategoryRepositoryImpl String name, String slug, TransactionType type, {String? description, MediaEntity? media}) { return RepositoryErrorHandler.handleApiCall(() async { - final category = await localDataSource.insertCategory( - name, - slug, - type, - description: description, - media: media != null - ? Media.fromLocal(content: media.content, type: media.mediaType) - : null, - ); - - unawaited(post(category)); + await persistAndPost(() => localDataSource.insertCategory( + name, + slug, + type, + description: description, + media: media != null + ? Media.fromLocal(content: media.content, type: media.mediaType) + : null, + )); return unit; }); } @@ -64,16 +61,15 @@ class CategoryRepositoryImpl MediaEntity? media, }) { return RepositoryErrorHandler.handleApiCall(() async { - final category = await localDataSource.updateCategory( - clientId, - name: name, - slug: slug, - description: description, - media: media != null - ? Media.fromLocal(content: media.content, type: media.mediaType) - : null, - ); - unawaited(put(category)); + await persistAndPut(() => localDataSource.updateCategory( + clientId, + name: name, + slug: slug, + description: description, + media: media != null + ? Media.fromLocal(content: media.content, type: media.mediaType) + : null, + )); return unit; }); } @@ -81,8 +77,8 @@ class CategoryRepositoryImpl @override Future> deleteCategory(String clientId) { return RepositoryErrorHandler.handleApiCall(() async { - final category = await localDataSource.deleteCategory(clientId); - unawaited(delete(category)); + final category = await syncHandler.getLocalByClientId(clientId); + await delete(category); return unit; }); } diff --git a/lib/data/repositories/config_repository_impl.dart b/lib/data/repositories/config_repository_impl.dart index 6493518e..de888b77 100644 --- a/lib/data/repositories/config_repository_impl.dart +++ b/lib/data/repositories/config_repository_impl.dart @@ -1,4 +1,3 @@ -import 'dart:async'; import 'package:fpdart/fpdart.dart'; import 'package:drift_sync_core/drift_sync_core.dart' as sync; import 'package:injectable/injectable.dart'; @@ -63,20 +62,18 @@ class ConfigRepositoryImpl final Config config; if (existingConfig != null) { // Update existing config - config = await localDataSource.updateConfig( - key, - type: type, - value: value, - ); - unawaited(put(config)); + config = await persistAndPut(() => localDataSource.updateConfig( + key, + type: type, + value: value, + )); } else { // Create new config - config = await localDataSource.insertConfig( - key: key, - type: type, - value: value, - ); - unawaited(post(config)); + config = await persistAndPost(() => localDataSource.insertConfig( + key: key, + type: type, + value: value, + )); } return ConfigMapper.toDomain(config); @@ -97,13 +94,11 @@ class ConfigRepositoryImpl throw NotFoundException('Config with key "$key" not found'); } - final config = await localDataSource.updateConfig( - key, - type: type, - value: value, - ); - - unawaited(put(config)); + await persistAndPut(() => localDataSource.updateConfig( + key, + type: type, + value: value, + )); return unit; }, ); @@ -118,8 +113,7 @@ class ConfigRepositoryImpl throw NotFoundException('Config with key "$key" not found'); } - await localDataSource.deleteConfig(key); - unawaited(delete(config)); + await delete(config); return unit; }, ); diff --git a/lib/data/repositories/group_repository_impl.dart b/lib/data/repositories/group_repository_impl.dart index f98321ad..a8d12f58 100644 --- a/lib/data/repositories/group_repository_impl.dart +++ b/lib/data/repositories/group_repository_impl.dart @@ -1,4 +1,3 @@ -import 'dart:async'; import 'package:fpdart/fpdart.dart'; import 'package:drift_sync_core/drift_sync_core.dart' as sync; import 'package:injectable/injectable.dart'; @@ -53,13 +52,11 @@ class GroupRepositoryImpl ) : null; - final group = await localDataSource.insertGroup( - name, - description: description, - icon: media, - ); - - unawaited(post(group)); + final group = await persistAndPost(() => localDataSource.insertGroup( + name, + description: description, + icon: media, + )); return GroupMapper.toDomain(group); }, ); @@ -86,14 +83,12 @@ class GroupRepositoryImpl ) : null; - final group = await localDataSource.updateGroup( - clientId, - name: name, - description: description, - icon: media, - ); - - unawaited(put(group)); + await persistAndPut(() => localDataSource.updateGroup( + clientId, + name: name, + description: description, + icon: media, + )); return unit; }, ); @@ -108,8 +103,7 @@ class GroupRepositoryImpl throw NotFoundException('Group not found'); } - await localDataSource.deleteGroup(clientId); - unawaited(delete(group)); + await delete(group); return unit; }, ); diff --git a/lib/data/repositories/media_repository_impl.dart b/lib/data/repositories/media_repository_impl.dart index b4d8b278..77506b8a 100644 --- a/lib/data/repositories/media_repository_impl.dart +++ b/lib/data/repositories/media_repository_impl.dart @@ -1,4 +1,3 @@ -import 'dart:async'; import 'dart:io'; import 'package:dio/dio.dart'; @@ -62,11 +61,12 @@ class MediaRepositoryImpl String filePath, ) async { try { - final media = await localDataSource.insertMediaForTransaction( - transactionClientId, - filePath, + await persistAndPost( + () => localDataSource.insertMediaForTransaction( + transactionClientId, + filePath, + ), ); - unawaited(post(media)); return const Right(unit); } catch (e) { return Left(Failure.cacheError(e.toString())); @@ -90,11 +90,8 @@ class MediaRepositoryImpl @override Future> deleteMediaByPath(String path) async { try { - final media = await localDataSource.deleteByPath(path); - if (media == null) { - return Left(Failure.cacheError('MediaFile not found for path: $path')); - } - unawaited(delete(media)); + final media = await syncHandler.getLocalByClientId(path); + await delete(media); return const Right(unit); } catch (e) { return Left(Failure.cacheError(e.toString())); diff --git a/lib/data/repositories/notification_repository_impl.dart b/lib/data/repositories/notification_repository_impl.dart index 86d69829..5d2bacbe 100644 --- a/lib/data/repositories/notification_repository_impl.dart +++ b/lib/data/repositories/notification_repository_impl.dart @@ -1,4 +1,3 @@ -import 'dart:async'; import 'package:fpdart/fpdart.dart'; import 'package:injectable/injectable.dart'; import 'package:trakli/data/database/app_database.dart'; @@ -41,9 +40,9 @@ class NotificationRepositoryImpl throw const NotFoundException(message: 'Notification not found'); } - final updatedNotification = - await localDataSource.markAsRead(clientId, DateTime.now()); - unawaited(put(updatedNotification)); + await persistAndPut( + () => localDataSource.markAsRead(clientId, DateTime.now()), + ); return unit; }); } diff --git a/lib/data/repositories/party_repository_impl.dart b/lib/data/repositories/party_repository_impl.dart index a46686c9..186ed4f3 100644 --- a/lib/data/repositories/party_repository_impl.dart +++ b/lib/data/repositories/party_repository_impl.dart @@ -1,4 +1,3 @@ -import 'dart:async'; import 'package:fpdart/fpdart.dart'; import 'package:drift_sync_core/drift_sync_core.dart' as sync; import 'package:injectable/injectable.dart'; @@ -44,16 +43,14 @@ class PartyRepositoryImpl PartyType? type, }) { return RepositoryErrorHandler.handleApiCall(() async { - final party = await localDataSource.insertParty( - name, - description: description, - media: media != null - ? Media.fromLocal(content: media.content, type: media.mediaType) - : null, - type: type, - ); - - unawaited(post(party)); + await persistAndPost(() => localDataSource.insertParty( + name, + description: description, + media: media != null + ? Media.fromLocal(content: media.content, type: media.mediaType) + : null, + type: type, + )); return unit; }); } @@ -67,17 +64,15 @@ class PartyRepositoryImpl PartyType? type, }) { return RepositoryErrorHandler.handleApiCall(() async { - final party = await localDataSource.updateParty( - clientId, - name: name, - description: description, - media: media != null - ? Media.fromLocal(content: media.content, type: media.mediaType) - : null, - type: type, - ); - - unawaited(put(party)); + await persistAndPut(() => localDataSource.updateParty( + clientId, + name: name, + description: description, + media: media != null + ? Media.fromLocal(content: media.content, type: media.mediaType) + : null, + type: type, + )); return unit; }); } @@ -85,8 +80,8 @@ class PartyRepositoryImpl @override Future> deleteParty(String clientId) { return RepositoryErrorHandler.handleApiCall(() async { - final party = await localDataSource.deleteParty(clientId); - unawaited(delete(party)); + final party = await syncHandler.getLocalByClientId(clientId); + await delete(party); return unit; }); } diff --git a/lib/data/repositories/reminder_repository_impl.dart b/lib/data/repositories/reminder_repository_impl.dart index 5bb2ac6f..60f28067 100644 --- a/lib/data/repositories/reminder_repository_impl.dart +++ b/lib/data/repositories/reminder_repository_impl.dart @@ -1,5 +1,3 @@ -import 'dart:async'; - import 'package:drift_sync_core/drift_sync_core.dart' as sync; import 'package:fpdart/fpdart.dart'; import 'package:injectable/injectable.dart'; @@ -54,16 +52,15 @@ class ReminderRepositoryImpl int? priority, }) { return RepositoryErrorHandler.handleApiCall(() async { - final reminder = await localDataSource.insertReminder( - title: title, - description: description, - type: type, - triggerAt: triggerAt, - repeatRule: repeatRule, - timezone: timezone ?? 'UTC', - priority: priority ?? 0, - ); - unawaited(post(reminder)); + await persistAndPost(() => localDataSource.insertReminder( + title: title, + description: description, + type: type, + triggerAt: triggerAt, + repeatRule: repeatRule, + timezone: timezone ?? 'UTC', + priority: priority ?? 0, + )); return unit; }); } @@ -81,18 +78,17 @@ class ReminderRepositoryImpl int? priority, }) { return RepositoryErrorHandler.handleApiCall(() async { - final reminder = await localDataSource.updateReminder( - clientId, - title: title, - description: description, - type: type, - triggerAt: triggerAt, - repeatRule: repeatRule, - clearRepeatRule: clearRepeatRule, - timezone: timezone, - priority: priority, - ); - unawaited(put(reminder)); + await persistAndPut(() => localDataSource.updateReminder( + clientId, + title: title, + description: description, + type: type, + triggerAt: triggerAt, + repeatRule: repeatRule, + clearRepeatRule: clearRepeatRule, + timezone: timezone, + priority: priority, + )); return unit; }); } @@ -100,8 +96,8 @@ class ReminderRepositoryImpl @override Future> deleteReminder(String clientId) { return RepositoryErrorHandler.handleApiCall(() async { - final reminder = await localDataSource.deleteReminder(clientId); - unawaited(delete(reminder)); + final reminder = await syncHandler.getLocalByClientId(clientId); + await delete(reminder); return unit; }); } diff --git a/lib/data/repositories/transaction_repository_impl.dart b/lib/data/repositories/transaction_repository_impl.dart index 839e8fd7..f0d3c0fa 100644 --- a/lib/data/repositories/transaction_repository_impl.dart +++ b/lib/data/repositories/transaction_repository_impl.dart @@ -1,5 +1,3 @@ -import 'dart:async'; - import 'package:drift_sync_core/drift_sync_core.dart'; import 'package:fpdart/fpdart.dart'; import 'package:injectable/injectable.dart'; @@ -49,28 +47,28 @@ class TransactionRepositoryImpl extends SyncEntityRepository localDataSource.updateTransaction( + id, + amount: amount, + description: description, + categoryIds: categoryIds, + datetime: datetime, + walletClientId: walletClientId, + intent: intent, + partyClientId: partyClientId, + groupClientId: groupClientId, + recurrence: recurrence, + clearRecurrence: clearRecurrence, + ), ); - unawaited(put(transaction)); - if (isRefund == true) { - unawaited(markTransactionAsRefund(id, refundOfClientId)); + await markTransactionAsRefund(id, refundOfClientId); } else if (isRefund == false) { final row = await localDataSource.getTransactionByClientId(id); if (row?.isRefund == true) { - unawaited(unmarkTransactionRefund(id)); + await unmarkTransactionRefund(id); } } return const Right(unit); @@ -82,9 +80,9 @@ class TransactionRepositoryImpl extends SyncEntityRepository> deleteTransaction(String id) async { try { - final transaction = await localDataSource.deleteTransaction(id); + final transaction = await syncHandler.getLocalByClientId(id); - unawaited(delete(transaction)); + await delete(transaction); return const Right(unit); } catch (e) { return Left(Failure.cacheError(e.toString())); @@ -108,18 +106,20 @@ class TransactionRepositoryImpl extends SyncEntityRepository localDataSource.insertTransaction( + amount, + description, + categoryIds, + type, + datetime, + walletClientId, + intent: intent, + partyClientId: partyClientId, + groupClientId: groupClientId, + attachedFilePaths: attachedFilePaths, + recurrence: recurrence, + ), ); final clientId = transaction.transaction.clientId; @@ -128,11 +128,7 @@ class TransactionRepositoryImpl extends SyncEntityRepository markTransactionAsRefund(clientId, refundOfClientId), - )); - } else { - unawaited(post(transaction)); + await markTransactionAsRefund(clientId, refundOfClientId); } return const Right(unit); } catch (e) { diff --git a/lib/data/repositories/transfer_repository_impl.dart b/lib/data/repositories/transfer_repository_impl.dart index a16f225a..ee69e783 100644 --- a/lib/data/repositories/transfer_repository_impl.dart +++ b/lib/data/repositories/transfer_repository_impl.dart @@ -72,8 +72,7 @@ class TransferRepositoryImpl expenseTransactionClientId: Value(entity.expenseTransactionClientId), incomeTransactionClientId: Value(entity.incomeTransactionClientId), ); - final transfer = await localDataSource.insertTransfer(companion); - unawaited(post(transfer)); + await persistAndPost(() => localDataSource.insertTransfer(companion)); return unit; }); } @@ -100,8 +99,7 @@ class TransferRepositoryImpl expenseTransactionClientId: entity.expenseTransactionClientId, incomeTransactionClientId: entity.incomeTransactionClientId, ); - final updated = await localDataSource.updateTransfer(transfer); - unawaited(put(updated)); + await persistAndPut(() => localDataSource.updateTransfer(transfer)); return unit; }); } @@ -109,8 +107,8 @@ class TransferRepositoryImpl @override Future> deleteTransfer(String clientId) { return RepositoryErrorHandler.handleApiCall(() async { - final transfer = await localDataSource.deleteTransfer(clientId); - unawaited(delete(transfer)); + final transfer = await syncHandler.getLocalByClientId(clientId); + await delete(transfer); return unit; }); } @@ -191,6 +189,10 @@ class TransferRepositoryImpl incomeDto.transaction.clientId, transferClientId: transferClientId, ); + + await transactionRepository.enqueuePut(expenseDto); + await transactionRepository.enqueuePut(incomeDto); + await enqueuePut(transferRow); }); unawaited( diff --git a/lib/data/repositories/wallet_repository_impl.dart b/lib/data/repositories/wallet_repository_impl.dart index 0652e64b..ebb61a76 100644 --- a/lib/data/repositories/wallet_repository_impl.dart +++ b/lib/data/repositories/wallet_repository_impl.dart @@ -1,5 +1,3 @@ -import 'dart:async'; - import 'package:drift_sync_core/drift_sync_core.dart' as sync; import 'package:fpdart/fpdart.dart'; import 'package:injectable/injectable.dart'; @@ -53,16 +51,14 @@ class WalletRepositoryImpl type: icon.mediaType, ) : null; - final wallet = await localDataSource.insertWallet( - name, - type, - balance, - currency, - description: description, - icon: media, - ); - - unawaited(post(wallet)); + final wallet = await persistAndPost(() => localDataSource.insertWallet( + name, + type, + balance, + currency, + description: description, + icon: media, + )); return WalletMapper.toDomain(wallet); }); } @@ -90,17 +86,15 @@ class WalletRepositoryImpl ) : null; - final wallet = await localDataSource.updateWallet( - clientId, - name: name, - type: type, - balance: balance, - currency: currency, - description: description, - icon: media, - ); - - unawaited(put(wallet)); + final wallet = await persistAndPut(() => localDataSource.updateWallet( + clientId, + name: name, + type: type, + balance: balance, + currency: currency, + description: description, + icon: media, + )); return WalletMapper.toDomain(wallet); }); } @@ -113,8 +107,7 @@ class WalletRepositoryImpl throw NotFoundException('Wallet not found'); } - await localDataSource.deleteWallet(clientId); - unawaited(syncHandler.deleteRemote(wallet)); + await delete(wallet); return unit; }); } diff --git a/lib/data/sync/transfer_sync_handler.dart b/lib/data/sync/transfer_sync_handler.dart index 083a7251..e6911dfd 100644 --- a/lib/data/sync/transfer_sync_handler.dart +++ b/lib/data/sync/transfer_sync_handler.dart @@ -30,6 +30,9 @@ class TransferSyncHandler extends SyncTypeHandler @override String get entityType => TransferSyncHandler.entity; + @override + bool get canSyncWithoutDependencies => true; + @override String getRev(Transfer entity) => entity.rev ?? '1'; diff --git a/lib/presentation/sync_history_screen.dart b/lib/presentation/sync_history_screen.dart index 7c016593..219423e9 100644 --- a/lib/presentation/sync_history_screen.dart +++ b/lib/presentation/sync_history_screen.dart @@ -9,6 +9,7 @@ import 'package:trakli/core/sync/sync_database.dart'; import 'package:trakli/data/database/app_database.dart'; import 'package:trakli/di/injection.dart'; import 'package:trakli/gen/translations/codegen_loader.g.dart'; +import 'package:trakli/presentation/utils/design_tokens.dart'; import 'package:trakli/presentation/utils/page_app_bar.dart'; class SyncHistoryScreen extends StatefulWidget { @@ -48,7 +49,17 @@ class _SyncHistoryScreenState extends State { Future _loadData() async { setState(() => _isLoading = true); try { - final metadata = await _db.getLocalSyncMetadataList(); + final savedMetadata = await _db.getLocalSyncMetadataList(); + final metadataByType = { + for (final item in savedMetadata) item.entityType: item, + }; + final metadata = _syncDb.typeHandlers + .where((handler) => !handler.skipDownSync) + .map((handler) => + metadataByType[handler.entityType] ?? + LocalSyncMetadata(entityType: handler.entityType)) + .toList() + ..sort((a, b) => a.entityType.compareTo(b.entityType)); final allChanges = await _db.select(_db.localChanges).get(); // Quarantined changes are permanently failed and never retry @@ -134,6 +145,16 @@ class _SyncHistoryScreenState extends State { return LocaleKeys.party.tr(); case 'group': return LocaleKeys.group.tr(); + case 'transfer': + return LocaleKeys.transfer.tr(); + case 'budget': + return LocaleKeys.budget.tr(); + case 'budget_period_state': + return LocaleKeys.budgetPeriod.tr(); + case 'notification': + return LocaleKeys.notifications.tr(); + case 'reminder': + return LocaleKeys.reminders.tr(); case 'config': return LocaleKeys.settings.tr(); default: @@ -251,13 +272,19 @@ class _SyncHistoryScreenState extends State { _getEntityTypeDisplayName(meta.entityType), style: TextStyle(fontSize: 14.sp), ), - trailing: Text( - _formatDateTime(meta.lastSyncedAt), - style: TextStyle( - fontSize: 12.sp, - color: Colors.grey[600], - ), - ), + trailing: meta.lastError != null + ? Icon( + Icons.error, + color: context.tones.expense.deep, + size: 20.sp, + ) + : Text( + _formatDateTime(meta.lastAttemptedAt), + style: TextStyle( + fontSize: 12.sp, + color: context.tones.textMuted, + ), + ), ); }, ), diff --git a/pubspec.lock b/pubspec.lock index 084be50e..331715a3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -429,8 +429,8 @@ packages: dependency: "direct main" description: path: "packages/drift_sync_core" - ref: "drift_sync_core-v0.3.3" - resolved-ref: dae6a056a7295cf196d13800c9194e2cd4ad2951 + ref: "4ac6cf0" + resolved-ref: "4ac6cf0a3f3cf6719ace9b0207d7d51e12878dcc" url: "https://github.com/whilesmartflutter/drift_sync.git" source: git version: "0.3.3" diff --git a/pubspec.yaml b/pubspec.yaml index e50f3e1c..83787d92 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -65,7 +65,7 @@ dependencies: drift_sync_core: git: url: https://github.com/whilesmartflutter/drift_sync.git - ref: drift_sync_core-v0.3.3 + ref: 4ac6cf0 path: packages/drift_sync_core drift_sync_flutter: git: diff --git a/test/drift/default/generated/schema.dart b/test/drift/default/generated/schema.dart index 746206e4..413b4408 100644 --- a/test/drift/default/generated/schema.dart +++ b/test/drift/default/generated/schema.dart @@ -11,6 +11,7 @@ import 'schema_v5.dart' as v5; import 'schema_v6.dart' as v6; import 'schema_v7.dart' as v7; import 'schema_v8.dart' as v8; +import 'schema_v9.dart' as v9; class GeneratedHelper implements SchemaInstantiationHelper { @override @@ -32,10 +33,12 @@ class GeneratedHelper implements SchemaInstantiationHelper { return v7.DatabaseAtV7(db); case 8: return v8.DatabaseAtV8(db); + case 9: + return v9.DatabaseAtV9(db); default: throw MissingSchemaException(version, versions); } } - static const versions = const [1, 2, 3, 4, 5, 6, 7, 8]; + static const versions = const [1, 2, 3, 4, 5, 6, 7, 8, 9]; } diff --git a/test/drift/default/generated/schema_v9.dart b/test/drift/default/generated/schema_v9.dart new file mode 100644 index 00000000..d1361846 --- /dev/null +++ b/test/drift/default/generated/schema_v9.dart @@ -0,0 +1,10024 @@ +// dart format width=80 +// GENERATED CODE, DO NOT EDIT BY HAND. +// ignore_for_file: type=lint +import 'package:drift/drift.dart'; + +class Wallets extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Wallets(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways('UNIQUE')); + late final GeneratedColumn userId = GeneratedColumn( + 'user_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn clientId = GeneratedColumn( + 'client_id', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'\'')); + late final GeneratedColumn rev = GeneratedColumn( + 'rev', aliasedName, true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'1\'')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn name = GeneratedColumn( + 'name', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn balance = GeneratedColumn( + 'balance', aliasedName, false, + type: DriftSqlType.double, + requiredDuringInsert: false, + defaultValue: const CustomExpression('0.0')); + late final GeneratedColumn currency = GeneratedColumn( + 'currency', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'description', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn stats = GeneratedColumn( + 'stats', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn icon = GeneratedColumn( + 'icon', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + @override + List get $columns => [ + id, + userId, + clientId, + rev, + createdAt, + updatedAt, + deletedAt, + lastSyncedAt, + name, + type, + balance, + currency, + description, + stats, + icon + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'wallets'; + @override + Set get $primaryKey => {clientId}; + @override + WalletsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return WalletsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id']), + userId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}user_id']), + clientId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}client_id'])!, + rev: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}rev']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + updatedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, + deletedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}deleted_at']), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_synced_at']), + name: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}name'])!, + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type'])!, + balance: attachedDatabase.typeMapping + .read(DriftSqlType.double, data['${effectivePrefix}balance'])!, + currency: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}currency'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}description']), + stats: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}stats']), + icon: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}icon']), + ); + } + + @override + Wallets createAlias(String alias) { + return Wallets(attachedDatabase, alias); + } +} + +class WalletsData extends DataClass implements Insertable { + final int? id; + final int? userId; + final String clientId; + final String? rev; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final DateTime? lastSyncedAt; + final String name; + final String type; + final double balance; + final String currency; + final String? description; + final String? stats; + final String? icon; + const WalletsData( + {this.id, + this.userId, + required this.clientId, + this.rev, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + this.lastSyncedAt, + required this.name, + required this.type, + required this.balance, + required this.currency, + this.description, + this.stats, + this.icon}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (!nullToAbsent || id != null) { + map['id'] = Variable(id); + } + if (!nullToAbsent || userId != null) { + map['user_id'] = Variable(userId); + } + map['client_id'] = Variable(clientId); + if (!nullToAbsent || rev != null) { + map['rev'] = Variable(rev); + } + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + map['name'] = Variable(name); + map['type'] = Variable(type); + map['balance'] = Variable(balance); + map['currency'] = Variable(currency); + if (!nullToAbsent || description != null) { + map['description'] = Variable(description); + } + if (!nullToAbsent || stats != null) { + map['stats'] = Variable(stats); + } + if (!nullToAbsent || icon != null) { + map['icon'] = Variable(icon); + } + return map; + } + + WalletsCompanion toCompanion(bool nullToAbsent) { + return WalletsCompanion( + id: id == null && nullToAbsent ? const Value.absent() : Value(id), + userId: + userId == null && nullToAbsent ? const Value.absent() : Value(userId), + clientId: Value(clientId), + rev: rev == null && nullToAbsent ? const Value.absent() : Value(rev), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + name: Value(name), + type: Value(type), + balance: Value(balance), + currency: Value(currency), + description: description == null && nullToAbsent + ? const Value.absent() + : Value(description), + stats: + stats == null && nullToAbsent ? const Value.absent() : Value(stats), + icon: icon == null && nullToAbsent ? const Value.absent() : Value(icon), + ); + } + + factory WalletsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return WalletsData( + id: serializer.fromJson(json['id']), + userId: serializer.fromJson(json['userId']), + clientId: serializer.fromJson(json['clientId']), + rev: serializer.fromJson(json['rev']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + name: serializer.fromJson(json['name']), + type: serializer.fromJson(json['type']), + balance: serializer.fromJson(json['balance']), + currency: serializer.fromJson(json['currency']), + description: serializer.fromJson(json['description']), + stats: serializer.fromJson(json['stats']), + icon: serializer.fromJson(json['icon']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'userId': serializer.toJson(userId), + 'clientId': serializer.toJson(clientId), + 'rev': serializer.toJson(rev), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'name': serializer.toJson(name), + 'type': serializer.toJson(type), + 'balance': serializer.toJson(balance), + 'currency': serializer.toJson(currency), + 'description': serializer.toJson(description), + 'stats': serializer.toJson(stats), + 'icon': serializer.toJson(icon), + }; + } + + WalletsData copyWith( + {Value id = const Value.absent(), + Value userId = const Value.absent(), + String? clientId, + Value rev = const Value.absent(), + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + String? name, + String? type, + double? balance, + String? currency, + Value description = const Value.absent(), + Value stats = const Value.absent(), + Value icon = const Value.absent()}) => + WalletsData( + id: id.present ? id.value : this.id, + userId: userId.present ? userId.value : this.userId, + clientId: clientId ?? this.clientId, + rev: rev.present ? rev.value : this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + lastSyncedAt: + lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + name: name ?? this.name, + type: type ?? this.type, + balance: balance ?? this.balance, + currency: currency ?? this.currency, + description: description.present ? description.value : this.description, + stats: stats.present ? stats.value : this.stats, + icon: icon.present ? icon.value : this.icon, + ); + WalletsData copyWithCompanion(WalletsCompanion data) { + return WalletsData( + id: data.id.present ? data.id.value : this.id, + userId: data.userId.present ? data.userId.value : this.userId, + clientId: data.clientId.present ? data.clientId.value : this.clientId, + rev: data.rev.present ? data.rev.value : this.rev, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + name: data.name.present ? data.name.value : this.name, + type: data.type.present ? data.type.value : this.type, + balance: data.balance.present ? data.balance.value : this.balance, + currency: data.currency.present ? data.currency.value : this.currency, + description: + data.description.present ? data.description.value : this.description, + stats: data.stats.present ? data.stats.value : this.stats, + icon: data.icon.present ? data.icon.value : this.icon, + ); + } + + @override + String toString() { + return (StringBuffer('WalletsData(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('name: $name, ') + ..write('type: $type, ') + ..write('balance: $balance, ') + ..write('currency: $currency, ') + ..write('description: $description, ') + ..write('stats: $stats, ') + ..write('icon: $icon') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + id, + userId, + clientId, + rev, + createdAt, + updatedAt, + deletedAt, + lastSyncedAt, + name, + type, + balance, + currency, + description, + stats, + icon); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is WalletsData && + other.id == this.id && + other.userId == this.userId && + other.clientId == this.clientId && + other.rev == this.rev && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.lastSyncedAt == this.lastSyncedAt && + other.name == this.name && + other.type == this.type && + other.balance == this.balance && + other.currency == this.currency && + other.description == this.description && + other.stats == this.stats && + other.icon == this.icon); +} + +class WalletsCompanion extends UpdateCompanion { + final Value id; + final Value userId; + final Value clientId; + final Value rev; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value lastSyncedAt; + final Value name; + final Value type; + final Value balance; + final Value currency; + final Value description; + final Value stats; + final Value icon; + final Value rowid; + const WalletsCompanion({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.name = const Value.absent(), + this.type = const Value.absent(), + this.balance = const Value.absent(), + this.currency = const Value.absent(), + this.description = const Value.absent(), + this.stats = const Value.absent(), + this.icon = const Value.absent(), + this.rowid = const Value.absent(), + }); + WalletsCompanion.insert({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + required String name, + required String type, + this.balance = const Value.absent(), + required String currency, + this.description = const Value.absent(), + this.stats = const Value.absent(), + this.icon = const Value.absent(), + this.rowid = const Value.absent(), + }) : name = Value(name), + type = Value(type), + currency = Value(currency); + static Insertable custom({ + Expression? id, + Expression? userId, + Expression? clientId, + Expression? rev, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? lastSyncedAt, + Expression? name, + Expression? type, + Expression? balance, + Expression? currency, + Expression? description, + Expression? stats, + Expression? icon, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (userId != null) 'user_id': userId, + if (clientId != null) 'client_id': clientId, + if (rev != null) 'rev': rev, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (name != null) 'name': name, + if (type != null) 'type': type, + if (balance != null) 'balance': balance, + if (currency != null) 'currency': currency, + if (description != null) 'description': description, + if (stats != null) 'stats': stats, + if (icon != null) 'icon': icon, + if (rowid != null) 'rowid': rowid, + }); + } + + WalletsCompanion copyWith( + {Value? id, + Value? userId, + Value? clientId, + Value? rev, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? lastSyncedAt, + Value? name, + Value? type, + Value? balance, + Value? currency, + Value? description, + Value? stats, + Value? icon, + Value? rowid}) { + return WalletsCompanion( + id: id ?? this.id, + userId: userId ?? this.userId, + clientId: clientId ?? this.clientId, + rev: rev ?? this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + name: name ?? this.name, + type: type ?? this.type, + balance: balance ?? this.balance, + currency: currency ?? this.currency, + description: description ?? this.description, + stats: stats ?? this.stats, + icon: icon ?? this.icon, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (userId.present) { + map['user_id'] = Variable(userId.value); + } + if (clientId.present) { + map['client_id'] = Variable(clientId.value); + } + if (rev.present) { + map['rev'] = Variable(rev.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (name.present) { + map['name'] = Variable(name.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (balance.present) { + map['balance'] = Variable(balance.value); + } + if (currency.present) { + map['currency'] = Variable(currency.value); + } + if (description.present) { + map['description'] = Variable(description.value); + } + if (stats.present) { + map['stats'] = Variable(stats.value); + } + if (icon.present) { + map['icon'] = Variable(icon.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('WalletsCompanion(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('name: $name, ') + ..write('type: $type, ') + ..write('balance: $balance, ') + ..write('currency: $currency, ') + ..write('description: $description, ') + ..write('stats: $stats, ') + ..write('icon: $icon, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class Parties extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Parties(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways('UNIQUE')); + late final GeneratedColumn userId = GeneratedColumn( + 'user_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn clientId = GeneratedColumn( + 'client_id', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'\'')); + late final GeneratedColumn rev = GeneratedColumn( + 'rev', aliasedName, true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'1\'')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn name = GeneratedColumn( + 'name', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'description', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn icon = GeneratedColumn( + 'icon', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + @override + List get $columns => [ + id, + userId, + clientId, + rev, + createdAt, + updatedAt, + deletedAt, + lastSyncedAt, + name, + description, + icon, + type + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'parties'; + @override + Set get $primaryKey => {clientId}; + @override + PartiesData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return PartiesData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id']), + userId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}user_id']), + clientId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}client_id'])!, + rev: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}rev']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + updatedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, + deletedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}deleted_at']), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_synced_at']), + name: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}name'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}description']), + icon: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}icon']), + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type']), + ); + } + + @override + Parties createAlias(String alias) { + return Parties(attachedDatabase, alias); + } +} + +class PartiesData extends DataClass implements Insertable { + final int? id; + final int? userId; + final String clientId; + final String? rev; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final DateTime? lastSyncedAt; + final String name; + final String? description; + final String? icon; + final String? type; + const PartiesData( + {this.id, + this.userId, + required this.clientId, + this.rev, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + this.lastSyncedAt, + required this.name, + this.description, + this.icon, + this.type}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (!nullToAbsent || id != null) { + map['id'] = Variable(id); + } + if (!nullToAbsent || userId != null) { + map['user_id'] = Variable(userId); + } + map['client_id'] = Variable(clientId); + if (!nullToAbsent || rev != null) { + map['rev'] = Variable(rev); + } + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + map['name'] = Variable(name); + if (!nullToAbsent || description != null) { + map['description'] = Variable(description); + } + if (!nullToAbsent || icon != null) { + map['icon'] = Variable(icon); + } + if (!nullToAbsent || type != null) { + map['type'] = Variable(type); + } + return map; + } + + PartiesCompanion toCompanion(bool nullToAbsent) { + return PartiesCompanion( + id: id == null && nullToAbsent ? const Value.absent() : Value(id), + userId: + userId == null && nullToAbsent ? const Value.absent() : Value(userId), + clientId: Value(clientId), + rev: rev == null && nullToAbsent ? const Value.absent() : Value(rev), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + name: Value(name), + description: description == null && nullToAbsent + ? const Value.absent() + : Value(description), + icon: icon == null && nullToAbsent ? const Value.absent() : Value(icon), + type: type == null && nullToAbsent ? const Value.absent() : Value(type), + ); + } + + factory PartiesData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return PartiesData( + id: serializer.fromJson(json['id']), + userId: serializer.fromJson(json['userId']), + clientId: serializer.fromJson(json['clientId']), + rev: serializer.fromJson(json['rev']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + name: serializer.fromJson(json['name']), + description: serializer.fromJson(json['description']), + icon: serializer.fromJson(json['icon']), + type: serializer.fromJson(json['type']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'userId': serializer.toJson(userId), + 'clientId': serializer.toJson(clientId), + 'rev': serializer.toJson(rev), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'name': serializer.toJson(name), + 'description': serializer.toJson(description), + 'icon': serializer.toJson(icon), + 'type': serializer.toJson(type), + }; + } + + PartiesData copyWith( + {Value id = const Value.absent(), + Value userId = const Value.absent(), + String? clientId, + Value rev = const Value.absent(), + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + String? name, + Value description = const Value.absent(), + Value icon = const Value.absent(), + Value type = const Value.absent()}) => + PartiesData( + id: id.present ? id.value : this.id, + userId: userId.present ? userId.value : this.userId, + clientId: clientId ?? this.clientId, + rev: rev.present ? rev.value : this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + lastSyncedAt: + lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + name: name ?? this.name, + description: description.present ? description.value : this.description, + icon: icon.present ? icon.value : this.icon, + type: type.present ? type.value : this.type, + ); + PartiesData copyWithCompanion(PartiesCompanion data) { + return PartiesData( + id: data.id.present ? data.id.value : this.id, + userId: data.userId.present ? data.userId.value : this.userId, + clientId: data.clientId.present ? data.clientId.value : this.clientId, + rev: data.rev.present ? data.rev.value : this.rev, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + name: data.name.present ? data.name.value : this.name, + description: + data.description.present ? data.description.value : this.description, + icon: data.icon.present ? data.icon.value : this.icon, + type: data.type.present ? data.type.value : this.type, + ); + } + + @override + String toString() { + return (StringBuffer('PartiesData(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('name: $name, ') + ..write('description: $description, ') + ..write('icon: $icon, ') + ..write('type: $type') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, userId, clientId, rev, createdAt, + updatedAt, deletedAt, lastSyncedAt, name, description, icon, type); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is PartiesData && + other.id == this.id && + other.userId == this.userId && + other.clientId == this.clientId && + other.rev == this.rev && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.lastSyncedAt == this.lastSyncedAt && + other.name == this.name && + other.description == this.description && + other.icon == this.icon && + other.type == this.type); +} + +class PartiesCompanion extends UpdateCompanion { + final Value id; + final Value userId; + final Value clientId; + final Value rev; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value lastSyncedAt; + final Value name; + final Value description; + final Value icon; + final Value type; + final Value rowid; + const PartiesCompanion({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.name = const Value.absent(), + this.description = const Value.absent(), + this.icon = const Value.absent(), + this.type = const Value.absent(), + this.rowid = const Value.absent(), + }); + PartiesCompanion.insert({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + required String name, + this.description = const Value.absent(), + this.icon = const Value.absent(), + this.type = const Value.absent(), + this.rowid = const Value.absent(), + }) : name = Value(name); + static Insertable custom({ + Expression? id, + Expression? userId, + Expression? clientId, + Expression? rev, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? lastSyncedAt, + Expression? name, + Expression? description, + Expression? icon, + Expression? type, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (userId != null) 'user_id': userId, + if (clientId != null) 'client_id': clientId, + if (rev != null) 'rev': rev, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (name != null) 'name': name, + if (description != null) 'description': description, + if (icon != null) 'icon': icon, + if (type != null) 'type': type, + if (rowid != null) 'rowid': rowid, + }); + } + + PartiesCompanion copyWith( + {Value? id, + Value? userId, + Value? clientId, + Value? rev, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? lastSyncedAt, + Value? name, + Value? description, + Value? icon, + Value? type, + Value? rowid}) { + return PartiesCompanion( + id: id ?? this.id, + userId: userId ?? this.userId, + clientId: clientId ?? this.clientId, + rev: rev ?? this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + name: name ?? this.name, + description: description ?? this.description, + icon: icon ?? this.icon, + type: type ?? this.type, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (userId.present) { + map['user_id'] = Variable(userId.value); + } + if (clientId.present) { + map['client_id'] = Variable(clientId.value); + } + if (rev.present) { + map['rev'] = Variable(rev.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (name.present) { + map['name'] = Variable(name.value); + } + if (description.present) { + map['description'] = Variable(description.value); + } + if (icon.present) { + map['icon'] = Variable(icon.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('PartiesCompanion(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('name: $name, ') + ..write('description: $description, ') + ..write('icon: $icon, ') + ..write('type: $type, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class Groups extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Groups(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways('UNIQUE')); + late final GeneratedColumn userId = GeneratedColumn( + 'user_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn clientId = GeneratedColumn( + 'client_id', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'\'')); + late final GeneratedColumn rev = GeneratedColumn( + 'rev', aliasedName, true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'1\'')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn name = GeneratedColumn( + 'name', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'description', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn icon = GeneratedColumn( + 'icon', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + @override + List get $columns => [ + id, + userId, + clientId, + rev, + createdAt, + updatedAt, + deletedAt, + lastSyncedAt, + name, + description, + icon + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'groups'; + @override + Set get $primaryKey => {clientId}; + @override + GroupsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return GroupsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id']), + userId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}user_id']), + clientId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}client_id'])!, + rev: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}rev']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + updatedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, + deletedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}deleted_at']), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_synced_at']), + name: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}name'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}description']), + icon: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}icon']), + ); + } + + @override + Groups createAlias(String alias) { + return Groups(attachedDatabase, alias); + } +} + +class GroupsData extends DataClass implements Insertable { + final int? id; + final int? userId; + final String clientId; + final String? rev; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final DateTime? lastSyncedAt; + final String name; + final String? description; + final String? icon; + const GroupsData( + {this.id, + this.userId, + required this.clientId, + this.rev, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + this.lastSyncedAt, + required this.name, + this.description, + this.icon}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (!nullToAbsent || id != null) { + map['id'] = Variable(id); + } + if (!nullToAbsent || userId != null) { + map['user_id'] = Variable(userId); + } + map['client_id'] = Variable(clientId); + if (!nullToAbsent || rev != null) { + map['rev'] = Variable(rev); + } + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + map['name'] = Variable(name); + if (!nullToAbsent || description != null) { + map['description'] = Variable(description); + } + if (!nullToAbsent || icon != null) { + map['icon'] = Variable(icon); + } + return map; + } + + GroupsCompanion toCompanion(bool nullToAbsent) { + return GroupsCompanion( + id: id == null && nullToAbsent ? const Value.absent() : Value(id), + userId: + userId == null && nullToAbsent ? const Value.absent() : Value(userId), + clientId: Value(clientId), + rev: rev == null && nullToAbsent ? const Value.absent() : Value(rev), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + name: Value(name), + description: description == null && nullToAbsent + ? const Value.absent() + : Value(description), + icon: icon == null && nullToAbsent ? const Value.absent() : Value(icon), + ); + } + + factory GroupsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return GroupsData( + id: serializer.fromJson(json['id']), + userId: serializer.fromJson(json['userId']), + clientId: serializer.fromJson(json['clientId']), + rev: serializer.fromJson(json['rev']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + name: serializer.fromJson(json['name']), + description: serializer.fromJson(json['description']), + icon: serializer.fromJson(json['icon']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'userId': serializer.toJson(userId), + 'clientId': serializer.toJson(clientId), + 'rev': serializer.toJson(rev), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'name': serializer.toJson(name), + 'description': serializer.toJson(description), + 'icon': serializer.toJson(icon), + }; + } + + GroupsData copyWith( + {Value id = const Value.absent(), + Value userId = const Value.absent(), + String? clientId, + Value rev = const Value.absent(), + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + String? name, + Value description = const Value.absent(), + Value icon = const Value.absent()}) => + GroupsData( + id: id.present ? id.value : this.id, + userId: userId.present ? userId.value : this.userId, + clientId: clientId ?? this.clientId, + rev: rev.present ? rev.value : this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + lastSyncedAt: + lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + name: name ?? this.name, + description: description.present ? description.value : this.description, + icon: icon.present ? icon.value : this.icon, + ); + GroupsData copyWithCompanion(GroupsCompanion data) { + return GroupsData( + id: data.id.present ? data.id.value : this.id, + userId: data.userId.present ? data.userId.value : this.userId, + clientId: data.clientId.present ? data.clientId.value : this.clientId, + rev: data.rev.present ? data.rev.value : this.rev, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + name: data.name.present ? data.name.value : this.name, + description: + data.description.present ? data.description.value : this.description, + icon: data.icon.present ? data.icon.value : this.icon, + ); + } + + @override + String toString() { + return (StringBuffer('GroupsData(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('name: $name, ') + ..write('description: $description, ') + ..write('icon: $icon') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, userId, clientId, rev, createdAt, + updatedAt, deletedAt, lastSyncedAt, name, description, icon); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is GroupsData && + other.id == this.id && + other.userId == this.userId && + other.clientId == this.clientId && + other.rev == this.rev && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.lastSyncedAt == this.lastSyncedAt && + other.name == this.name && + other.description == this.description && + other.icon == this.icon); +} + +class GroupsCompanion extends UpdateCompanion { + final Value id; + final Value userId; + final Value clientId; + final Value rev; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value lastSyncedAt; + final Value name; + final Value description; + final Value icon; + final Value rowid; + const GroupsCompanion({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.name = const Value.absent(), + this.description = const Value.absent(), + this.icon = const Value.absent(), + this.rowid = const Value.absent(), + }); + GroupsCompanion.insert({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + required String name, + this.description = const Value.absent(), + this.icon = const Value.absent(), + this.rowid = const Value.absent(), + }) : name = Value(name); + static Insertable custom({ + Expression? id, + Expression? userId, + Expression? clientId, + Expression? rev, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? lastSyncedAt, + Expression? name, + Expression? description, + Expression? icon, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (userId != null) 'user_id': userId, + if (clientId != null) 'client_id': clientId, + if (rev != null) 'rev': rev, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (name != null) 'name': name, + if (description != null) 'description': description, + if (icon != null) 'icon': icon, + if (rowid != null) 'rowid': rowid, + }); + } + + GroupsCompanion copyWith( + {Value? id, + Value? userId, + Value? clientId, + Value? rev, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? lastSyncedAt, + Value? name, + Value? description, + Value? icon, + Value? rowid}) { + return GroupsCompanion( + id: id ?? this.id, + userId: userId ?? this.userId, + clientId: clientId ?? this.clientId, + rev: rev ?? this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + name: name ?? this.name, + description: description ?? this.description, + icon: icon ?? this.icon, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (userId.present) { + map['user_id'] = Variable(userId.value); + } + if (clientId.present) { + map['client_id'] = Variable(clientId.value); + } + if (rev.present) { + map['rev'] = Variable(rev.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (name.present) { + map['name'] = Variable(name.value); + } + if (description.present) { + map['description'] = Variable(description.value); + } + if (icon.present) { + map['icon'] = Variable(icon.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('GroupsCompanion(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('name: $name, ') + ..write('description: $description, ') + ..write('icon: $icon, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class Transactions extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Transactions(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways('UNIQUE')); + late final GeneratedColumn userId = GeneratedColumn( + 'user_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn clientId = GeneratedColumn( + 'client_id', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'\'')); + late final GeneratedColumn rev = GeneratedColumn( + 'rev', aliasedName, true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'1\'')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn amount = GeneratedColumn( + 'amount', aliasedName, false, + type: DriftSqlType.double, requiredDuringInsert: true); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn intent = GeneratedColumn( + 'intent', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'regular\'')); + late final GeneratedColumn description = GeneratedColumn( + 'description', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn datetime = GeneratedColumn( + 'datetime', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn partyId = GeneratedColumn( + 'party_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn walletId = GeneratedColumn( + 'wallet_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn groupId = GeneratedColumn( + 'group_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn walletClientId = GeneratedColumn( + 'wallet_client_id', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES wallets (client_id)')); + late final GeneratedColumn partyClientId = GeneratedColumn( + 'party_client_id', aliasedName, true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES parties (client_id)')); + late final GeneratedColumn groupClientId = GeneratedColumn( + 'group_client_id', aliasedName, true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES "groups" (client_id)')); + late final GeneratedColumn transferId = GeneratedColumn( + 'transfer_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn transferClientId = GeneratedColumn( + 'transfer_client_id', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn isRefund = GeneratedColumn( + 'is_refund', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("is_refund" IN (0, 1))'), + defaultValue: const CustomExpression('0')); + late final GeneratedColumn refundOfTransactionId = GeneratedColumn( + 'refund_of_transaction_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn recurrencePeriod = GeneratedColumn( + 'recurrence_period', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn recurrenceInterval = GeneratedColumn( + 'recurrence_interval', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn recurrenceEndsAt = + GeneratedColumn('recurrence_ends_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn recurrenceNextScheduledAt = + GeneratedColumn( + 'recurrence_next_scheduled_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + @override + List get $columns => [ + id, + userId, + clientId, + rev, + createdAt, + updatedAt, + deletedAt, + lastSyncedAt, + amount, + type, + intent, + description, + datetime, + partyId, + walletId, + groupId, + walletClientId, + partyClientId, + groupClientId, + transferId, + transferClientId, + isRefund, + refundOfTransactionId, + recurrencePeriod, + recurrenceInterval, + recurrenceEndsAt, + recurrenceNextScheduledAt + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'transactions'; + @override + Set get $primaryKey => {clientId}; + @override + TransactionsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return TransactionsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id']), + userId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}user_id']), + clientId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}client_id'])!, + rev: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}rev']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + updatedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, + deletedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}deleted_at']), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_synced_at']), + amount: attachedDatabase.typeMapping + .read(DriftSqlType.double, data['${effectivePrefix}amount'])!, + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type'])!, + intent: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}intent'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}description']), + datetime: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}datetime']), + partyId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}party_id']), + walletId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}wallet_id']), + groupId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}group_id']), + walletClientId: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}wallet_client_id'])!, + partyClientId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}party_client_id']), + groupClientId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}group_client_id']), + transferId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}transfer_id']), + transferClientId: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}transfer_client_id']), + isRefund: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}is_refund'])!, + refundOfTransactionId: attachedDatabase.typeMapping.read( + DriftSqlType.int, data['${effectivePrefix}refund_of_transaction_id']), + recurrencePeriod: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}recurrence_period']), + recurrenceInterval: attachedDatabase.typeMapping.read( + DriftSqlType.int, data['${effectivePrefix}recurrence_interval']), + recurrenceEndsAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}recurrence_ends_at']), + recurrenceNextScheduledAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}recurrence_next_scheduled_at']), + ); + } + + @override + Transactions createAlias(String alias) { + return Transactions(attachedDatabase, alias); + } +} + +class TransactionsData extends DataClass + implements Insertable { + final int? id; + final int? userId; + final String clientId; + final String? rev; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final DateTime? lastSyncedAt; + final double amount; + final String type; + final String intent; + final String? description; + final DateTime? datetime; + final int? partyId; + final int? walletId; + final int? groupId; + final String walletClientId; + final String? partyClientId; + final String? groupClientId; + final int? transferId; + final String? transferClientId; + final bool isRefund; + final int? refundOfTransactionId; + final String? recurrencePeriod; + final int? recurrenceInterval; + final DateTime? recurrenceEndsAt; + final DateTime? recurrenceNextScheduledAt; + const TransactionsData( + {this.id, + this.userId, + required this.clientId, + this.rev, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + this.lastSyncedAt, + required this.amount, + required this.type, + required this.intent, + this.description, + this.datetime, + this.partyId, + this.walletId, + this.groupId, + required this.walletClientId, + this.partyClientId, + this.groupClientId, + this.transferId, + this.transferClientId, + required this.isRefund, + this.refundOfTransactionId, + this.recurrencePeriod, + this.recurrenceInterval, + this.recurrenceEndsAt, + this.recurrenceNextScheduledAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (!nullToAbsent || id != null) { + map['id'] = Variable(id); + } + if (!nullToAbsent || userId != null) { + map['user_id'] = Variable(userId); + } + map['client_id'] = Variable(clientId); + if (!nullToAbsent || rev != null) { + map['rev'] = Variable(rev); + } + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + map['amount'] = Variable(amount); + map['type'] = Variable(type); + map['intent'] = Variable(intent); + if (!nullToAbsent || description != null) { + map['description'] = Variable(description); + } + if (!nullToAbsent || datetime != null) { + map['datetime'] = Variable(datetime); + } + if (!nullToAbsent || partyId != null) { + map['party_id'] = Variable(partyId); + } + if (!nullToAbsent || walletId != null) { + map['wallet_id'] = Variable(walletId); + } + if (!nullToAbsent || groupId != null) { + map['group_id'] = Variable(groupId); + } + map['wallet_client_id'] = Variable(walletClientId); + if (!nullToAbsent || partyClientId != null) { + map['party_client_id'] = Variable(partyClientId); + } + if (!nullToAbsent || groupClientId != null) { + map['group_client_id'] = Variable(groupClientId); + } + if (!nullToAbsent || transferId != null) { + map['transfer_id'] = Variable(transferId); + } + if (!nullToAbsent || transferClientId != null) { + map['transfer_client_id'] = Variable(transferClientId); + } + map['is_refund'] = Variable(isRefund); + if (!nullToAbsent || refundOfTransactionId != null) { + map['refund_of_transaction_id'] = Variable(refundOfTransactionId); + } + if (!nullToAbsent || recurrencePeriod != null) { + map['recurrence_period'] = Variable(recurrencePeriod); + } + if (!nullToAbsent || recurrenceInterval != null) { + map['recurrence_interval'] = Variable(recurrenceInterval); + } + if (!nullToAbsent || recurrenceEndsAt != null) { + map['recurrence_ends_at'] = Variable(recurrenceEndsAt); + } + if (!nullToAbsent || recurrenceNextScheduledAt != null) { + map['recurrence_next_scheduled_at'] = + Variable(recurrenceNextScheduledAt); + } + return map; + } + + TransactionsCompanion toCompanion(bool nullToAbsent) { + return TransactionsCompanion( + id: id == null && nullToAbsent ? const Value.absent() : Value(id), + userId: + userId == null && nullToAbsent ? const Value.absent() : Value(userId), + clientId: Value(clientId), + rev: rev == null && nullToAbsent ? const Value.absent() : Value(rev), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + amount: Value(amount), + type: Value(type), + intent: Value(intent), + description: description == null && nullToAbsent + ? const Value.absent() + : Value(description), + datetime: datetime == null && nullToAbsent + ? const Value.absent() + : Value(datetime), + partyId: partyId == null && nullToAbsent + ? const Value.absent() + : Value(partyId), + walletId: walletId == null && nullToAbsent + ? const Value.absent() + : Value(walletId), + groupId: groupId == null && nullToAbsent + ? const Value.absent() + : Value(groupId), + walletClientId: Value(walletClientId), + partyClientId: partyClientId == null && nullToAbsent + ? const Value.absent() + : Value(partyClientId), + groupClientId: groupClientId == null && nullToAbsent + ? const Value.absent() + : Value(groupClientId), + transferId: transferId == null && nullToAbsent + ? const Value.absent() + : Value(transferId), + transferClientId: transferClientId == null && nullToAbsent + ? const Value.absent() + : Value(transferClientId), + isRefund: Value(isRefund), + refundOfTransactionId: refundOfTransactionId == null && nullToAbsent + ? const Value.absent() + : Value(refundOfTransactionId), + recurrencePeriod: recurrencePeriod == null && nullToAbsent + ? const Value.absent() + : Value(recurrencePeriod), + recurrenceInterval: recurrenceInterval == null && nullToAbsent + ? const Value.absent() + : Value(recurrenceInterval), + recurrenceEndsAt: recurrenceEndsAt == null && nullToAbsent + ? const Value.absent() + : Value(recurrenceEndsAt), + recurrenceNextScheduledAt: + recurrenceNextScheduledAt == null && nullToAbsent + ? const Value.absent() + : Value(recurrenceNextScheduledAt), + ); + } + + factory TransactionsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return TransactionsData( + id: serializer.fromJson(json['id']), + userId: serializer.fromJson(json['userId']), + clientId: serializer.fromJson(json['clientId']), + rev: serializer.fromJson(json['rev']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + amount: serializer.fromJson(json['amount']), + type: serializer.fromJson(json['type']), + intent: serializer.fromJson(json['intent']), + description: serializer.fromJson(json['description']), + datetime: serializer.fromJson(json['datetime']), + partyId: serializer.fromJson(json['partyId']), + walletId: serializer.fromJson(json['walletId']), + groupId: serializer.fromJson(json['groupId']), + walletClientId: serializer.fromJson(json['walletClientId']), + partyClientId: serializer.fromJson(json['partyClientId']), + groupClientId: serializer.fromJson(json['groupClientId']), + transferId: serializer.fromJson(json['transferId']), + transferClientId: serializer.fromJson(json['transferClientId']), + isRefund: serializer.fromJson(json['isRefund']), + refundOfTransactionId: + serializer.fromJson(json['refundOfTransactionId']), + recurrencePeriod: serializer.fromJson(json['recurrencePeriod']), + recurrenceInterval: serializer.fromJson(json['recurrenceInterval']), + recurrenceEndsAt: + serializer.fromJson(json['recurrenceEndsAt']), + recurrenceNextScheduledAt: + serializer.fromJson(json['recurrenceNextScheduledAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'userId': serializer.toJson(userId), + 'clientId': serializer.toJson(clientId), + 'rev': serializer.toJson(rev), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'amount': serializer.toJson(amount), + 'type': serializer.toJson(type), + 'intent': serializer.toJson(intent), + 'description': serializer.toJson(description), + 'datetime': serializer.toJson(datetime), + 'partyId': serializer.toJson(partyId), + 'walletId': serializer.toJson(walletId), + 'groupId': serializer.toJson(groupId), + 'walletClientId': serializer.toJson(walletClientId), + 'partyClientId': serializer.toJson(partyClientId), + 'groupClientId': serializer.toJson(groupClientId), + 'transferId': serializer.toJson(transferId), + 'transferClientId': serializer.toJson(transferClientId), + 'isRefund': serializer.toJson(isRefund), + 'refundOfTransactionId': serializer.toJson(refundOfTransactionId), + 'recurrencePeriod': serializer.toJson(recurrencePeriod), + 'recurrenceInterval': serializer.toJson(recurrenceInterval), + 'recurrenceEndsAt': serializer.toJson(recurrenceEndsAt), + 'recurrenceNextScheduledAt': + serializer.toJson(recurrenceNextScheduledAt), + }; + } + + TransactionsData copyWith( + {Value id = const Value.absent(), + Value userId = const Value.absent(), + String? clientId, + Value rev = const Value.absent(), + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + double? amount, + String? type, + String? intent, + Value description = const Value.absent(), + Value datetime = const Value.absent(), + Value partyId = const Value.absent(), + Value walletId = const Value.absent(), + Value groupId = const Value.absent(), + String? walletClientId, + Value partyClientId = const Value.absent(), + Value groupClientId = const Value.absent(), + Value transferId = const Value.absent(), + Value transferClientId = const Value.absent(), + bool? isRefund, + Value refundOfTransactionId = const Value.absent(), + Value recurrencePeriod = const Value.absent(), + Value recurrenceInterval = const Value.absent(), + Value recurrenceEndsAt = const Value.absent(), + Value recurrenceNextScheduledAt = const Value.absent()}) => + TransactionsData( + id: id.present ? id.value : this.id, + userId: userId.present ? userId.value : this.userId, + clientId: clientId ?? this.clientId, + rev: rev.present ? rev.value : this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + lastSyncedAt: + lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + amount: amount ?? this.amount, + type: type ?? this.type, + intent: intent ?? this.intent, + description: description.present ? description.value : this.description, + datetime: datetime.present ? datetime.value : this.datetime, + partyId: partyId.present ? partyId.value : this.partyId, + walletId: walletId.present ? walletId.value : this.walletId, + groupId: groupId.present ? groupId.value : this.groupId, + walletClientId: walletClientId ?? this.walletClientId, + partyClientId: + partyClientId.present ? partyClientId.value : this.partyClientId, + groupClientId: + groupClientId.present ? groupClientId.value : this.groupClientId, + transferId: transferId.present ? transferId.value : this.transferId, + transferClientId: transferClientId.present + ? transferClientId.value + : this.transferClientId, + isRefund: isRefund ?? this.isRefund, + refundOfTransactionId: refundOfTransactionId.present + ? refundOfTransactionId.value + : this.refundOfTransactionId, + recurrencePeriod: recurrencePeriod.present + ? recurrencePeriod.value + : this.recurrencePeriod, + recurrenceInterval: recurrenceInterval.present + ? recurrenceInterval.value + : this.recurrenceInterval, + recurrenceEndsAt: recurrenceEndsAt.present + ? recurrenceEndsAt.value + : this.recurrenceEndsAt, + recurrenceNextScheduledAt: recurrenceNextScheduledAt.present + ? recurrenceNextScheduledAt.value + : this.recurrenceNextScheduledAt, + ); + TransactionsData copyWithCompanion(TransactionsCompanion data) { + return TransactionsData( + id: data.id.present ? data.id.value : this.id, + userId: data.userId.present ? data.userId.value : this.userId, + clientId: data.clientId.present ? data.clientId.value : this.clientId, + rev: data.rev.present ? data.rev.value : this.rev, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + amount: data.amount.present ? data.amount.value : this.amount, + type: data.type.present ? data.type.value : this.type, + intent: data.intent.present ? data.intent.value : this.intent, + description: + data.description.present ? data.description.value : this.description, + datetime: data.datetime.present ? data.datetime.value : this.datetime, + partyId: data.partyId.present ? data.partyId.value : this.partyId, + walletId: data.walletId.present ? data.walletId.value : this.walletId, + groupId: data.groupId.present ? data.groupId.value : this.groupId, + walletClientId: data.walletClientId.present + ? data.walletClientId.value + : this.walletClientId, + partyClientId: data.partyClientId.present + ? data.partyClientId.value + : this.partyClientId, + groupClientId: data.groupClientId.present + ? data.groupClientId.value + : this.groupClientId, + transferId: + data.transferId.present ? data.transferId.value : this.transferId, + transferClientId: data.transferClientId.present + ? data.transferClientId.value + : this.transferClientId, + isRefund: data.isRefund.present ? data.isRefund.value : this.isRefund, + refundOfTransactionId: data.refundOfTransactionId.present + ? data.refundOfTransactionId.value + : this.refundOfTransactionId, + recurrencePeriod: data.recurrencePeriod.present + ? data.recurrencePeriod.value + : this.recurrencePeriod, + recurrenceInterval: data.recurrenceInterval.present + ? data.recurrenceInterval.value + : this.recurrenceInterval, + recurrenceEndsAt: data.recurrenceEndsAt.present + ? data.recurrenceEndsAt.value + : this.recurrenceEndsAt, + recurrenceNextScheduledAt: data.recurrenceNextScheduledAt.present + ? data.recurrenceNextScheduledAt.value + : this.recurrenceNextScheduledAt, + ); + } + + @override + String toString() { + return (StringBuffer('TransactionsData(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('amount: $amount, ') + ..write('type: $type, ') + ..write('intent: $intent, ') + ..write('description: $description, ') + ..write('datetime: $datetime, ') + ..write('partyId: $partyId, ') + ..write('walletId: $walletId, ') + ..write('groupId: $groupId, ') + ..write('walletClientId: $walletClientId, ') + ..write('partyClientId: $partyClientId, ') + ..write('groupClientId: $groupClientId, ') + ..write('transferId: $transferId, ') + ..write('transferClientId: $transferClientId, ') + ..write('isRefund: $isRefund, ') + ..write('refundOfTransactionId: $refundOfTransactionId, ') + ..write('recurrencePeriod: $recurrencePeriod, ') + ..write('recurrenceInterval: $recurrenceInterval, ') + ..write('recurrenceEndsAt: $recurrenceEndsAt, ') + ..write('recurrenceNextScheduledAt: $recurrenceNextScheduledAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hashAll([ + id, + userId, + clientId, + rev, + createdAt, + updatedAt, + deletedAt, + lastSyncedAt, + amount, + type, + intent, + description, + datetime, + partyId, + walletId, + groupId, + walletClientId, + partyClientId, + groupClientId, + transferId, + transferClientId, + isRefund, + refundOfTransactionId, + recurrencePeriod, + recurrenceInterval, + recurrenceEndsAt, + recurrenceNextScheduledAt + ]); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is TransactionsData && + other.id == this.id && + other.userId == this.userId && + other.clientId == this.clientId && + other.rev == this.rev && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.lastSyncedAt == this.lastSyncedAt && + other.amount == this.amount && + other.type == this.type && + other.intent == this.intent && + other.description == this.description && + other.datetime == this.datetime && + other.partyId == this.partyId && + other.walletId == this.walletId && + other.groupId == this.groupId && + other.walletClientId == this.walletClientId && + other.partyClientId == this.partyClientId && + other.groupClientId == this.groupClientId && + other.transferId == this.transferId && + other.transferClientId == this.transferClientId && + other.isRefund == this.isRefund && + other.refundOfTransactionId == this.refundOfTransactionId && + other.recurrencePeriod == this.recurrencePeriod && + other.recurrenceInterval == this.recurrenceInterval && + other.recurrenceEndsAt == this.recurrenceEndsAt && + other.recurrenceNextScheduledAt == this.recurrenceNextScheduledAt); +} + +class TransactionsCompanion extends UpdateCompanion { + final Value id; + final Value userId; + final Value clientId; + final Value rev; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value lastSyncedAt; + final Value amount; + final Value type; + final Value intent; + final Value description; + final Value datetime; + final Value partyId; + final Value walletId; + final Value groupId; + final Value walletClientId; + final Value partyClientId; + final Value groupClientId; + final Value transferId; + final Value transferClientId; + final Value isRefund; + final Value refundOfTransactionId; + final Value recurrencePeriod; + final Value recurrenceInterval; + final Value recurrenceEndsAt; + final Value recurrenceNextScheduledAt; + final Value rowid; + const TransactionsCompanion({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.amount = const Value.absent(), + this.type = const Value.absent(), + this.intent = const Value.absent(), + this.description = const Value.absent(), + this.datetime = const Value.absent(), + this.partyId = const Value.absent(), + this.walletId = const Value.absent(), + this.groupId = const Value.absent(), + this.walletClientId = const Value.absent(), + this.partyClientId = const Value.absent(), + this.groupClientId = const Value.absent(), + this.transferId = const Value.absent(), + this.transferClientId = const Value.absent(), + this.isRefund = const Value.absent(), + this.refundOfTransactionId = const Value.absent(), + this.recurrencePeriod = const Value.absent(), + this.recurrenceInterval = const Value.absent(), + this.recurrenceEndsAt = const Value.absent(), + this.recurrenceNextScheduledAt = const Value.absent(), + this.rowid = const Value.absent(), + }); + TransactionsCompanion.insert({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + required double amount, + required String type, + this.intent = const Value.absent(), + this.description = const Value.absent(), + this.datetime = const Value.absent(), + this.partyId = const Value.absent(), + this.walletId = const Value.absent(), + this.groupId = const Value.absent(), + required String walletClientId, + this.partyClientId = const Value.absent(), + this.groupClientId = const Value.absent(), + this.transferId = const Value.absent(), + this.transferClientId = const Value.absent(), + this.isRefund = const Value.absent(), + this.refundOfTransactionId = const Value.absent(), + this.recurrencePeriod = const Value.absent(), + this.recurrenceInterval = const Value.absent(), + this.recurrenceEndsAt = const Value.absent(), + this.recurrenceNextScheduledAt = const Value.absent(), + this.rowid = const Value.absent(), + }) : amount = Value(amount), + type = Value(type), + walletClientId = Value(walletClientId); + static Insertable custom({ + Expression? id, + Expression? userId, + Expression? clientId, + Expression? rev, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? lastSyncedAt, + Expression? amount, + Expression? type, + Expression? intent, + Expression? description, + Expression? datetime, + Expression? partyId, + Expression? walletId, + Expression? groupId, + Expression? walletClientId, + Expression? partyClientId, + Expression? groupClientId, + Expression? transferId, + Expression? transferClientId, + Expression? isRefund, + Expression? refundOfTransactionId, + Expression? recurrencePeriod, + Expression? recurrenceInterval, + Expression? recurrenceEndsAt, + Expression? recurrenceNextScheduledAt, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (userId != null) 'user_id': userId, + if (clientId != null) 'client_id': clientId, + if (rev != null) 'rev': rev, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (amount != null) 'amount': amount, + if (type != null) 'type': type, + if (intent != null) 'intent': intent, + if (description != null) 'description': description, + if (datetime != null) 'datetime': datetime, + if (partyId != null) 'party_id': partyId, + if (walletId != null) 'wallet_id': walletId, + if (groupId != null) 'group_id': groupId, + if (walletClientId != null) 'wallet_client_id': walletClientId, + if (partyClientId != null) 'party_client_id': partyClientId, + if (groupClientId != null) 'group_client_id': groupClientId, + if (transferId != null) 'transfer_id': transferId, + if (transferClientId != null) 'transfer_client_id': transferClientId, + if (isRefund != null) 'is_refund': isRefund, + if (refundOfTransactionId != null) + 'refund_of_transaction_id': refundOfTransactionId, + if (recurrencePeriod != null) 'recurrence_period': recurrencePeriod, + if (recurrenceInterval != null) 'recurrence_interval': recurrenceInterval, + if (recurrenceEndsAt != null) 'recurrence_ends_at': recurrenceEndsAt, + if (recurrenceNextScheduledAt != null) + 'recurrence_next_scheduled_at': recurrenceNextScheduledAt, + if (rowid != null) 'rowid': rowid, + }); + } + + TransactionsCompanion copyWith( + {Value? id, + Value? userId, + Value? clientId, + Value? rev, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? lastSyncedAt, + Value? amount, + Value? type, + Value? intent, + Value? description, + Value? datetime, + Value? partyId, + Value? walletId, + Value? groupId, + Value? walletClientId, + Value? partyClientId, + Value? groupClientId, + Value? transferId, + Value? transferClientId, + Value? isRefund, + Value? refundOfTransactionId, + Value? recurrencePeriod, + Value? recurrenceInterval, + Value? recurrenceEndsAt, + Value? recurrenceNextScheduledAt, + Value? rowid}) { + return TransactionsCompanion( + id: id ?? this.id, + userId: userId ?? this.userId, + clientId: clientId ?? this.clientId, + rev: rev ?? this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + amount: amount ?? this.amount, + type: type ?? this.type, + intent: intent ?? this.intent, + description: description ?? this.description, + datetime: datetime ?? this.datetime, + partyId: partyId ?? this.partyId, + walletId: walletId ?? this.walletId, + groupId: groupId ?? this.groupId, + walletClientId: walletClientId ?? this.walletClientId, + partyClientId: partyClientId ?? this.partyClientId, + groupClientId: groupClientId ?? this.groupClientId, + transferId: transferId ?? this.transferId, + transferClientId: transferClientId ?? this.transferClientId, + isRefund: isRefund ?? this.isRefund, + refundOfTransactionId: + refundOfTransactionId ?? this.refundOfTransactionId, + recurrencePeriod: recurrencePeriod ?? this.recurrencePeriod, + recurrenceInterval: recurrenceInterval ?? this.recurrenceInterval, + recurrenceEndsAt: recurrenceEndsAt ?? this.recurrenceEndsAt, + recurrenceNextScheduledAt: + recurrenceNextScheduledAt ?? this.recurrenceNextScheduledAt, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (userId.present) { + map['user_id'] = Variable(userId.value); + } + if (clientId.present) { + map['client_id'] = Variable(clientId.value); + } + if (rev.present) { + map['rev'] = Variable(rev.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (amount.present) { + map['amount'] = Variable(amount.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (intent.present) { + map['intent'] = Variable(intent.value); + } + if (description.present) { + map['description'] = Variable(description.value); + } + if (datetime.present) { + map['datetime'] = Variable(datetime.value); + } + if (partyId.present) { + map['party_id'] = Variable(partyId.value); + } + if (walletId.present) { + map['wallet_id'] = Variable(walletId.value); + } + if (groupId.present) { + map['group_id'] = Variable(groupId.value); + } + if (walletClientId.present) { + map['wallet_client_id'] = Variable(walletClientId.value); + } + if (partyClientId.present) { + map['party_client_id'] = Variable(partyClientId.value); + } + if (groupClientId.present) { + map['group_client_id'] = Variable(groupClientId.value); + } + if (transferId.present) { + map['transfer_id'] = Variable(transferId.value); + } + if (transferClientId.present) { + map['transfer_client_id'] = Variable(transferClientId.value); + } + if (isRefund.present) { + map['is_refund'] = Variable(isRefund.value); + } + if (refundOfTransactionId.present) { + map['refund_of_transaction_id'] = + Variable(refundOfTransactionId.value); + } + if (recurrencePeriod.present) { + map['recurrence_period'] = Variable(recurrencePeriod.value); + } + if (recurrenceInterval.present) { + map['recurrence_interval'] = Variable(recurrenceInterval.value); + } + if (recurrenceEndsAt.present) { + map['recurrence_ends_at'] = Variable(recurrenceEndsAt.value); + } + if (recurrenceNextScheduledAt.present) { + map['recurrence_next_scheduled_at'] = + Variable(recurrenceNextScheduledAt.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('TransactionsCompanion(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('amount: $amount, ') + ..write('type: $type, ') + ..write('intent: $intent, ') + ..write('description: $description, ') + ..write('datetime: $datetime, ') + ..write('partyId: $partyId, ') + ..write('walletId: $walletId, ') + ..write('groupId: $groupId, ') + ..write('walletClientId: $walletClientId, ') + ..write('partyClientId: $partyClientId, ') + ..write('groupClientId: $groupClientId, ') + ..write('transferId: $transferId, ') + ..write('transferClientId: $transferClientId, ') + ..write('isRefund: $isRefund, ') + ..write('refundOfTransactionId: $refundOfTransactionId, ') + ..write('recurrencePeriod: $recurrencePeriod, ') + ..write('recurrenceInterval: $recurrenceInterval, ') + ..write('recurrenceEndsAt: $recurrenceEndsAt, ') + ..write('recurrenceNextScheduledAt: $recurrenceNextScheduledAt, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class Categories extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Categories(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways('UNIQUE')); + late final GeneratedColumn userId = GeneratedColumn( + 'user_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn clientId = GeneratedColumn( + 'client_id', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'\'')); + late final GeneratedColumn rev = GeneratedColumn( + 'rev', aliasedName, true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'1\'')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn name = GeneratedColumn( + 'name', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways('UNIQUE')); + late final GeneratedColumn slug = GeneratedColumn( + 'slug', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'description', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn icon = GeneratedColumn( + 'icon', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + @override + List get $columns => [ + id, + userId, + clientId, + rev, + createdAt, + updatedAt, + deletedAt, + lastSyncedAt, + name, + slug, + description, + type, + icon + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'categories'; + @override + Set get $primaryKey => {clientId}; + @override + CategoriesData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return CategoriesData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id']), + userId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}user_id']), + clientId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}client_id'])!, + rev: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}rev']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + updatedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, + deletedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}deleted_at']), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_synced_at']), + name: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}name'])!, + slug: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}slug'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}description']), + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type'])!, + icon: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}icon']), + ); + } + + @override + Categories createAlias(String alias) { + return Categories(attachedDatabase, alias); + } +} + +class CategoriesData extends DataClass implements Insertable { + final int? id; + final int? userId; + final String clientId; + final String? rev; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final DateTime? lastSyncedAt; + final String name; + final String slug; + final String? description; + final String type; + final String? icon; + const CategoriesData( + {this.id, + this.userId, + required this.clientId, + this.rev, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + this.lastSyncedAt, + required this.name, + required this.slug, + this.description, + required this.type, + this.icon}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (!nullToAbsent || id != null) { + map['id'] = Variable(id); + } + if (!nullToAbsent || userId != null) { + map['user_id'] = Variable(userId); + } + map['client_id'] = Variable(clientId); + if (!nullToAbsent || rev != null) { + map['rev'] = Variable(rev); + } + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + map['name'] = Variable(name); + map['slug'] = Variable(slug); + if (!nullToAbsent || description != null) { + map['description'] = Variable(description); + } + map['type'] = Variable(type); + if (!nullToAbsent || icon != null) { + map['icon'] = Variable(icon); + } + return map; + } + + CategoriesCompanion toCompanion(bool nullToAbsent) { + return CategoriesCompanion( + id: id == null && nullToAbsent ? const Value.absent() : Value(id), + userId: + userId == null && nullToAbsent ? const Value.absent() : Value(userId), + clientId: Value(clientId), + rev: rev == null && nullToAbsent ? const Value.absent() : Value(rev), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + name: Value(name), + slug: Value(slug), + description: description == null && nullToAbsent + ? const Value.absent() + : Value(description), + type: Value(type), + icon: icon == null && nullToAbsent ? const Value.absent() : Value(icon), + ); + } + + factory CategoriesData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return CategoriesData( + id: serializer.fromJson(json['id']), + userId: serializer.fromJson(json['userId']), + clientId: serializer.fromJson(json['clientId']), + rev: serializer.fromJson(json['rev']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + name: serializer.fromJson(json['name']), + slug: serializer.fromJson(json['slug']), + description: serializer.fromJson(json['description']), + type: serializer.fromJson(json['type']), + icon: serializer.fromJson(json['icon']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'userId': serializer.toJson(userId), + 'clientId': serializer.toJson(clientId), + 'rev': serializer.toJson(rev), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'name': serializer.toJson(name), + 'slug': serializer.toJson(slug), + 'description': serializer.toJson(description), + 'type': serializer.toJson(type), + 'icon': serializer.toJson(icon), + }; + } + + CategoriesData copyWith( + {Value id = const Value.absent(), + Value userId = const Value.absent(), + String? clientId, + Value rev = const Value.absent(), + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + String? name, + String? slug, + Value description = const Value.absent(), + String? type, + Value icon = const Value.absent()}) => + CategoriesData( + id: id.present ? id.value : this.id, + userId: userId.present ? userId.value : this.userId, + clientId: clientId ?? this.clientId, + rev: rev.present ? rev.value : this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + lastSyncedAt: + lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + name: name ?? this.name, + slug: slug ?? this.slug, + description: description.present ? description.value : this.description, + type: type ?? this.type, + icon: icon.present ? icon.value : this.icon, + ); + CategoriesData copyWithCompanion(CategoriesCompanion data) { + return CategoriesData( + id: data.id.present ? data.id.value : this.id, + userId: data.userId.present ? data.userId.value : this.userId, + clientId: data.clientId.present ? data.clientId.value : this.clientId, + rev: data.rev.present ? data.rev.value : this.rev, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + name: data.name.present ? data.name.value : this.name, + slug: data.slug.present ? data.slug.value : this.slug, + description: + data.description.present ? data.description.value : this.description, + type: data.type.present ? data.type.value : this.type, + icon: data.icon.present ? data.icon.value : this.icon, + ); + } + + @override + String toString() { + return (StringBuffer('CategoriesData(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('name: $name, ') + ..write('slug: $slug, ') + ..write('description: $description, ') + ..write('type: $type, ') + ..write('icon: $icon') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, userId, clientId, rev, createdAt, + updatedAt, deletedAt, lastSyncedAt, name, slug, description, type, icon); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is CategoriesData && + other.id == this.id && + other.userId == this.userId && + other.clientId == this.clientId && + other.rev == this.rev && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.lastSyncedAt == this.lastSyncedAt && + other.name == this.name && + other.slug == this.slug && + other.description == this.description && + other.type == this.type && + other.icon == this.icon); +} + +class CategoriesCompanion extends UpdateCompanion { + final Value id; + final Value userId; + final Value clientId; + final Value rev; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value lastSyncedAt; + final Value name; + final Value slug; + final Value description; + final Value type; + final Value icon; + final Value rowid; + const CategoriesCompanion({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.name = const Value.absent(), + this.slug = const Value.absent(), + this.description = const Value.absent(), + this.type = const Value.absent(), + this.icon = const Value.absent(), + this.rowid = const Value.absent(), + }); + CategoriesCompanion.insert({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + required String name, + required String slug, + this.description = const Value.absent(), + required String type, + this.icon = const Value.absent(), + this.rowid = const Value.absent(), + }) : name = Value(name), + slug = Value(slug), + type = Value(type); + static Insertable custom({ + Expression? id, + Expression? userId, + Expression? clientId, + Expression? rev, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? lastSyncedAt, + Expression? name, + Expression? slug, + Expression? description, + Expression? type, + Expression? icon, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (userId != null) 'user_id': userId, + if (clientId != null) 'client_id': clientId, + if (rev != null) 'rev': rev, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (name != null) 'name': name, + if (slug != null) 'slug': slug, + if (description != null) 'description': description, + if (type != null) 'type': type, + if (icon != null) 'icon': icon, + if (rowid != null) 'rowid': rowid, + }); + } + + CategoriesCompanion copyWith( + {Value? id, + Value? userId, + Value? clientId, + Value? rev, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? lastSyncedAt, + Value? name, + Value? slug, + Value? description, + Value? type, + Value? icon, + Value? rowid}) { + return CategoriesCompanion( + id: id ?? this.id, + userId: userId ?? this.userId, + clientId: clientId ?? this.clientId, + rev: rev ?? this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + name: name ?? this.name, + slug: slug ?? this.slug, + description: description ?? this.description, + type: type ?? this.type, + icon: icon ?? this.icon, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (userId.present) { + map['user_id'] = Variable(userId.value); + } + if (clientId.present) { + map['client_id'] = Variable(clientId.value); + } + if (rev.present) { + map['rev'] = Variable(rev.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (name.present) { + map['name'] = Variable(name.value); + } + if (slug.present) { + map['slug'] = Variable(slug.value); + } + if (description.present) { + map['description'] = Variable(description.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (icon.present) { + map['icon'] = Variable(icon.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('CategoriesCompanion(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('name: $name, ') + ..write('slug: $slug, ') + ..write('description: $description, ') + ..write('type: $type, ') + ..write('icon: $icon, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class Configs extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Configs(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways('UNIQUE')); + late final GeneratedColumn userId = GeneratedColumn( + 'user_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn clientId = GeneratedColumn( + 'client_id', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'\'')); + late final GeneratedColumn rev = GeneratedColumn( + 'rev', aliasedName, true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'1\'')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn key = GeneratedColumn( + 'key', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways('UNIQUE')); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn value = GeneratedColumn( + 'value', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => [ + id, + userId, + clientId, + rev, + createdAt, + updatedAt, + deletedAt, + lastSyncedAt, + key, + type, + value + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'configs'; + @override + Set get $primaryKey => {clientId}; + @override + ConfigsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ConfigsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id']), + userId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}user_id']), + clientId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}client_id'])!, + rev: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}rev']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + updatedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, + deletedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}deleted_at']), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_synced_at']), + key: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}key'])!, + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type'])!, + value: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}value'])!, + ); + } + + @override + Configs createAlias(String alias) { + return Configs(attachedDatabase, alias); + } +} + +class ConfigsData extends DataClass implements Insertable { + final int? id; + final int? userId; + final String clientId; + final String? rev; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final DateTime? lastSyncedAt; + final String key; + final String type; + final String value; + const ConfigsData( + {this.id, + this.userId, + required this.clientId, + this.rev, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + this.lastSyncedAt, + required this.key, + required this.type, + required this.value}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (!nullToAbsent || id != null) { + map['id'] = Variable(id); + } + if (!nullToAbsent || userId != null) { + map['user_id'] = Variable(userId); + } + map['client_id'] = Variable(clientId); + if (!nullToAbsent || rev != null) { + map['rev'] = Variable(rev); + } + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + map['key'] = Variable(key); + map['type'] = Variable(type); + map['value'] = Variable(value); + return map; + } + + ConfigsCompanion toCompanion(bool nullToAbsent) { + return ConfigsCompanion( + id: id == null && nullToAbsent ? const Value.absent() : Value(id), + userId: + userId == null && nullToAbsent ? const Value.absent() : Value(userId), + clientId: Value(clientId), + rev: rev == null && nullToAbsent ? const Value.absent() : Value(rev), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + key: Value(key), + type: Value(type), + value: Value(value), + ); + } + + factory ConfigsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ConfigsData( + id: serializer.fromJson(json['id']), + userId: serializer.fromJson(json['userId']), + clientId: serializer.fromJson(json['clientId']), + rev: serializer.fromJson(json['rev']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + key: serializer.fromJson(json['key']), + type: serializer.fromJson(json['type']), + value: serializer.fromJson(json['value']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'userId': serializer.toJson(userId), + 'clientId': serializer.toJson(clientId), + 'rev': serializer.toJson(rev), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'key': serializer.toJson(key), + 'type': serializer.toJson(type), + 'value': serializer.toJson(value), + }; + } + + ConfigsData copyWith( + {Value id = const Value.absent(), + Value userId = const Value.absent(), + String? clientId, + Value rev = const Value.absent(), + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + String? key, + String? type, + String? value}) => + ConfigsData( + id: id.present ? id.value : this.id, + userId: userId.present ? userId.value : this.userId, + clientId: clientId ?? this.clientId, + rev: rev.present ? rev.value : this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + lastSyncedAt: + lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + key: key ?? this.key, + type: type ?? this.type, + value: value ?? this.value, + ); + ConfigsData copyWithCompanion(ConfigsCompanion data) { + return ConfigsData( + id: data.id.present ? data.id.value : this.id, + userId: data.userId.present ? data.userId.value : this.userId, + clientId: data.clientId.present ? data.clientId.value : this.clientId, + rev: data.rev.present ? data.rev.value : this.rev, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + key: data.key.present ? data.key.value : this.key, + type: data.type.present ? data.type.value : this.type, + value: data.value.present ? data.value.value : this.value, + ); + } + + @override + String toString() { + return (StringBuffer('ConfigsData(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('key: $key, ') + ..write('type: $type, ') + ..write('value: $value') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, userId, clientId, rev, createdAt, + updatedAt, deletedAt, lastSyncedAt, key, type, value); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ConfigsData && + other.id == this.id && + other.userId == this.userId && + other.clientId == this.clientId && + other.rev == this.rev && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.lastSyncedAt == this.lastSyncedAt && + other.key == this.key && + other.type == this.type && + other.value == this.value); +} + +class ConfigsCompanion extends UpdateCompanion { + final Value id; + final Value userId; + final Value clientId; + final Value rev; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value lastSyncedAt; + final Value key; + final Value type; + final Value value; + final Value rowid; + const ConfigsCompanion({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.key = const Value.absent(), + this.type = const Value.absent(), + this.value = const Value.absent(), + this.rowid = const Value.absent(), + }); + ConfigsCompanion.insert({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + required String key, + required String type, + required String value, + this.rowid = const Value.absent(), + }) : key = Value(key), + type = Value(type), + value = Value(value); + static Insertable custom({ + Expression? id, + Expression? userId, + Expression? clientId, + Expression? rev, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? lastSyncedAt, + Expression? key, + Expression? type, + Expression? value, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (userId != null) 'user_id': userId, + if (clientId != null) 'client_id': clientId, + if (rev != null) 'rev': rev, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (key != null) 'key': key, + if (type != null) 'type': type, + if (value != null) 'value': value, + if (rowid != null) 'rowid': rowid, + }); + } + + ConfigsCompanion copyWith( + {Value? id, + Value? userId, + Value? clientId, + Value? rev, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? lastSyncedAt, + Value? key, + Value? type, + Value? value, + Value? rowid}) { + return ConfigsCompanion( + id: id ?? this.id, + userId: userId ?? this.userId, + clientId: clientId ?? this.clientId, + rev: rev ?? this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + key: key ?? this.key, + type: type ?? this.type, + value: value ?? this.value, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (userId.present) { + map['user_id'] = Variable(userId.value); + } + if (clientId.present) { + map['client_id'] = Variable(clientId.value); + } + if (rev.present) { + map['rev'] = Variable(rev.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (key.present) { + map['key'] = Variable(key.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (value.present) { + map['value'] = Variable(value.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ConfigsCompanion(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('key: $key, ') + ..write('type: $type, ') + ..write('value: $value, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class Users extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Users(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn email = GeneratedColumn( + 'email', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways('UNIQUE')); + late final GeneratedColumn firstName = GeneratedColumn( + 'first_name', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn lastName = GeneratedColumn( + 'last_name', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn username = GeneratedColumn( + 'username', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn phone = GeneratedColumn( + 'phone', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn avatar = GeneratedColumn( + 'avatar', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + @override + List get $columns => [ + id, + email, + firstName, + lastName, + username, + phone, + avatar, + createdAt, + updatedAt + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'users'; + @override + Set get $primaryKey => {id}; + @override + UsersData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return UsersData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + email: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}email'])!, + firstName: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}first_name'])!, + lastName: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}last_name']), + username: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}username']), + phone: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}phone']), + avatar: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}avatar']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at']), + updatedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at']), + ); + } + + @override + Users createAlias(String alias) { + return Users(attachedDatabase, alias); + } +} + +class UsersData extends DataClass implements Insertable { + final int id; + final String email; + final String firstName; + final String? lastName; + final String? username; + final String? phone; + final String? avatar; + final DateTime? createdAt; + final DateTime? updatedAt; + const UsersData( + {required this.id, + required this.email, + required this.firstName, + this.lastName, + this.username, + this.phone, + this.avatar, + this.createdAt, + this.updatedAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['email'] = Variable(email); + map['first_name'] = Variable(firstName); + if (!nullToAbsent || lastName != null) { + map['last_name'] = Variable(lastName); + } + if (!nullToAbsent || username != null) { + map['username'] = Variable(username); + } + if (!nullToAbsent || phone != null) { + map['phone'] = Variable(phone); + } + if (!nullToAbsent || avatar != null) { + map['avatar'] = Variable(avatar); + } + if (!nullToAbsent || createdAt != null) { + map['created_at'] = Variable(createdAt); + } + if (!nullToAbsent || updatedAt != null) { + map['updated_at'] = Variable(updatedAt); + } + return map; + } + + UsersCompanion toCompanion(bool nullToAbsent) { + return UsersCompanion( + id: Value(id), + email: Value(email), + firstName: Value(firstName), + lastName: lastName == null && nullToAbsent + ? const Value.absent() + : Value(lastName), + username: username == null && nullToAbsent + ? const Value.absent() + : Value(username), + phone: + phone == null && nullToAbsent ? const Value.absent() : Value(phone), + avatar: + avatar == null && nullToAbsent ? const Value.absent() : Value(avatar), + createdAt: createdAt == null && nullToAbsent + ? const Value.absent() + : Value(createdAt), + updatedAt: updatedAt == null && nullToAbsent + ? const Value.absent() + : Value(updatedAt), + ); + } + + factory UsersData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return UsersData( + id: serializer.fromJson(json['id']), + email: serializer.fromJson(json['email']), + firstName: serializer.fromJson(json['firstName']), + lastName: serializer.fromJson(json['lastName']), + username: serializer.fromJson(json['username']), + phone: serializer.fromJson(json['phone']), + avatar: serializer.fromJson(json['avatar']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'email': serializer.toJson(email), + 'firstName': serializer.toJson(firstName), + 'lastName': serializer.toJson(lastName), + 'username': serializer.toJson(username), + 'phone': serializer.toJson(phone), + 'avatar': serializer.toJson(avatar), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + }; + } + + UsersData copyWith( + {int? id, + String? email, + String? firstName, + Value lastName = const Value.absent(), + Value username = const Value.absent(), + Value phone = const Value.absent(), + Value avatar = const Value.absent(), + Value createdAt = const Value.absent(), + Value updatedAt = const Value.absent()}) => + UsersData( + id: id ?? this.id, + email: email ?? this.email, + firstName: firstName ?? this.firstName, + lastName: lastName.present ? lastName.value : this.lastName, + username: username.present ? username.value : this.username, + phone: phone.present ? phone.value : this.phone, + avatar: avatar.present ? avatar.value : this.avatar, + createdAt: createdAt.present ? createdAt.value : this.createdAt, + updatedAt: updatedAt.present ? updatedAt.value : this.updatedAt, + ); + UsersData copyWithCompanion(UsersCompanion data) { + return UsersData( + id: data.id.present ? data.id.value : this.id, + email: data.email.present ? data.email.value : this.email, + firstName: data.firstName.present ? data.firstName.value : this.firstName, + lastName: data.lastName.present ? data.lastName.value : this.lastName, + username: data.username.present ? data.username.value : this.username, + phone: data.phone.present ? data.phone.value : this.phone, + avatar: data.avatar.present ? data.avatar.value : this.avatar, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + ); + } + + @override + String toString() { + return (StringBuffer('UsersData(') + ..write('id: $id, ') + ..write('email: $email, ') + ..write('firstName: $firstName, ') + ..write('lastName: $lastName, ') + ..write('username: $username, ') + ..write('phone: $phone, ') + ..write('avatar: $avatar, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, email, firstName, lastName, username, + phone, avatar, createdAt, updatedAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is UsersData && + other.id == this.id && + other.email == this.email && + other.firstName == this.firstName && + other.lastName == this.lastName && + other.username == this.username && + other.phone == this.phone && + other.avatar == this.avatar && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt); +} + +class UsersCompanion extends UpdateCompanion { + final Value id; + final Value email; + final Value firstName; + final Value lastName; + final Value username; + final Value phone; + final Value avatar; + final Value createdAt; + final Value updatedAt; + const UsersCompanion({ + this.id = const Value.absent(), + this.email = const Value.absent(), + this.firstName = const Value.absent(), + this.lastName = const Value.absent(), + this.username = const Value.absent(), + this.phone = const Value.absent(), + this.avatar = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + }); + UsersCompanion.insert({ + this.id = const Value.absent(), + required String email, + required String firstName, + this.lastName = const Value.absent(), + this.username = const Value.absent(), + this.phone = const Value.absent(), + this.avatar = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + }) : email = Value(email), + firstName = Value(firstName); + static Insertable custom({ + Expression? id, + Expression? email, + Expression? firstName, + Expression? lastName, + Expression? username, + Expression? phone, + Expression? avatar, + Expression? createdAt, + Expression? updatedAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (email != null) 'email': email, + if (firstName != null) 'first_name': firstName, + if (lastName != null) 'last_name': lastName, + if (username != null) 'username': username, + if (phone != null) 'phone': phone, + if (avatar != null) 'avatar': avatar, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + }); + } + + UsersCompanion copyWith( + {Value? id, + Value? email, + Value? firstName, + Value? lastName, + Value? username, + Value? phone, + Value? avatar, + Value? createdAt, + Value? updatedAt}) { + return UsersCompanion( + id: id ?? this.id, + email: email ?? this.email, + firstName: firstName ?? this.firstName, + lastName: lastName ?? this.lastName, + username: username ?? this.username, + phone: phone ?? this.phone, + avatar: avatar ?? this.avatar, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (email.present) { + map['email'] = Variable(email.value); + } + if (firstName.present) { + map['first_name'] = Variable(firstName.value); + } + if (lastName.present) { + map['last_name'] = Variable(lastName.value); + } + if (username.present) { + map['username'] = Variable(username.value); + } + if (phone.present) { + map['phone'] = Variable(phone.value); + } + if (avatar.present) { + map['avatar'] = Variable(avatar.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('UsersCompanion(') + ..write('id: $id, ') + ..write('email: $email, ') + ..write('firstName: $firstName, ') + ..write('lastName: $lastName, ') + ..write('username: $username, ') + ..write('phone: $phone, ') + ..write('avatar: $avatar, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt') + ..write(')')) + .toString(); + } +} + +class LocalChanges extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + LocalChanges(this.attachedDatabase, [this._alias]); + late final GeneratedColumn entityType = GeneratedColumn( + 'entity_type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn entityId = GeneratedColumn( + 'entity_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn entityRev = GeneratedColumn( + 'entity_rev', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn deleted = GeneratedColumn( + 'deleted', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("deleted" IN (0, 1))')); + late final GeneratedColumn data = GeneratedColumn( + 'data', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn createAt = GeneratedColumn( + 'create_at', aliasedName, false, + type: DriftSqlType.dateTime, requiredDuringInsert: true); + late final GeneratedColumn concluded = GeneratedColumn( + 'concluded', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("concluded" IN (0, 1))')); + late final GeneratedColumn concludedMoment = + GeneratedColumn('concluded_moment', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn error = GeneratedColumn( + 'error', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn dismissed = GeneratedColumn( + 'dismissed', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("dismissed" IN (0, 1))')); + late final GeneratedColumn attemptCount = GeneratedColumn( + 'attempt_count', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const CustomExpression('0')); + late final GeneratedColumn quarantinedAt = + GeneratedColumn('quarantined_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + @override + List get $columns => [ + entityType, + entityId, + entityRev, + deleted, + data, + createAt, + concluded, + concludedMoment, + error, + dismissed, + attemptCount, + quarantinedAt + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'local_changes'; + @override + Set get $primaryKey => {entityId, entityType}; + @override + LocalChangesData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return LocalChangesData( + entityType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}entity_type'])!, + entityId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}entity_id'])!, + entityRev: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}entity_rev'])!, + deleted: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}deleted'])!, + data: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}data'])!, + createAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}create_at'])!, + concluded: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}concluded'])!, + concludedMoment: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}concluded_moment']), + error: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}error']), + dismissed: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}dismissed'])!, + attemptCount: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}attempt_count'])!, + quarantinedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}quarantined_at']), + ); + } + + @override + LocalChanges createAlias(String alias) { + return LocalChanges(attachedDatabase, alias); + } +} + +class LocalChangesData extends DataClass + implements Insertable { + final String entityType; + final String entityId; + final String entityRev; + final bool deleted; + final String data; + final DateTime createAt; + final bool concluded; + final DateTime? concludedMoment; + final String? error; + final bool dismissed; + final int attemptCount; + final DateTime? quarantinedAt; + const LocalChangesData( + {required this.entityType, + required this.entityId, + required this.entityRev, + required this.deleted, + required this.data, + required this.createAt, + required this.concluded, + this.concludedMoment, + this.error, + required this.dismissed, + required this.attemptCount, + this.quarantinedAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['entity_type'] = Variable(entityType); + map['entity_id'] = Variable(entityId); + map['entity_rev'] = Variable(entityRev); + map['deleted'] = Variable(deleted); + map['data'] = Variable(data); + map['create_at'] = Variable(createAt); + map['concluded'] = Variable(concluded); + if (!nullToAbsent || concludedMoment != null) { + map['concluded_moment'] = Variable(concludedMoment); + } + if (!nullToAbsent || error != null) { + map['error'] = Variable(error); + } + map['dismissed'] = Variable(dismissed); + map['attempt_count'] = Variable(attemptCount); + if (!nullToAbsent || quarantinedAt != null) { + map['quarantined_at'] = Variable(quarantinedAt); + } + return map; + } + + LocalChangesCompanion toCompanion(bool nullToAbsent) { + return LocalChangesCompanion( + entityType: Value(entityType), + entityId: Value(entityId), + entityRev: Value(entityRev), + deleted: Value(deleted), + data: Value(data), + createAt: Value(createAt), + concluded: Value(concluded), + concludedMoment: concludedMoment == null && nullToAbsent + ? const Value.absent() + : Value(concludedMoment), + error: + error == null && nullToAbsent ? const Value.absent() : Value(error), + dismissed: Value(dismissed), + attemptCount: Value(attemptCount), + quarantinedAt: quarantinedAt == null && nullToAbsent + ? const Value.absent() + : Value(quarantinedAt), + ); + } + + factory LocalChangesData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return LocalChangesData( + entityType: serializer.fromJson(json['entityType']), + entityId: serializer.fromJson(json['entityId']), + entityRev: serializer.fromJson(json['entityRev']), + deleted: serializer.fromJson(json['deleted']), + data: serializer.fromJson(json['data']), + createAt: serializer.fromJson(json['createAt']), + concluded: serializer.fromJson(json['concluded']), + concludedMoment: serializer.fromJson(json['concludedMoment']), + error: serializer.fromJson(json['error']), + dismissed: serializer.fromJson(json['dismissed']), + attemptCount: serializer.fromJson(json['attemptCount']), + quarantinedAt: serializer.fromJson(json['quarantinedAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'entityType': serializer.toJson(entityType), + 'entityId': serializer.toJson(entityId), + 'entityRev': serializer.toJson(entityRev), + 'deleted': serializer.toJson(deleted), + 'data': serializer.toJson(data), + 'createAt': serializer.toJson(createAt), + 'concluded': serializer.toJson(concluded), + 'concludedMoment': serializer.toJson(concludedMoment), + 'error': serializer.toJson(error), + 'dismissed': serializer.toJson(dismissed), + 'attemptCount': serializer.toJson(attemptCount), + 'quarantinedAt': serializer.toJson(quarantinedAt), + }; + } + + LocalChangesData copyWith( + {String? entityType, + String? entityId, + String? entityRev, + bool? deleted, + String? data, + DateTime? createAt, + bool? concluded, + Value concludedMoment = const Value.absent(), + Value error = const Value.absent(), + bool? dismissed, + int? attemptCount, + Value quarantinedAt = const Value.absent()}) => + LocalChangesData( + entityType: entityType ?? this.entityType, + entityId: entityId ?? this.entityId, + entityRev: entityRev ?? this.entityRev, + deleted: deleted ?? this.deleted, + data: data ?? this.data, + createAt: createAt ?? this.createAt, + concluded: concluded ?? this.concluded, + concludedMoment: concludedMoment.present + ? concludedMoment.value + : this.concludedMoment, + error: error.present ? error.value : this.error, + dismissed: dismissed ?? this.dismissed, + attemptCount: attemptCount ?? this.attemptCount, + quarantinedAt: + quarantinedAt.present ? quarantinedAt.value : this.quarantinedAt, + ); + LocalChangesData copyWithCompanion(LocalChangesCompanion data) { + return LocalChangesData( + entityType: + data.entityType.present ? data.entityType.value : this.entityType, + entityId: data.entityId.present ? data.entityId.value : this.entityId, + entityRev: data.entityRev.present ? data.entityRev.value : this.entityRev, + deleted: data.deleted.present ? data.deleted.value : this.deleted, + data: data.data.present ? data.data.value : this.data, + createAt: data.createAt.present ? data.createAt.value : this.createAt, + concluded: data.concluded.present ? data.concluded.value : this.concluded, + concludedMoment: data.concludedMoment.present + ? data.concludedMoment.value + : this.concludedMoment, + error: data.error.present ? data.error.value : this.error, + dismissed: data.dismissed.present ? data.dismissed.value : this.dismissed, + attemptCount: data.attemptCount.present + ? data.attemptCount.value + : this.attemptCount, + quarantinedAt: data.quarantinedAt.present + ? data.quarantinedAt.value + : this.quarantinedAt, + ); + } + + @override + String toString() { + return (StringBuffer('LocalChangesData(') + ..write('entityType: $entityType, ') + ..write('entityId: $entityId, ') + ..write('entityRev: $entityRev, ') + ..write('deleted: $deleted, ') + ..write('data: $data, ') + ..write('createAt: $createAt, ') + ..write('concluded: $concluded, ') + ..write('concludedMoment: $concludedMoment, ') + ..write('error: $error, ') + ..write('dismissed: $dismissed, ') + ..write('attemptCount: $attemptCount, ') + ..write('quarantinedAt: $quarantinedAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + entityType, + entityId, + entityRev, + deleted, + data, + createAt, + concluded, + concludedMoment, + error, + dismissed, + attemptCount, + quarantinedAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is LocalChangesData && + other.entityType == this.entityType && + other.entityId == this.entityId && + other.entityRev == this.entityRev && + other.deleted == this.deleted && + other.data == this.data && + other.createAt == this.createAt && + other.concluded == this.concluded && + other.concludedMoment == this.concludedMoment && + other.error == this.error && + other.dismissed == this.dismissed && + other.attemptCount == this.attemptCount && + other.quarantinedAt == this.quarantinedAt); +} + +class LocalChangesCompanion extends UpdateCompanion { + final Value entityType; + final Value entityId; + final Value entityRev; + final Value deleted; + final Value data; + final Value createAt; + final Value concluded; + final Value concludedMoment; + final Value error; + final Value dismissed; + final Value attemptCount; + final Value quarantinedAt; + final Value rowid; + const LocalChangesCompanion({ + this.entityType = const Value.absent(), + this.entityId = const Value.absent(), + this.entityRev = const Value.absent(), + this.deleted = const Value.absent(), + this.data = const Value.absent(), + this.createAt = const Value.absent(), + this.concluded = const Value.absent(), + this.concludedMoment = const Value.absent(), + this.error = const Value.absent(), + this.dismissed = const Value.absent(), + this.attemptCount = const Value.absent(), + this.quarantinedAt = const Value.absent(), + this.rowid = const Value.absent(), + }); + LocalChangesCompanion.insert({ + required String entityType, + required String entityId, + required String entityRev, + required bool deleted, + required String data, + required DateTime createAt, + required bool concluded, + this.concludedMoment = const Value.absent(), + this.error = const Value.absent(), + required bool dismissed, + this.attemptCount = const Value.absent(), + this.quarantinedAt = const Value.absent(), + this.rowid = const Value.absent(), + }) : entityType = Value(entityType), + entityId = Value(entityId), + entityRev = Value(entityRev), + deleted = Value(deleted), + data = Value(data), + createAt = Value(createAt), + concluded = Value(concluded), + dismissed = Value(dismissed); + static Insertable custom({ + Expression? entityType, + Expression? entityId, + Expression? entityRev, + Expression? deleted, + Expression? data, + Expression? createAt, + Expression? concluded, + Expression? concludedMoment, + Expression? error, + Expression? dismissed, + Expression? attemptCount, + Expression? quarantinedAt, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (entityType != null) 'entity_type': entityType, + if (entityId != null) 'entity_id': entityId, + if (entityRev != null) 'entity_rev': entityRev, + if (deleted != null) 'deleted': deleted, + if (data != null) 'data': data, + if (createAt != null) 'create_at': createAt, + if (concluded != null) 'concluded': concluded, + if (concludedMoment != null) 'concluded_moment': concludedMoment, + if (error != null) 'error': error, + if (dismissed != null) 'dismissed': dismissed, + if (attemptCount != null) 'attempt_count': attemptCount, + if (quarantinedAt != null) 'quarantined_at': quarantinedAt, + if (rowid != null) 'rowid': rowid, + }); + } + + LocalChangesCompanion copyWith( + {Value? entityType, + Value? entityId, + Value? entityRev, + Value? deleted, + Value? data, + Value? createAt, + Value? concluded, + Value? concludedMoment, + Value? error, + Value? dismissed, + Value? attemptCount, + Value? quarantinedAt, + Value? rowid}) { + return LocalChangesCompanion( + entityType: entityType ?? this.entityType, + entityId: entityId ?? this.entityId, + entityRev: entityRev ?? this.entityRev, + deleted: deleted ?? this.deleted, + data: data ?? this.data, + createAt: createAt ?? this.createAt, + concluded: concluded ?? this.concluded, + concludedMoment: concludedMoment ?? this.concludedMoment, + error: error ?? this.error, + dismissed: dismissed ?? this.dismissed, + attemptCount: attemptCount ?? this.attemptCount, + quarantinedAt: quarantinedAt ?? this.quarantinedAt, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (entityType.present) { + map['entity_type'] = Variable(entityType.value); + } + if (entityId.present) { + map['entity_id'] = Variable(entityId.value); + } + if (entityRev.present) { + map['entity_rev'] = Variable(entityRev.value); + } + if (deleted.present) { + map['deleted'] = Variable(deleted.value); + } + if (data.present) { + map['data'] = Variable(data.value); + } + if (createAt.present) { + map['create_at'] = Variable(createAt.value); + } + if (concluded.present) { + map['concluded'] = Variable(concluded.value); + } + if (concludedMoment.present) { + map['concluded_moment'] = Variable(concludedMoment.value); + } + if (error.present) { + map['error'] = Variable(error.value); + } + if (dismissed.present) { + map['dismissed'] = Variable(dismissed.value); + } + if (attemptCount.present) { + map['attempt_count'] = Variable(attemptCount.value); + } + if (quarantinedAt.present) { + map['quarantined_at'] = Variable(quarantinedAt.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('LocalChangesCompanion(') + ..write('entityType: $entityType, ') + ..write('entityId: $entityId, ') + ..write('entityRev: $entityRev, ') + ..write('deleted: $deleted, ') + ..write('data: $data, ') + ..write('createAt: $createAt, ') + ..write('concluded: $concluded, ') + ..write('concludedMoment: $concludedMoment, ') + ..write('error: $error, ') + ..write('dismissed: $dismissed, ') + ..write('attemptCount: $attemptCount, ') + ..write('quarantinedAt: $quarantinedAt, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class SyncMetadata extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + SyncMetadata(this.attachedDatabase, [this._alias]); + late final GeneratedColumn entityType = GeneratedColumn( + 'entity_type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastAttemptedAt = + GeneratedColumn('last_attempted_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastError = GeneratedColumn( + 'last_error', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + @override + List get $columns => + [entityType, lastSyncedAt, lastAttemptedAt, lastError]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'sync_metadata'; + @override + Set get $primaryKey => {entityType}; + @override + SyncMetadataData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SyncMetadataData( + entityType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}entity_type'])!, + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_synced_at']), + lastAttemptedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_attempted_at']), + lastError: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}last_error']), + ); + } + + @override + SyncMetadata createAlias(String alias) { + return SyncMetadata(attachedDatabase, alias); + } +} + +class SyncMetadataData extends DataClass + implements Insertable { + final String entityType; + final DateTime? lastSyncedAt; + final DateTime? lastAttemptedAt; + final String? lastError; + const SyncMetadataData( + {required this.entityType, + this.lastSyncedAt, + this.lastAttemptedAt, + this.lastError}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['entity_type'] = Variable(entityType); + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + if (!nullToAbsent || lastAttemptedAt != null) { + map['last_attempted_at'] = Variable(lastAttemptedAt); + } + if (!nullToAbsent || lastError != null) { + map['last_error'] = Variable(lastError); + } + return map; + } + + SyncMetadataCompanion toCompanion(bool nullToAbsent) { + return SyncMetadataCompanion( + entityType: Value(entityType), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + lastAttemptedAt: lastAttemptedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastAttemptedAt), + lastError: lastError == null && nullToAbsent + ? const Value.absent() + : Value(lastError), + ); + } + + factory SyncMetadataData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SyncMetadataData( + entityType: serializer.fromJson(json['entityType']), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + lastAttemptedAt: serializer.fromJson(json['lastAttemptedAt']), + lastError: serializer.fromJson(json['lastError']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'entityType': serializer.toJson(entityType), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'lastAttemptedAt': serializer.toJson(lastAttemptedAt), + 'lastError': serializer.toJson(lastError), + }; + } + + SyncMetadataData copyWith( + {String? entityType, + Value lastSyncedAt = const Value.absent(), + Value lastAttemptedAt = const Value.absent(), + Value lastError = const Value.absent()}) => + SyncMetadataData( + entityType: entityType ?? this.entityType, + lastSyncedAt: + lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + lastAttemptedAt: lastAttemptedAt.present + ? lastAttemptedAt.value + : this.lastAttemptedAt, + lastError: lastError.present ? lastError.value : this.lastError, + ); + SyncMetadataData copyWithCompanion(SyncMetadataCompanion data) { + return SyncMetadataData( + entityType: + data.entityType.present ? data.entityType.value : this.entityType, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + lastAttemptedAt: data.lastAttemptedAt.present + ? data.lastAttemptedAt.value + : this.lastAttemptedAt, + lastError: data.lastError.present ? data.lastError.value : this.lastError, + ); + } + + @override + String toString() { + return (StringBuffer('SyncMetadataData(') + ..write('entityType: $entityType, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('lastAttemptedAt: $lastAttemptedAt, ') + ..write('lastError: $lastError') + ..write(')')) + .toString(); + } + + @override + int get hashCode => + Object.hash(entityType, lastSyncedAt, lastAttemptedAt, lastError); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SyncMetadataData && + other.entityType == this.entityType && + other.lastSyncedAt == this.lastSyncedAt && + other.lastAttemptedAt == this.lastAttemptedAt && + other.lastError == this.lastError); +} + +class SyncMetadataCompanion extends UpdateCompanion { + final Value entityType; + final Value lastSyncedAt; + final Value lastAttemptedAt; + final Value lastError; + final Value rowid; + const SyncMetadataCompanion({ + this.entityType = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.lastAttemptedAt = const Value.absent(), + this.lastError = const Value.absent(), + this.rowid = const Value.absent(), + }); + SyncMetadataCompanion.insert({ + required String entityType, + this.lastSyncedAt = const Value.absent(), + this.lastAttemptedAt = const Value.absent(), + this.lastError = const Value.absent(), + this.rowid = const Value.absent(), + }) : entityType = Value(entityType); + static Insertable custom({ + Expression? entityType, + Expression? lastSyncedAt, + Expression? lastAttemptedAt, + Expression? lastError, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (entityType != null) 'entity_type': entityType, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (lastAttemptedAt != null) 'last_attempted_at': lastAttemptedAt, + if (lastError != null) 'last_error': lastError, + if (rowid != null) 'rowid': rowid, + }); + } + + SyncMetadataCompanion copyWith( + {Value? entityType, + Value? lastSyncedAt, + Value? lastAttemptedAt, + Value? lastError, + Value? rowid}) { + return SyncMetadataCompanion( + entityType: entityType ?? this.entityType, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + lastAttemptedAt: lastAttemptedAt ?? this.lastAttemptedAt, + lastError: lastError ?? this.lastError, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (entityType.present) { + map['entity_type'] = Variable(entityType.value); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (lastAttemptedAt.present) { + map['last_attempted_at'] = Variable(lastAttemptedAt.value); + } + if (lastError.present) { + map['last_error'] = Variable(lastError.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SyncMetadataCompanion(') + ..write('entityType: $entityType, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('lastAttemptedAt: $lastAttemptedAt, ') + ..write('lastError: $lastError, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class Categorizables extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Categorizables(this.attachedDatabase, [this._alias]); + late final GeneratedColumn categorizableId = GeneratedColumn( + 'categorizable_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn categorizableType = + GeneratedColumn('categorizable_type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn categoryClientId = GeneratedColumn( + 'category_client_id', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES categories (client_id)')); + @override + List get $columns => + [categorizableId, categorizableType, categoryClientId]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'categorizables'; + @override + Set get $primaryKey => + {categorizableId, categorizableType, categoryClientId}; + @override + CategorizablesData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return CategorizablesData( + categorizableId: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}categorizable_id'])!, + categorizableType: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}categorizable_type'])!, + categoryClientId: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}category_client_id'])!, + ); + } + + @override + Categorizables createAlias(String alias) { + return Categorizables(attachedDatabase, alias); + } +} + +class CategorizablesData extends DataClass + implements Insertable { + final String categorizableId; + final String categorizableType; + final String categoryClientId; + const CategorizablesData( + {required this.categorizableId, + required this.categorizableType, + required this.categoryClientId}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['categorizable_id'] = Variable(categorizableId); + map['categorizable_type'] = Variable(categorizableType); + map['category_client_id'] = Variable(categoryClientId); + return map; + } + + CategorizablesCompanion toCompanion(bool nullToAbsent) { + return CategorizablesCompanion( + categorizableId: Value(categorizableId), + categorizableType: Value(categorizableType), + categoryClientId: Value(categoryClientId), + ); + } + + factory CategorizablesData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return CategorizablesData( + categorizableId: serializer.fromJson(json['categorizableId']), + categorizableType: serializer.fromJson(json['categorizableType']), + categoryClientId: serializer.fromJson(json['categoryClientId']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'categorizableId': serializer.toJson(categorizableId), + 'categorizableType': serializer.toJson(categorizableType), + 'categoryClientId': serializer.toJson(categoryClientId), + }; + } + + CategorizablesData copyWith( + {String? categorizableId, + String? categorizableType, + String? categoryClientId}) => + CategorizablesData( + categorizableId: categorizableId ?? this.categorizableId, + categorizableType: categorizableType ?? this.categorizableType, + categoryClientId: categoryClientId ?? this.categoryClientId, + ); + CategorizablesData copyWithCompanion(CategorizablesCompanion data) { + return CategorizablesData( + categorizableId: data.categorizableId.present + ? data.categorizableId.value + : this.categorizableId, + categorizableType: data.categorizableType.present + ? data.categorizableType.value + : this.categorizableType, + categoryClientId: data.categoryClientId.present + ? data.categoryClientId.value + : this.categoryClientId, + ); + } + + @override + String toString() { + return (StringBuffer('CategorizablesData(') + ..write('categorizableId: $categorizableId, ') + ..write('categorizableType: $categorizableType, ') + ..write('categoryClientId: $categoryClientId') + ..write(')')) + .toString(); + } + + @override + int get hashCode => + Object.hash(categorizableId, categorizableType, categoryClientId); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is CategorizablesData && + other.categorizableId == this.categorizableId && + other.categorizableType == this.categorizableType && + other.categoryClientId == this.categoryClientId); +} + +class CategorizablesCompanion extends UpdateCompanion { + final Value categorizableId; + final Value categorizableType; + final Value categoryClientId; + final Value rowid; + const CategorizablesCompanion({ + this.categorizableId = const Value.absent(), + this.categorizableType = const Value.absent(), + this.categoryClientId = const Value.absent(), + this.rowid = const Value.absent(), + }); + CategorizablesCompanion.insert({ + required String categorizableId, + required String categorizableType, + required String categoryClientId, + this.rowid = const Value.absent(), + }) : categorizableId = Value(categorizableId), + categorizableType = Value(categorizableType), + categoryClientId = Value(categoryClientId); + static Insertable custom({ + Expression? categorizableId, + Expression? categorizableType, + Expression? categoryClientId, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (categorizableId != null) 'categorizable_id': categorizableId, + if (categorizableType != null) 'categorizable_type': categorizableType, + if (categoryClientId != null) 'category_client_id': categoryClientId, + if (rowid != null) 'rowid': rowid, + }); + } + + CategorizablesCompanion copyWith( + {Value? categorizableId, + Value? categorizableType, + Value? categoryClientId, + Value? rowid}) { + return CategorizablesCompanion( + categorizableId: categorizableId ?? this.categorizableId, + categorizableType: categorizableType ?? this.categorizableType, + categoryClientId: categoryClientId ?? this.categoryClientId, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (categorizableId.present) { + map['categorizable_id'] = Variable(categorizableId.value); + } + if (categorizableType.present) { + map['categorizable_type'] = Variable(categorizableType.value); + } + if (categoryClientId.present) { + map['category_client_id'] = Variable(categoryClientId.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('CategorizablesCompanion(') + ..write('categorizableId: $categorizableId, ') + ..write('categorizableType: $categorizableType, ') + ..write('categoryClientId: $categoryClientId, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class Notifications extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Notifications(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways('UNIQUE')); + late final GeneratedColumn userId = GeneratedColumn( + 'user_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn clientId = GeneratedColumn( + 'client_id', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'\'')); + late final GeneratedColumn rev = GeneratedColumn( + 'rev', aliasedName, true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'1\'')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn body = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn data = GeneratedColumn( + 'data', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn readAt = GeneratedColumn( + 'read_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + @override + List get $columns => [ + id, + userId, + clientId, + rev, + createdAt, + updatedAt, + deletedAt, + lastSyncedAt, + type, + title, + body, + data, + readAt + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'notifications'; + @override + Set get $primaryKey => {clientId}; + @override + NotificationsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return NotificationsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id']), + userId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}user_id']), + clientId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}client_id'])!, + rev: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}rev']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + updatedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, + deletedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}deleted_at']), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_synced_at']), + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + body: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + data: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}data'])!, + readAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}read_at']), + ); + } + + @override + Notifications createAlias(String alias) { + return Notifications(attachedDatabase, alias); + } +} + +class NotificationsData extends DataClass + implements Insertable { + final int? id; + final int? userId; + final String clientId; + final String? rev; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final DateTime? lastSyncedAt; + final String type; + final String title; + final String body; + final String data; + final DateTime? readAt; + const NotificationsData( + {this.id, + this.userId, + required this.clientId, + this.rev, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + this.lastSyncedAt, + required this.type, + required this.title, + required this.body, + required this.data, + this.readAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (!nullToAbsent || id != null) { + map['id'] = Variable(id); + } + if (!nullToAbsent || userId != null) { + map['user_id'] = Variable(userId); + } + map['client_id'] = Variable(clientId); + if (!nullToAbsent || rev != null) { + map['rev'] = Variable(rev); + } + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + map['type'] = Variable(type); + map['title'] = Variable(title); + map['body'] = Variable(body); + map['data'] = Variable(data); + if (!nullToAbsent || readAt != null) { + map['read_at'] = Variable(readAt); + } + return map; + } + + NotificationsCompanion toCompanion(bool nullToAbsent) { + return NotificationsCompanion( + id: id == null && nullToAbsent ? const Value.absent() : Value(id), + userId: + userId == null && nullToAbsent ? const Value.absent() : Value(userId), + clientId: Value(clientId), + rev: rev == null && nullToAbsent ? const Value.absent() : Value(rev), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + type: Value(type), + title: Value(title), + body: Value(body), + data: Value(data), + readAt: + readAt == null && nullToAbsent ? const Value.absent() : Value(readAt), + ); + } + + factory NotificationsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return NotificationsData( + id: serializer.fromJson(json['id']), + userId: serializer.fromJson(json['userId']), + clientId: serializer.fromJson(json['clientId']), + rev: serializer.fromJson(json['rev']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + type: serializer.fromJson(json['type']), + title: serializer.fromJson(json['title']), + body: serializer.fromJson(json['body']), + data: serializer.fromJson(json['data']), + readAt: serializer.fromJson(json['readAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'userId': serializer.toJson(userId), + 'clientId': serializer.toJson(clientId), + 'rev': serializer.toJson(rev), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'type': serializer.toJson(type), + 'title': serializer.toJson(title), + 'body': serializer.toJson(body), + 'data': serializer.toJson(data), + 'readAt': serializer.toJson(readAt), + }; + } + + NotificationsData copyWith( + {Value id = const Value.absent(), + Value userId = const Value.absent(), + String? clientId, + Value rev = const Value.absent(), + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + String? type, + String? title, + String? body, + String? data, + Value readAt = const Value.absent()}) => + NotificationsData( + id: id.present ? id.value : this.id, + userId: userId.present ? userId.value : this.userId, + clientId: clientId ?? this.clientId, + rev: rev.present ? rev.value : this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + lastSyncedAt: + lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + type: type ?? this.type, + title: title ?? this.title, + body: body ?? this.body, + data: data ?? this.data, + readAt: readAt.present ? readAt.value : this.readAt, + ); + NotificationsData copyWithCompanion(NotificationsCompanion data) { + return NotificationsData( + id: data.id.present ? data.id.value : this.id, + userId: data.userId.present ? data.userId.value : this.userId, + clientId: data.clientId.present ? data.clientId.value : this.clientId, + rev: data.rev.present ? data.rev.value : this.rev, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + type: data.type.present ? data.type.value : this.type, + title: data.title.present ? data.title.value : this.title, + body: data.body.present ? data.body.value : this.body, + data: data.data.present ? data.data.value : this.data, + readAt: data.readAt.present ? data.readAt.value : this.readAt, + ); + } + + @override + String toString() { + return (StringBuffer('NotificationsData(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('type: $type, ') + ..write('title: $title, ') + ..write('body: $body, ') + ..write('data: $data, ') + ..write('readAt: $readAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, userId, clientId, rev, createdAt, + updatedAt, deletedAt, lastSyncedAt, type, title, body, data, readAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is NotificationsData && + other.id == this.id && + other.userId == this.userId && + other.clientId == this.clientId && + other.rev == this.rev && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.lastSyncedAt == this.lastSyncedAt && + other.type == this.type && + other.title == this.title && + other.body == this.body && + other.data == this.data && + other.readAt == this.readAt); +} + +class NotificationsCompanion extends UpdateCompanion { + final Value id; + final Value userId; + final Value clientId; + final Value rev; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value lastSyncedAt; + final Value type; + final Value title; + final Value body; + final Value data; + final Value readAt; + final Value rowid; + const NotificationsCompanion({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.type = const Value.absent(), + this.title = const Value.absent(), + this.body = const Value.absent(), + this.data = const Value.absent(), + this.readAt = const Value.absent(), + this.rowid = const Value.absent(), + }); + NotificationsCompanion.insert({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + required String type, + required String title, + required String body, + required String data, + this.readAt = const Value.absent(), + this.rowid = const Value.absent(), + }) : type = Value(type), + title = Value(title), + body = Value(body), + data = Value(data); + static Insertable custom({ + Expression? id, + Expression? userId, + Expression? clientId, + Expression? rev, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? lastSyncedAt, + Expression? type, + Expression? title, + Expression? body, + Expression? data, + Expression? readAt, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (userId != null) 'user_id': userId, + if (clientId != null) 'client_id': clientId, + if (rev != null) 'rev': rev, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (type != null) 'type': type, + if (title != null) 'title': title, + if (body != null) 'body': body, + if (data != null) 'data': data, + if (readAt != null) 'read_at': readAt, + if (rowid != null) 'rowid': rowid, + }); + } + + NotificationsCompanion copyWith( + {Value? id, + Value? userId, + Value? clientId, + Value? rev, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? lastSyncedAt, + Value? type, + Value? title, + Value? body, + Value? data, + Value? readAt, + Value? rowid}) { + return NotificationsCompanion( + id: id ?? this.id, + userId: userId ?? this.userId, + clientId: clientId ?? this.clientId, + rev: rev ?? this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + type: type ?? this.type, + title: title ?? this.title, + body: body ?? this.body, + data: data ?? this.data, + readAt: readAt ?? this.readAt, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (userId.present) { + map['user_id'] = Variable(userId.value); + } + if (clientId.present) { + map['client_id'] = Variable(clientId.value); + } + if (rev.present) { + map['rev'] = Variable(rev.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (body.present) { + map['body'] = Variable(body.value); + } + if (data.present) { + map['data'] = Variable(data.value); + } + if (readAt.present) { + map['read_at'] = Variable(readAt.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('NotificationsCompanion(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('type: $type, ') + ..write('title: $title, ') + ..write('body: $body, ') + ..write('data: $data, ') + ..write('readAt: $readAt, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class MediaFiles extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + MediaFiles(this.attachedDatabase, [this._alias]); + late final GeneratedColumn path = GeneratedColumn( + 'path', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn fileableType = GeneratedColumn( + 'fileable_type', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn fileableId = GeneratedColumn( + 'fileable_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn localFileableType = + GeneratedColumn('local_fileable_type', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn localFileableId = GeneratedColumn( + 'local_fileable_id', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + @override + List get $columns => [ + path, + id, + type, + fileableType, + fileableId, + localFileableType, + localFileableId, + createdAt, + updatedAt + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'media_files'; + @override + Set get $primaryKey => {path}; + @override + MediaFilesData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return MediaFilesData( + path: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}path'])!, + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id']), + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type']), + fileableType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}fileable_type']), + fileableId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}fileable_id']), + localFileableType: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}local_fileable_type']), + localFileableId: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}local_fileable_id']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at']), + updatedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at']), + ); + } + + @override + MediaFiles createAlias(String alias) { + return MediaFiles(attachedDatabase, alias); + } +} + +class MediaFilesData extends DataClass implements Insertable { + final String path; + final int? id; + final String? type; + final String? fileableType; + final int? fileableId; + final String? localFileableType; + final String? localFileableId; + final DateTime? createdAt; + final DateTime? updatedAt; + const MediaFilesData( + {required this.path, + this.id, + this.type, + this.fileableType, + this.fileableId, + this.localFileableType, + this.localFileableId, + this.createdAt, + this.updatedAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['path'] = Variable(path); + if (!nullToAbsent || id != null) { + map['id'] = Variable(id); + } + if (!nullToAbsent || type != null) { + map['type'] = Variable(type); + } + if (!nullToAbsent || fileableType != null) { + map['fileable_type'] = Variable(fileableType); + } + if (!nullToAbsent || fileableId != null) { + map['fileable_id'] = Variable(fileableId); + } + if (!nullToAbsent || localFileableType != null) { + map['local_fileable_type'] = Variable(localFileableType); + } + if (!nullToAbsent || localFileableId != null) { + map['local_fileable_id'] = Variable(localFileableId); + } + if (!nullToAbsent || createdAt != null) { + map['created_at'] = Variable(createdAt); + } + if (!nullToAbsent || updatedAt != null) { + map['updated_at'] = Variable(updatedAt); + } + return map; + } + + MediaFilesCompanion toCompanion(bool nullToAbsent) { + return MediaFilesCompanion( + path: Value(path), + id: id == null && nullToAbsent ? const Value.absent() : Value(id), + type: type == null && nullToAbsent ? const Value.absent() : Value(type), + fileableType: fileableType == null && nullToAbsent + ? const Value.absent() + : Value(fileableType), + fileableId: fileableId == null && nullToAbsent + ? const Value.absent() + : Value(fileableId), + localFileableType: localFileableType == null && nullToAbsent + ? const Value.absent() + : Value(localFileableType), + localFileableId: localFileableId == null && nullToAbsent + ? const Value.absent() + : Value(localFileableId), + createdAt: createdAt == null && nullToAbsent + ? const Value.absent() + : Value(createdAt), + updatedAt: updatedAt == null && nullToAbsent + ? const Value.absent() + : Value(updatedAt), + ); + } + + factory MediaFilesData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return MediaFilesData( + path: serializer.fromJson(json['path']), + id: serializer.fromJson(json['id']), + type: serializer.fromJson(json['type']), + fileableType: serializer.fromJson(json['fileableType']), + fileableId: serializer.fromJson(json['fileableId']), + localFileableType: + serializer.fromJson(json['localFileableType']), + localFileableId: serializer.fromJson(json['localFileableId']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'path': serializer.toJson(path), + 'id': serializer.toJson(id), + 'type': serializer.toJson(type), + 'fileableType': serializer.toJson(fileableType), + 'fileableId': serializer.toJson(fileableId), + 'localFileableType': serializer.toJson(localFileableType), + 'localFileableId': serializer.toJson(localFileableId), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + }; + } + + MediaFilesData copyWith( + {String? path, + Value id = const Value.absent(), + Value type = const Value.absent(), + Value fileableType = const Value.absent(), + Value fileableId = const Value.absent(), + Value localFileableType = const Value.absent(), + Value localFileableId = const Value.absent(), + Value createdAt = const Value.absent(), + Value updatedAt = const Value.absent()}) => + MediaFilesData( + path: path ?? this.path, + id: id.present ? id.value : this.id, + type: type.present ? type.value : this.type, + fileableType: + fileableType.present ? fileableType.value : this.fileableType, + fileableId: fileableId.present ? fileableId.value : this.fileableId, + localFileableType: localFileableType.present + ? localFileableType.value + : this.localFileableType, + localFileableId: localFileableId.present + ? localFileableId.value + : this.localFileableId, + createdAt: createdAt.present ? createdAt.value : this.createdAt, + updatedAt: updatedAt.present ? updatedAt.value : this.updatedAt, + ); + MediaFilesData copyWithCompanion(MediaFilesCompanion data) { + return MediaFilesData( + path: data.path.present ? data.path.value : this.path, + id: data.id.present ? data.id.value : this.id, + type: data.type.present ? data.type.value : this.type, + fileableType: data.fileableType.present + ? data.fileableType.value + : this.fileableType, + fileableId: + data.fileableId.present ? data.fileableId.value : this.fileableId, + localFileableType: data.localFileableType.present + ? data.localFileableType.value + : this.localFileableType, + localFileableId: data.localFileableId.present + ? data.localFileableId.value + : this.localFileableId, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + ); + } + + @override + String toString() { + return (StringBuffer('MediaFilesData(') + ..write('path: $path, ') + ..write('id: $id, ') + ..write('type: $type, ') + ..write('fileableType: $fileableType, ') + ..write('fileableId: $fileableId, ') + ..write('localFileableType: $localFileableType, ') + ..write('localFileableId: $localFileableId, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(path, id, type, fileableType, fileableId, + localFileableType, localFileableId, createdAt, updatedAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is MediaFilesData && + other.path == this.path && + other.id == this.id && + other.type == this.type && + other.fileableType == this.fileableType && + other.fileableId == this.fileableId && + other.localFileableType == this.localFileableType && + other.localFileableId == this.localFileableId && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt); +} + +class MediaFilesCompanion extends UpdateCompanion { + final Value path; + final Value id; + final Value type; + final Value fileableType; + final Value fileableId; + final Value localFileableType; + final Value localFileableId; + final Value createdAt; + final Value updatedAt; + final Value rowid; + const MediaFilesCompanion({ + this.path = const Value.absent(), + this.id = const Value.absent(), + this.type = const Value.absent(), + this.fileableType = const Value.absent(), + this.fileableId = const Value.absent(), + this.localFileableType = const Value.absent(), + this.localFileableId = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.rowid = const Value.absent(), + }); + MediaFilesCompanion.insert({ + required String path, + this.id = const Value.absent(), + this.type = const Value.absent(), + this.fileableType = const Value.absent(), + this.fileableId = const Value.absent(), + this.localFileableType = const Value.absent(), + this.localFileableId = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.rowid = const Value.absent(), + }) : path = Value(path); + static Insertable custom({ + Expression? path, + Expression? id, + Expression? type, + Expression? fileableType, + Expression? fileableId, + Expression? localFileableType, + Expression? localFileableId, + Expression? createdAt, + Expression? updatedAt, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (path != null) 'path': path, + if (id != null) 'id': id, + if (type != null) 'type': type, + if (fileableType != null) 'fileable_type': fileableType, + if (fileableId != null) 'fileable_id': fileableId, + if (localFileableType != null) 'local_fileable_type': localFileableType, + if (localFileableId != null) 'local_fileable_id': localFileableId, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (rowid != null) 'rowid': rowid, + }); + } + + MediaFilesCompanion copyWith( + {Value? path, + Value? id, + Value? type, + Value? fileableType, + Value? fileableId, + Value? localFileableType, + Value? localFileableId, + Value? createdAt, + Value? updatedAt, + Value? rowid}) { + return MediaFilesCompanion( + path: path ?? this.path, + id: id ?? this.id, + type: type ?? this.type, + fileableType: fileableType ?? this.fileableType, + fileableId: fileableId ?? this.fileableId, + localFileableType: localFileableType ?? this.localFileableType, + localFileableId: localFileableId ?? this.localFileableId, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (path.present) { + map['path'] = Variable(path.value); + } + if (id.present) { + map['id'] = Variable(id.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (fileableType.present) { + map['fileable_type'] = Variable(fileableType.value); + } + if (fileableId.present) { + map['fileable_id'] = Variable(fileableId.value); + } + if (localFileableType.present) { + map['local_fileable_type'] = Variable(localFileableType.value); + } + if (localFileableId.present) { + map['local_fileable_id'] = Variable(localFileableId.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('MediaFilesCompanion(') + ..write('path: $path, ') + ..write('id: $id, ') + ..write('type: $type, ') + ..write('fileableType: $fileableType, ') + ..write('fileableId: $fileableId, ') + ..write('localFileableType: $localFileableType, ') + ..write('localFileableId: $localFileableId, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class Transfers extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Transfers(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways('UNIQUE')); + late final GeneratedColumn userId = GeneratedColumn( + 'user_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn clientId = GeneratedColumn( + 'client_id', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'\'')); + late final GeneratedColumn rev = GeneratedColumn( + 'rev', aliasedName, true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'1\'')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn amount = GeneratedColumn( + 'amount', aliasedName, false, + type: DriftSqlType.double, requiredDuringInsert: true); + late final GeneratedColumn fromWalletId = GeneratedColumn( + 'from_wallet_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn toWalletId = GeneratedColumn( + 'to_wallet_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn fromWalletClientId = + GeneratedColumn('from_wallet_client_id', aliasedName, true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES wallets (client_id)')); + late final GeneratedColumn toWalletClientId = GeneratedColumn( + 'to_wallet_client_id', aliasedName, true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES wallets (client_id)')); + late final GeneratedColumn exchangeRate = GeneratedColumn( + 'exchange_rate', aliasedName, true, + type: DriftSqlType.double, requiredDuringInsert: false); + late final GeneratedColumn datetime = GeneratedColumn( + 'datetime', aliasedName, false, + type: DriftSqlType.dateTime, requiredDuringInsert: true); + late final GeneratedColumn expenseTransactionClientId = + GeneratedColumn( + 'expense_transaction_client_id', aliasedName, true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES transactions (client_id)')); + late final GeneratedColumn incomeTransactionClientId = + GeneratedColumn('income_transaction_client_id', aliasedName, true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES transactions (client_id)')); + @override + List get $columns => [ + id, + userId, + clientId, + rev, + createdAt, + updatedAt, + deletedAt, + lastSyncedAt, + amount, + fromWalletId, + toWalletId, + fromWalletClientId, + toWalletClientId, + exchangeRate, + datetime, + expenseTransactionClientId, + incomeTransactionClientId + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'transfers'; + @override + Set get $primaryKey => {clientId}; + @override + TransfersData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return TransfersData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id']), + userId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}user_id']), + clientId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}client_id'])!, + rev: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}rev']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + updatedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, + deletedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}deleted_at']), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_synced_at']), + amount: attachedDatabase.typeMapping + .read(DriftSqlType.double, data['${effectivePrefix}amount'])!, + fromWalletId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}from_wallet_id']), + toWalletId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}to_wallet_id']), + fromWalletClientId: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}from_wallet_client_id']), + toWalletClientId: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}to_wallet_client_id']), + exchangeRate: attachedDatabase.typeMapping + .read(DriftSqlType.double, data['${effectivePrefix}exchange_rate']), + datetime: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}datetime'])!, + expenseTransactionClientId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}expense_transaction_client_id']), + incomeTransactionClientId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}income_transaction_client_id']), + ); + } + + @override + Transfers createAlias(String alias) { + return Transfers(attachedDatabase, alias); + } +} + +class TransfersData extends DataClass implements Insertable { + final int? id; + final int? userId; + final String clientId; + final String? rev; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final DateTime? lastSyncedAt; + final double amount; + final int? fromWalletId; + final int? toWalletId; + final String? fromWalletClientId; + final String? toWalletClientId; + final double? exchangeRate; + final DateTime datetime; + final String? expenseTransactionClientId; + final String? incomeTransactionClientId; + const TransfersData( + {this.id, + this.userId, + required this.clientId, + this.rev, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + this.lastSyncedAt, + required this.amount, + this.fromWalletId, + this.toWalletId, + this.fromWalletClientId, + this.toWalletClientId, + this.exchangeRate, + required this.datetime, + this.expenseTransactionClientId, + this.incomeTransactionClientId}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (!nullToAbsent || id != null) { + map['id'] = Variable(id); + } + if (!nullToAbsent || userId != null) { + map['user_id'] = Variable(userId); + } + map['client_id'] = Variable(clientId); + if (!nullToAbsent || rev != null) { + map['rev'] = Variable(rev); + } + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + map['amount'] = Variable(amount); + if (!nullToAbsent || fromWalletId != null) { + map['from_wallet_id'] = Variable(fromWalletId); + } + if (!nullToAbsent || toWalletId != null) { + map['to_wallet_id'] = Variable(toWalletId); + } + if (!nullToAbsent || fromWalletClientId != null) { + map['from_wallet_client_id'] = Variable(fromWalletClientId); + } + if (!nullToAbsent || toWalletClientId != null) { + map['to_wallet_client_id'] = Variable(toWalletClientId); + } + if (!nullToAbsent || exchangeRate != null) { + map['exchange_rate'] = Variable(exchangeRate); + } + map['datetime'] = Variable(datetime); + if (!nullToAbsent || expenseTransactionClientId != null) { + map['expense_transaction_client_id'] = + Variable(expenseTransactionClientId); + } + if (!nullToAbsent || incomeTransactionClientId != null) { + map['income_transaction_client_id'] = + Variable(incomeTransactionClientId); + } + return map; + } + + TransfersCompanion toCompanion(bool nullToAbsent) { + return TransfersCompanion( + id: id == null && nullToAbsent ? const Value.absent() : Value(id), + userId: + userId == null && nullToAbsent ? const Value.absent() : Value(userId), + clientId: Value(clientId), + rev: rev == null && nullToAbsent ? const Value.absent() : Value(rev), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + amount: Value(amount), + fromWalletId: fromWalletId == null && nullToAbsent + ? const Value.absent() + : Value(fromWalletId), + toWalletId: toWalletId == null && nullToAbsent + ? const Value.absent() + : Value(toWalletId), + fromWalletClientId: fromWalletClientId == null && nullToAbsent + ? const Value.absent() + : Value(fromWalletClientId), + toWalletClientId: toWalletClientId == null && nullToAbsent + ? const Value.absent() + : Value(toWalletClientId), + exchangeRate: exchangeRate == null && nullToAbsent + ? const Value.absent() + : Value(exchangeRate), + datetime: Value(datetime), + expenseTransactionClientId: + expenseTransactionClientId == null && nullToAbsent + ? const Value.absent() + : Value(expenseTransactionClientId), + incomeTransactionClientId: + incomeTransactionClientId == null && nullToAbsent + ? const Value.absent() + : Value(incomeTransactionClientId), + ); + } + + factory TransfersData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return TransfersData( + id: serializer.fromJson(json['id']), + userId: serializer.fromJson(json['userId']), + clientId: serializer.fromJson(json['clientId']), + rev: serializer.fromJson(json['rev']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + amount: serializer.fromJson(json['amount']), + fromWalletId: serializer.fromJson(json['fromWalletId']), + toWalletId: serializer.fromJson(json['toWalletId']), + fromWalletClientId: + serializer.fromJson(json['fromWalletClientId']), + toWalletClientId: serializer.fromJson(json['toWalletClientId']), + exchangeRate: serializer.fromJson(json['exchangeRate']), + datetime: serializer.fromJson(json['datetime']), + expenseTransactionClientId: + serializer.fromJson(json['expenseTransactionClientId']), + incomeTransactionClientId: + serializer.fromJson(json['incomeTransactionClientId']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'userId': serializer.toJson(userId), + 'clientId': serializer.toJson(clientId), + 'rev': serializer.toJson(rev), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'amount': serializer.toJson(amount), + 'fromWalletId': serializer.toJson(fromWalletId), + 'toWalletId': serializer.toJson(toWalletId), + 'fromWalletClientId': serializer.toJson(fromWalletClientId), + 'toWalletClientId': serializer.toJson(toWalletClientId), + 'exchangeRate': serializer.toJson(exchangeRate), + 'datetime': serializer.toJson(datetime), + 'expenseTransactionClientId': + serializer.toJson(expenseTransactionClientId), + 'incomeTransactionClientId': + serializer.toJson(incomeTransactionClientId), + }; + } + + TransfersData copyWith( + {Value id = const Value.absent(), + Value userId = const Value.absent(), + String? clientId, + Value rev = const Value.absent(), + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + double? amount, + Value fromWalletId = const Value.absent(), + Value toWalletId = const Value.absent(), + Value fromWalletClientId = const Value.absent(), + Value toWalletClientId = const Value.absent(), + Value exchangeRate = const Value.absent(), + DateTime? datetime, + Value expenseTransactionClientId = const Value.absent(), + Value incomeTransactionClientId = const Value.absent()}) => + TransfersData( + id: id.present ? id.value : this.id, + userId: userId.present ? userId.value : this.userId, + clientId: clientId ?? this.clientId, + rev: rev.present ? rev.value : this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + lastSyncedAt: + lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + amount: amount ?? this.amount, + fromWalletId: + fromWalletId.present ? fromWalletId.value : this.fromWalletId, + toWalletId: toWalletId.present ? toWalletId.value : this.toWalletId, + fromWalletClientId: fromWalletClientId.present + ? fromWalletClientId.value + : this.fromWalletClientId, + toWalletClientId: toWalletClientId.present + ? toWalletClientId.value + : this.toWalletClientId, + exchangeRate: + exchangeRate.present ? exchangeRate.value : this.exchangeRate, + datetime: datetime ?? this.datetime, + expenseTransactionClientId: expenseTransactionClientId.present + ? expenseTransactionClientId.value + : this.expenseTransactionClientId, + incomeTransactionClientId: incomeTransactionClientId.present + ? incomeTransactionClientId.value + : this.incomeTransactionClientId, + ); + TransfersData copyWithCompanion(TransfersCompanion data) { + return TransfersData( + id: data.id.present ? data.id.value : this.id, + userId: data.userId.present ? data.userId.value : this.userId, + clientId: data.clientId.present ? data.clientId.value : this.clientId, + rev: data.rev.present ? data.rev.value : this.rev, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + amount: data.amount.present ? data.amount.value : this.amount, + fromWalletId: data.fromWalletId.present + ? data.fromWalletId.value + : this.fromWalletId, + toWalletId: + data.toWalletId.present ? data.toWalletId.value : this.toWalletId, + fromWalletClientId: data.fromWalletClientId.present + ? data.fromWalletClientId.value + : this.fromWalletClientId, + toWalletClientId: data.toWalletClientId.present + ? data.toWalletClientId.value + : this.toWalletClientId, + exchangeRate: data.exchangeRate.present + ? data.exchangeRate.value + : this.exchangeRate, + datetime: data.datetime.present ? data.datetime.value : this.datetime, + expenseTransactionClientId: data.expenseTransactionClientId.present + ? data.expenseTransactionClientId.value + : this.expenseTransactionClientId, + incomeTransactionClientId: data.incomeTransactionClientId.present + ? data.incomeTransactionClientId.value + : this.incomeTransactionClientId, + ); + } + + @override + String toString() { + return (StringBuffer('TransfersData(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('amount: $amount, ') + ..write('fromWalletId: $fromWalletId, ') + ..write('toWalletId: $toWalletId, ') + ..write('fromWalletClientId: $fromWalletClientId, ') + ..write('toWalletClientId: $toWalletClientId, ') + ..write('exchangeRate: $exchangeRate, ') + ..write('datetime: $datetime, ') + ..write('expenseTransactionClientId: $expenseTransactionClientId, ') + ..write('incomeTransactionClientId: $incomeTransactionClientId') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + id, + userId, + clientId, + rev, + createdAt, + updatedAt, + deletedAt, + lastSyncedAt, + amount, + fromWalletId, + toWalletId, + fromWalletClientId, + toWalletClientId, + exchangeRate, + datetime, + expenseTransactionClientId, + incomeTransactionClientId); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is TransfersData && + other.id == this.id && + other.userId == this.userId && + other.clientId == this.clientId && + other.rev == this.rev && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.lastSyncedAt == this.lastSyncedAt && + other.amount == this.amount && + other.fromWalletId == this.fromWalletId && + other.toWalletId == this.toWalletId && + other.fromWalletClientId == this.fromWalletClientId && + other.toWalletClientId == this.toWalletClientId && + other.exchangeRate == this.exchangeRate && + other.datetime == this.datetime && + other.expenseTransactionClientId == this.expenseTransactionClientId && + other.incomeTransactionClientId == this.incomeTransactionClientId); +} + +class TransfersCompanion extends UpdateCompanion { + final Value id; + final Value userId; + final Value clientId; + final Value rev; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value lastSyncedAt; + final Value amount; + final Value fromWalletId; + final Value toWalletId; + final Value fromWalletClientId; + final Value toWalletClientId; + final Value exchangeRate; + final Value datetime; + final Value expenseTransactionClientId; + final Value incomeTransactionClientId; + final Value rowid; + const TransfersCompanion({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.amount = const Value.absent(), + this.fromWalletId = const Value.absent(), + this.toWalletId = const Value.absent(), + this.fromWalletClientId = const Value.absent(), + this.toWalletClientId = const Value.absent(), + this.exchangeRate = const Value.absent(), + this.datetime = const Value.absent(), + this.expenseTransactionClientId = const Value.absent(), + this.incomeTransactionClientId = const Value.absent(), + this.rowid = const Value.absent(), + }); + TransfersCompanion.insert({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + required double amount, + this.fromWalletId = const Value.absent(), + this.toWalletId = const Value.absent(), + this.fromWalletClientId = const Value.absent(), + this.toWalletClientId = const Value.absent(), + this.exchangeRate = const Value.absent(), + required DateTime datetime, + this.expenseTransactionClientId = const Value.absent(), + this.incomeTransactionClientId = const Value.absent(), + this.rowid = const Value.absent(), + }) : amount = Value(amount), + datetime = Value(datetime); + static Insertable custom({ + Expression? id, + Expression? userId, + Expression? clientId, + Expression? rev, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? lastSyncedAt, + Expression? amount, + Expression? fromWalletId, + Expression? toWalletId, + Expression? fromWalletClientId, + Expression? toWalletClientId, + Expression? exchangeRate, + Expression? datetime, + Expression? expenseTransactionClientId, + Expression? incomeTransactionClientId, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (userId != null) 'user_id': userId, + if (clientId != null) 'client_id': clientId, + if (rev != null) 'rev': rev, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (amount != null) 'amount': amount, + if (fromWalletId != null) 'from_wallet_id': fromWalletId, + if (toWalletId != null) 'to_wallet_id': toWalletId, + if (fromWalletClientId != null) + 'from_wallet_client_id': fromWalletClientId, + if (toWalletClientId != null) 'to_wallet_client_id': toWalletClientId, + if (exchangeRate != null) 'exchange_rate': exchangeRate, + if (datetime != null) 'datetime': datetime, + if (expenseTransactionClientId != null) + 'expense_transaction_client_id': expenseTransactionClientId, + if (incomeTransactionClientId != null) + 'income_transaction_client_id': incomeTransactionClientId, + if (rowid != null) 'rowid': rowid, + }); + } + + TransfersCompanion copyWith( + {Value? id, + Value? userId, + Value? clientId, + Value? rev, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? lastSyncedAt, + Value? amount, + Value? fromWalletId, + Value? toWalletId, + Value? fromWalletClientId, + Value? toWalletClientId, + Value? exchangeRate, + Value? datetime, + Value? expenseTransactionClientId, + Value? incomeTransactionClientId, + Value? rowid}) { + return TransfersCompanion( + id: id ?? this.id, + userId: userId ?? this.userId, + clientId: clientId ?? this.clientId, + rev: rev ?? this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + amount: amount ?? this.amount, + fromWalletId: fromWalletId ?? this.fromWalletId, + toWalletId: toWalletId ?? this.toWalletId, + fromWalletClientId: fromWalletClientId ?? this.fromWalletClientId, + toWalletClientId: toWalletClientId ?? this.toWalletClientId, + exchangeRate: exchangeRate ?? this.exchangeRate, + datetime: datetime ?? this.datetime, + expenseTransactionClientId: + expenseTransactionClientId ?? this.expenseTransactionClientId, + incomeTransactionClientId: + incomeTransactionClientId ?? this.incomeTransactionClientId, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (userId.present) { + map['user_id'] = Variable(userId.value); + } + if (clientId.present) { + map['client_id'] = Variable(clientId.value); + } + if (rev.present) { + map['rev'] = Variable(rev.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (amount.present) { + map['amount'] = Variable(amount.value); + } + if (fromWalletId.present) { + map['from_wallet_id'] = Variable(fromWalletId.value); + } + if (toWalletId.present) { + map['to_wallet_id'] = Variable(toWalletId.value); + } + if (fromWalletClientId.present) { + map['from_wallet_client_id'] = Variable(fromWalletClientId.value); + } + if (toWalletClientId.present) { + map['to_wallet_client_id'] = Variable(toWalletClientId.value); + } + if (exchangeRate.present) { + map['exchange_rate'] = Variable(exchangeRate.value); + } + if (datetime.present) { + map['datetime'] = Variable(datetime.value); + } + if (expenseTransactionClientId.present) { + map['expense_transaction_client_id'] = + Variable(expenseTransactionClientId.value); + } + if (incomeTransactionClientId.present) { + map['income_transaction_client_id'] = + Variable(incomeTransactionClientId.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('TransfersCompanion(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('amount: $amount, ') + ..write('fromWalletId: $fromWalletId, ') + ..write('toWalletId: $toWalletId, ') + ..write('fromWalletClientId: $fromWalletClientId, ') + ..write('toWalletClientId: $toWalletClientId, ') + ..write('exchangeRate: $exchangeRate, ') + ..write('datetime: $datetime, ') + ..write('expenseTransactionClientId: $expenseTransactionClientId, ') + ..write('incomeTransactionClientId: $incomeTransactionClientId, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class Budgets extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Budgets(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways('UNIQUE')); + late final GeneratedColumn userId = GeneratedColumn( + 'user_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn clientId = GeneratedColumn( + 'client_id', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'\'')); + late final GeneratedColumn rev = GeneratedColumn( + 'rev', aliasedName, true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'1\'')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn name = GeneratedColumn( + 'name', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn slug = GeneratedColumn( + 'slug', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'description', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn amount = GeneratedColumn( + 'amount', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn currency = GeneratedColumn( + 'currency', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn periodType = GeneratedColumn( + 'period_type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn startDate = GeneratedColumn( + 'start_date', aliasedName, false, + type: DriftSqlType.dateTime, requiredDuringInsert: true); + late final GeneratedColumn endDate = GeneratedColumn( + 'end_date', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn rolloverEnabled = GeneratedColumn( + 'rollover_enabled', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("rollover_enabled" IN (0, 1))'), + defaultValue: const CustomExpression('0')); + late final GeneratedColumn thresholdPercent = GeneratedColumn( + 'threshold_percent', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const CustomExpression('80')); + late final GeneratedColumn forecastAlertsEnabled = + GeneratedColumn('forecast_alerts_enabled', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("forecast_alerts_enabled" IN (0, 1))'), + defaultValue: const CustomExpression('0')); + late final GeneratedColumn isActive = GeneratedColumn( + 'is_active', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("is_active" IN (0, 1))'), + defaultValue: const CustomExpression('1')); + late final GeneratedColumn ownerType = GeneratedColumn( + 'owner_type', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'user\'')); + late final GeneratedColumn ownerId = GeneratedColumn( + 'owner_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn progress = GeneratedColumn( + 'progress', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + @override + List get $columns => [ + id, + userId, + clientId, + rev, + createdAt, + updatedAt, + deletedAt, + lastSyncedAt, + name, + slug, + description, + amount, + currency, + periodType, + startDate, + endDate, + rolloverEnabled, + thresholdPercent, + forecastAlertsEnabled, + isActive, + ownerType, + ownerId, + progress + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'budgets'; + @override + Set get $primaryKey => {clientId}; + @override + BudgetsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BudgetsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id']), + userId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}user_id']), + clientId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}client_id'])!, + rev: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}rev']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + updatedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, + deletedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}deleted_at']), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_synced_at']), + name: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}name'])!, + slug: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}slug'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}description']), + amount: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}amount'])!, + currency: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}currency'])!, + periodType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}period_type'])!, + startDate: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}start_date'])!, + endDate: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}end_date']), + rolloverEnabled: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}rollover_enabled'])!, + thresholdPercent: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}threshold_percent'])!, + forecastAlertsEnabled: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}forecast_alerts_enabled'])!, + isActive: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}is_active'])!, + ownerType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}owner_type'])!, + ownerId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}owner_id']), + progress: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}progress']), + ); + } + + @override + Budgets createAlias(String alias) { + return Budgets(attachedDatabase, alias); + } +} + +class BudgetsData extends DataClass implements Insertable { + final int? id; + final int? userId; + final String clientId; + final String? rev; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final DateTime? lastSyncedAt; + final String name; + final String slug; + final String? description; + final String amount; + final String currency; + final String periodType; + final DateTime startDate; + final DateTime? endDate; + final bool rolloverEnabled; + final int thresholdPercent; + final bool forecastAlertsEnabled; + final bool isActive; + final String ownerType; + final int? ownerId; + final String? progress; + const BudgetsData( + {this.id, + this.userId, + required this.clientId, + this.rev, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + this.lastSyncedAt, + required this.name, + required this.slug, + this.description, + required this.amount, + required this.currency, + required this.periodType, + required this.startDate, + this.endDate, + required this.rolloverEnabled, + required this.thresholdPercent, + required this.forecastAlertsEnabled, + required this.isActive, + required this.ownerType, + this.ownerId, + this.progress}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (!nullToAbsent || id != null) { + map['id'] = Variable(id); + } + if (!nullToAbsent || userId != null) { + map['user_id'] = Variable(userId); + } + map['client_id'] = Variable(clientId); + if (!nullToAbsent || rev != null) { + map['rev'] = Variable(rev); + } + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + map['name'] = Variable(name); + map['slug'] = Variable(slug); + if (!nullToAbsent || description != null) { + map['description'] = Variable(description); + } + map['amount'] = Variable(amount); + map['currency'] = Variable(currency); + map['period_type'] = Variable(periodType); + map['start_date'] = Variable(startDate); + if (!nullToAbsent || endDate != null) { + map['end_date'] = Variable(endDate); + } + map['rollover_enabled'] = Variable(rolloverEnabled); + map['threshold_percent'] = Variable(thresholdPercent); + map['forecast_alerts_enabled'] = Variable(forecastAlertsEnabled); + map['is_active'] = Variable(isActive); + map['owner_type'] = Variable(ownerType); + if (!nullToAbsent || ownerId != null) { + map['owner_id'] = Variable(ownerId); + } + if (!nullToAbsent || progress != null) { + map['progress'] = Variable(progress); + } + return map; + } + + BudgetsCompanion toCompanion(bool nullToAbsent) { + return BudgetsCompanion( + id: id == null && nullToAbsent ? const Value.absent() : Value(id), + userId: + userId == null && nullToAbsent ? const Value.absent() : Value(userId), + clientId: Value(clientId), + rev: rev == null && nullToAbsent ? const Value.absent() : Value(rev), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + name: Value(name), + slug: Value(slug), + description: description == null && nullToAbsent + ? const Value.absent() + : Value(description), + amount: Value(amount), + currency: Value(currency), + periodType: Value(periodType), + startDate: Value(startDate), + endDate: endDate == null && nullToAbsent + ? const Value.absent() + : Value(endDate), + rolloverEnabled: Value(rolloverEnabled), + thresholdPercent: Value(thresholdPercent), + forecastAlertsEnabled: Value(forecastAlertsEnabled), + isActive: Value(isActive), + ownerType: Value(ownerType), + ownerId: ownerId == null && nullToAbsent + ? const Value.absent() + : Value(ownerId), + progress: progress == null && nullToAbsent + ? const Value.absent() + : Value(progress), + ); + } + + factory BudgetsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BudgetsData( + id: serializer.fromJson(json['id']), + userId: serializer.fromJson(json['userId']), + clientId: serializer.fromJson(json['clientId']), + rev: serializer.fromJson(json['rev']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + name: serializer.fromJson(json['name']), + slug: serializer.fromJson(json['slug']), + description: serializer.fromJson(json['description']), + amount: serializer.fromJson(json['amount']), + currency: serializer.fromJson(json['currency']), + periodType: serializer.fromJson(json['periodType']), + startDate: serializer.fromJson(json['startDate']), + endDate: serializer.fromJson(json['endDate']), + rolloverEnabled: serializer.fromJson(json['rolloverEnabled']), + thresholdPercent: serializer.fromJson(json['thresholdPercent']), + forecastAlertsEnabled: + serializer.fromJson(json['forecastAlertsEnabled']), + isActive: serializer.fromJson(json['isActive']), + ownerType: serializer.fromJson(json['ownerType']), + ownerId: serializer.fromJson(json['ownerId']), + progress: serializer.fromJson(json['progress']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'userId': serializer.toJson(userId), + 'clientId': serializer.toJson(clientId), + 'rev': serializer.toJson(rev), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'name': serializer.toJson(name), + 'slug': serializer.toJson(slug), + 'description': serializer.toJson(description), + 'amount': serializer.toJson(amount), + 'currency': serializer.toJson(currency), + 'periodType': serializer.toJson(periodType), + 'startDate': serializer.toJson(startDate), + 'endDate': serializer.toJson(endDate), + 'rolloverEnabled': serializer.toJson(rolloverEnabled), + 'thresholdPercent': serializer.toJson(thresholdPercent), + 'forecastAlertsEnabled': serializer.toJson(forecastAlertsEnabled), + 'isActive': serializer.toJson(isActive), + 'ownerType': serializer.toJson(ownerType), + 'ownerId': serializer.toJson(ownerId), + 'progress': serializer.toJson(progress), + }; + } + + BudgetsData copyWith( + {Value id = const Value.absent(), + Value userId = const Value.absent(), + String? clientId, + Value rev = const Value.absent(), + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + String? name, + String? slug, + Value description = const Value.absent(), + String? amount, + String? currency, + String? periodType, + DateTime? startDate, + Value endDate = const Value.absent(), + bool? rolloverEnabled, + int? thresholdPercent, + bool? forecastAlertsEnabled, + bool? isActive, + String? ownerType, + Value ownerId = const Value.absent(), + Value progress = const Value.absent()}) => + BudgetsData( + id: id.present ? id.value : this.id, + userId: userId.present ? userId.value : this.userId, + clientId: clientId ?? this.clientId, + rev: rev.present ? rev.value : this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + lastSyncedAt: + lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + name: name ?? this.name, + slug: slug ?? this.slug, + description: description.present ? description.value : this.description, + amount: amount ?? this.amount, + currency: currency ?? this.currency, + periodType: periodType ?? this.periodType, + startDate: startDate ?? this.startDate, + endDate: endDate.present ? endDate.value : this.endDate, + rolloverEnabled: rolloverEnabled ?? this.rolloverEnabled, + thresholdPercent: thresholdPercent ?? this.thresholdPercent, + forecastAlertsEnabled: + forecastAlertsEnabled ?? this.forecastAlertsEnabled, + isActive: isActive ?? this.isActive, + ownerType: ownerType ?? this.ownerType, + ownerId: ownerId.present ? ownerId.value : this.ownerId, + progress: progress.present ? progress.value : this.progress, + ); + BudgetsData copyWithCompanion(BudgetsCompanion data) { + return BudgetsData( + id: data.id.present ? data.id.value : this.id, + userId: data.userId.present ? data.userId.value : this.userId, + clientId: data.clientId.present ? data.clientId.value : this.clientId, + rev: data.rev.present ? data.rev.value : this.rev, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + name: data.name.present ? data.name.value : this.name, + slug: data.slug.present ? data.slug.value : this.slug, + description: + data.description.present ? data.description.value : this.description, + amount: data.amount.present ? data.amount.value : this.amount, + currency: data.currency.present ? data.currency.value : this.currency, + periodType: + data.periodType.present ? data.periodType.value : this.periodType, + startDate: data.startDate.present ? data.startDate.value : this.startDate, + endDate: data.endDate.present ? data.endDate.value : this.endDate, + rolloverEnabled: data.rolloverEnabled.present + ? data.rolloverEnabled.value + : this.rolloverEnabled, + thresholdPercent: data.thresholdPercent.present + ? data.thresholdPercent.value + : this.thresholdPercent, + forecastAlertsEnabled: data.forecastAlertsEnabled.present + ? data.forecastAlertsEnabled.value + : this.forecastAlertsEnabled, + isActive: data.isActive.present ? data.isActive.value : this.isActive, + ownerType: data.ownerType.present ? data.ownerType.value : this.ownerType, + ownerId: data.ownerId.present ? data.ownerId.value : this.ownerId, + progress: data.progress.present ? data.progress.value : this.progress, + ); + } + + @override + String toString() { + return (StringBuffer('BudgetsData(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('name: $name, ') + ..write('slug: $slug, ') + ..write('description: $description, ') + ..write('amount: $amount, ') + ..write('currency: $currency, ') + ..write('periodType: $periodType, ') + ..write('startDate: $startDate, ') + ..write('endDate: $endDate, ') + ..write('rolloverEnabled: $rolloverEnabled, ') + ..write('thresholdPercent: $thresholdPercent, ') + ..write('forecastAlertsEnabled: $forecastAlertsEnabled, ') + ..write('isActive: $isActive, ') + ..write('ownerType: $ownerType, ') + ..write('ownerId: $ownerId, ') + ..write('progress: $progress') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hashAll([ + id, + userId, + clientId, + rev, + createdAt, + updatedAt, + deletedAt, + lastSyncedAt, + name, + slug, + description, + amount, + currency, + periodType, + startDate, + endDate, + rolloverEnabled, + thresholdPercent, + forecastAlertsEnabled, + isActive, + ownerType, + ownerId, + progress + ]); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BudgetsData && + other.id == this.id && + other.userId == this.userId && + other.clientId == this.clientId && + other.rev == this.rev && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.lastSyncedAt == this.lastSyncedAt && + other.name == this.name && + other.slug == this.slug && + other.description == this.description && + other.amount == this.amount && + other.currency == this.currency && + other.periodType == this.periodType && + other.startDate == this.startDate && + other.endDate == this.endDate && + other.rolloverEnabled == this.rolloverEnabled && + other.thresholdPercent == this.thresholdPercent && + other.forecastAlertsEnabled == this.forecastAlertsEnabled && + other.isActive == this.isActive && + other.ownerType == this.ownerType && + other.ownerId == this.ownerId && + other.progress == this.progress); +} + +class BudgetsCompanion extends UpdateCompanion { + final Value id; + final Value userId; + final Value clientId; + final Value rev; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value lastSyncedAt; + final Value name; + final Value slug; + final Value description; + final Value amount; + final Value currency; + final Value periodType; + final Value startDate; + final Value endDate; + final Value rolloverEnabled; + final Value thresholdPercent; + final Value forecastAlertsEnabled; + final Value isActive; + final Value ownerType; + final Value ownerId; + final Value progress; + final Value rowid; + const BudgetsCompanion({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.name = const Value.absent(), + this.slug = const Value.absent(), + this.description = const Value.absent(), + this.amount = const Value.absent(), + this.currency = const Value.absent(), + this.periodType = const Value.absent(), + this.startDate = const Value.absent(), + this.endDate = const Value.absent(), + this.rolloverEnabled = const Value.absent(), + this.thresholdPercent = const Value.absent(), + this.forecastAlertsEnabled = const Value.absent(), + this.isActive = const Value.absent(), + this.ownerType = const Value.absent(), + this.ownerId = const Value.absent(), + this.progress = const Value.absent(), + this.rowid = const Value.absent(), + }); + BudgetsCompanion.insert({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + required String name, + required String slug, + this.description = const Value.absent(), + required String amount, + required String currency, + required String periodType, + required DateTime startDate, + this.endDate = const Value.absent(), + this.rolloverEnabled = const Value.absent(), + this.thresholdPercent = const Value.absent(), + this.forecastAlertsEnabled = const Value.absent(), + this.isActive = const Value.absent(), + this.ownerType = const Value.absent(), + this.ownerId = const Value.absent(), + this.progress = const Value.absent(), + this.rowid = const Value.absent(), + }) : name = Value(name), + slug = Value(slug), + amount = Value(amount), + currency = Value(currency), + periodType = Value(periodType), + startDate = Value(startDate); + static Insertable custom({ + Expression? id, + Expression? userId, + Expression? clientId, + Expression? rev, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? lastSyncedAt, + Expression? name, + Expression? slug, + Expression? description, + Expression? amount, + Expression? currency, + Expression? periodType, + Expression? startDate, + Expression? endDate, + Expression? rolloverEnabled, + Expression? thresholdPercent, + Expression? forecastAlertsEnabled, + Expression? isActive, + Expression? ownerType, + Expression? ownerId, + Expression? progress, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (userId != null) 'user_id': userId, + if (clientId != null) 'client_id': clientId, + if (rev != null) 'rev': rev, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (name != null) 'name': name, + if (slug != null) 'slug': slug, + if (description != null) 'description': description, + if (amount != null) 'amount': amount, + if (currency != null) 'currency': currency, + if (periodType != null) 'period_type': periodType, + if (startDate != null) 'start_date': startDate, + if (endDate != null) 'end_date': endDate, + if (rolloverEnabled != null) 'rollover_enabled': rolloverEnabled, + if (thresholdPercent != null) 'threshold_percent': thresholdPercent, + if (forecastAlertsEnabled != null) + 'forecast_alerts_enabled': forecastAlertsEnabled, + if (isActive != null) 'is_active': isActive, + if (ownerType != null) 'owner_type': ownerType, + if (ownerId != null) 'owner_id': ownerId, + if (progress != null) 'progress': progress, + if (rowid != null) 'rowid': rowid, + }); + } + + BudgetsCompanion copyWith( + {Value? id, + Value? userId, + Value? clientId, + Value? rev, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? lastSyncedAt, + Value? name, + Value? slug, + Value? description, + Value? amount, + Value? currency, + Value? periodType, + Value? startDate, + Value? endDate, + Value? rolloverEnabled, + Value? thresholdPercent, + Value? forecastAlertsEnabled, + Value? isActive, + Value? ownerType, + Value? ownerId, + Value? progress, + Value? rowid}) { + return BudgetsCompanion( + id: id ?? this.id, + userId: userId ?? this.userId, + clientId: clientId ?? this.clientId, + rev: rev ?? this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + name: name ?? this.name, + slug: slug ?? this.slug, + description: description ?? this.description, + amount: amount ?? this.amount, + currency: currency ?? this.currency, + periodType: periodType ?? this.periodType, + startDate: startDate ?? this.startDate, + endDate: endDate ?? this.endDate, + rolloverEnabled: rolloverEnabled ?? this.rolloverEnabled, + thresholdPercent: thresholdPercent ?? this.thresholdPercent, + forecastAlertsEnabled: + forecastAlertsEnabled ?? this.forecastAlertsEnabled, + isActive: isActive ?? this.isActive, + ownerType: ownerType ?? this.ownerType, + ownerId: ownerId ?? this.ownerId, + progress: progress ?? this.progress, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (userId.present) { + map['user_id'] = Variable(userId.value); + } + if (clientId.present) { + map['client_id'] = Variable(clientId.value); + } + if (rev.present) { + map['rev'] = Variable(rev.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (name.present) { + map['name'] = Variable(name.value); + } + if (slug.present) { + map['slug'] = Variable(slug.value); + } + if (description.present) { + map['description'] = Variable(description.value); + } + if (amount.present) { + map['amount'] = Variable(amount.value); + } + if (currency.present) { + map['currency'] = Variable(currency.value); + } + if (periodType.present) { + map['period_type'] = Variable(periodType.value); + } + if (startDate.present) { + map['start_date'] = Variable(startDate.value); + } + if (endDate.present) { + map['end_date'] = Variable(endDate.value); + } + if (rolloverEnabled.present) { + map['rollover_enabled'] = Variable(rolloverEnabled.value); + } + if (thresholdPercent.present) { + map['threshold_percent'] = Variable(thresholdPercent.value); + } + if (forecastAlertsEnabled.present) { + map['forecast_alerts_enabled'] = + Variable(forecastAlertsEnabled.value); + } + if (isActive.present) { + map['is_active'] = Variable(isActive.value); + } + if (ownerType.present) { + map['owner_type'] = Variable(ownerType.value); + } + if (ownerId.present) { + map['owner_id'] = Variable(ownerId.value); + } + if (progress.present) { + map['progress'] = Variable(progress.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BudgetsCompanion(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('name: $name, ') + ..write('slug: $slug, ') + ..write('description: $description, ') + ..write('amount: $amount, ') + ..write('currency: $currency, ') + ..write('periodType: $periodType, ') + ..write('startDate: $startDate, ') + ..write('endDate: $endDate, ') + ..write('rolloverEnabled: $rolloverEnabled, ') + ..write('thresholdPercent: $thresholdPercent, ') + ..write('forecastAlertsEnabled: $forecastAlertsEnabled, ') + ..write('isActive: $isActive, ') + ..write('ownerType: $ownerType, ') + ..write('ownerId: $ownerId, ') + ..write('progress: $progress, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class BudgetTargets extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BudgetTargets(this.attachedDatabase, [this._alias]); + late final GeneratedColumn budgetClientId = GeneratedColumn( + 'budget_client_id', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES budgets (client_id)')); + late final GeneratedColumn targetType = GeneratedColumn( + 'target_type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn targetClientId = GeneratedColumn( + 'target_client_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => + [budgetClientId, targetType, targetClientId]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'budget_targets'; + @override + Set get $primaryKey => + {budgetClientId, targetType, targetClientId}; + @override + BudgetTargetsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BudgetTargetsData( + budgetClientId: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}budget_client_id'])!, + targetType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}target_type'])!, + targetClientId: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}target_client_id'])!, + ); + } + + @override + BudgetTargets createAlias(String alias) { + return BudgetTargets(attachedDatabase, alias); + } +} + +class BudgetTargetsData extends DataClass + implements Insertable { + final String budgetClientId; + final String targetType; + final String targetClientId; + const BudgetTargetsData( + {required this.budgetClientId, + required this.targetType, + required this.targetClientId}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['budget_client_id'] = Variable(budgetClientId); + map['target_type'] = Variable(targetType); + map['target_client_id'] = Variable(targetClientId); + return map; + } + + BudgetTargetsCompanion toCompanion(bool nullToAbsent) { + return BudgetTargetsCompanion( + budgetClientId: Value(budgetClientId), + targetType: Value(targetType), + targetClientId: Value(targetClientId), + ); + } + + factory BudgetTargetsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BudgetTargetsData( + budgetClientId: serializer.fromJson(json['budgetClientId']), + targetType: serializer.fromJson(json['targetType']), + targetClientId: serializer.fromJson(json['targetClientId']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'budgetClientId': serializer.toJson(budgetClientId), + 'targetType': serializer.toJson(targetType), + 'targetClientId': serializer.toJson(targetClientId), + }; + } + + BudgetTargetsData copyWith( + {String? budgetClientId, + String? targetType, + String? targetClientId}) => + BudgetTargetsData( + budgetClientId: budgetClientId ?? this.budgetClientId, + targetType: targetType ?? this.targetType, + targetClientId: targetClientId ?? this.targetClientId, + ); + BudgetTargetsData copyWithCompanion(BudgetTargetsCompanion data) { + return BudgetTargetsData( + budgetClientId: data.budgetClientId.present + ? data.budgetClientId.value + : this.budgetClientId, + targetType: + data.targetType.present ? data.targetType.value : this.targetType, + targetClientId: data.targetClientId.present + ? data.targetClientId.value + : this.targetClientId, + ); + } + + @override + String toString() { + return (StringBuffer('BudgetTargetsData(') + ..write('budgetClientId: $budgetClientId, ') + ..write('targetType: $targetType, ') + ..write('targetClientId: $targetClientId') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(budgetClientId, targetType, targetClientId); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BudgetTargetsData && + other.budgetClientId == this.budgetClientId && + other.targetType == this.targetType && + other.targetClientId == this.targetClientId); +} + +class BudgetTargetsCompanion extends UpdateCompanion { + final Value budgetClientId; + final Value targetType; + final Value targetClientId; + final Value rowid; + const BudgetTargetsCompanion({ + this.budgetClientId = const Value.absent(), + this.targetType = const Value.absent(), + this.targetClientId = const Value.absent(), + this.rowid = const Value.absent(), + }); + BudgetTargetsCompanion.insert({ + required String budgetClientId, + required String targetType, + required String targetClientId, + this.rowid = const Value.absent(), + }) : budgetClientId = Value(budgetClientId), + targetType = Value(targetType), + targetClientId = Value(targetClientId); + static Insertable custom({ + Expression? budgetClientId, + Expression? targetType, + Expression? targetClientId, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (budgetClientId != null) 'budget_client_id': budgetClientId, + if (targetType != null) 'target_type': targetType, + if (targetClientId != null) 'target_client_id': targetClientId, + if (rowid != null) 'rowid': rowid, + }); + } + + BudgetTargetsCompanion copyWith( + {Value? budgetClientId, + Value? targetType, + Value? targetClientId, + Value? rowid}) { + return BudgetTargetsCompanion( + budgetClientId: budgetClientId ?? this.budgetClientId, + targetType: targetType ?? this.targetType, + targetClientId: targetClientId ?? this.targetClientId, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (budgetClientId.present) { + map['budget_client_id'] = Variable(budgetClientId.value); + } + if (targetType.present) { + map['target_type'] = Variable(targetType.value); + } + if (targetClientId.present) { + map['target_client_id'] = Variable(targetClientId.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BudgetTargetsCompanion(') + ..write('budgetClientId: $budgetClientId, ') + ..write('targetType: $targetType, ') + ..write('targetClientId: $targetClientId, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class BudgetPeriodStates extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BudgetPeriodStates(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways('UNIQUE')); + late final GeneratedColumn userId = GeneratedColumn( + 'user_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn clientId = GeneratedColumn( + 'client_id', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'\'')); + late final GeneratedColumn rev = GeneratedColumn( + 'rev', aliasedName, true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'1\'')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn budgetClientId = GeneratedColumn( + 'budget_client_id', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES budgets (client_id)')); + late final GeneratedColumn periodStart = GeneratedColumn( + 'period_start', aliasedName, false, + type: DriftSqlType.dateTime, requiredDuringInsert: true); + late final GeneratedColumn periodEnd = GeneratedColumn( + 'period_end', aliasedName, false, + type: DriftSqlType.dateTime, requiredDuringInsert: true); + late final GeneratedColumn netSpent = GeneratedColumn( + 'net_spent', aliasedName, false, + type: DriftSqlType.double, + requiredDuringInsert: false, + defaultValue: const CustomExpression('0.0')); + late final GeneratedColumn rolloverIn = GeneratedColumn( + 'rollover_in', aliasedName, false, + type: DriftSqlType.double, + requiredDuringInsert: false, + defaultValue: const CustomExpression('0.0')); + late final GeneratedColumn rolloverOut = GeneratedColumn( + 'rollover_out', aliasedName, false, + type: DriftSqlType.double, + requiredDuringInsert: false, + defaultValue: const CustomExpression('0.0')); + late final GeneratedColumn closedAt = GeneratedColumn( + 'closed_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + @override + List get $columns => [ + id, + userId, + clientId, + rev, + createdAt, + updatedAt, + deletedAt, + lastSyncedAt, + budgetClientId, + periodStart, + periodEnd, + netSpent, + rolloverIn, + rolloverOut, + closedAt + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'budget_period_states'; + @override + Set get $primaryKey => {clientId}; + @override + BudgetPeriodStatesData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BudgetPeriodStatesData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id']), + userId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}user_id']), + clientId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}client_id'])!, + rev: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}rev']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + updatedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, + deletedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}deleted_at']), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_synced_at']), + budgetClientId: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}budget_client_id'])!, + periodStart: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}period_start'])!, + periodEnd: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}period_end'])!, + netSpent: attachedDatabase.typeMapping + .read(DriftSqlType.double, data['${effectivePrefix}net_spent'])!, + rolloverIn: attachedDatabase.typeMapping + .read(DriftSqlType.double, data['${effectivePrefix}rollover_in'])!, + rolloverOut: attachedDatabase.typeMapping + .read(DriftSqlType.double, data['${effectivePrefix}rollover_out'])!, + closedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}closed_at']), + ); + } + + @override + BudgetPeriodStates createAlias(String alias) { + return BudgetPeriodStates(attachedDatabase, alias); + } +} + +class BudgetPeriodStatesData extends DataClass + implements Insertable { + final int? id; + final int? userId; + final String clientId; + final String? rev; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final DateTime? lastSyncedAt; + final String budgetClientId; + final DateTime periodStart; + final DateTime periodEnd; + final double netSpent; + final double rolloverIn; + final double rolloverOut; + final DateTime? closedAt; + const BudgetPeriodStatesData( + {this.id, + this.userId, + required this.clientId, + this.rev, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + this.lastSyncedAt, + required this.budgetClientId, + required this.periodStart, + required this.periodEnd, + required this.netSpent, + required this.rolloverIn, + required this.rolloverOut, + this.closedAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (!nullToAbsent || id != null) { + map['id'] = Variable(id); + } + if (!nullToAbsent || userId != null) { + map['user_id'] = Variable(userId); + } + map['client_id'] = Variable(clientId); + if (!nullToAbsent || rev != null) { + map['rev'] = Variable(rev); + } + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + map['budget_client_id'] = Variable(budgetClientId); + map['period_start'] = Variable(periodStart); + map['period_end'] = Variable(periodEnd); + map['net_spent'] = Variable(netSpent); + map['rollover_in'] = Variable(rolloverIn); + map['rollover_out'] = Variable(rolloverOut); + if (!nullToAbsent || closedAt != null) { + map['closed_at'] = Variable(closedAt); + } + return map; + } + + BudgetPeriodStatesCompanion toCompanion(bool nullToAbsent) { + return BudgetPeriodStatesCompanion( + id: id == null && nullToAbsent ? const Value.absent() : Value(id), + userId: + userId == null && nullToAbsent ? const Value.absent() : Value(userId), + clientId: Value(clientId), + rev: rev == null && nullToAbsent ? const Value.absent() : Value(rev), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + budgetClientId: Value(budgetClientId), + periodStart: Value(periodStart), + periodEnd: Value(periodEnd), + netSpent: Value(netSpent), + rolloverIn: Value(rolloverIn), + rolloverOut: Value(rolloverOut), + closedAt: closedAt == null && nullToAbsent + ? const Value.absent() + : Value(closedAt), + ); + } + + factory BudgetPeriodStatesData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BudgetPeriodStatesData( + id: serializer.fromJson(json['id']), + userId: serializer.fromJson(json['userId']), + clientId: serializer.fromJson(json['clientId']), + rev: serializer.fromJson(json['rev']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + budgetClientId: serializer.fromJson(json['budgetClientId']), + periodStart: serializer.fromJson(json['periodStart']), + periodEnd: serializer.fromJson(json['periodEnd']), + netSpent: serializer.fromJson(json['netSpent']), + rolloverIn: serializer.fromJson(json['rolloverIn']), + rolloverOut: serializer.fromJson(json['rolloverOut']), + closedAt: serializer.fromJson(json['closedAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'userId': serializer.toJson(userId), + 'clientId': serializer.toJson(clientId), + 'rev': serializer.toJson(rev), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'budgetClientId': serializer.toJson(budgetClientId), + 'periodStart': serializer.toJson(periodStart), + 'periodEnd': serializer.toJson(periodEnd), + 'netSpent': serializer.toJson(netSpent), + 'rolloverIn': serializer.toJson(rolloverIn), + 'rolloverOut': serializer.toJson(rolloverOut), + 'closedAt': serializer.toJson(closedAt), + }; + } + + BudgetPeriodStatesData copyWith( + {Value id = const Value.absent(), + Value userId = const Value.absent(), + String? clientId, + Value rev = const Value.absent(), + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + String? budgetClientId, + DateTime? periodStart, + DateTime? periodEnd, + double? netSpent, + double? rolloverIn, + double? rolloverOut, + Value closedAt = const Value.absent()}) => + BudgetPeriodStatesData( + id: id.present ? id.value : this.id, + userId: userId.present ? userId.value : this.userId, + clientId: clientId ?? this.clientId, + rev: rev.present ? rev.value : this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + lastSyncedAt: + lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + budgetClientId: budgetClientId ?? this.budgetClientId, + periodStart: periodStart ?? this.periodStart, + periodEnd: periodEnd ?? this.periodEnd, + netSpent: netSpent ?? this.netSpent, + rolloverIn: rolloverIn ?? this.rolloverIn, + rolloverOut: rolloverOut ?? this.rolloverOut, + closedAt: closedAt.present ? closedAt.value : this.closedAt, + ); + BudgetPeriodStatesData copyWithCompanion(BudgetPeriodStatesCompanion data) { + return BudgetPeriodStatesData( + id: data.id.present ? data.id.value : this.id, + userId: data.userId.present ? data.userId.value : this.userId, + clientId: data.clientId.present ? data.clientId.value : this.clientId, + rev: data.rev.present ? data.rev.value : this.rev, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + budgetClientId: data.budgetClientId.present + ? data.budgetClientId.value + : this.budgetClientId, + periodStart: + data.periodStart.present ? data.periodStart.value : this.periodStart, + periodEnd: data.periodEnd.present ? data.periodEnd.value : this.periodEnd, + netSpent: data.netSpent.present ? data.netSpent.value : this.netSpent, + rolloverIn: + data.rolloverIn.present ? data.rolloverIn.value : this.rolloverIn, + rolloverOut: + data.rolloverOut.present ? data.rolloverOut.value : this.rolloverOut, + closedAt: data.closedAt.present ? data.closedAt.value : this.closedAt, + ); + } + + @override + String toString() { + return (StringBuffer('BudgetPeriodStatesData(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('budgetClientId: $budgetClientId, ') + ..write('periodStart: $periodStart, ') + ..write('periodEnd: $periodEnd, ') + ..write('netSpent: $netSpent, ') + ..write('rolloverIn: $rolloverIn, ') + ..write('rolloverOut: $rolloverOut, ') + ..write('closedAt: $closedAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + id, + userId, + clientId, + rev, + createdAt, + updatedAt, + deletedAt, + lastSyncedAt, + budgetClientId, + periodStart, + periodEnd, + netSpent, + rolloverIn, + rolloverOut, + closedAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BudgetPeriodStatesData && + other.id == this.id && + other.userId == this.userId && + other.clientId == this.clientId && + other.rev == this.rev && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.lastSyncedAt == this.lastSyncedAt && + other.budgetClientId == this.budgetClientId && + other.periodStart == this.periodStart && + other.periodEnd == this.periodEnd && + other.netSpent == this.netSpent && + other.rolloverIn == this.rolloverIn && + other.rolloverOut == this.rolloverOut && + other.closedAt == this.closedAt); +} + +class BudgetPeriodStatesCompanion + extends UpdateCompanion { + final Value id; + final Value userId; + final Value clientId; + final Value rev; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value lastSyncedAt; + final Value budgetClientId; + final Value periodStart; + final Value periodEnd; + final Value netSpent; + final Value rolloverIn; + final Value rolloverOut; + final Value closedAt; + final Value rowid; + const BudgetPeriodStatesCompanion({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.budgetClientId = const Value.absent(), + this.periodStart = const Value.absent(), + this.periodEnd = const Value.absent(), + this.netSpent = const Value.absent(), + this.rolloverIn = const Value.absent(), + this.rolloverOut = const Value.absent(), + this.closedAt = const Value.absent(), + this.rowid = const Value.absent(), + }); + BudgetPeriodStatesCompanion.insert({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + required String budgetClientId, + required DateTime periodStart, + required DateTime periodEnd, + this.netSpent = const Value.absent(), + this.rolloverIn = const Value.absent(), + this.rolloverOut = const Value.absent(), + this.closedAt = const Value.absent(), + this.rowid = const Value.absent(), + }) : budgetClientId = Value(budgetClientId), + periodStart = Value(periodStart), + periodEnd = Value(periodEnd); + static Insertable custom({ + Expression? id, + Expression? userId, + Expression? clientId, + Expression? rev, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? lastSyncedAt, + Expression? budgetClientId, + Expression? periodStart, + Expression? periodEnd, + Expression? netSpent, + Expression? rolloverIn, + Expression? rolloverOut, + Expression? closedAt, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (userId != null) 'user_id': userId, + if (clientId != null) 'client_id': clientId, + if (rev != null) 'rev': rev, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (budgetClientId != null) 'budget_client_id': budgetClientId, + if (periodStart != null) 'period_start': periodStart, + if (periodEnd != null) 'period_end': periodEnd, + if (netSpent != null) 'net_spent': netSpent, + if (rolloverIn != null) 'rollover_in': rolloverIn, + if (rolloverOut != null) 'rollover_out': rolloverOut, + if (closedAt != null) 'closed_at': closedAt, + if (rowid != null) 'rowid': rowid, + }); + } + + BudgetPeriodStatesCompanion copyWith( + {Value? id, + Value? userId, + Value? clientId, + Value? rev, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? lastSyncedAt, + Value? budgetClientId, + Value? periodStart, + Value? periodEnd, + Value? netSpent, + Value? rolloverIn, + Value? rolloverOut, + Value? closedAt, + Value? rowid}) { + return BudgetPeriodStatesCompanion( + id: id ?? this.id, + userId: userId ?? this.userId, + clientId: clientId ?? this.clientId, + rev: rev ?? this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + budgetClientId: budgetClientId ?? this.budgetClientId, + periodStart: periodStart ?? this.periodStart, + periodEnd: periodEnd ?? this.periodEnd, + netSpent: netSpent ?? this.netSpent, + rolloverIn: rolloverIn ?? this.rolloverIn, + rolloverOut: rolloverOut ?? this.rolloverOut, + closedAt: closedAt ?? this.closedAt, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (userId.present) { + map['user_id'] = Variable(userId.value); + } + if (clientId.present) { + map['client_id'] = Variable(clientId.value); + } + if (rev.present) { + map['rev'] = Variable(rev.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (budgetClientId.present) { + map['budget_client_id'] = Variable(budgetClientId.value); + } + if (periodStart.present) { + map['period_start'] = Variable(periodStart.value); + } + if (periodEnd.present) { + map['period_end'] = Variable(periodEnd.value); + } + if (netSpent.present) { + map['net_spent'] = Variable(netSpent.value); + } + if (rolloverIn.present) { + map['rollover_in'] = Variable(rolloverIn.value); + } + if (rolloverOut.present) { + map['rollover_out'] = Variable(rolloverOut.value); + } + if (closedAt.present) { + map['closed_at'] = Variable(closedAt.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BudgetPeriodStatesCompanion(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('budgetClientId: $budgetClientId, ') + ..write('periodStart: $periodStart, ') + ..write('periodEnd: $periodEnd, ') + ..write('netSpent: $netSpent, ') + ..write('rolloverIn: $rolloverIn, ') + ..write('rolloverOut: $rolloverOut, ') + ..write('closedAt: $closedAt, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class Holdings extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Holdings(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn name = GeneratedColumn( + 'name', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn symbol = GeneratedColumn( + 'symbol', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn quantity = GeneratedColumn( + 'quantity', aliasedName, false, + type: DriftSqlType.double, + requiredDuringInsert: false, + defaultValue: const CustomExpression('0.0')); + late final GeneratedColumn currency = GeneratedColumn( + 'currency', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn unitPrice = GeneratedColumn( + 'unit_price', aliasedName, false, + type: DriftSqlType.double, + requiredDuringInsert: false, + defaultValue: const CustomExpression('0.0')); + late final GeneratedColumn value = GeneratedColumn( + 'value', aliasedName, false, + type: DriftSqlType.double, + requiredDuringInsert: false, + defaultValue: const CustomExpression('0.0')); + late final GeneratedColumn priceSource = GeneratedColumn( + 'price_source', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'manual\'')); + late final GeneratedColumn provider = GeneratedColumn( + 'provider', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn externalRef = GeneratedColumn( + 'external_ref', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn lastPricedAt = GeneratedColumn( + 'last_priced_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + @override + List get $columns => [ + id, + name, + symbol, + quantity, + currency, + unitPrice, + value, + priceSource, + provider, + externalRef, + lastPricedAt + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'holdings'; + @override + Set get $primaryKey => {id}; + @override + HoldingsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return HoldingsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + name: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}name'])!, + symbol: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}symbol']), + quantity: attachedDatabase.typeMapping + .read(DriftSqlType.double, data['${effectivePrefix}quantity'])!, + currency: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}currency'])!, + unitPrice: attachedDatabase.typeMapping + .read(DriftSqlType.double, data['${effectivePrefix}unit_price'])!, + value: attachedDatabase.typeMapping + .read(DriftSqlType.double, data['${effectivePrefix}value'])!, + priceSource: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}price_source'])!, + provider: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}provider']), + externalRef: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}external_ref']), + lastPricedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_priced_at']), + ); + } + + @override + Holdings createAlias(String alias) { + return Holdings(attachedDatabase, alias); + } +} + +class HoldingsData extends DataClass implements Insertable { + final int id; + final String name; + final String? symbol; + final double quantity; + final String currency; + final double unitPrice; + final double value; + final String priceSource; + final String? provider; + final String? externalRef; + final DateTime? lastPricedAt; + const HoldingsData( + {required this.id, + required this.name, + this.symbol, + required this.quantity, + required this.currency, + required this.unitPrice, + required this.value, + required this.priceSource, + this.provider, + this.externalRef, + this.lastPricedAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['name'] = Variable(name); + if (!nullToAbsent || symbol != null) { + map['symbol'] = Variable(symbol); + } + map['quantity'] = Variable(quantity); + map['currency'] = Variable(currency); + map['unit_price'] = Variable(unitPrice); + map['value'] = Variable(value); + map['price_source'] = Variable(priceSource); + if (!nullToAbsent || provider != null) { + map['provider'] = Variable(provider); + } + if (!nullToAbsent || externalRef != null) { + map['external_ref'] = Variable(externalRef); + } + if (!nullToAbsent || lastPricedAt != null) { + map['last_priced_at'] = Variable(lastPricedAt); + } + return map; + } + + HoldingsCompanion toCompanion(bool nullToAbsent) { + return HoldingsCompanion( + id: Value(id), + name: Value(name), + symbol: + symbol == null && nullToAbsent ? const Value.absent() : Value(symbol), + quantity: Value(quantity), + currency: Value(currency), + unitPrice: Value(unitPrice), + value: Value(value), + priceSource: Value(priceSource), + provider: provider == null && nullToAbsent + ? const Value.absent() + : Value(provider), + externalRef: externalRef == null && nullToAbsent + ? const Value.absent() + : Value(externalRef), + lastPricedAt: lastPricedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastPricedAt), + ); + } + + factory HoldingsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return HoldingsData( + id: serializer.fromJson(json['id']), + name: serializer.fromJson(json['name']), + symbol: serializer.fromJson(json['symbol']), + quantity: serializer.fromJson(json['quantity']), + currency: serializer.fromJson(json['currency']), + unitPrice: serializer.fromJson(json['unitPrice']), + value: serializer.fromJson(json['value']), + priceSource: serializer.fromJson(json['priceSource']), + provider: serializer.fromJson(json['provider']), + externalRef: serializer.fromJson(json['externalRef']), + lastPricedAt: serializer.fromJson(json['lastPricedAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'name': serializer.toJson(name), + 'symbol': serializer.toJson(symbol), + 'quantity': serializer.toJson(quantity), + 'currency': serializer.toJson(currency), + 'unitPrice': serializer.toJson(unitPrice), + 'value': serializer.toJson(value), + 'priceSource': serializer.toJson(priceSource), + 'provider': serializer.toJson(provider), + 'externalRef': serializer.toJson(externalRef), + 'lastPricedAt': serializer.toJson(lastPricedAt), + }; + } + + HoldingsData copyWith( + {int? id, + String? name, + Value symbol = const Value.absent(), + double? quantity, + String? currency, + double? unitPrice, + double? value, + String? priceSource, + Value provider = const Value.absent(), + Value externalRef = const Value.absent(), + Value lastPricedAt = const Value.absent()}) => + HoldingsData( + id: id ?? this.id, + name: name ?? this.name, + symbol: symbol.present ? symbol.value : this.symbol, + quantity: quantity ?? this.quantity, + currency: currency ?? this.currency, + unitPrice: unitPrice ?? this.unitPrice, + value: value ?? this.value, + priceSource: priceSource ?? this.priceSource, + provider: provider.present ? provider.value : this.provider, + externalRef: externalRef.present ? externalRef.value : this.externalRef, + lastPricedAt: + lastPricedAt.present ? lastPricedAt.value : this.lastPricedAt, + ); + HoldingsData copyWithCompanion(HoldingsCompanion data) { + return HoldingsData( + id: data.id.present ? data.id.value : this.id, + name: data.name.present ? data.name.value : this.name, + symbol: data.symbol.present ? data.symbol.value : this.symbol, + quantity: data.quantity.present ? data.quantity.value : this.quantity, + currency: data.currency.present ? data.currency.value : this.currency, + unitPrice: data.unitPrice.present ? data.unitPrice.value : this.unitPrice, + value: data.value.present ? data.value.value : this.value, + priceSource: + data.priceSource.present ? data.priceSource.value : this.priceSource, + provider: data.provider.present ? data.provider.value : this.provider, + externalRef: + data.externalRef.present ? data.externalRef.value : this.externalRef, + lastPricedAt: data.lastPricedAt.present + ? data.lastPricedAt.value + : this.lastPricedAt, + ); + } + + @override + String toString() { + return (StringBuffer('HoldingsData(') + ..write('id: $id, ') + ..write('name: $name, ') + ..write('symbol: $symbol, ') + ..write('quantity: $quantity, ') + ..write('currency: $currency, ') + ..write('unitPrice: $unitPrice, ') + ..write('value: $value, ') + ..write('priceSource: $priceSource, ') + ..write('provider: $provider, ') + ..write('externalRef: $externalRef, ') + ..write('lastPricedAt: $lastPricedAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, name, symbol, quantity, currency, + unitPrice, value, priceSource, provider, externalRef, lastPricedAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is HoldingsData && + other.id == this.id && + other.name == this.name && + other.symbol == this.symbol && + other.quantity == this.quantity && + other.currency == this.currency && + other.unitPrice == this.unitPrice && + other.value == this.value && + other.priceSource == this.priceSource && + other.provider == this.provider && + other.externalRef == this.externalRef && + other.lastPricedAt == this.lastPricedAt); +} + +class HoldingsCompanion extends UpdateCompanion { + final Value id; + final Value name; + final Value symbol; + final Value quantity; + final Value currency; + final Value unitPrice; + final Value value; + final Value priceSource; + final Value provider; + final Value externalRef; + final Value lastPricedAt; + const HoldingsCompanion({ + this.id = const Value.absent(), + this.name = const Value.absent(), + this.symbol = const Value.absent(), + this.quantity = const Value.absent(), + this.currency = const Value.absent(), + this.unitPrice = const Value.absent(), + this.value = const Value.absent(), + this.priceSource = const Value.absent(), + this.provider = const Value.absent(), + this.externalRef = const Value.absent(), + this.lastPricedAt = const Value.absent(), + }); + HoldingsCompanion.insert({ + this.id = const Value.absent(), + required String name, + this.symbol = const Value.absent(), + this.quantity = const Value.absent(), + required String currency, + this.unitPrice = const Value.absent(), + this.value = const Value.absent(), + this.priceSource = const Value.absent(), + this.provider = const Value.absent(), + this.externalRef = const Value.absent(), + this.lastPricedAt = const Value.absent(), + }) : name = Value(name), + currency = Value(currency); + static Insertable custom({ + Expression? id, + Expression? name, + Expression? symbol, + Expression? quantity, + Expression? currency, + Expression? unitPrice, + Expression? value, + Expression? priceSource, + Expression? provider, + Expression? externalRef, + Expression? lastPricedAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (name != null) 'name': name, + if (symbol != null) 'symbol': symbol, + if (quantity != null) 'quantity': quantity, + if (currency != null) 'currency': currency, + if (unitPrice != null) 'unit_price': unitPrice, + if (value != null) 'value': value, + if (priceSource != null) 'price_source': priceSource, + if (provider != null) 'provider': provider, + if (externalRef != null) 'external_ref': externalRef, + if (lastPricedAt != null) 'last_priced_at': lastPricedAt, + }); + } + + HoldingsCompanion copyWith( + {Value? id, + Value? name, + Value? symbol, + Value? quantity, + Value? currency, + Value? unitPrice, + Value? value, + Value? priceSource, + Value? provider, + Value? externalRef, + Value? lastPricedAt}) { + return HoldingsCompanion( + id: id ?? this.id, + name: name ?? this.name, + symbol: symbol ?? this.symbol, + quantity: quantity ?? this.quantity, + currency: currency ?? this.currency, + unitPrice: unitPrice ?? this.unitPrice, + value: value ?? this.value, + priceSource: priceSource ?? this.priceSource, + provider: provider ?? this.provider, + externalRef: externalRef ?? this.externalRef, + lastPricedAt: lastPricedAt ?? this.lastPricedAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (name.present) { + map['name'] = Variable(name.value); + } + if (symbol.present) { + map['symbol'] = Variable(symbol.value); + } + if (quantity.present) { + map['quantity'] = Variable(quantity.value); + } + if (currency.present) { + map['currency'] = Variable(currency.value); + } + if (unitPrice.present) { + map['unit_price'] = Variable(unitPrice.value); + } + if (value.present) { + map['value'] = Variable(value.value); + } + if (priceSource.present) { + map['price_source'] = Variable(priceSource.value); + } + if (provider.present) { + map['provider'] = Variable(provider.value); + } + if (externalRef.present) { + map['external_ref'] = Variable(externalRef.value); + } + if (lastPricedAt.present) { + map['last_priced_at'] = Variable(lastPricedAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('HoldingsCompanion(') + ..write('id: $id, ') + ..write('name: $name, ') + ..write('symbol: $symbol, ') + ..write('quantity: $quantity, ') + ..write('currency: $currency, ') + ..write('unitPrice: $unitPrice, ') + ..write('value: $value, ') + ..write('priceSource: $priceSource, ') + ..write('provider: $provider, ') + ..write('externalRef: $externalRef, ') + ..write('lastPricedAt: $lastPricedAt') + ..write(')')) + .toString(); + } +} + +class FinancialPositionCache extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + FinancialPositionCache(this.attachedDatabase, [this._alias]); + late final GeneratedColumn cacheKey = GeneratedColumn( + 'cache_key', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn payload = GeneratedColumn( + 'payload', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn currency = GeneratedColumn( + 'currency', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn fetchedAt = GeneratedColumn( + 'fetched_at', aliasedName, false, + type: DriftSqlType.dateTime, requiredDuringInsert: true); + @override + List get $columns => + [cacheKey, payload, currency, fetchedAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'financial_position_cache'; + @override + Set get $primaryKey => {cacheKey}; + @override + FinancialPositionCacheData map(Map data, + {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return FinancialPositionCacheData( + cacheKey: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}cache_key'])!, + payload: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}payload'])!, + currency: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}currency']), + fetchedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}fetched_at'])!, + ); + } + + @override + FinancialPositionCache createAlias(String alias) { + return FinancialPositionCache(attachedDatabase, alias); + } +} + +class FinancialPositionCacheData extends DataClass + implements Insertable { + final String cacheKey; + final String payload; + final String? currency; + final DateTime fetchedAt; + const FinancialPositionCacheData( + {required this.cacheKey, + required this.payload, + this.currency, + required this.fetchedAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['cache_key'] = Variable(cacheKey); + map['payload'] = Variable(payload); + if (!nullToAbsent || currency != null) { + map['currency'] = Variable(currency); + } + map['fetched_at'] = Variable(fetchedAt); + return map; + } + + FinancialPositionCacheCompanion toCompanion(bool nullToAbsent) { + return FinancialPositionCacheCompanion( + cacheKey: Value(cacheKey), + payload: Value(payload), + currency: currency == null && nullToAbsent + ? const Value.absent() + : Value(currency), + fetchedAt: Value(fetchedAt), + ); + } + + factory FinancialPositionCacheData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return FinancialPositionCacheData( + cacheKey: serializer.fromJson(json['cacheKey']), + payload: serializer.fromJson(json['payload']), + currency: serializer.fromJson(json['currency']), + fetchedAt: serializer.fromJson(json['fetchedAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'cacheKey': serializer.toJson(cacheKey), + 'payload': serializer.toJson(payload), + 'currency': serializer.toJson(currency), + 'fetchedAt': serializer.toJson(fetchedAt), + }; + } + + FinancialPositionCacheData copyWith( + {String? cacheKey, + String? payload, + Value currency = const Value.absent(), + DateTime? fetchedAt}) => + FinancialPositionCacheData( + cacheKey: cacheKey ?? this.cacheKey, + payload: payload ?? this.payload, + currency: currency.present ? currency.value : this.currency, + fetchedAt: fetchedAt ?? this.fetchedAt, + ); + FinancialPositionCacheData copyWithCompanion( + FinancialPositionCacheCompanion data) { + return FinancialPositionCacheData( + cacheKey: data.cacheKey.present ? data.cacheKey.value : this.cacheKey, + payload: data.payload.present ? data.payload.value : this.payload, + currency: data.currency.present ? data.currency.value : this.currency, + fetchedAt: data.fetchedAt.present ? data.fetchedAt.value : this.fetchedAt, + ); + } + + @override + String toString() { + return (StringBuffer('FinancialPositionCacheData(') + ..write('cacheKey: $cacheKey, ') + ..write('payload: $payload, ') + ..write('currency: $currency, ') + ..write('fetchedAt: $fetchedAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(cacheKey, payload, currency, fetchedAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is FinancialPositionCacheData && + other.cacheKey == this.cacheKey && + other.payload == this.payload && + other.currency == this.currency && + other.fetchedAt == this.fetchedAt); +} + +class FinancialPositionCacheCompanion + extends UpdateCompanion { + final Value cacheKey; + final Value payload; + final Value currency; + final Value fetchedAt; + final Value rowid; + const FinancialPositionCacheCompanion({ + this.cacheKey = const Value.absent(), + this.payload = const Value.absent(), + this.currency = const Value.absent(), + this.fetchedAt = const Value.absent(), + this.rowid = const Value.absent(), + }); + FinancialPositionCacheCompanion.insert({ + required String cacheKey, + required String payload, + this.currency = const Value.absent(), + required DateTime fetchedAt, + this.rowid = const Value.absent(), + }) : cacheKey = Value(cacheKey), + payload = Value(payload), + fetchedAt = Value(fetchedAt); + static Insertable custom({ + Expression? cacheKey, + Expression? payload, + Expression? currency, + Expression? fetchedAt, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (cacheKey != null) 'cache_key': cacheKey, + if (payload != null) 'payload': payload, + if (currency != null) 'currency': currency, + if (fetchedAt != null) 'fetched_at': fetchedAt, + if (rowid != null) 'rowid': rowid, + }); + } + + FinancialPositionCacheCompanion copyWith( + {Value? cacheKey, + Value? payload, + Value? currency, + Value? fetchedAt, + Value? rowid}) { + return FinancialPositionCacheCompanion( + cacheKey: cacheKey ?? this.cacheKey, + payload: payload ?? this.payload, + currency: currency ?? this.currency, + fetchedAt: fetchedAt ?? this.fetchedAt, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (cacheKey.present) { + map['cache_key'] = Variable(cacheKey.value); + } + if (payload.present) { + map['payload'] = Variable(payload.value); + } + if (currency.present) { + map['currency'] = Variable(currency.value); + } + if (fetchedAt.present) { + map['fetched_at'] = Variable(fetchedAt.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('FinancialPositionCacheCompanion(') + ..write('cacheKey: $cacheKey, ') + ..write('payload: $payload, ') + ..write('currency: $currency, ') + ..write('fetchedAt: $fetchedAt, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class Reminders extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Reminders(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways('UNIQUE')); + late final GeneratedColumn userId = GeneratedColumn( + 'user_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn clientId = GeneratedColumn( + 'client_id', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'\'')); + late final GeneratedColumn rev = GeneratedColumn( + 'rev', aliasedName, true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'1\'')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'description', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'custom\'')); + late final GeneratedColumn triggerAt = GeneratedColumn( + 'trigger_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn dueAt = GeneratedColumn( + 'due_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn repeatRule = GeneratedColumn( + 'repeat_rule', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn timezone = GeneratedColumn( + 'timezone', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn status = GeneratedColumn( + 'status', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'active\'')); + late final GeneratedColumn priority = GeneratedColumn( + 'priority', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const CustomExpression('0')); + late final GeneratedColumn snoozedUntil = GeneratedColumn( + 'snoozed_until', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastTriggeredAt = + GeneratedColumn('last_triggered_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn nextTriggerAt = + GeneratedColumn('next_trigger_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + @override + List get $columns => [ + id, + userId, + clientId, + rev, + createdAt, + updatedAt, + deletedAt, + lastSyncedAt, + title, + description, + type, + triggerAt, + dueAt, + repeatRule, + timezone, + status, + priority, + snoozedUntil, + lastTriggeredAt, + nextTriggerAt + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'reminders'; + @override + Set get $primaryKey => {clientId}; + @override + RemindersData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return RemindersData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id']), + userId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}user_id']), + clientId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}client_id'])!, + rev: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}rev']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + updatedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, + deletedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}deleted_at']), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_synced_at']), + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}description']), + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type'])!, + triggerAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}trigger_at']), + dueAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}due_at']), + repeatRule: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}repeat_rule']), + timezone: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}timezone']), + status: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}status'])!, + priority: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}priority'])!, + snoozedUntil: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}snoozed_until']), + lastTriggeredAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_triggered_at']), + nextTriggerAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}next_trigger_at']), + ); + } + + @override + Reminders createAlias(String alias) { + return Reminders(attachedDatabase, alias); + } +} + +class RemindersData extends DataClass implements Insertable { + final int? id; + final int? userId; + final String clientId; + final String? rev; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final DateTime? lastSyncedAt; + final String title; + final String? description; + final String type; + final DateTime? triggerAt; + final DateTime? dueAt; + final String? repeatRule; + final String? timezone; + final String status; + final int priority; + final DateTime? snoozedUntil; + final DateTime? lastTriggeredAt; + final DateTime? nextTriggerAt; + const RemindersData( + {this.id, + this.userId, + required this.clientId, + this.rev, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + this.lastSyncedAt, + required this.title, + this.description, + required this.type, + this.triggerAt, + this.dueAt, + this.repeatRule, + this.timezone, + required this.status, + required this.priority, + this.snoozedUntil, + this.lastTriggeredAt, + this.nextTriggerAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (!nullToAbsent || id != null) { + map['id'] = Variable(id); + } + if (!nullToAbsent || userId != null) { + map['user_id'] = Variable(userId); + } + map['client_id'] = Variable(clientId); + if (!nullToAbsent || rev != null) { + map['rev'] = Variable(rev); + } + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + map['title'] = Variable(title); + if (!nullToAbsent || description != null) { + map['description'] = Variable(description); + } + map['type'] = Variable(type); + if (!nullToAbsent || triggerAt != null) { + map['trigger_at'] = Variable(triggerAt); + } + if (!nullToAbsent || dueAt != null) { + map['due_at'] = Variable(dueAt); + } + if (!nullToAbsent || repeatRule != null) { + map['repeat_rule'] = Variable(repeatRule); + } + if (!nullToAbsent || timezone != null) { + map['timezone'] = Variable(timezone); + } + map['status'] = Variable(status); + map['priority'] = Variable(priority); + if (!nullToAbsent || snoozedUntil != null) { + map['snoozed_until'] = Variable(snoozedUntil); + } + if (!nullToAbsent || lastTriggeredAt != null) { + map['last_triggered_at'] = Variable(lastTriggeredAt); + } + if (!nullToAbsent || nextTriggerAt != null) { + map['next_trigger_at'] = Variable(nextTriggerAt); + } + return map; + } + + RemindersCompanion toCompanion(bool nullToAbsent) { + return RemindersCompanion( + id: id == null && nullToAbsent ? const Value.absent() : Value(id), + userId: + userId == null && nullToAbsent ? const Value.absent() : Value(userId), + clientId: Value(clientId), + rev: rev == null && nullToAbsent ? const Value.absent() : Value(rev), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + title: Value(title), + description: description == null && nullToAbsent + ? const Value.absent() + : Value(description), + type: Value(type), + triggerAt: triggerAt == null && nullToAbsent + ? const Value.absent() + : Value(triggerAt), + dueAt: + dueAt == null && nullToAbsent ? const Value.absent() : Value(dueAt), + repeatRule: repeatRule == null && nullToAbsent + ? const Value.absent() + : Value(repeatRule), + timezone: timezone == null && nullToAbsent + ? const Value.absent() + : Value(timezone), + status: Value(status), + priority: Value(priority), + snoozedUntil: snoozedUntil == null && nullToAbsent + ? const Value.absent() + : Value(snoozedUntil), + lastTriggeredAt: lastTriggeredAt == null && nullToAbsent + ? const Value.absent() + : Value(lastTriggeredAt), + nextTriggerAt: nextTriggerAt == null && nullToAbsent + ? const Value.absent() + : Value(nextTriggerAt), + ); + } + + factory RemindersData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return RemindersData( + id: serializer.fromJson(json['id']), + userId: serializer.fromJson(json['userId']), + clientId: serializer.fromJson(json['clientId']), + rev: serializer.fromJson(json['rev']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + title: serializer.fromJson(json['title']), + description: serializer.fromJson(json['description']), + type: serializer.fromJson(json['type']), + triggerAt: serializer.fromJson(json['triggerAt']), + dueAt: serializer.fromJson(json['dueAt']), + repeatRule: serializer.fromJson(json['repeatRule']), + timezone: serializer.fromJson(json['timezone']), + status: serializer.fromJson(json['status']), + priority: serializer.fromJson(json['priority']), + snoozedUntil: serializer.fromJson(json['snoozedUntil']), + lastTriggeredAt: serializer.fromJson(json['lastTriggeredAt']), + nextTriggerAt: serializer.fromJson(json['nextTriggerAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'userId': serializer.toJson(userId), + 'clientId': serializer.toJson(clientId), + 'rev': serializer.toJson(rev), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'title': serializer.toJson(title), + 'description': serializer.toJson(description), + 'type': serializer.toJson(type), + 'triggerAt': serializer.toJson(triggerAt), + 'dueAt': serializer.toJson(dueAt), + 'repeatRule': serializer.toJson(repeatRule), + 'timezone': serializer.toJson(timezone), + 'status': serializer.toJson(status), + 'priority': serializer.toJson(priority), + 'snoozedUntil': serializer.toJson(snoozedUntil), + 'lastTriggeredAt': serializer.toJson(lastTriggeredAt), + 'nextTriggerAt': serializer.toJson(nextTriggerAt), + }; + } + + RemindersData copyWith( + {Value id = const Value.absent(), + Value userId = const Value.absent(), + String? clientId, + Value rev = const Value.absent(), + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + String? title, + Value description = const Value.absent(), + String? type, + Value triggerAt = const Value.absent(), + Value dueAt = const Value.absent(), + Value repeatRule = const Value.absent(), + Value timezone = const Value.absent(), + String? status, + int? priority, + Value snoozedUntil = const Value.absent(), + Value lastTriggeredAt = const Value.absent(), + Value nextTriggerAt = const Value.absent()}) => + RemindersData( + id: id.present ? id.value : this.id, + userId: userId.present ? userId.value : this.userId, + clientId: clientId ?? this.clientId, + rev: rev.present ? rev.value : this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + lastSyncedAt: + lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + title: title ?? this.title, + description: description.present ? description.value : this.description, + type: type ?? this.type, + triggerAt: triggerAt.present ? triggerAt.value : this.triggerAt, + dueAt: dueAt.present ? dueAt.value : this.dueAt, + repeatRule: repeatRule.present ? repeatRule.value : this.repeatRule, + timezone: timezone.present ? timezone.value : this.timezone, + status: status ?? this.status, + priority: priority ?? this.priority, + snoozedUntil: + snoozedUntil.present ? snoozedUntil.value : this.snoozedUntil, + lastTriggeredAt: lastTriggeredAt.present + ? lastTriggeredAt.value + : this.lastTriggeredAt, + nextTriggerAt: + nextTriggerAt.present ? nextTriggerAt.value : this.nextTriggerAt, + ); + RemindersData copyWithCompanion(RemindersCompanion data) { + return RemindersData( + id: data.id.present ? data.id.value : this.id, + userId: data.userId.present ? data.userId.value : this.userId, + clientId: data.clientId.present ? data.clientId.value : this.clientId, + rev: data.rev.present ? data.rev.value : this.rev, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + title: data.title.present ? data.title.value : this.title, + description: + data.description.present ? data.description.value : this.description, + type: data.type.present ? data.type.value : this.type, + triggerAt: data.triggerAt.present ? data.triggerAt.value : this.triggerAt, + dueAt: data.dueAt.present ? data.dueAt.value : this.dueAt, + repeatRule: + data.repeatRule.present ? data.repeatRule.value : this.repeatRule, + timezone: data.timezone.present ? data.timezone.value : this.timezone, + status: data.status.present ? data.status.value : this.status, + priority: data.priority.present ? data.priority.value : this.priority, + snoozedUntil: data.snoozedUntil.present + ? data.snoozedUntil.value + : this.snoozedUntil, + lastTriggeredAt: data.lastTriggeredAt.present + ? data.lastTriggeredAt.value + : this.lastTriggeredAt, + nextTriggerAt: data.nextTriggerAt.present + ? data.nextTriggerAt.value + : this.nextTriggerAt, + ); + } + + @override + String toString() { + return (StringBuffer('RemindersData(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('type: $type, ') + ..write('triggerAt: $triggerAt, ') + ..write('dueAt: $dueAt, ') + ..write('repeatRule: $repeatRule, ') + ..write('timezone: $timezone, ') + ..write('status: $status, ') + ..write('priority: $priority, ') + ..write('snoozedUntil: $snoozedUntil, ') + ..write('lastTriggeredAt: $lastTriggeredAt, ') + ..write('nextTriggerAt: $nextTriggerAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + id, + userId, + clientId, + rev, + createdAt, + updatedAt, + deletedAt, + lastSyncedAt, + title, + description, + type, + triggerAt, + dueAt, + repeatRule, + timezone, + status, + priority, + snoozedUntil, + lastTriggeredAt, + nextTriggerAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is RemindersData && + other.id == this.id && + other.userId == this.userId && + other.clientId == this.clientId && + other.rev == this.rev && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.lastSyncedAt == this.lastSyncedAt && + other.title == this.title && + other.description == this.description && + other.type == this.type && + other.triggerAt == this.triggerAt && + other.dueAt == this.dueAt && + other.repeatRule == this.repeatRule && + other.timezone == this.timezone && + other.status == this.status && + other.priority == this.priority && + other.snoozedUntil == this.snoozedUntil && + other.lastTriggeredAt == this.lastTriggeredAt && + other.nextTriggerAt == this.nextTriggerAt); +} + +class RemindersCompanion extends UpdateCompanion { + final Value id; + final Value userId; + final Value clientId; + final Value rev; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value lastSyncedAt; + final Value title; + final Value description; + final Value type; + final Value triggerAt; + final Value dueAt; + final Value repeatRule; + final Value timezone; + final Value status; + final Value priority; + final Value snoozedUntil; + final Value lastTriggeredAt; + final Value nextTriggerAt; + final Value rowid; + const RemindersCompanion({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.title = const Value.absent(), + this.description = const Value.absent(), + this.type = const Value.absent(), + this.triggerAt = const Value.absent(), + this.dueAt = const Value.absent(), + this.repeatRule = const Value.absent(), + this.timezone = const Value.absent(), + this.status = const Value.absent(), + this.priority = const Value.absent(), + this.snoozedUntil = const Value.absent(), + this.lastTriggeredAt = const Value.absent(), + this.nextTriggerAt = const Value.absent(), + this.rowid = const Value.absent(), + }); + RemindersCompanion.insert({ + this.id = const Value.absent(), + this.userId = const Value.absent(), + this.clientId = const Value.absent(), + this.rev = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + required String title, + this.description = const Value.absent(), + this.type = const Value.absent(), + this.triggerAt = const Value.absent(), + this.dueAt = const Value.absent(), + this.repeatRule = const Value.absent(), + this.timezone = const Value.absent(), + this.status = const Value.absent(), + this.priority = const Value.absent(), + this.snoozedUntil = const Value.absent(), + this.lastTriggeredAt = const Value.absent(), + this.nextTriggerAt = const Value.absent(), + this.rowid = const Value.absent(), + }) : title = Value(title); + static Insertable custom({ + Expression? id, + Expression? userId, + Expression? clientId, + Expression? rev, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? lastSyncedAt, + Expression? title, + Expression? description, + Expression? type, + Expression? triggerAt, + Expression? dueAt, + Expression? repeatRule, + Expression? timezone, + Expression? status, + Expression? priority, + Expression? snoozedUntil, + Expression? lastTriggeredAt, + Expression? nextTriggerAt, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (userId != null) 'user_id': userId, + if (clientId != null) 'client_id': clientId, + if (rev != null) 'rev': rev, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (title != null) 'title': title, + if (description != null) 'description': description, + if (type != null) 'type': type, + if (triggerAt != null) 'trigger_at': triggerAt, + if (dueAt != null) 'due_at': dueAt, + if (repeatRule != null) 'repeat_rule': repeatRule, + if (timezone != null) 'timezone': timezone, + if (status != null) 'status': status, + if (priority != null) 'priority': priority, + if (snoozedUntil != null) 'snoozed_until': snoozedUntil, + if (lastTriggeredAt != null) 'last_triggered_at': lastTriggeredAt, + if (nextTriggerAt != null) 'next_trigger_at': nextTriggerAt, + if (rowid != null) 'rowid': rowid, + }); + } + + RemindersCompanion copyWith( + {Value? id, + Value? userId, + Value? clientId, + Value? rev, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? lastSyncedAt, + Value? title, + Value? description, + Value? type, + Value? triggerAt, + Value? dueAt, + Value? repeatRule, + Value? timezone, + Value? status, + Value? priority, + Value? snoozedUntil, + Value? lastTriggeredAt, + Value? nextTriggerAt, + Value? rowid}) { + return RemindersCompanion( + id: id ?? this.id, + userId: userId ?? this.userId, + clientId: clientId ?? this.clientId, + rev: rev ?? this.rev, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + title: title ?? this.title, + description: description ?? this.description, + type: type ?? this.type, + triggerAt: triggerAt ?? this.triggerAt, + dueAt: dueAt ?? this.dueAt, + repeatRule: repeatRule ?? this.repeatRule, + timezone: timezone ?? this.timezone, + status: status ?? this.status, + priority: priority ?? this.priority, + snoozedUntil: snoozedUntil ?? this.snoozedUntil, + lastTriggeredAt: lastTriggeredAt ?? this.lastTriggeredAt, + nextTriggerAt: nextTriggerAt ?? this.nextTriggerAt, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (userId.present) { + map['user_id'] = Variable(userId.value); + } + if (clientId.present) { + map['client_id'] = Variable(clientId.value); + } + if (rev.present) { + map['rev'] = Variable(rev.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (description.present) { + map['description'] = Variable(description.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (triggerAt.present) { + map['trigger_at'] = Variable(triggerAt.value); + } + if (dueAt.present) { + map['due_at'] = Variable(dueAt.value); + } + if (repeatRule.present) { + map['repeat_rule'] = Variable(repeatRule.value); + } + if (timezone.present) { + map['timezone'] = Variable(timezone.value); + } + if (status.present) { + map['status'] = Variable(status.value); + } + if (priority.present) { + map['priority'] = Variable(priority.value); + } + if (snoozedUntil.present) { + map['snoozed_until'] = Variable(snoozedUntil.value); + } + if (lastTriggeredAt.present) { + map['last_triggered_at'] = Variable(lastTriggeredAt.value); + } + if (nextTriggerAt.present) { + map['next_trigger_at'] = Variable(nextTriggerAt.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('RemindersCompanion(') + ..write('id: $id, ') + ..write('userId: $userId, ') + ..write('clientId: $clientId, ') + ..write('rev: $rev, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('type: $type, ') + ..write('triggerAt: $triggerAt, ') + ..write('dueAt: $dueAt, ') + ..write('repeatRule: $repeatRule, ') + ..write('timezone: $timezone, ') + ..write('status: $status, ') + ..write('priority: $priority, ') + ..write('snoozedUntil: $snoozedUntil, ') + ..write('lastTriggeredAt: $lastTriggeredAt, ') + ..write('nextTriggerAt: $nextTriggerAt, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class DeferredRemoteItems extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + DeferredRemoteItems(this.attachedDatabase, [this._alias]); + late final GeneratedColumn entityType = GeneratedColumn( + 'entity_type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn clientId = GeneratedColumn( + 'client_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn data = GeneratedColumn( + 'data', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn parkedAt = GeneratedColumn( + 'parked_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression('CURRENT_TIMESTAMP')); + @override + List get $columns => [entityType, clientId, data, parkedAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'deferred_remote_items'; + @override + Set get $primaryKey => {entityType, clientId}; + @override + DeferredRemoteItemsData map(Map data, + {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return DeferredRemoteItemsData( + entityType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}entity_type'])!, + clientId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}client_id'])!, + data: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}data'])!, + parkedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}parked_at'])!, + ); + } + + @override + DeferredRemoteItems createAlias(String alias) { + return DeferredRemoteItems(attachedDatabase, alias); + } +} + +class DeferredRemoteItemsData extends DataClass + implements Insertable { + final String entityType; + final String clientId; + final String data; + final DateTime parkedAt; + const DeferredRemoteItemsData( + {required this.entityType, + required this.clientId, + required this.data, + required this.parkedAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['entity_type'] = Variable(entityType); + map['client_id'] = Variable(clientId); + map['data'] = Variable(data); + map['parked_at'] = Variable(parkedAt); + return map; + } + + DeferredRemoteItemsCompanion toCompanion(bool nullToAbsent) { + return DeferredRemoteItemsCompanion( + entityType: Value(entityType), + clientId: Value(clientId), + data: Value(data), + parkedAt: Value(parkedAt), + ); + } + + factory DeferredRemoteItemsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return DeferredRemoteItemsData( + entityType: serializer.fromJson(json['entityType']), + clientId: serializer.fromJson(json['clientId']), + data: serializer.fromJson(json['data']), + parkedAt: serializer.fromJson(json['parkedAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'entityType': serializer.toJson(entityType), + 'clientId': serializer.toJson(clientId), + 'data': serializer.toJson(data), + 'parkedAt': serializer.toJson(parkedAt), + }; + } + + DeferredRemoteItemsData copyWith( + {String? entityType, + String? clientId, + String? data, + DateTime? parkedAt}) => + DeferredRemoteItemsData( + entityType: entityType ?? this.entityType, + clientId: clientId ?? this.clientId, + data: data ?? this.data, + parkedAt: parkedAt ?? this.parkedAt, + ); + DeferredRemoteItemsData copyWithCompanion(DeferredRemoteItemsCompanion data) { + return DeferredRemoteItemsData( + entityType: + data.entityType.present ? data.entityType.value : this.entityType, + clientId: data.clientId.present ? data.clientId.value : this.clientId, + data: data.data.present ? data.data.value : this.data, + parkedAt: data.parkedAt.present ? data.parkedAt.value : this.parkedAt, + ); + } + + @override + String toString() { + return (StringBuffer('DeferredRemoteItemsData(') + ..write('entityType: $entityType, ') + ..write('clientId: $clientId, ') + ..write('data: $data, ') + ..write('parkedAt: $parkedAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(entityType, clientId, data, parkedAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is DeferredRemoteItemsData && + other.entityType == this.entityType && + other.clientId == this.clientId && + other.data == this.data && + other.parkedAt == this.parkedAt); +} + +class DeferredRemoteItemsCompanion + extends UpdateCompanion { + final Value entityType; + final Value clientId; + final Value data; + final Value parkedAt; + final Value rowid; + const DeferredRemoteItemsCompanion({ + this.entityType = const Value.absent(), + this.clientId = const Value.absent(), + this.data = const Value.absent(), + this.parkedAt = const Value.absent(), + this.rowid = const Value.absent(), + }); + DeferredRemoteItemsCompanion.insert({ + required String entityType, + required String clientId, + required String data, + this.parkedAt = const Value.absent(), + this.rowid = const Value.absent(), + }) : entityType = Value(entityType), + clientId = Value(clientId), + data = Value(data); + static Insertable custom({ + Expression? entityType, + Expression? clientId, + Expression? data, + Expression? parkedAt, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (entityType != null) 'entity_type': entityType, + if (clientId != null) 'client_id': clientId, + if (data != null) 'data': data, + if (parkedAt != null) 'parked_at': parkedAt, + if (rowid != null) 'rowid': rowid, + }); + } + + DeferredRemoteItemsCompanion copyWith( + {Value? entityType, + Value? clientId, + Value? data, + Value? parkedAt, + Value? rowid}) { + return DeferredRemoteItemsCompanion( + entityType: entityType ?? this.entityType, + clientId: clientId ?? this.clientId, + data: data ?? this.data, + parkedAt: parkedAt ?? this.parkedAt, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (entityType.present) { + map['entity_type'] = Variable(entityType.value); + } + if (clientId.present) { + map['client_id'] = Variable(clientId.value); + } + if (data.present) { + map['data'] = Variable(data.value); + } + if (parkedAt.present) { + map['parked_at'] = Variable(parkedAt.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('DeferredRemoteItemsCompanion(') + ..write('entityType: $entityType, ') + ..write('clientId: $clientId, ') + ..write('data: $data, ') + ..write('parkedAt: $parkedAt, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class DatabaseAtV9 extends GeneratedDatabase { + DatabaseAtV9(QueryExecutor e) : super(e); + late final Wallets wallets = Wallets(this); + late final Parties parties = Parties(this); + late final Groups groups = Groups(this); + late final Transactions transactions = Transactions(this); + late final Categories categories = Categories(this); + late final Configs configs = Configs(this); + late final Users users = Users(this); + late final LocalChanges localChanges = LocalChanges(this); + late final SyncMetadata syncMetadata = SyncMetadata(this); + late final Categorizables categorizables = Categorizables(this); + late final Notifications notifications = Notifications(this); + late final MediaFiles mediaFiles = MediaFiles(this); + late final Transfers transfers = Transfers(this); + late final Budgets budgets = Budgets(this); + late final BudgetTargets budgetTargets = BudgetTargets(this); + late final BudgetPeriodStates budgetPeriodStates = BudgetPeriodStates(this); + late final Holdings holdings = Holdings(this); + late final FinancialPositionCache financialPositionCache = + FinancialPositionCache(this); + late final Reminders reminders = Reminders(this); + late final DeferredRemoteItems deferredRemoteItems = + DeferredRemoteItems(this); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [ + wallets, + parties, + groups, + transactions, + categories, + configs, + users, + localChanges, + syncMetadata, + categorizables, + notifications, + mediaFiles, + transfers, + budgets, + budgetTargets, + budgetPeriodStates, + holdings, + financialPositionCache, + reminders, + deferredRemoteItems + ]; + @override + int get schemaVersion => 9; + @override + DriftDatabaseOptions get options => + const DriftDatabaseOptions(storeDateTimeAsText: true); +} diff --git a/test/unit/orphaned_change_reconciliation_test.dart b/test/unit/orphaned_change_reconciliation_test.dart index 93e66177..5fab403a 100644 --- a/test/unit/orphaned_change_reconciliation_test.dart +++ b/test/unit/orphaned_change_reconciliation_test.dart @@ -75,6 +75,14 @@ void main() { )); } + Future insertParty(String clientId, {int? serverId}) { + return db.into(db.parties).insert(PartiesCompanion.insert( + clientId: Value(clientId), + id: Value(serverId), + name: 'Party', + )); + } + Future insertChange( String entityType, String entityId, { @@ -147,6 +155,7 @@ void main() { typeHandlers: { _StubHandler('transaction', failFor: failFor), _StubHandler('transfer'), + _StubHandler('party'), }, dependencyManager: DefaultSyncDependencyManager(), requestAuthorizationService: _FakeAuth(), @@ -154,17 +163,18 @@ void main() { ); } - test('enqueues orphaned transactions and transfers', () async { + test('enqueues orphaned dependency models and dependents', () async { await insertTransaction('t1'); await insertTransfer('tr1'); + await insertParty('p1'); final enqueued = await buildSync().reconcileOrphanedLocalChanges(); - expect(enqueued, 2); + expect(enqueued, 3); final pending = await db.select(db.localChanges).get(); expect( {for (final c in pending) c.entityId: c.entityType}, - {'t1': 'transaction', 'tr1': 'transfer'}, + {'t1': 'transaction', 'tr1': 'transfer', 'p1': 'party'}, ); final data = pending.firstWhere((c) => c.entityId == 't1').data; expect(data, {'entity_type': 'transaction', 'client_id': 't1'}); From a498ac0df2c17714d41a2a6a5a3895998a89135e Mon Sep 17 00:00:00 2001 From: Fuh Austin Date: Sun, 16 Aug 2026 00:48:11 +0100 Subject: [PATCH 2/5] fix(sync): Adopt non-blocking deletes and bound HTTP timeouts Every repository awaited `delete`, which awaits the remote call, so deleting a record held the UI for a full network round trip. The cubits already remove the row optimistically, but `isDeleting` stayed true until the request settled. Switch to `persistAndDelete`, which returns once the deletion and its outbox entry are durable and leaves delivery to the sync loop - the same shape create and update already use. The Dio instance set no timeouts, so a stalled connection fell through to the OS socket timeout and could hang a request for minutes. Bound connect, send and receive. Also rename the transfer handler override to match `downloadIgnoresFailedDependencies`. --- lib/core/module/http_module.dart | 5 +++++ lib/data/repositories/budget_repository_impl.dart | 2 +- lib/data/repositories/category_repository_impl.dart | 2 +- lib/data/repositories/config_repository_impl.dart | 2 +- lib/data/repositories/group_repository_impl.dart | 2 +- lib/data/repositories/media_repository_impl.dart | 2 +- lib/data/repositories/party_repository_impl.dart | 2 +- lib/data/repositories/reminder_repository_impl.dart | 2 +- lib/data/repositories/transaction_repository_impl.dart | 2 +- lib/data/repositories/transfer_repository_impl.dart | 2 +- lib/data/repositories/wallet_repository_impl.dart | 2 +- lib/data/sync/transfer_sync_handler.dart | 2 +- 12 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/core/module/http_module.dart b/lib/core/module/http_module.dart index f41e4eac..eab05e29 100644 --- a/lib/core/module/http_module.dart +++ b/lib/core/module/http_module.dart @@ -26,6 +26,11 @@ abstract class InjectHttpClientModule { BaseOptions( baseUrl: url, headers: {'Accept': 'application/json'}, + // Without these, a stalled connection falls through to the OS socket + // timeout, which can hang a request for minutes. + connectTimeout: const Duration(seconds: 15), + sendTimeout: const Duration(seconds: 30), + receiveTimeout: const Duration(seconds: 30), ), ); diff --git a/lib/data/repositories/budget_repository_impl.dart b/lib/data/repositories/budget_repository_impl.dart index 3bcd7fdb..801b4b9a 100644 --- a/lib/data/repositories/budget_repository_impl.dart +++ b/lib/data/repositories/budget_repository_impl.dart @@ -144,7 +144,7 @@ class BudgetRepositoryImpl return RepositoryErrorHandler.handleApiCall(() async { final dto = await _composeDto(clientId); if (dto != null) { - await delete(dto); + await persistAndDelete(dto); } return unit; }); diff --git a/lib/data/repositories/category_repository_impl.dart b/lib/data/repositories/category_repository_impl.dart index 7820de51..cab1e9d4 100644 --- a/lib/data/repositories/category_repository_impl.dart +++ b/lib/data/repositories/category_repository_impl.dart @@ -78,7 +78,7 @@ class CategoryRepositoryImpl Future> deleteCategory(String clientId) { return RepositoryErrorHandler.handleApiCall(() async { final category = await syncHandler.getLocalByClientId(clientId); - await delete(category); + await persistAndDelete(category); return unit; }); } diff --git a/lib/data/repositories/config_repository_impl.dart b/lib/data/repositories/config_repository_impl.dart index de888b77..8974a2df 100644 --- a/lib/data/repositories/config_repository_impl.dart +++ b/lib/data/repositories/config_repository_impl.dart @@ -113,7 +113,7 @@ class ConfigRepositoryImpl throw NotFoundException('Config with key "$key" not found'); } - await delete(config); + await persistAndDelete(config); return unit; }, ); diff --git a/lib/data/repositories/group_repository_impl.dart b/lib/data/repositories/group_repository_impl.dart index a8d12f58..4b7ac1a7 100644 --- a/lib/data/repositories/group_repository_impl.dart +++ b/lib/data/repositories/group_repository_impl.dart @@ -103,7 +103,7 @@ class GroupRepositoryImpl throw NotFoundException('Group not found'); } - await delete(group); + await persistAndDelete(group); return unit; }, ); diff --git a/lib/data/repositories/media_repository_impl.dart b/lib/data/repositories/media_repository_impl.dart index 77506b8a..c55d8edb 100644 --- a/lib/data/repositories/media_repository_impl.dart +++ b/lib/data/repositories/media_repository_impl.dart @@ -91,7 +91,7 @@ class MediaRepositoryImpl Future> deleteMediaByPath(String path) async { try { final media = await syncHandler.getLocalByClientId(path); - await delete(media); + await persistAndDelete(media); return const Right(unit); } catch (e) { return Left(Failure.cacheError(e.toString())); diff --git a/lib/data/repositories/party_repository_impl.dart b/lib/data/repositories/party_repository_impl.dart index 186ed4f3..13fe76e1 100644 --- a/lib/data/repositories/party_repository_impl.dart +++ b/lib/data/repositories/party_repository_impl.dart @@ -81,7 +81,7 @@ class PartyRepositoryImpl Future> deleteParty(String clientId) { return RepositoryErrorHandler.handleApiCall(() async { final party = await syncHandler.getLocalByClientId(clientId); - await delete(party); + await persistAndDelete(party); return unit; }); } diff --git a/lib/data/repositories/reminder_repository_impl.dart b/lib/data/repositories/reminder_repository_impl.dart index 60f28067..9987f52b 100644 --- a/lib/data/repositories/reminder_repository_impl.dart +++ b/lib/data/repositories/reminder_repository_impl.dart @@ -97,7 +97,7 @@ class ReminderRepositoryImpl Future> deleteReminder(String clientId) { return RepositoryErrorHandler.handleApiCall(() async { final reminder = await syncHandler.getLocalByClientId(clientId); - await delete(reminder); + await persistAndDelete(reminder); return unit; }); } diff --git a/lib/data/repositories/transaction_repository_impl.dart b/lib/data/repositories/transaction_repository_impl.dart index f0d3c0fa..8f8891b4 100644 --- a/lib/data/repositories/transaction_repository_impl.dart +++ b/lib/data/repositories/transaction_repository_impl.dart @@ -82,7 +82,7 @@ class TransactionRepositoryImpl extends SyncEntityRepository> deleteTransfer(String clientId) { return RepositoryErrorHandler.handleApiCall(() async { final transfer = await syncHandler.getLocalByClientId(clientId); - await delete(transfer); + await persistAndDelete(transfer); return unit; }); } diff --git a/lib/data/repositories/wallet_repository_impl.dart b/lib/data/repositories/wallet_repository_impl.dart index ebb61a76..7f71389e 100644 --- a/lib/data/repositories/wallet_repository_impl.dart +++ b/lib/data/repositories/wallet_repository_impl.dart @@ -107,7 +107,7 @@ class WalletRepositoryImpl throw NotFoundException('Wallet not found'); } - await delete(wallet); + await persistAndDelete(wallet); return unit; }); } diff --git a/lib/data/sync/transfer_sync_handler.dart b/lib/data/sync/transfer_sync_handler.dart index e6911dfd..28fbf15d 100644 --- a/lib/data/sync/transfer_sync_handler.dart +++ b/lib/data/sync/transfer_sync_handler.dart @@ -31,7 +31,7 @@ class TransferSyncHandler extends SyncTypeHandler String get entityType => TransferSyncHandler.entity; @override - bool get canSyncWithoutDependencies => true; + bool get downloadIgnoresFailedDependencies => true; @override String getRev(Transfer entity) => entity.rev ?? '1'; From 038667d2ca6c5df5f6ca59a2781ccff9ad6efcff Mon Sep 17 00:00:00 2001 From: Fuh Austin Date: Sun, 16 Aug 2026 02:44:10 +0100 Subject: [PATCH 3/5] feat(sync): Surface the failing model's error in sync history A down-sync failure was rendered as a bare red icon that replaced the timestamp, so the screen said a model was broken without saying why or when it last tried - and unlike upload failures there is no queued change to inspect, so the error was unreachable from the UI entirely. Keep the last-attempted timestamp visible next to the icon, show a one-line excerpt of the error inline, and make the row open a dialog with the full selectable text. Regenerating the localization keys also picked up five export* keys that were already in the JSON but missing from locale_keys.g.dart. --- assets/translations/de.json | 1 + assets/translations/en.json | 1 + assets/translations/es.json | 1 + assets/translations/fr.json | 1 + assets/translations/it.json | 1 + assets/translations/ru.json | 1 + lib/gen/translations/codegen_loader.g.dart | 1 + lib/gen/translations/locale_keys.g.dart | 6 ++ lib/presentation/sync_history_screen.dart | 95 ++++++++++++++++++++-- 9 files changed, 99 insertions(+), 9 deletions(-) diff --git a/assets/translations/de.json b/assets/translations/de.json index 79364d6f..fdd7a371 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -506,6 +506,7 @@ "synchronization": "Synchronisation", "syncHistoryDesc": "Synchronisationsstatus und ausstehende Änderungen anzeigen", "lastSyncStatus": "Letzter Synchronisationsstatus", + "lastAttempted": "Letzter Versuch", "noSyncHistory": "Kein Synchronisationsverlauf verfügbar", "pendingChanges": "Ausstehende Änderungen", "noPendingChanges": "Keine ausstehenden Änderungen", diff --git a/assets/translations/en.json b/assets/translations/en.json index a8b5dfda..c1f29fec 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -506,6 +506,7 @@ "synchronization": "Synchronization", "syncHistoryDesc": "View sync status and pending changes", "lastSyncStatus": "Last sync status", + "lastAttempted": "Last attempted", "noSyncHistory": "No sync history available", "pendingChanges": "Pending changes", "noPendingChanges": "No pending changes", diff --git a/assets/translations/es.json b/assets/translations/es.json index 0ac67126..c5ecd804 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -506,6 +506,7 @@ "synchronization": "Sincronización", "syncHistoryDesc": "Ver estado de sincronización y cambios pendientes", "lastSyncStatus": "Último estado de sincronización", + "lastAttempted": "Último intento", "noSyncHistory": "No hay historial de sincronización disponible", "pendingChanges": "Cambios pendientes", "noPendingChanges": "No hay cambios pendientes", diff --git a/assets/translations/fr.json b/assets/translations/fr.json index c6f442f7..51868aa0 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -506,6 +506,7 @@ "synchronization": "Synchronisation", "syncHistoryDesc": "Voir l'état de synchronisation et les modifications en attente", "lastSyncStatus": "Dernier état de synchronisation", + "lastAttempted": "Dernière tentative", "noSyncHistory": "Aucun historique de synchronisation disponible", "pendingChanges": "Modifications en attente", "noPendingChanges": "Aucune modification en attente", diff --git a/assets/translations/it.json b/assets/translations/it.json index 7f48f729..0cfd63c3 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -506,6 +506,7 @@ "synchronization": "Sincronizzazione", "syncHistoryDesc": "Visualizza lo stato della sincronizzazione e le modifiche in sospeso", "lastSyncStatus": "Ultimo stato di sincronizzazione", + "lastAttempted": "Ultimo tentativo", "noSyncHistory": "Nessuno storico di sincronizzazione disponibile", "pendingChanges": "Modifiche in sospeso", "noPendingChanges": "Nessuna modifica in sospeso", diff --git a/assets/translations/ru.json b/assets/translations/ru.json index d05c0628..f6f2a104 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -506,6 +506,7 @@ "synchronization": "Синхронизация", "syncHistoryDesc": "Просмотр статуса синхронизации и ожидающих изменений", "lastSyncStatus": "Последний статус синхронизации", + "lastAttempted": "Последняя попытка", "noSyncHistory": "История синхронизации недоступна", "pendingChanges": "Ожидающие изменения", "noPendingChanges": "Нет ожидающих изменений", diff --git a/lib/gen/translations/codegen_loader.g.dart b/lib/gen/translations/codegen_loader.g.dart index 6683e1c3..15ddf2d4 100644 --- a/lib/gen/translations/codegen_loader.g.dart +++ b/lib/gen/translations/codegen_loader.g.dart @@ -510,6 +510,7 @@ abstract class LocaleKeys { static const synchronization = 'synchronization'; static const syncHistoryDesc = 'syncHistoryDesc'; static const lastSyncStatus = 'lastSyncStatus'; + static const lastAttempted = 'lastAttempted'; static const noSyncHistory = 'noSyncHistory'; static const pendingChanges = 'pendingChanges'; static const noPendingChanges = 'noPendingChanges'; diff --git a/lib/gen/translations/locale_keys.g.dart b/lib/gen/translations/locale_keys.g.dart index a0761dc4..15ddf2d4 100644 --- a/lib/gen/translations/locale_keys.g.dart +++ b/lib/gen/translations/locale_keys.g.dart @@ -174,6 +174,11 @@ abstract class LocaleKeys { static const export = 'export'; static const toPdf = 'toPdf'; static const toExcel = 'toExcel'; + static const exportSaved = 'exportSaved'; + static const exportSaveFailed = 'exportSaveFailed'; + static const exportRequiresAccount = 'exportRequiresAccount'; + static const exportAwaitingSync = 'exportAwaitingSync'; + static const exportPreparing = 'exportPreparing'; static const family = 'family'; static const searchHint = 'searchHint'; static const totalIncome = 'totalIncome'; @@ -505,6 +510,7 @@ abstract class LocaleKeys { static const synchronization = 'synchronization'; static const syncHistoryDesc = 'syncHistoryDesc'; static const lastSyncStatus = 'lastSyncStatus'; + static const lastAttempted = 'lastAttempted'; static const noSyncHistory = 'noSyncHistory'; static const pendingChanges = 'pendingChanges'; static const noPendingChanges = 'noPendingChanges'; diff --git a/lib/presentation/sync_history_screen.dart b/lib/presentation/sync_history_screen.dart index 219423e9..7f2581bb 100644 --- a/lib/presentation/sync_history_screen.dart +++ b/lib/presentation/sync_history_screen.dart @@ -266,25 +266,49 @@ class _SyncHistoryScreenState extends State { separatorBuilder: (_, __) => const Divider(height: 1), itemBuilder: (context, index) { final meta = _syncMetadata[index]; + final error = meta.lastError; return ListTile( dense: true, + onTap: error == null + ? null + : () => _showModelSyncError(meta, error), title: Text( _getEntityTypeDisplayName(meta.entityType), style: TextStyle(fontSize: 14.sp), ), - trailing: meta.lastError != null - ? Icon( - Icons.error, - color: context.tones.expense.deep, - size: 20.sp, - ) + subtitle: error == null + ? null : Text( - _formatDateTime(meta.lastAttemptedAt), + error, style: TextStyle( - fontSize: 12.sp, - color: context.tones.textMuted, + fontSize: 11.sp, + color: context.tones.expense.deep, ), + maxLines: 1, + overflow: TextOverflow.ellipsis, ), + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + // Kept alongside the error so a failing model still + // shows when it was last tried. + Text( + _formatDateTime(meta.lastAttemptedAt), + style: TextStyle( + fontSize: 12.sp, + color: context.tones.textMuted, + ), + ), + if (error != null) ...[ + SizedBox(width: 6.w), + Icon( + Icons.error, + color: context.tones.expense.deep, + size: 20.sp, + ), + ], + ], + ), ); }, ), @@ -374,6 +398,59 @@ class _SyncHistoryScreenState extends State { /// Full error text plus the queued request payload, so validation /// failures show exactly what the server received. + /// Down-sync failures have no queued change to inspect, so the error is + /// only recoverable from the model's sync metadata. + void _showModelSyncError(LocalSyncMetadata meta, String error) { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text(_getEntityTypeDisplayName(meta.entityType)), + content: SizedBox( + width: double.maxFinite, + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + '${LocaleKeys.lastAttempted.tr()}: ' + '${_formatDateTime(meta.lastAttemptedAt)}', + style: TextStyle( + fontSize: 12.sp, + color: context.tones.textMuted, + ), + ), + SizedBox(height: 12.h), + Container( + width: double.infinity, + padding: EdgeInsets.all(8.r), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surface, + borderRadius: BorderRadius.circular(8.r), + ), + child: SelectableText( + error, + style: TextStyle( + fontSize: 11.sp, + fontFamily: 'monospace', + color: context.tones.expense.deep, + ), + ), + ), + ], + ), + ), + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text(LocaleKeys.done.tr()), + ), + ], + ), + ); + } + void _showChangeDetails(LocalChange change) { final payload = const JsonEncoder.withIndent(' ').convert(change.data); showDialog( From 11f68ab2413aea3cdbd41fc64aa91a48d9ffcfe7 Mon Sep 17 00:00:00 2001 From: Fuh Austin Date: Sun, 16 Aug 2026 04:01:59 +0100 Subject: [PATCH 4/5] build(deps): Point drift_sync_core at the commit providing persistAndDelete The ref was still 4ac6cf0, which predates `persistAndDelete` and the `downloadIgnoresFailedDependencies` rename, so CI could not compile the repositories. Still a bare SHA, as before - it moves to drift_sync_core-v0.3.4 once that release is cut. --- pubspec.lock | 6 +++--- pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 331715a3..ef74b6a1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -429,11 +429,11 @@ packages: dependency: "direct main" description: path: "packages/drift_sync_core" - ref: "4ac6cf0" - resolved-ref: "4ac6cf0a3f3cf6719ace9b0207d7d51e12878dcc" + ref: "136da08" + resolved-ref: "136da0849494ad2ccc1e22165efe717395076055" url: "https://github.com/whilesmartflutter/drift_sync.git" source: git - version: "0.3.3" + version: "0.3.4" drift_sync_flutter: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 83787d92..f2362525 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -65,7 +65,7 @@ dependencies: drift_sync_core: git: url: https://github.com/whilesmartflutter/drift_sync.git - ref: 4ac6cf0 + ref: 136da08 path: packages/drift_sync_core drift_sync_flutter: git: From 20743b9c2be7dfaf6e3eda27c67418bde601544d Mon Sep 17 00:00:00 2001 From: nfebe Date: Sun, 16 Aug 2026 12:53:30 +0100 Subject: [PATCH 5/5] build(deps): Use drift_sync_core 0.3.4 release --- pubspec.lock | 14 +++++++------- pubspec.yaml | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index ef74b6a1..c99845b6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -181,10 +181,10 @@ packages: dependency: transitive description: name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.4.0" charcode: dependency: transitive description: @@ -429,8 +429,8 @@ packages: dependency: "direct main" description: path: "packages/drift_sync_core" - ref: "136da08" - resolved-ref: "136da0849494ad2ccc1e22165efe717395076055" + ref: "drift_sync_core-v0.3.4" + resolved-ref: "19ee6eced96af9f392fc83fb99816ce7d7dbc8c8" url: "https://github.com/whilesmartflutter/drift_sync.git" source: git version: "0.3.4" @@ -1292,10 +1292,10 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.13.0" + version: "0.11.1" meta: dependency: transitive description: @@ -2174,5 +2174,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.9.0-0 <4.0.0" + dart: ">=3.8.0 <4.0.0" flutter: ">=3.32.0" diff --git a/pubspec.yaml b/pubspec.yaml index f2362525..6ceb97ee 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -65,7 +65,7 @@ dependencies: drift_sync_core: git: url: https://github.com/whilesmartflutter/drift_sync.git - ref: 136da08 + ref: drift_sync_core-v0.3.4 path: packages/drift_sync_core drift_sync_flutter: git: