/// // Schema-Snapshot der sechs fachlichen Collections, abgezogen von der // produktiven Instanz. System-Collections (_superusers, _mfas, ...) legt // PocketBase selbst an und stehen deshalb nicht hier drin. // // importCollections wird mit deleteMissing = false aufgerufen: Die Migration // legt an und aktualisiert, löscht aber nichts, was nicht im Snapshot steht. migrate((app) => { const collections = [ { "id": "_pb_users_auth_", "listRule": "id = @request.auth.id", "viewRule": "id = @request.auth.id", "createRule": null, "updateRule": "id = @request.auth.id", "deleteRule": "id = @request.auth.id", "name": "users", "type": "auth", "fields": [ { "autogeneratePattern": "[a-z0-9]{15}", "hidden": false, "id": "text3208210256", "max": 15, "min": 15, "name": "id", "pattern": "^[a-z0-9]+$", "presentable": false, "primaryKey": true, "required": true, "system": true, "type": "text" }, { "cost": 10, "hidden": true, "id": "password901924565", "max": 0, "min": 8, "name": "password", "pattern": "", "presentable": false, "required": true, "system": true, "type": "password" }, { "autogeneratePattern": "[a-zA-Z0-9_]{50}", "hidden": true, "id": "text2504183744", "max": 60, "min": 30, "name": "tokenKey", "pattern": "", "presentable": false, "primaryKey": false, "required": true, "system": true, "type": "text" }, { "exceptDomains": null, "hidden": false, "id": "email3885137012", "name": "email", "onlyDomains": null, "presentable": false, "required": false, "system": true, "type": "email" }, { "hidden": false, "id": "bool1547992806", "name": "emailVisibility", "presentable": false, "required": false, "system": true, "type": "bool" }, { "hidden": false, "id": "bool256245529", "name": "verified", "presentable": false, "required": false, "system": true, "type": "bool" }, { "autogeneratePattern": "users[0-9]{6}", "hidden": false, "id": "text4166911607", "max": 150, "min": 3, "name": "username", "pattern": "^[\\w][\\w\\.\\-]*$", "presentable": false, "primaryKey": false, "required": true, "system": false, "type": "text" }, { "autogeneratePattern": "", "hidden": false, "id": "users_name", "max": 0, "min": 0, "name": "name", "pattern": "", "presentable": false, "primaryKey": false, "required": false, "system": false, "type": "text" }, { "hidden": false, "id": "users_avatar", "maxSelect": 1, "maxSize": 5242880, "mimeTypes": [ "image/jpeg", "image/png", "image/svg+xml", "image/gif", "image/webp" ], "name": "avatar", "presentable": false, "protected": false, "required": false, "system": false, "thumbs": null, "type": "file" }, { "hidden": false, "id": "autodate2990389176", "name": "created", "onCreate": true, "onUpdate": false, "presentable": false, "system": false, "type": "autodate" }, { "hidden": false, "id": "autodate3332085495", "name": "updated", "onCreate": true, "onUpdate": true, "presentable": false, "system": false, "type": "autodate" } ], "indexes": [ "CREATE UNIQUE INDEX `__pb_users_auth__username_idx` ON `users` (username COLLATE NOCASE)", "CREATE UNIQUE INDEX `__pb_users_auth__email_idx` ON `users` (`email`) WHERE `email` != ''", "CREATE UNIQUE INDEX `__pb_users_auth__tokenKey_idx` ON `users` (`tokenKey`)" ], "created": "2023-10-28 21:35:49.020Z", "updated": "2024-07-19 09:58:56.589Z", "system": false, "authRule": "", "manageRule": null, "authAlert": { "enabled": true, "emailTemplate": { "subject": "Login from a new location", "body": "

Hello,

\n

We noticed a login to your {APP_NAME} account from a new location.

\n

If this was you, you may disregard this email.

\n

If this wasn't you, you should immediately change your {APP_NAME} account password to revoke access from all other locations.

\n

\n Thanks,
\n {APP_NAME} team\n

" } }, "oauth2": { "providers": [], "mappedFields": { "id": "", "name": "", "username": "username", "avatarURL": "" }, "enabled": false }, "passwordAuth": { "enabled": true, "identityFields": [ "email", "username" ] }, "mfa": { "enabled": false, "duration": 1800, "rule": "" }, "otp": { "enabled": false, "duration": 180, "length": 8, "emailTemplate": { "subject": "OTP for {APP_NAME}", "body": "

Hello,

\n

Your one-time password is: {OTP}

\n

If you didn't ask for the one-time password, you can ignore this email.

\n

\n Thanks,
\n {APP_NAME} team\n

" } }, "authToken": { "duration": 1209600 }, "passwordResetToken": { "duration": 1800 }, "emailChangeToken": { "duration": 1800 }, "verificationToken": { "duration": 604800 }, "fileToken": { "duration": 120 }, "verificationTemplate": { "subject": "Verify your {APP_NAME} email", "body": "

Hello,

\n

Thank you for joining us at {APP_NAME}.

\n

Click on the button below to verify your email address.

\n

\n Verify\n

\n

\n Thanks,
\n {APP_NAME} team\n

" }, "resetPasswordTemplate": { "subject": "Reset your {APP_NAME} password", "body": "

Hello,

\n

Click on the button below to reset your password.

\n

\n Reset password\n

\n

If you didn't ask to reset your password, you can ignore this email.

\n

\n Thanks,
\n {APP_NAME} team\n

" }, "confirmEmailChangeTemplate": { "subject": "Confirm your {APP_NAME} new email address", "body": "

Hello,

\n

Click on the button below to confirm your new email address.

\n

\n Confirm new email\n

\n

If you didn't ask to change your email address, you can ignore this email.

\n

\n Thanks,
\n {APP_NAME} team\n

" } }, { "id": "pbc_1568971955", "listRule": "users.id ?= @request.auth.id", "viewRule": "users.id ?= @request.auth.id", "createRule": "@request.auth.id != \"\"", "updateRule": "owner.id ?= @request.auth.id || admins.id ?= @request.auth.id", "deleteRule": "owner.id ?= @request.auth.id", "name": "teams", "type": "base", "fields": [ { "autogeneratePattern": "[a-z0-9]{15}", "hidden": false, "id": "text3208210256", "max": 15, "min": 15, "name": "id", "pattern": "^[a-z0-9]+$", "presentable": false, "primaryKey": true, "required": true, "system": true, "type": "text" }, { "autogeneratePattern": "", "hidden": false, "id": "text1579384326", "max": 100, "min": 1, "name": "name", "pattern": "", "presentable": true, "primaryKey": false, "required": true, "system": false, "type": "text" }, { "cascadeDelete": false, "collectionId": "_pb_users_auth_", "hidden": false, "id": "relation3479234172", "maxSelect": 1, "minSelect": 1, "name": "owner", "presentable": false, "required": true, "system": false, "type": "relation" }, { "cascadeDelete": false, "collectionId": "_pb_users_auth_", "hidden": false, "id": "relation2732594447", "maxSelect": 999, "minSelect": 0, "name": "admins", "presentable": false, "required": false, "system": false, "type": "relation" }, { "cascadeDelete": false, "collectionId": "_pb_users_auth_", "hidden": false, "id": "relation344172009", "maxSelect": 999, "minSelect": 0, "name": "users", "presentable": false, "required": false, "system": false, "type": "relation" }, { "hidden": false, "id": "autodate2990389176", "name": "created", "onCreate": true, "onUpdate": false, "presentable": false, "system": false, "type": "autodate" }, { "hidden": false, "id": "autodate3332085495", "name": "updated", "onCreate": true, "onUpdate": true, "presentable": false, "system": false, "type": "autodate" } ], "indexes": [], "created": "2026-05-15 19:54:02.885Z", "updated": "2026-05-15 19:54:02.885Z", "system": false }, { "id": "xiqlzggqxg1e2y7", "listRule": "team.users.id ?= @request.auth.id", "viewRule": "team.users.id ?= @request.auth.id", "createRule": "team.users.id ?= @request.auth.id", "updateRule": "team.users.id ?= @request.auth.id", "deleteRule": "team.users.id ?= @request.auth.id", "name": "events", "type": "base", "fields": [ { "autogeneratePattern": "[a-z0-9]{15}", "hidden": false, "id": "text3208210256", "max": 15, "min": 15, "name": "id", "pattern": "^[a-z0-9]+$", "presentable": false, "primaryKey": true, "required": true, "system": true, "type": "text" }, { "autogeneratePattern": "", "hidden": false, "id": "g7nkasyb", "max": 0, "min": 0, "name": "description", "pattern": "", "presentable": true, "primaryKey": false, "required": false, "system": false, "type": "text" }, { "autogeneratePattern": "", "hidden": false, "id": "7n5qjiax", "max": 0, "min": 0, "name": "location", "pattern": "", "presentable": true, "primaryKey": false, "required": false, "system": false, "type": "text" }, { "autogeneratePattern": "", "hidden": false, "id": "hdp9vbeh", "max": 0, "min": 0, "name": "gps", "pattern": "", "presentable": false, "primaryKey": false, "required": false, "system": false, "type": "text" }, { "hidden": false, "id": "autodate2990389176", "name": "created", "onCreate": true, "onUpdate": false, "presentable": false, "system": false, "type": "autodate" }, { "hidden": false, "id": "autodate3332085495", "name": "updated", "onCreate": true, "onUpdate": true, "presentable": false, "system": false, "type": "autodate" }, { "autogeneratePattern": "", "hidden": false, "id": "text1579384326", "max": 0, "min": 0, "name": "name", "pattern": "", "presentable": true, "primaryKey": false, "required": false, "system": false, "type": "text" }, { "hidden": false, "id": "select2063623452", "maxSelect": 1, "name": "status", "presentable": false, "required": false, "system": false, "type": "select", "values": [ "draft", "active", "finished" ] }, { "cascadeDelete": false, "collectionId": "pbc_1568971955", "hidden": false, "id": "relation3303056927", "maxSelect": 1, "minSelect": 0, "name": "team", "presentable": false, "required": false, "system": false, "type": "relation" } ], "indexes": [], "created": "2023-10-28 21:38:00.122Z", "updated": "2026-05-15 19:54:27.453Z", "system": false }, { "id": "jo49lycyfs2sz2c", "listRule": "team.users.id ?= @request.auth.id", "viewRule": "team.users.id ?= @request.auth.id", "createRule": "team.users.id ?= @request.auth.id", "updateRule": "team.users.id ?= @request.auth.id", "deleteRule": "team.users.id ?= @request.auth.id", "name": "runs", "type": "base", "fields": [ { "autogeneratePattern": "[a-z0-9]{15}", "hidden": false, "id": "text3208210256", "max": 15, "min": 15, "name": "id", "pattern": "^[a-z0-9]+$", "presentable": false, "primaryKey": true, "required": true, "system": true, "type": "text" }, { "autogeneratePattern": "", "hidden": false, "id": "lnfys3xe", "max": 0, "min": 0, "name": "description", "pattern": "", "presentable": false, "primaryKey": false, "required": false, "system": false, "type": "text" }, { "cascadeDelete": false, "collectionId": "xiqlzggqxg1e2y7", "hidden": false, "id": "fqqevsrf", "maxSelect": 1, "minSelect": 0, "name": "event", "presentable": false, "required": false, "system": false, "type": "relation" }, { "hidden": false, "id": "autodate2990389176", "name": "created", "onCreate": true, "onUpdate": false, "presentable": false, "system": false, "type": "autodate" }, { "hidden": false, "id": "autodate3332085495", "name": "updated", "onCreate": true, "onUpdate": true, "presentable": false, "system": false, "type": "autodate" }, { "cascadeDelete": false, "collectionId": "pbc_1568971955", "hidden": false, "id": "relation3303056927", "maxSelect": 1, "minSelect": 0, "name": "team", "presentable": false, "required": false, "system": false, "type": "relation" } ], "indexes": [], "created": "2023-10-30 20:50:18.294Z", "updated": "2026-05-15 19:54:27.393Z", "system": false }, { "id": "spgs7e4anufen9u", "listRule": "team.users.id ?= @request.auth.id", "viewRule": "team.users.id ?= @request.auth.id", "createRule": "team.users.id ?= @request.auth.id", "updateRule": "team.users.id ?= @request.auth.id", "deleteRule": "team.users.id ?= @request.auth.id", "name": "riders", "type": "base", "fields": [ { "autogeneratePattern": "[a-z0-9]{15}", "hidden": false, "id": "text3208210256", "max": 15, "min": 15, "name": "id", "pattern": "^[a-z0-9]+$", "presentable": false, "primaryKey": true, "required": true, "system": true, "type": "text" }, { "autogeneratePattern": "", "hidden": false, "id": "hcc93nbj", "max": 0, "min": 0, "name": "name", "pattern": "", "presentable": false, "primaryKey": false, "required": false, "system": false, "type": "text" }, { "hidden": false, "id": "hc38dfyc", "maxSelect": 1, "maxSize": 5242880, "mimeTypes": [], "name": "avatar", "presentable": false, "protected": false, "required": false, "system": false, "thumbs": [], "type": "file" }, { "cascadeDelete": false, "collectionId": "xiqlzggqxg1e2y7", "hidden": false, "id": "anbugepo", "maxSelect": 1, "minSelect": 0, "name": "event", "presentable": false, "required": false, "system": false, "type": "relation" }, { "hidden": false, "id": "autodate2990389176", "name": "created", "onCreate": true, "onUpdate": false, "presentable": false, "system": false, "type": "autodate" }, { "hidden": false, "id": "autodate3332085495", "name": "updated", "onCreate": true, "onUpdate": true, "presentable": false, "system": false, "type": "autodate" }, { "autogeneratePattern": "", "hidden": false, "id": "text2526027604", "max": 0, "min": 0, "name": "number", "pattern": "", "presentable": true, "primaryKey": false, "required": false, "system": false, "type": "text" }, { "autogeneratePattern": "", "hidden": false, "id": "text2208304744", "max": 0, "min": 0, "name": "firstname", "pattern": "", "presentable": true, "primaryKey": false, "required": false, "system": false, "type": "text" }, { "autogeneratePattern": "", "hidden": false, "id": "text824489398", "max": 0, "min": 0, "name": "lastname", "pattern": "", "presentable": true, "primaryKey": false, "required": false, "system": false, "type": "text" }, { "cascadeDelete": false, "collectionId": "pbc_1568971955", "hidden": false, "id": "relation3303056927", "maxSelect": 1, "minSelect": 0, "name": "team", "presentable": false, "required": false, "system": false, "type": "relation" } ], "indexes": [], "created": "2023-10-28 21:37:09.275Z", "updated": "2026-05-15 19:54:27.372Z", "system": false }, { "id": "iomx9mcd1ko22ma", "listRule": "team.users.id ?= @request.auth.id", "viewRule": "team.users.id ?= @request.auth.id", "createRule": "team.users.id ?= @request.auth.id", "updateRule": "team.users.id ?= @request.auth.id", "deleteRule": "team.users.id ?= @request.auth.id", "name": "times", "type": "base", "fields": [ { "autogeneratePattern": "[a-z0-9]{15}", "hidden": false, "id": "text3208210256", "max": 15, "min": 15, "name": "id", "pattern": "^[a-z0-9]+$", "presentable": false, "primaryKey": true, "required": true, "system": true, "type": "text" }, { "hidden": false, "id": "3k55v0ld", "maxSelect": 1, "name": "status", "presentable": false, "required": false, "system": false, "type": "select", "values": [ "active", "finished", "dnf", "dns", "dsq" ] }, { "cascadeDelete": false, "collectionId": "spgs7e4anufen9u", "hidden": false, "id": "r3ixummt", "maxSelect": 1, "minSelect": 0, "name": "rider", "presentable": false, "required": false, "system": false, "type": "relation" }, { "hidden": false, "id": "mfhbdhhe", "max": "", "min": "", "name": "start", "presentable": false, "required": false, "system": false, "type": "date" }, { "cascadeDelete": false, "collectionId": "_pb_users_auth_", "hidden": false, "id": "ybjm5n0k", "maxSelect": 1, "minSelect": 0, "name": "startedBy", "presentable": false, "required": false, "system": false, "type": "relation" }, { "hidden": false, "id": "nkmjfeqt", "max": "", "min": "", "name": "stop", "presentable": false, "required": false, "system": false, "type": "date" }, { "cascadeDelete": false, "collectionId": "_pb_users_auth_", "hidden": false, "id": "o2fp9hvv", "maxSelect": 1, "minSelect": 0, "name": "stoppedBy", "presentable": false, "required": false, "system": false, "type": "relation" }, { "autogeneratePattern": "", "hidden": false, "id": "dky8o1vw", "max": 0, "min": 0, "name": "comment", "pattern": "", "presentable": false, "primaryKey": false, "required": false, "system": false, "type": "text" }, { "cascadeDelete": false, "collectionId": "jo49lycyfs2sz2c", "hidden": false, "id": "ltfephwe", "maxSelect": 1, "minSelect": 0, "name": "run", "presentable": false, "required": false, "system": false, "type": "relation" }, { "hidden": false, "id": "autodate2990389176", "name": "created", "onCreate": true, "onUpdate": false, "presentable": false, "system": false, "type": "autodate" }, { "hidden": false, "id": "autodate3332085495", "name": "updated", "onCreate": true, "onUpdate": true, "presentable": false, "system": false, "type": "autodate" }, { "hidden": false, "id": "number2728239544", "max": null, "min": null, "name": "correction", "onlyInt": false, "presentable": false, "required": false, "system": false, "type": "number" }, { "cascadeDelete": false, "collectionId": "pbc_1568971955", "hidden": false, "id": "relation3303056927", "maxSelect": 1, "minSelect": 0, "name": "team", "presentable": false, "required": false, "system": false, "type": "relation" } ], "indexes": [], "created": "2023-10-28 21:37:47.259Z", "updated": "2026-05-15 19:54:27.415Z", "system": false } ] // importCollections erwartet das Array selbst, keinen JSON-String — die // String-Variante heißt importCollectionsByMarshaledJSON. app.importCollections(collections, false) }, (app) => { // Rückwärts: die angelegten Collections wieder entfernen, in umgekehrter // Reihenfolge, damit keine Relation ins Leere zeigt. // // "users" bleibt bewusst stehen: PocketBase legt die Auth-Collection selbst // an, ein Löschen wäre kein Zurückrollen dieser Migration. const ids = [ "_pb_users_auth_", "pbc_1568971955", "xiqlzggqxg1e2y7", "jo49lycyfs2sz2c", "spgs7e4anufen9u", "iomx9mcd1ko22ma" ] for (const id of ids.slice().reverse()) { if (id === '_pb_users_auth_') continue try { app.delete(app.findCollectionByNameOrId(id)) } catch { // Bereits entfernt — nichts zu tun. } } })