cms.c2sgmbh/src/migrations/20251210_090000_enhance_form_submissions.ts
Martin Porwoll 17eb46a787 feat: enhance FormSubmissions with workflow and tracking
- Add status workflow: new → read → in-progress → waiting → completed → archived
- Add priority levels (high, normal, low)
- Add assignedTo field for team member assignment
- Add internal notes array with author and timestamp
- Add response tracking (responded, method, summary)
- Add tags for categorization
- Auto-mark as read on first view
- Auto-set note author and timestamp
- Improved admin view with better columns
- Update documentation

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-10 09:13:06 +00:00

115 lines
5.5 KiB
TypeScript

import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
-- Status Enum
CREATE TYPE "public"."enum_form_submissions_status" AS ENUM('new', 'read', 'in-progress', 'waiting', 'completed', 'archived');
-- Priority Enum
CREATE TYPE "public"."enum_form_submissions_priority" AS ENUM('high', 'normal', 'low');
-- Response Method Enum
CREATE TYPE "public"."enum_form_submissions_response_tracking_response_method" AS ENUM('email', 'phone', 'in-person', 'letter');
-- Add new columns to form_submissions
ALTER TABLE "form_submissions"
ADD COLUMN "status" "enum_form_submissions_status" DEFAULT 'new',
ADD COLUMN "priority" "enum_form_submissions_priority" DEFAULT 'normal',
ADD COLUMN "assigned_to_id" integer,
ADD COLUMN "read_at" timestamp(3) with time zone,
ADD COLUMN "read_by_id" integer,
ADD COLUMN "response_tracking_responded" boolean DEFAULT false,
ADD COLUMN "response_tracking_responded_at" timestamp(3) with time zone,
ADD COLUMN "response_tracking_responded_by_id" integer,
ADD COLUMN "response_tracking_response_method" "enum_form_submissions_response_tracking_response_method",
ADD COLUMN "response_tracking_response_summary" varchar;
-- Create internal notes table
CREATE TABLE "form_submissions_internal_notes" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"note" varchar NOT NULL,
"author_id" integer,
"created_at" timestamp(3) with time zone
);
-- Create tags table
CREATE TABLE "form_submissions_tags" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"tag" varchar NOT NULL
);
-- Add foreign keys
ALTER TABLE "form_submissions"
ADD CONSTRAINT "form_submissions_assigned_to_id_users_id_fk"
FOREIGN KEY ("assigned_to_id") REFERENCES "public"."users"("id") ON DELETE SET NULL ON UPDATE NO ACTION;
ALTER TABLE "form_submissions"
ADD CONSTRAINT "form_submissions_read_by_id_users_id_fk"
FOREIGN KEY ("read_by_id") REFERENCES "public"."users"("id") ON DELETE SET NULL ON UPDATE NO ACTION;
ALTER TABLE "form_submissions"
ADD CONSTRAINT "form_submissions_response_tracking_responded_by_id_users_id_fk"
FOREIGN KEY ("response_tracking_responded_by_id") REFERENCES "public"."users"("id") ON DELETE SET NULL ON UPDATE NO ACTION;
ALTER TABLE "form_submissions_internal_notes"
ADD CONSTRAINT "form_submissions_internal_notes_author_id_users_id_fk"
FOREIGN KEY ("author_id") REFERENCES "public"."users"("id") ON DELETE SET NULL ON UPDATE NO ACTION;
ALTER TABLE "form_submissions_internal_notes"
ADD CONSTRAINT "form_submissions_internal_notes_parent_id_fk"
FOREIGN KEY ("_parent_id") REFERENCES "public"."form_submissions"("id") ON DELETE CASCADE ON UPDATE NO ACTION;
ALTER TABLE "form_submissions_tags"
ADD CONSTRAINT "form_submissions_tags_parent_id_fk"
FOREIGN KEY ("_parent_id") REFERENCES "public"."form_submissions"("id") ON DELETE CASCADE ON UPDATE NO ACTION;
-- Create indexes
CREATE INDEX "form_submissions_status_idx" ON "form_submissions" USING btree ("status");
CREATE INDEX "form_submissions_priority_idx" ON "form_submissions" USING btree ("priority");
CREATE INDEX "form_submissions_assigned_to_idx" ON "form_submissions" USING btree ("assigned_to_id");
CREATE INDEX "form_submissions_internal_notes_order_idx" ON "form_submissions_internal_notes" USING btree ("_order");
CREATE INDEX "form_submissions_internal_notes_parent_id_idx" ON "form_submissions_internal_notes" USING btree ("_parent_id");
CREATE INDEX "form_submissions_tags_order_idx" ON "form_submissions_tags" USING btree ("_order");
CREATE INDEX "form_submissions_tags_parent_id_idx" ON "form_submissions_tags" USING btree ("_parent_id");
`)
}
export async function down({ db }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
-- Drop tables
DROP TABLE IF EXISTS "form_submissions_tags" CASCADE;
DROP TABLE IF EXISTS "form_submissions_internal_notes" CASCADE;
-- Drop indexes
DROP INDEX IF EXISTS "form_submissions_status_idx";
DROP INDEX IF EXISTS "form_submissions_priority_idx";
DROP INDEX IF EXISTS "form_submissions_assigned_to_idx";
-- Drop foreign keys and columns
ALTER TABLE "form_submissions"
DROP CONSTRAINT IF EXISTS "form_submissions_assigned_to_id_users_id_fk",
DROP CONSTRAINT IF EXISTS "form_submissions_read_by_id_users_id_fk",
DROP CONSTRAINT IF EXISTS "form_submissions_response_tracking_responded_by_id_users_id_fk";
ALTER TABLE "form_submissions"
DROP COLUMN IF EXISTS "status",
DROP COLUMN IF EXISTS "priority",
DROP COLUMN IF EXISTS "assigned_to_id",
DROP COLUMN IF EXISTS "read_at",
DROP COLUMN IF EXISTS "read_by_id",
DROP COLUMN IF EXISTS "response_tracking_responded",
DROP COLUMN IF EXISTS "response_tracking_responded_at",
DROP COLUMN IF EXISTS "response_tracking_responded_by_id",
DROP COLUMN IF EXISTS "response_tracking_response_method",
DROP COLUMN IF EXISTS "response_tracking_response_summary";
-- Drop enums
DROP TYPE IF EXISTS "public"."enum_form_submissions_status";
DROP TYPE IF EXISTS "public"."enum_form_submissions_priority";
DROP TYPE IF EXISTS "public"."enum_form_submissions_response_tracking_response_method";
`)
}