fix: add missing globals migration and await seed
CI / test (push) Canceled after 0s
CI / build-image (push) Canceled after 0s

This commit is contained in:
2026-09-16 21:23:55 +02:00
parent 7c2b0ec2b5
commit e26da639ce
4 changed files with 6792 additions and 2 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,101 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
CREATE TYPE "public"."enum_analytics_events_device" AS ENUM('mobile', 'desktop', 'tablet');
CREATE TYPE "public"."enum_analytics_events_browser" AS ENUM('chrome', 'firefox', 'safari', 'edge', 'other');
CREATE TABLE "analytics_events" (
"id" serial PRIMARY KEY NOT NULL,
"session_id" varchar NOT NULL,
"visitor_hash" varchar NOT NULL,
"path" varchar NOT NULL,
"event_name" varchar DEFAULT 'page_view' NOT NULL,
"referrer_host" varchar,
"device" "enum_analytics_events_device",
"browser" "enum_analytics_events_browser",
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "analytics_daily_stats" (
"id" serial PRIMARY KEY NOT NULL,
"date" timestamp(3) with time zone NOT NULL,
"sessions" numeric DEFAULT 0 NOT NULL,
"page_views" numeric DEFAULT 0 NOT NULL,
"unique_visitors" numeric DEFAULT 0 NOT NULL,
"event_counts" jsonb,
"device_counts" jsonb,
"browser_counts" jsonb,
"top_paths" jsonb,
"entry_paths" jsonb,
"exit_paths" jsonb,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "cookie_settings" (
"id" serial PRIMARY KEY NOT NULL,
"consent_version" varchar DEFAULT '1.0' NOT NULL,
"necessary_label" varchar DEFAULT 'Notwendig' NOT NULL,
"necessary_description" varchar DEFAULT 'Für den Betrieb der Website technisch erforderlich (z. B. Login, Sitzung). Kann nicht deaktiviert werden.' NOT NULL,
"preferences_label" varchar DEFAULT 'Präferenzen' NOT NULL,
"preferences_description" varchar DEFAULT 'Speichert Einstellungen wie z. B. bevorzugte Anzeigeoptionen.' NOT NULL,
"preferences_enabled" boolean DEFAULT true,
"statistics_label" varchar DEFAULT 'Statistik' NOT NULL,
"statistics_description" varchar DEFAULT 'Anonymisierte, datensparsame Reichweitenmessung (Seitenaufrufe, Ereignisse) ohne personenbezogene Profile.' NOT NULL,
"statistics_enabled" boolean DEFAULT true,
"updated_at" timestamp(3) with time zone,
"created_at" timestamp(3) with time zone
);
CREATE TABLE "analytics_settings" (
"id" serial PRIMARY KEY NOT NULL,
"raw_retention_days" numeric DEFAULT 90 NOT NULL,
"aggregate_retention_months" numeric DEFAULT 12 NOT NULL,
"updated_at" timestamp(3) with time zone,
"created_at" timestamp(3) with time zone
);
ALTER TABLE "meeting_settings" ALTER COLUMN "participant_join_window_minutes" SET DEFAULT 10;
ALTER TABLE "users" ADD COLUMN "can_view_analytics" boolean DEFAULT true;
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "analytics_events_id" integer;
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "analytics_daily_stats_id" integer;
CREATE INDEX "analytics_events_session_id_idx" ON "analytics_events" USING btree ("session_id");
CREATE INDEX "analytics_events_path_idx" ON "analytics_events" USING btree ("path");
CREATE INDEX "analytics_events_event_name_idx" ON "analytics_events" USING btree ("event_name");
CREATE INDEX "analytics_events_updated_at_idx" ON "analytics_events" USING btree ("updated_at");
CREATE INDEX "analytics_events_created_at_idx" ON "analytics_events" USING btree ("created_at");
CREATE INDEX "visitorHash_createdAt_idx" ON "analytics_events" USING btree ("visitor_hash","created_at");
CREATE INDEX "createdAt_idx" ON "analytics_events" USING btree ("created_at");
CREATE UNIQUE INDEX "analytics_daily_stats_date_idx" ON "analytics_daily_stats" USING btree ("date");
CREATE INDEX "analytics_daily_stats_updated_at_idx" ON "analytics_daily_stats" USING btree ("updated_at");
CREATE INDEX "analytics_daily_stats_created_at_idx" ON "analytics_daily_stats" USING btree ("created_at");
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_analytics_events_fk" FOREIGN KEY ("analytics_events_id") REFERENCES "public"."analytics_events"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_analytics_daily_stats_fk" FOREIGN KEY ("analytics_daily_stats_id") REFERENCES "public"."analytics_daily_stats"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "payload_locked_documents_rels_analytics_events_id_idx" ON "payload_locked_documents_rels" USING btree ("analytics_events_id");
CREATE INDEX "payload_locked_documents_rels_analytics_daily_stats_id_idx" ON "payload_locked_documents_rels" USING btree ("analytics_daily_stats_id");`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
ALTER TABLE "analytics_events" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "analytics_daily_stats" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "cookie_settings" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "analytics_settings" DISABLE ROW LEVEL SECURITY;
DROP TABLE "analytics_events" CASCADE;
DROP TABLE "analytics_daily_stats" CASCADE;
DROP TABLE "cookie_settings" CASCADE;
DROP TABLE "analytics_settings" CASCADE;
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_analytics_events_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_analytics_daily_stats_fk";
DROP INDEX "payload_locked_documents_rels_analytics_events_id_idx";
DROP INDEX "payload_locked_documents_rels_analytics_daily_stats_id_idx";
ALTER TABLE "meeting_settings" ALTER COLUMN "participant_join_window_minutes" SET DEFAULT 30;
ALTER TABLE "users" DROP COLUMN "can_view_analytics";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "analytics_events_id";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "analytics_daily_stats_id";
DROP TYPE "public"."enum_analytics_events_device";
DROP TYPE "public"."enum_analytics_events_browser";`)
}
+7 -1
View File
@@ -1,9 +1,15 @@
import * as migration_20260826_004425 from './20260826_004425';
import * as migration_20260916_192252_cookie_settings from './20260916_192252_cookie_settings';
export const migrations = [
{
up: migration_20260826_004425.up,
down: migration_20260826_004425.down,
name: '20260826_004425'
name: '20260826_004425',
},
{
up: migration_20260916_192252_cookie_settings.up,
down: migration_20260916_192252_cookie_settings.down,
name: '20260916_192252_cookie_settings'
},
];
+25 -1
View File
@@ -220,6 +220,30 @@ async function seedGlobals(payload: Awaited<ReturnType<typeof getPayload>>) {
},
});
console.log(" ↺ Global „Termin buchen“ gesetzt");
await payload.updateGlobal({
slug: "cookie-settings",
data: {
consentVersion: "1.0",
necessary: {
label: "Notwendig",
description:
"Für den Betrieb der Website technisch erforderlich (z. B. Login, Sitzung). Kann nicht deaktiviert werden.",
},
preferences: {
label: "Präferenzen",
description: "Speichert Einstellungen wie z. B. bevorzugte Anzeigeoptionen.",
enabled: true,
},
statistics: {
label: "Statistik",
description:
"Anonymisierte, datensparsame Reichweitenmessung (Seitenaufrufe, Ereignisse) ohne personenbezogene Profile.",
enabled: true,
},
},
});
console.log(" ↺ Global „Cookie-Einstellungen“ gesetzt");
}
async function run() {
@@ -235,7 +259,7 @@ async function run() {
process.exit(0);
}
run().catch((err) => {
await run().catch((err) => {
console.error(err);
process.exit(1);
});