Youth events need a name and date of birth for every attendee, and a parent/guardian's details for under-18s. Parents get an email and WhatsApp link to a consent page that records the signed name, time, IP, device and exact consent text; medical and emergency details are stored encrypted. Tickets are issued but check-in is blocked until consent is given (supervisor override audited). A daily job sends reminders and purges medical details after the retention period. Adds a supervisor consent tracker, consent status and medical list reports, and clears consent data when an account is anonymised. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
72 lines
2.6 KiB
SQL
72 lines
2.6 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "ConsentStatus" AS ENUM ('pending', 'given', 'declined');
|
|
|
|
-- AlterEnum
|
|
-- This migration adds more than one value to an enum.
|
|
-- With PostgreSQL versions 11 and earlier, this is not possible
|
|
-- in a single migration. This can be worked around by creating
|
|
-- multiple migrations, each migration adding only one value to
|
|
-- the enum.
|
|
|
|
|
|
ALTER TYPE "AdminAuditAction" ADD VALUE 'consent_override';
|
|
ALTER TYPE "AdminAuditAction" ADD VALUE 'consent_rerequested';
|
|
ALTER TYPE "AdminAuditAction" ADD VALUE 'medical_list_viewed';
|
|
|
|
-- AlterTable
|
|
ALTER TABLE "Attendee" ADD COLUMN "parentEmail" TEXT,
|
|
ADD COLUMN "parentName" TEXT,
|
|
ADD COLUMN "parentPhone" TEXT;
|
|
|
|
-- AlterTable
|
|
ALTER TABLE "Event" ADD COLUMN "consentCollectEmergency" BOOLEAN NOT NULL DEFAULT false,
|
|
ADD COLUMN "consentCollectMedical" BOOLEAN NOT NULL DEFAULT false,
|
|
ADD COLUMN "consentCollectPhoto" BOOLEAN NOT NULL DEFAULT false,
|
|
ADD COLUMN "consentText" TEXT,
|
|
ADD COLUMN "consentTextVersion" INTEGER NOT NULL DEFAULT 1,
|
|
ADD COLUMN "requiresParentalConsent" BOOLEAN NOT NULL DEFAULT false;
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ConsentRequest" (
|
|
"id" TEXT NOT NULL,
|
|
"attendeeId" TEXT NOT NULL,
|
|
"eventId" TEXT NOT NULL,
|
|
"tokenHash" TEXT NOT NULL,
|
|
"status" "ConsentStatus" NOT NULL DEFAULT 'pending',
|
|
"textVersion" INTEGER NOT NULL,
|
|
"consentText" TEXT NOT NULL,
|
|
"parentName" TEXT,
|
|
"parentEmail" TEXT,
|
|
"parentPhone" TEXT,
|
|
"signedName" TEXT,
|
|
"ip" TEXT,
|
|
"device" TEXT,
|
|
"medical" TEXT,
|
|
"emergency" TEXT,
|
|
"photoConsent" BOOLEAN,
|
|
"respondedAt" TIMESTAMP(3),
|
|
"lastSentAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"remindersSent" INTEGER NOT NULL DEFAULT 0,
|
|
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
"medicalPurgedAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ConsentRequest_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "ConsentRequest_tokenHash_key" ON "ConsentRequest"("tokenHash");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ConsentRequest_attendeeId_createdAt_idx" ON "ConsentRequest"("attendeeId", "createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ConsentRequest_eventId_status_idx" ON "ConsentRequest"("eventId", "status");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ConsentRequest" ADD CONSTRAINT "ConsentRequest_attendeeId_fkey" FOREIGN KEY ("attendeeId") REFERENCES "Attendee"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ConsentRequest" ADD CONSTRAINT "ConsentRequest_eventId_fkey" FOREIGN KEY ("eventId") REFERENCES "Event"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|