generator client { provider = "prisma-client-js" } datasource db { provider = "sqlite" url = env("DATABASE_URL") } model NotificationDelivery { id String @id @default(uuid()) projectCode String idempotencyKey String requestHash String recipientUserId String businessTitle String renderedTitle String content String actionTitle String actionUrl String status String @default("pending") attemptCount Int @default(0) maxAttempts Int @default(4) nextAttemptAt DateTime @default(now()) leaseOwner String? leaseExpiresAt DateTime? processQueryKey String? lastErrorCode String? lastErrorMessage String? sentAt DateTime? readAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@unique([projectCode, idempotencyKey]) @@index([status, nextAttemptAt]) @@index([leaseExpiresAt]) @@index([processQueryKey]) } model RequestNonce { id String @id @default(uuid()) projectCode String nonce String expiresAt DateTime createdAt DateTime @default(now()) @@unique([projectCode, nonce]) @@index([expiresAt]) } model DingtalkLoginTicket { id String @id @default(uuid()) projectCode String audience String ticketHash String @unique ticketNonce String @unique authCodeHash String @unique dingtalkUserId String redirectPath String expiresAt DateTime consumedAt DateTime? createdAt DateTime @default(now()) @@index([projectCode, audience, expiresAt]) @@index([expiresAt, consumedAt]) }