CREATE TYPE "public"."media_kind" AS ENUM('image', 'video');--> statement-breakpoint CREATE TYPE "public"."issue_status" AS ENUM('draft', 'scheduled', 'published');--> statement-breakpoint CREATE TYPE "public"."post_audience" AS ENUM('internal', 'customer', 'public');--> statement-breakpoint CREATE TYPE "public"."post_locale" AS ENUM('de', 'en');--> statement-breakpoint CREATE TYPE "public"."post_status" AS ENUM('draft', 'review', 'scheduled', 'published', 'archived');--> statement-breakpoint CREATE TYPE "public"."post_type" AS ENUM('feature', 'improvement', 'fix', 'breaking', 'info');--> statement-breakpoint CREATE TABLE "media" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "project_id" uuid NOT NULL, "kind" "media_kind" DEFAULT 'image' NOT NULL, "original_filename" text NOT NULL, "mime" text NOT NULL, "width" integer, "height" integer, "byte_size" integer NOT NULL, "variants" jsonb DEFAULT '[]'::jsonb NOT NULL, "alt" text, "caption" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "block" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "post_id" uuid NOT NULL, "sort" integer DEFAULT 0 NOT NULL, "type" text NOT NULL, "data" jsonb DEFAULT '{}'::jsonb NOT NULL ); --> statement-breakpoint CREATE TABLE "issue" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "project_id" uuid NOT NULL, "title" text NOT NULL, "period_from" timestamp with time zone, "period_to" timestamp with time zone, "status" "issue_status" DEFAULT 'draft' NOT NULL, "publish_at" timestamp with time zone, "created_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "post_tag" ( "post_id" uuid NOT NULL, "tag_id" uuid NOT NULL, CONSTRAINT "post_tag_post_id_tag_id_pk" PRIMARY KEY("post_id","tag_id") ); --> statement-breakpoint CREATE TABLE "post" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "project_id" uuid NOT NULL, "issue_id" uuid, "number" integer NOT NULL, "slug" text NOT NULL, "title" text NOT NULL, "teaser" text, "type" "post_type" DEFAULT 'feature' NOT NULL, "audience" "post_audience" DEFAULT 'internal' NOT NULL, "status" "post_status" DEFAULT 'draft' NOT NULL, "locale" "post_locale" DEFAULT 'de' NOT NULL, "translation_group" uuid, "publish_at" timestamp with time zone, "author_name" text, "cover_media_id" uuid, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "post_project_slug" UNIQUE("project_id","slug"), CONSTRAINT "post_project_number" UNIQUE("project_id","number") ); --> statement-breakpoint CREATE TABLE "tag" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "project_id" uuid NOT NULL, "slug" text NOT NULL, "label" text NOT NULL, CONSTRAINT "tag_project_slug" UNIQUE("project_id","slug") ); --> statement-breakpoint ALTER TABLE "media" ADD CONSTRAINT "media_project_id_project_id_fk" FOREIGN KEY ("project_id") REFERENCES "public"."project"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "block" ADD CONSTRAINT "block_post_id_post_id_fk" FOREIGN KEY ("post_id") REFERENCES "public"."post"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "issue" ADD CONSTRAINT "issue_project_id_project_id_fk" FOREIGN KEY ("project_id") REFERENCES "public"."project"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "post_tag" ADD CONSTRAINT "post_tag_post_id_post_id_fk" FOREIGN KEY ("post_id") REFERENCES "public"."post"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "post_tag" ADD CONSTRAINT "post_tag_tag_id_tag_id_fk" FOREIGN KEY ("tag_id") REFERENCES "public"."tag"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "post" ADD CONSTRAINT "post_project_id_project_id_fk" FOREIGN KEY ("project_id") REFERENCES "public"."project"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "post" ADD CONSTRAINT "post_issue_id_issue_id_fk" FOREIGN KEY ("issue_id") REFERENCES "public"."issue"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint ALTER TABLE "post" ADD CONSTRAINT "post_cover_media_id_media_id_fk" FOREIGN KEY ("cover_media_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint ALTER TABLE "tag" ADD CONSTRAINT "tag_project_id_project_id_fk" FOREIGN KEY ("project_id") REFERENCES "public"."project"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint CREATE INDEX "block_post_sort" ON "block" USING btree ("post_id","sort");--> statement-breakpoint CREATE INDEX "post_publish_at" ON "post" USING btree ("publish_at");--> statement-breakpoint CREATE INDEX "post_project_status" ON "post" USING btree ("project_id","status");