Require acceptance for ticket transfers; privacy and legal updates
Transfers now send the new holder a link (to the email/phone typed) and only complete once they accept; they can decline and the sender can cancel. No response reveals whether contact details belong to an account, and attendee account links are no longer sent to payers. Terms of Use and Privacy Policy are updated for all features since 1.12, with a full cookie policy and a "Cookie settings" control. The /docs route list now covers every mounted route, and account activation auto-login is fixed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CP62L9JxHomA36aYP1ekCe
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
-- CreateTable
|
||||
CREATE TABLE "TicketTransferRequest" (
|
||||
"id" TEXT NOT NULL,
|
||||
"ticketId" TEXT NOT NULL,
|
||||
"requestedById" TEXT NOT NULL,
|
||||
"toName" TEXT NOT NULL,
|
||||
"toEmail" TEXT,
|
||||
"toPhone" TEXT,
|
||||
"details" JSONB,
|
||||
"tokenHash" TEXT NOT NULL,
|
||||
"status" TEXT NOT NULL DEFAULT 'pending',
|
||||
"expiresAt" TIMESTAMP(3) NOT NULL,
|
||||
"respondedAt" TIMESTAMP(3),
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "TicketTransferRequest_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "TicketTransferRequest_tokenHash_key" ON "TicketTransferRequest"("tokenHash");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "TicketTransferRequest_ticketId_status_idx" ON "TicketTransferRequest"("ticketId", "status");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "TicketTransferRequest" ADD CONSTRAINT "TicketTransferRequest_ticketId_fkey" FOREIGN KEY ("ticketId") REFERENCES "Ticket"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "TicketTransferRequest" ADD CONSTRAINT "TicketTransferRequest_requestedById_fkey" FOREIGN KEY ("requestedById") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
@@ -112,6 +112,7 @@ model User {
|
||||
feedbackInvites FeedbackInvite[]
|
||||
feedbackGiven FeedbackResponse[]
|
||||
impersonationsDone ImpersonationSession[] @relation("ImpersonationAdmin")
|
||||
transferRequests TicketTransferRequest[] @relation("TransferRequester")
|
||||
impersonatedIn ImpersonationSession[] @relation("ImpersonationTarget")
|
||||
scanLocksForced ScanLock[] @relation("ScanLockForcedBy")
|
||||
syncReportsDone OfflineSyncReport[] @relation("SyncReportReviewer")
|
||||
@@ -389,6 +390,7 @@ model Ticket {
|
||||
event Event @relation(fields: [eventId], references: [id], onDelete: Restrict)
|
||||
usages TicketUsage[]
|
||||
transfers TicketTransfer[]
|
||||
transferRequests TicketTransferRequest[]
|
||||
|
||||
@@index([holderUserId])
|
||||
@@index([eventId])
|
||||
@@ -1047,6 +1049,28 @@ model AllocationAssignment {
|
||||
@@index([attendeeId])
|
||||
}
|
||||
|
||||
/// A transfer waiting for the new holder to accept it from the link sent to the email /
|
||||
/// phone the sender typed. Nothing changes on the ticket until it's accepted. `details`
|
||||
/// holds what the sender entered (date of birth, gender, parent details on youth events).
|
||||
model TicketTransferRequest {
|
||||
id String @id @default(uuid())
|
||||
ticketId String
|
||||
requestedById String
|
||||
toName String
|
||||
toEmail String?
|
||||
toPhone String?
|
||||
details Json?
|
||||
tokenHash String @unique
|
||||
status String @default("pending") // pending | accepted | declined | cancelled | expired
|
||||
expiresAt DateTime
|
||||
respondedAt DateTime?
|
||||
createdAt DateTime @default(now())
|
||||
ticket Ticket @relation(fields: [ticketId], references: [id], onDelete: Cascade)
|
||||
requestedBy User @relation("TransferRequester", fields: [requestedById], references: [id], onDelete: Cascade)
|
||||
|
||||
@@index([ticketId, status])
|
||||
}
|
||||
|
||||
/// A ticket handed to someone else. oldQrCode is the code that stopped working (null
|
||||
/// when one place was split off a shared group ticket, whose code stays valid).
|
||||
model TicketTransfer {
|
||||
|
||||
Reference in New Issue
Block a user