From e7617a2d9818093ff8843bad09655c608e9f8c26 Mon Sep 17 00:00:00 2001 From: davmar Date: Thu, 10 Sep 2026 20:44:59 +0200 Subject: [PATCH] ok lets ship for now --- lib/models/app_cloud_prefs.dart | 41 ++++++++++++ .../1740000007_ingtrak_app_prefs.js | 67 +++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 lib/models/app_cloud_prefs.dart create mode 100644 pocketbase/pb_migrations/1740000007_ingtrak_app_prefs.js diff --git a/lib/models/app_cloud_prefs.dart b/lib/models/app_cloud_prefs.dart new file mode 100644 index 0000000..18cc254 --- /dev/null +++ b/lib/models/app_cloud_prefs.dart @@ -0,0 +1,41 @@ +/// Cloud-synced app preferences (Home sections + Look ahead). +library; + +import 'home_built_in_sections.dart'; + +/// One-per-user prefs row mirrored in PocketBase `app_prefs`. +class AppCloudPrefs { + const AppCloudPrefs({ + required this.homeBuiltInSections, + required this.lookAheadMaxYears, + }); + + final HomeBuiltInSections homeBuiltInSections; + final int lookAheadMaxYears; + + static const defaults = AppCloudPrefs( + homeBuiltInSections: HomeBuiltInSections.defaults, + lookAheadMaxYears: 5, + ); + + AppCloudPrefs copyWith({ + HomeBuiltInSections? homeBuiltInSections, + int? lookAheadMaxYears, + }) { + return AppCloudPrefs( + homeBuiltInSections: + homeBuiltInSections ?? this.homeBuiltInSections, + lookAheadMaxYears: lookAheadMaxYears ?? this.lookAheadMaxYears, + ); + } +} + +/// Prefer local when the user has pending edits; otherwise take remote. +AppCloudPrefs mergeAppCloudPrefs({ + required AppCloudPrefs local, + required AppCloudPrefs? remote, + required bool preferLocal, +}) { + if (preferLocal || remote == null) return local; + return remote; +} diff --git a/pocketbase/pb_migrations/1740000007_ingtrak_app_prefs.js b/pocketbase/pb_migrations/1740000007_ingtrak_app_prefs.js new file mode 100644 index 0000000..6dec6ec --- /dev/null +++ b/pocketbase/pb_migrations/1740000007_ingtrak_app_prefs.js @@ -0,0 +1,67 @@ +/// PocketBase migration: per-user app preferences (Home sections + Look ahead). +/// +/// Apply on the server: +/// +/// sudo cp this_file /opt/pocketbase/pb_migrations/ +/// sudo chown pocketbase:pocketbase /opt/pocketbase/pb_migrations/*.js +/// sudo -u pocketbase /opt/pocketbase/pocketbase migrate up +/// sudo systemctl restart pocketbase +/// +/// Depends on usersapp. +migrate((app) => { + const users = app.findCollectionByNameOrId("usersapp"); + + const ownerRules = { + listRule: "user = @request.auth.id", + viewRule: "user = @request.auth.id", + createRule: "@request.auth.id != '' && user = @request.auth.id", + updateRule: "user = @request.auth.id", + deleteRule: "user = @request.auth.id", + }; + + const appPrefs = new Collection({ + type: "base", + name: "app_prefs", + ...ownerRules, + fields: [ + { + type: "relation", + name: "user", + required: true, + collectionId: users.id, + cascadeDelete: true, + maxSelect: 1, + }, + { + type: "bool", + name: "home_show_transactions", + required: false, + }, + { + type: "bool", + name: "home_show_categorized", + required: false, + }, + { + type: "bool", + name: "home_show_recent", + required: false, + }, + { + type: "number", + name: "look_ahead_max_years", + required: false, + onlyInt: true, + }, + ], + indexes: [ + "CREATE UNIQUE INDEX idx_app_prefs_user ON app_prefs (user)", + ], + }); + app.save(appPrefs); +}, (app) => { + try { + const col = app.findCollectionByNameOrId("app_prefs"); + app.delete(col); + } catch (_) {} +});