cms.c2sgmbh/src/migrations_backup/20251130_150000_blocks_tables.ts
Martin Porwoll d18e58de40 chore: add jobs, backups, and migration history
Jobs:
- Add consentRetentionJob.ts for GDPR consent cleanup
- Add scheduler.ts for background job scheduling

Backups:
- Add database backup files for recovery

Migration backups:
- Archive old migration files for reference

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 08:24:26 +00:00

269 lines
16 KiB
TypeScript

import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
-- Posts List Block Table
CREATE TABLE IF NOT EXISTS "pages_blocks_posts_list_block" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"_order" integer NOT NULL,
"_path" varchar NOT NULL,
"title" varchar,
"subtitle" varchar,
"post_type" varchar DEFAULT 'blog',
"layout" varchar DEFAULT 'grid',
"columns" varchar DEFAULT '3',
"limit" integer DEFAULT 6,
"show_featured_only" boolean DEFAULT false,
"show_excerpt" boolean DEFAULT true,
"show_date" boolean DEFAULT true,
"show_author" boolean DEFAULT false,
"show_category" boolean DEFAULT true,
"show_pagination" boolean DEFAULT false,
"show_read_more" boolean DEFAULT true,
"read_more_label" varchar DEFAULT 'Alle Beiträge anzeigen',
"read_more_link" varchar DEFAULT '/blog',
"background_color" varchar DEFAULT 'white',
"block_name" varchar
);
CREATE INDEX IF NOT EXISTS "pages_blocks_posts_list_block_parent_idx" ON "pages_blocks_posts_list_block" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "pages_blocks_posts_list_block_order_idx" ON "pages_blocks_posts_list_block" USING btree ("_order");
CREATE INDEX IF NOT EXISTS "pages_blocks_posts_list_block_path_idx" ON "pages_blocks_posts_list_block" USING btree ("_path");
ALTER TABLE "pages_blocks_posts_list_block" DROP CONSTRAINT IF EXISTS "pages_blocks_posts_list_block_parent_id_fk";
ALTER TABLE "pages_blocks_posts_list_block" ADD CONSTRAINT "pages_blocks_posts_list_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
-- Testimonials Block Table
CREATE TABLE IF NOT EXISTS "pages_blocks_testimonials_block" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"_order" integer NOT NULL,
"_path" varchar NOT NULL,
"title" varchar DEFAULT 'Das sagen unsere Kunden',
"subtitle" varchar,
"layout" varchar DEFAULT 'slider',
"columns" varchar DEFAULT '3',
"display_mode" varchar DEFAULT 'all',
"limit" integer DEFAULT 6,
"show_rating" boolean DEFAULT true,
"show_image" boolean DEFAULT true,
"show_company" boolean DEFAULT true,
"show_source" boolean DEFAULT false,
"autoplay" boolean DEFAULT true,
"autoplay_speed" integer DEFAULT 5000,
"background_color" varchar DEFAULT 'light',
"block_name" varchar
);
CREATE INDEX IF NOT EXISTS "pages_blocks_testimonials_block_parent_idx" ON "pages_blocks_testimonials_block" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "pages_blocks_testimonials_block_order_idx" ON "pages_blocks_testimonials_block" USING btree ("_order");
CREATE INDEX IF NOT EXISTS "pages_blocks_testimonials_block_path_idx" ON "pages_blocks_testimonials_block" USING btree ("_path");
ALTER TABLE "pages_blocks_testimonials_block" DROP CONSTRAINT IF EXISTS "pages_blocks_testimonials_block_parent_id_fk";
ALTER TABLE "pages_blocks_testimonials_block" ADD CONSTRAINT "pages_blocks_testimonials_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
-- Newsletter Block Table
CREATE TABLE IF NOT EXISTS "pages_blocks_newsletter_block" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"_order" integer NOT NULL,
"_path" varchar NOT NULL,
"title" varchar DEFAULT 'Newsletter abonnieren',
"subtitle" varchar,
"layout" varchar DEFAULT 'inline',
"image_id" integer,
"image_position" varchar DEFAULT 'left',
"collect_name" boolean DEFAULT false,
"show_interests" boolean DEFAULT false,
"button_text" varchar DEFAULT 'Anmelden',
"placeholder_email" varchar DEFAULT 'Ihre E-Mail-Adresse',
"success_message" varchar,
"error_message" varchar,
"privacy_text" varchar,
"privacy_link" varchar DEFAULT '/datenschutz',
"source" varchar DEFAULT 'website',
"background_color" varchar DEFAULT 'accent',
"block_name" varchar
);
CREATE INDEX IF NOT EXISTS "pages_blocks_newsletter_block_parent_idx" ON "pages_blocks_newsletter_block" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "pages_blocks_newsletter_block_order_idx" ON "pages_blocks_newsletter_block" USING btree ("_order");
CREATE INDEX IF NOT EXISTS "pages_blocks_newsletter_block_path_idx" ON "pages_blocks_newsletter_block" USING btree ("_path");
ALTER TABLE "pages_blocks_newsletter_block" DROP CONSTRAINT IF EXISTS "pages_blocks_newsletter_block_parent_id_fk";
ALTER TABLE "pages_blocks_newsletter_block" ADD CONSTRAINT "pages_blocks_newsletter_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_newsletter_block" DROP CONSTRAINT IF EXISTS "pages_blocks_newsletter_block_image_id_fk";
ALTER TABLE "pages_blocks_newsletter_block" ADD CONSTRAINT "pages_blocks_newsletter_block_image_id_fk" FOREIGN KEY ("image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
-- Newsletter Block Available Interests (hasMany select)
CREATE TABLE IF NOT EXISTS "pages_blocks_newsletter_block_available_interests" (
"id" serial PRIMARY KEY NOT NULL,
"parent_id" integer NOT NULL,
"order" integer NOT NULL,
"value" varchar
);
CREATE INDEX IF NOT EXISTS "pages_blocks_newsletter_block_available_interests_parent_idx" ON "pages_blocks_newsletter_block_available_interests" USING btree ("parent_id");
CREATE INDEX IF NOT EXISTS "pages_blocks_newsletter_block_available_interests_order_idx" ON "pages_blocks_newsletter_block_available_interests" USING btree ("order");
ALTER TABLE "pages_blocks_newsletter_block_available_interests" DROP CONSTRAINT IF EXISTS "pages_blocks_newsletter_block_available_interests_parent_id_fk";
ALTER TABLE "pages_blocks_newsletter_block_available_interests" ADD CONSTRAINT "pages_blocks_newsletter_block_available_interests_parent_id_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."pages_blocks_newsletter_block"("id") ON DELETE cascade ON UPDATE no action;
-- Process Steps Block Table
CREATE TABLE IF NOT EXISTS "pages_blocks_process_steps_block" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"_order" integer NOT NULL,
"_path" varchar NOT NULL,
"title" varchar DEFAULT 'So funktioniert es',
"subtitle" varchar,
"layout" varchar DEFAULT 'horizontal',
"show_numbers" boolean DEFAULT true,
"show_icons" boolean DEFAULT true,
"cta_show" boolean DEFAULT false,
"cta_label" varchar DEFAULT 'Jetzt starten',
"cta_href" varchar,
"cta_variant" varchar DEFAULT 'default',
"background_color" varchar DEFAULT 'white',
"block_name" varchar
);
CREATE INDEX IF NOT EXISTS "pages_blocks_process_steps_block_parent_idx" ON "pages_blocks_process_steps_block" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "pages_blocks_process_steps_block_order_idx" ON "pages_blocks_process_steps_block" USING btree ("_order");
CREATE INDEX IF NOT EXISTS "pages_blocks_process_steps_block_path_idx" ON "pages_blocks_process_steps_block" USING btree ("_path");
ALTER TABLE "pages_blocks_process_steps_block" DROP CONSTRAINT IF EXISTS "pages_blocks_process_steps_block_parent_id_fk";
ALTER TABLE "pages_blocks_process_steps_block" ADD CONSTRAINT "pages_blocks_process_steps_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
-- Process Steps Block Steps (array)
CREATE TABLE IF NOT EXISTS "pages_blocks_process_steps_block_steps" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"_order" integer NOT NULL,
"title" varchar NOT NULL,
"description" varchar,
"icon" varchar,
"image_id" integer
);
CREATE INDEX IF NOT EXISTS "pages_blocks_process_steps_block_steps_parent_idx" ON "pages_blocks_process_steps_block_steps" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "pages_blocks_process_steps_block_steps_order_idx" ON "pages_blocks_process_steps_block_steps" USING btree ("_order");
ALTER TABLE "pages_blocks_process_steps_block_steps" DROP CONSTRAINT IF EXISTS "pages_blocks_process_steps_block_steps_parent_id_fk";
ALTER TABLE "pages_blocks_process_steps_block_steps" ADD CONSTRAINT "pages_blocks_process_steps_block_steps_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages_blocks_process_steps_block"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_process_steps_block_steps" DROP CONSTRAINT IF EXISTS "pages_blocks_process_steps_block_steps_image_id_fk";
ALTER TABLE "pages_blocks_process_steps_block_steps" ADD CONSTRAINT "pages_blocks_process_steps_block_steps_image_id_fk" FOREIGN KEY ("image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
-- SEO Settings Global
CREATE TABLE IF NOT EXISTS "seo_settings" (
"id" serial PRIMARY KEY NOT NULL,
"meta_defaults_title_suffix" varchar DEFAULT '| Website',
"meta_defaults_default_description" varchar,
"meta_defaults_default_og_image_id" integer,
"organization_name" varchar,
"organization_legal_name" varchar,
"organization_description" varchar,
"organization_logo_id" integer,
"organization_founding_date" timestamp(3) with time zone,
"contact_email" varchar,
"contact_phone" varchar,
"contact_fax" varchar,
"address_street" varchar,
"address_postal_code" varchar,
"address_city" varchar,
"address_region" varchar,
"address_country" varchar DEFAULT 'Deutschland',
"address_country_code" varchar DEFAULT 'DE',
"geo_latitude" numeric,
"geo_longitude" numeric,
"local_business_enabled" boolean DEFAULT false,
"local_business_type" varchar,
"local_business_price_range" varchar,
"robots_allow_indexing" boolean DEFAULT true,
"verification_google" varchar,
"verification_bing" varchar,
"verification_yandex" varchar,
"updated_at" timestamp(3) with time zone,
"created_at" timestamp(3) with time zone
);
ALTER TABLE "seo_settings" DROP CONSTRAINT IF EXISTS "seo_settings_meta_defaults_default_og_image_id_fk";
ALTER TABLE "seo_settings" ADD CONSTRAINT "seo_settings_meta_defaults_default_og_image_id_fk" FOREIGN KEY ("meta_defaults_default_og_image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "seo_settings" DROP CONSTRAINT IF EXISTS "seo_settings_organization_logo_id_fk";
ALTER TABLE "seo_settings" ADD CONSTRAINT "seo_settings_organization_logo_id_fk" FOREIGN KEY ("organization_logo_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
-- SEO Settings Keywords (hasMany text)
CREATE TABLE IF NOT EXISTS "seo_settings_meta_defaults_keywords" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"order" integer NOT NULL,
"value" varchar
);
CREATE INDEX IF NOT EXISTS "seo_settings_meta_defaults_keywords_parent_idx" ON "seo_settings_meta_defaults_keywords" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "seo_settings_meta_defaults_keywords_order_idx" ON "seo_settings_meta_defaults_keywords" USING btree ("order");
ALTER TABLE "seo_settings_meta_defaults_keywords" DROP CONSTRAINT IF EXISTS "seo_settings_meta_defaults_keywords_parent_id_fk";
ALTER TABLE "seo_settings_meta_defaults_keywords" ADD CONSTRAINT "seo_settings_meta_defaults_keywords_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."seo_settings"("id") ON DELETE cascade ON UPDATE no action;
-- SEO Settings Social Profiles (array)
CREATE TABLE IF NOT EXISTS "seo_settings_social_profiles" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"_order" integer NOT NULL,
"platform" varchar,
"url" varchar
);
CREATE INDEX IF NOT EXISTS "seo_settings_social_profiles_parent_idx" ON "seo_settings_social_profiles" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "seo_settings_social_profiles_order_idx" ON "seo_settings_social_profiles" USING btree ("_order");
ALTER TABLE "seo_settings_social_profiles" DROP CONSTRAINT IF EXISTS "seo_settings_social_profiles_parent_id_fk";
ALTER TABLE "seo_settings_social_profiles" ADD CONSTRAINT "seo_settings_social_profiles_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."seo_settings"("id") ON DELETE cascade ON UPDATE no action;
-- SEO Settings Opening Hours (array)
CREATE TABLE IF NOT EXISTS "seo_settings_local_business_opening_hours" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"_order" integer NOT NULL,
"specification" varchar
);
CREATE INDEX IF NOT EXISTS "seo_settings_local_business_opening_hours_parent_idx" ON "seo_settings_local_business_opening_hours" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "seo_settings_local_business_opening_hours_order_idx" ON "seo_settings_local_business_opening_hours" USING btree ("_order");
ALTER TABLE "seo_settings_local_business_opening_hours" DROP CONSTRAINT IF EXISTS "seo_settings_local_business_opening_hours_parent_id_fk";
ALTER TABLE "seo_settings_local_business_opening_hours" ADD CONSTRAINT "seo_settings_local_business_opening_hours_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."seo_settings"("id") ON DELETE cascade ON UPDATE no action;
-- SEO Settings Additional Disallow Paths (hasMany text)
CREATE TABLE IF NOT EXISTS "seo_settings_robots_additional_disallow" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"order" integer NOT NULL,
"value" varchar
);
CREATE INDEX IF NOT EXISTS "seo_settings_robots_additional_disallow_parent_idx" ON "seo_settings_robots_additional_disallow" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "seo_settings_robots_additional_disallow_order_idx" ON "seo_settings_robots_additional_disallow" USING btree ("order");
ALTER TABLE "seo_settings_robots_additional_disallow" DROP CONSTRAINT IF EXISTS "seo_settings_robots_additional_disallow_parent_id_fk";
ALTER TABLE "seo_settings_robots_additional_disallow" ADD CONSTRAINT "seo_settings_robots_additional_disallow_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."seo_settings"("id") ON DELETE cascade ON UPDATE no action;
`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
DROP TABLE IF EXISTS "pages_blocks_posts_list_block" CASCADE;
DROP TABLE IF EXISTS "pages_blocks_testimonials_block" CASCADE;
DROP TABLE IF EXISTS "pages_blocks_newsletter_block_available_interests" CASCADE;
DROP TABLE IF EXISTS "pages_blocks_newsletter_block" CASCADE;
DROP TABLE IF EXISTS "pages_blocks_process_steps_block_steps" CASCADE;
DROP TABLE IF EXISTS "pages_blocks_process_steps_block" CASCADE;
DROP TABLE IF EXISTS "seo_settings_meta_defaults_keywords" CASCADE;
DROP TABLE IF EXISTS "seo_settings_social_profiles" CASCADE;
DROP TABLE IF EXISTS "seo_settings_local_business_opening_hours" CASCADE;
DROP TABLE IF EXISTS "seo_settings_robots_additional_disallow" CASCADE;
DROP TABLE IF EXISTS "seo_settings" CASCADE;
`)
}