Die SvelteKit-App liegt unter frontend/, das Backend unter backend/ als eigenständige PocketBase-Instanz mit Dockerfile, docker-compose und versioniertem Schema. - PocketBase-URL über PUBLIC_PB_URL konfigurierbar, Default bleibt die produktive Instanz https://api.stammtisch-hersbruck.de - Schema als Snapshot-Migration der sechs fachlichen Collections (users, teams, events, runs, riders, times), abgezogen von der produktiven Instanz. Verifiziert: ein Erststart gegen leere pb_data legt alle sechs an, Felder und API-Rules stimmen überein. - pb_data und pb_migrations als Bind-Mounts, damit Daten persistieren und im Admin-UI erzeugte Migrationen im Repo landen - Veraltete Dokumentation entfernt: pocketbase_schema.json nannte Collections (stages, results, organizers), die es nicht gibt Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
919 lines
30 KiB
JavaScript
919 lines
30 KiB
JavaScript
/// <reference path="../pb_data/types.d.ts" />
|
|
|
|
// 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": "<p>Hello,</p>\n<p>We noticed a login to your {APP_NAME} account from a new location.</p>\n<p>If this was you, you may disregard this email.</p>\n<p><strong>If this wasn't you, you should immediately change your {APP_NAME} account password to revoke access from all other locations.</strong></p>\n<p>\n Thanks,<br/>\n {APP_NAME} team\n</p>"
|
|
}
|
|
},
|
|
"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": "<p>Hello,</p>\n<p>Your one-time password is: <strong>{OTP}</strong></p>\n<p><i>If you didn't ask for the one-time password, you can ignore this email.</i></p>\n<p>\n Thanks,<br/>\n {APP_NAME} team\n</p>"
|
|
}
|
|
},
|
|
"authToken": {
|
|
"duration": 1209600
|
|
},
|
|
"passwordResetToken": {
|
|
"duration": 1800
|
|
},
|
|
"emailChangeToken": {
|
|
"duration": 1800
|
|
},
|
|
"verificationToken": {
|
|
"duration": 604800
|
|
},
|
|
"fileToken": {
|
|
"duration": 120
|
|
},
|
|
"verificationTemplate": {
|
|
"subject": "Verify your {APP_NAME} email",
|
|
"body": "<p>Hello,</p>\n<p>Thank you for joining us at {APP_NAME}.</p>\n<p>Click on the button below to verify your email address.</p>\n<p>\n <a class=\"btn\" href=\"{APP_URL}/_/#/auth/confirm-verification/{TOKEN}\" target=\"_blank\" rel=\"noopener\">Verify</a>\n</p>\n<p>\n Thanks,<br/>\n {APP_NAME} team\n</p>"
|
|
},
|
|
"resetPasswordTemplate": {
|
|
"subject": "Reset your {APP_NAME} password",
|
|
"body": "<p>Hello,</p>\n<p>Click on the button below to reset your password.</p>\n<p>\n <a class=\"btn\" href=\"{APP_URL}/_/#/auth/confirm-password-reset/{TOKEN}\" target=\"_blank\" rel=\"noopener\">Reset password</a>\n</p>\n<p><i>If you didn't ask to reset your password, you can ignore this email.</i></p>\n<p>\n Thanks,<br/>\n {APP_NAME} team\n</p>"
|
|
},
|
|
"confirmEmailChangeTemplate": {
|
|
"subject": "Confirm your {APP_NAME} new email address",
|
|
"body": "<p>Hello,</p>\n<p>Click on the button below to confirm your new email address.</p>\n<p>\n <a class=\"btn\" href=\"{APP_URL}/_/#/auth/confirm-email-change/{TOKEN}\" target=\"_blank\" rel=\"noopener\">Confirm new email</a>\n</p>\n<p><i>If you didn't ask to change your email address, you can ignore this email.</i></p>\n<p>\n Thanks,<br/>\n {APP_NAME} team\n</p>"
|
|
}
|
|
},
|
|
{
|
|
"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.
|
|
}
|
|
}
|
|
})
|