/// PocketBase migration: Overview chart favourites. /// /// Apply on the server (from /opt/pocketbase or wherever the binary lives): /// /// 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 (same owner rules as labels / recurring_templates). 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 overviewFavourites = new Collection({ type: "base", name: "overview_favourites", ...ownerRules, fields: [ { type: "relation", name: "user", required: true, collectionId: users.id, cascadeDelete: true, maxSelect: 1, }, { // App-side OverviewFavourite.id type: "text", name: "client_id", required: true, min: 1, max: 120, }, { type: "text", name: "name", required: true, min: 1, max: 200, }, { // Show on Favourites overview view type: "bool", name: "display", required: false, }, { // "flow" | "labels" type: "text", name: "metric", required: true, min: 1, max: 32, }, { // "monthly" | "yearly" type: "text", name: "period", required: true, min: 1, max: 32, }, { // Label client_ids included on Labels chart ([] = all) type: "json", name: "label_ids", required: false, }, { // "all" | "income" | "expense" type: "text", name: "flow", required: true, min: 1, max: 32, }, { // "parallel" | "stacked" type: "text", name: "bar_style", required: true, min: 1, max: 32, }, { type: "bool", name: "invert_expense_perspective", required: false, }, ], indexes: [ "CREATE UNIQUE INDEX idx_overview_favourites_user_client ON overview_favourites (user, client_id)", ], }); app.save(overviewFavourites); }, (app) => { try { const col = app.findCollectionByNameOrId("overview_favourites"); app.delete(col); } catch (_) {} });