From 375a3305bbdb992c1ab32aaae562982a8774866b Mon Sep 17 00:00:00 2001 From: rene Date: Tue, 19 May 2026 20:40:47 +0200 Subject: [PATCH] Add PocketBase schema migrations and migration pipeline - 8 collections: vereine, gruppen, mitglieder, beitraege, einzuege, termine, nachrichten, push_subscriptions - verein_id relation added to users (multi-tenant isolation) - API rules enforce tenant separation via @request.auth.verein_id - docker-compose: --migrationsDir=/pb_data/migrations flag + volume mount - Makefile: migrations sync step added to deploy target --- Makefile | 13 +- docker-compose.yml | 2 + .../1779215839_created_vereine.js | 144 ++++++++++++++++++ .../1779215883_created_gruppen.js | 67 ++++++++ .../pb_migrations/1779215883_updated_users.js | 29 ++++ .../1779215901_created_beitraege.js | 97 ++++++++++++ .../1779215901_created_mitglieder.js | 139 +++++++++++++++++ .../1779215948_created_einzuege.js | 123 +++++++++++++++ .../1779215948_created_nachrichten.js | 105 +++++++++++++ .../1779215948_created_push_subscriptions.js | 94 ++++++++++++ .../1779215948_created_termine.js | 120 +++++++++++++++ 11 files changed, 931 insertions(+), 2 deletions(-) create mode 100644 pocketbase/pb_migrations/1779215839_created_vereine.js create mode 100644 pocketbase/pb_migrations/1779215883_created_gruppen.js create mode 100644 pocketbase/pb_migrations/1779215883_updated_users.js create mode 100644 pocketbase/pb_migrations/1779215901_created_beitraege.js create mode 100644 pocketbase/pb_migrations/1779215901_created_mitglieder.js create mode 100644 pocketbase/pb_migrations/1779215948_created_einzuege.js create mode 100644 pocketbase/pb_migrations/1779215948_created_nachrichten.js create mode 100644 pocketbase/pb_migrations/1779215948_created_push_subscriptions.js create mode 100644 pocketbase/pb_migrations/1779215948_created_termine.js diff --git a/Makefile b/Makefile index 5a6b184..9c2699f 100644 --- a/Makefile +++ b/Makefile @@ -18,8 +18,10 @@ TAR_EXCLUDE := --exclude='.git' \ --exclude='./.env' \ --exclude='./.DS_Store' -HOOKS_SRC := pocketbase/pb_hooks -HOOKS_DST := /volume1/docker/vereinshaus/pocketbase/data/pb_hooks +HOOKS_SRC := pocketbase/pb_hooks +HOOKS_DST := /volume1/docker/vereinshaus/pocketbase/data/pb_hooks +MIGRATIONS_SRC := pocketbase/pb_migrations +MIGRATIONS_DST := /volume1/docker/vereinshaus/pocketbase/migrations .PHONY: help check-ssh start stop restart status logs logs-f logs-app \ shell-pb pb-admin deploy @@ -71,6 +73,13 @@ deploy: check-ssh cat "$$f" | ssh $(DS_HOST) "cat > $(HOOKS_DST)/$$(basename $$f)"; \ done; \ fi + @echo "→ PocketBase Migrations synchronisieren..." + @ssh $(DS_HOST) "mkdir -p $(MIGRATIONS_DST)" + @if ls $(MIGRATIONS_SRC)/*.js 2>/dev/null | grep -q .; then \ + for f in $(MIGRATIONS_SRC)/*.js; do \ + cat "$$f" | ssh $(DS_HOST) "cat > $(MIGRATIONS_DST)/$$(basename $$f)"; \ + done; \ + fi @echo "→ Docker rebuild + restart..." @ssh $(DS_HOST) " \ cd $(DS_PATH) && \ diff --git a/docker-compose.yml b/docker-compose.yml index 47d3cd2..2e1a044 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,10 +5,12 @@ services: image: ghcr.io/muchobien/pocketbase:latest container_name: vereinshaus-pocketbase restart: unless-stopped + command: ["--migrationsDir=/pb_data/migrations"] volumes: - /volume1/docker/vereinshaus/pocketbase/data:/pb_data - /volume1/docker/vereinshaus/pocketbase/storage:/pb_public - /volume1/docker/vereinshaus/pocketbase/data/pb_hooks:/pb_hooks + - /volume1/docker/vereinshaus/pocketbase/migrations:/pb_data/migrations environment: - TZ=Europe/Berlin - BREVO_KEY=${BREVO_KEY} diff --git a/pocketbase/pb_migrations/1779215839_created_vereine.js b/pocketbase/pb_migrations/1779215839_created_vereine.js new file mode 100644 index 0000000..b1f4095 --- /dev/null +++ b/pocketbase/pb_migrations/1779215839_created_vereine.js @@ -0,0 +1,144 @@ +/// +migrate((app) => { + const collection = new Collection({ + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "help": "", + "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": "", + "help": "", + "hidden": false, + "id": "text1579384326", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "help": "", + "hidden": false, + "id": "text3525840331", + "max": 0, + "min": 0, + "name": "plz", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "help": "", + "hidden": false, + "id": "text4138466142", + "max": 0, + "min": 0, + "name": "ort", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "help": "", + "hidden": false, + "id": "select1497100012", + "maxSelect": 1, + "name": "bundesland", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "BW", + "BY", + "BE", + "BB", + "HB", + "HH", + "HE", + "MV", + "NI", + "NW", + "RP", + "SL", + "SN", + "ST", + "SH", + "TH" + ] + }, + { + "help": "", + "hidden": false, + "id": "select3713686397", + "maxSelect": 1, + "name": "plan", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "free", + "starter", + "wachstum", + "verband" + ] + }, + { + "autogeneratePattern": "", + "help": "", + "hidden": false, + "id": "text1888339527", + "max": 0, + "min": 0, + "name": "stripe_customer_id", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + } + ], + "id": "pbc_3589557411", + "indexes": [], + "listRule": "@request.auth.verein_id = id", + "name": "vereine", + "system": false, + "type": "base", + "updateRule": "@request.auth.verein_id = id", + "viewRule": "@request.auth.verein_id = id" + }); + + return app.save(collection); +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_3589557411"); + + return app.delete(collection); +}) diff --git a/pocketbase/pb_migrations/1779215883_created_gruppen.js b/pocketbase/pb_migrations/1779215883_created_gruppen.js new file mode 100644 index 0000000..858d446 --- /dev/null +++ b/pocketbase/pb_migrations/1779215883_created_gruppen.js @@ -0,0 +1,67 @@ +/// +migrate((app) => { + const collection = new Collection({ + "createRule": "@request.auth.verein_id = verein_id", + "deleteRule": "@request.auth.verein_id = verein_id", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "help": "", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "pbc_3589557411", + "help": "", + "hidden": false, + "id": "relation145676011", + "maxSelect": 1, + "minSelect": 0, + "name": "verein_id", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "autogeneratePattern": "", + "help": "", + "hidden": false, + "id": "text1579384326", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + } + ], + "id": "pbc_3099069179", + "indexes": [], + "listRule": "@request.auth.verein_id = verein_id", + "name": "gruppen", + "system": false, + "type": "base", + "updateRule": "@request.auth.verein_id = verein_id", + "viewRule": "@request.auth.verein_id = verein_id" + }); + + return app.save(collection); +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_3099069179"); + + return app.delete(collection); +}) diff --git a/pocketbase/pb_migrations/1779215883_updated_users.js b/pocketbase/pb_migrations/1779215883_updated_users.js new file mode 100644 index 0000000..d8f294a --- /dev/null +++ b/pocketbase/pb_migrations/1779215883_updated_users.js @@ -0,0 +1,29 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // add field + collection.fields.addAt(10, new Field({ + "cascadeDelete": false, + "collectionId": "pbc_3589557411", + "help": "", + "hidden": false, + "id": "relation145676011", + "maxSelect": 1, + "minSelect": 0, + "name": "verein_id", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // remove field + collection.fields.removeById("relation145676011") + + return app.save(collection) +}) diff --git a/pocketbase/pb_migrations/1779215901_created_beitraege.js b/pocketbase/pb_migrations/1779215901_created_beitraege.js new file mode 100644 index 0000000..5ffa960 --- /dev/null +++ b/pocketbase/pb_migrations/1779215901_created_beitraege.js @@ -0,0 +1,97 @@ +/// +migrate((app) => { + const collection = new Collection({ + "createRule": "@request.auth.verein_id = verein_id", + "deleteRule": "@request.auth.verein_id = verein_id", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "help": "", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "pbc_3589557411", + "help": "", + "hidden": false, + "id": "relation145676011", + "maxSelect": 1, + "minSelect": 0, + "name": "verein_id", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "autogeneratePattern": "", + "help": "", + "hidden": false, + "id": "text1579384326", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + }, + { + "help": "", + "hidden": false, + "id": "number3107246631", + "max": null, + "min": null, + "name": "betrag", + "onlyInt": false, + "presentable": false, + "required": true, + "system": false, + "type": "number" + }, + { + "help": "", + "hidden": false, + "id": "select917011370", + "maxSelect": 1, + "name": "rhythmus", + "presentable": false, + "required": true, + "system": false, + "type": "select", + "values": [ + "monatlich", + "quartalsweise", + "jaehrlich", + "einmalig" + ] + } + ], + "id": "pbc_3218207135", + "indexes": [], + "listRule": "@request.auth.verein_id = verein_id", + "name": "beitraege", + "system": false, + "type": "base", + "updateRule": "@request.auth.verein_id = verein_id", + "viewRule": "@request.auth.verein_id = verein_id" + }); + + return app.save(collection); +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_3218207135"); + + return app.delete(collection); +}) diff --git a/pocketbase/pb_migrations/1779215901_created_mitglieder.js b/pocketbase/pb_migrations/1779215901_created_mitglieder.js new file mode 100644 index 0000000..6dad2e0 --- /dev/null +++ b/pocketbase/pb_migrations/1779215901_created_mitglieder.js @@ -0,0 +1,139 @@ +/// +migrate((app) => { + const collection = new Collection({ + "createRule": "@request.auth.verein_id = verein_id", + "deleteRule": "@request.auth.verein_id = verein_id", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "help": "", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "pbc_3589557411", + "help": "", + "hidden": false, + "id": "relation145676011", + "maxSelect": 1, + "minSelect": 0, + "name": "verein_id", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "autogeneratePattern": "", + "help": "", + "hidden": false, + "id": "text386110805", + "max": 0, + "min": 0, + "name": "vorname", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "help": "", + "hidden": false, + "id": "text3586640595", + "max": 0, + "min": 0, + "name": "nachname", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + }, + { + "exceptDomains": null, + "help": "", + "hidden": false, + "id": "email3885137012", + "name": "email", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "email" + }, + { + "autogeneratePattern": "", + "help": "", + "hidden": false, + "id": "text4208291426", + "max": 0, + "min": 0, + "name": "iban", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "cascadeDelete": false, + "collectionId": "pbc_3099069179", + "help": "", + "hidden": false, + "id": "relation1077495665", + "maxSelect": 99, + "minSelect": 0, + "name": "gruppe_ids", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "help": "", + "hidden": false, + "id": "select2063623452", + "maxSelect": 1, + "name": "status", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "aktiv", + "passiv", + "ausgetreten" + ] + } + ], + "id": "pbc_2707111162", + "indexes": [], + "listRule": "@request.auth.verein_id = verein_id", + "name": "mitglieder", + "system": false, + "type": "base", + "updateRule": "@request.auth.verein_id = verein_id", + "viewRule": "@request.auth.verein_id = verein_id" + }); + + return app.save(collection); +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_2707111162"); + + return app.delete(collection); +}) diff --git a/pocketbase/pb_migrations/1779215948_created_einzuege.js b/pocketbase/pb_migrations/1779215948_created_einzuege.js new file mode 100644 index 0000000..16c1ad5 --- /dev/null +++ b/pocketbase/pb_migrations/1779215948_created_einzuege.js @@ -0,0 +1,123 @@ +/// +migrate((app) => { + const collection = new Collection({ + "createRule": "@request.auth.verein_id = mitglied_id.verein_id", + "deleteRule": "@request.auth.verein_id = mitglied_id.verein_id", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "help": "", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "pbc_2707111162", + "help": "", + "hidden": false, + "id": "relation3039789658", + "maxSelect": 1, + "minSelect": 0, + "name": "mitglied_id", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "cascadeDelete": false, + "collectionId": "pbc_3218207135", + "help": "", + "hidden": false, + "id": "relation715527895", + "maxSelect": 1, + "minSelect": 0, + "name": "beitrag_id", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "help": "", + "hidden": false, + "id": "number3107246631", + "max": null, + "min": null, + "name": "betrag", + "onlyInt": false, + "presentable": false, + "required": true, + "system": false, + "type": "number" + }, + { + "help": "", + "hidden": false, + "id": "date3314956993", + "max": "", + "min": "", + "name": "faellig_am", + "presentable": false, + "required": false, + "system": false, + "type": "date" + }, + { + "help": "", + "hidden": false, + "id": "select2063623452", + "maxSelect": 1, + "name": "status", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "ausstehend", + "bezahlt", + "fehlgeschlagen", + "storniert" + ] + }, + { + "autogeneratePattern": "", + "help": "", + "hidden": false, + "id": "text4235393406", + "max": 0, + "min": 0, + "name": "stripe_payment_intent_id", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + } + ], + "id": "pbc_659326735", + "indexes": [], + "listRule": "@request.auth.verein_id = mitglied_id.verein_id", + "name": "einzuege", + "system": false, + "type": "base", + "updateRule": "@request.auth.verein_id = mitglied_id.verein_id", + "viewRule": "@request.auth.verein_id = mitglied_id.verein_id" + }); + + return app.save(collection); +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_659326735"); + + return app.delete(collection); +}) diff --git a/pocketbase/pb_migrations/1779215948_created_nachrichten.js b/pocketbase/pb_migrations/1779215948_created_nachrichten.js new file mode 100644 index 0000000..5343778 --- /dev/null +++ b/pocketbase/pb_migrations/1779215948_created_nachrichten.js @@ -0,0 +1,105 @@ +/// +migrate((app) => { + const collection = new Collection({ + "createRule": "@request.auth.verein_id = verein_id", + "deleteRule": "@request.auth.verein_id = verein_id", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "help": "", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "pbc_3589557411", + "help": "", + "hidden": false, + "id": "relation145676011", + "maxSelect": 1, + "minSelect": 0, + "name": "verein_id", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "autogeneratePattern": "", + "help": "", + "hidden": false, + "id": "text3446813636", + "max": 0, + "min": 0, + "name": "betreff", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + }, + { + "convertURLs": false, + "help": "", + "hidden": false, + "id": "editor999008199", + "maxSize": 0, + "name": "text", + "presentable": false, + "required": false, + "system": false, + "type": "editor" + }, + { + "cascadeDelete": false, + "collectionId": "pbc_3099069179", + "help": "", + "hidden": false, + "id": "relation1077495665", + "maxSelect": 99, + "minSelect": 0, + "name": "gruppe_ids", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "help": "", + "hidden": false, + "id": "date2716153632", + "max": "", + "min": "", + "name": "gesendet_am", + "presentable": false, + "required": false, + "system": false, + "type": "date" + } + ], + "id": "pbc_1415911511", + "indexes": [], + "listRule": "@request.auth.verein_id = verein_id", + "name": "nachrichten", + "system": false, + "type": "base", + "updateRule": "@request.auth.verein_id = verein_id", + "viewRule": "@request.auth.verein_id = verein_id" + }); + + return app.save(collection); +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1415911511"); + + return app.delete(collection); +}) diff --git a/pocketbase/pb_migrations/1779215948_created_push_subscriptions.js b/pocketbase/pb_migrations/1779215948_created_push_subscriptions.js new file mode 100644 index 0000000..c7998d0 --- /dev/null +++ b/pocketbase/pb_migrations/1779215948_created_push_subscriptions.js @@ -0,0 +1,94 @@ +/// +migrate((app) => { + const collection = new Collection({ + "createRule": "@request.auth.id != ''", + "deleteRule": "@request.auth.id = user_id", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "help": "", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "_pb_users_auth_", + "help": "", + "hidden": false, + "id": "relation2809058197", + "maxSelect": 1, + "minSelect": 0, + "name": "user_id", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "exceptDomains": null, + "help": "", + "hidden": false, + "id": "url3292663675", + "name": "endpoint", + "onlyDomains": null, + "presentable": false, + "required": true, + "system": false, + "type": "url" + }, + { + "autogeneratePattern": "", + "help": "", + "hidden": false, + "id": "text3303707132", + "max": 0, + "min": 0, + "name": "p256dh", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "help": "", + "hidden": false, + "id": "text4175343705", + "max": 0, + "min": 0, + "name": "auth", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + } + ], + "id": "pbc_1438754935", + "indexes": [], + "listRule": "@request.auth.id = user_id", + "name": "push_subscriptions", + "system": false, + "type": "base", + "updateRule": "@request.auth.id = user_id", + "viewRule": "@request.auth.id = user_id" + }); + + return app.save(collection); +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1438754935"); + + return app.delete(collection); +}) diff --git a/pocketbase/pb_migrations/1779215948_created_termine.js b/pocketbase/pb_migrations/1779215948_created_termine.js new file mode 100644 index 0000000..6053dbe --- /dev/null +++ b/pocketbase/pb_migrations/1779215948_created_termine.js @@ -0,0 +1,120 @@ +/// +migrate((app) => { + const collection = new Collection({ + "createRule": "@request.auth.verein_id = verein_id", + "deleteRule": "@request.auth.verein_id = verein_id", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "help": "", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "pbc_3589557411", + "help": "", + "hidden": false, + "id": "relation145676011", + "maxSelect": 1, + "minSelect": 0, + "name": "verein_id", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "autogeneratePattern": "", + "help": "", + "hidden": false, + "id": "text2200468358", + "max": 0, + "min": 0, + "name": "titel", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + }, + { + "help": "", + "hidden": false, + "id": "date363840172", + "max": "", + "min": "", + "name": "beginn", + "presentable": false, + "required": true, + "system": false, + "type": "date" + }, + { + "help": "", + "hidden": false, + "id": "date1404831091", + "max": "", + "min": "", + "name": "ende", + "presentable": false, + "required": false, + "system": false, + "type": "date" + }, + { + "autogeneratePattern": "", + "help": "", + "hidden": false, + "id": "text4138466142", + "max": 0, + "min": 0, + "name": "ort", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "cascadeDelete": false, + "collectionId": "pbc_3099069179", + "help": "", + "hidden": false, + "id": "relation1077495665", + "maxSelect": 99, + "minSelect": 0, + "name": "gruppe_ids", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + } + ], + "id": "pbc_2279568741", + "indexes": [], + "listRule": "@request.auth.verein_id = verein_id", + "name": "termine", + "system": false, + "type": "base", + "updateRule": "@request.auth.verein_id = verein_id", + "viewRule": "@request.auth.verein_id = verein_id" + }); + + return app.save(collection); +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_2279568741"); + + return app.delete(collection); +})