- Add User model synced from Authentik headers with admin/reviewer/viewer roles - Add assignment fields (assignedToId, assignedById, reviewedById, etc.) to ResponseCard - Add userId tracking to ActivityLog and Notification models - Create auth.ts with getOrCreateUser() and role mapping from Authentik groups - Create /api/users endpoint and /api/cards/assign batch assignment endpoint - Gate card mutations behind role checks (viewers read-only, reviewers edit assigned only) - Gate Monday.com push behind reviewStatus=reviewed instead of ocr_complete - Add "My Cards" stat card, Assigned To filter, and assignment columns to table - Add Assign button with user picker to batch selection toolbar (admin only) - Update card detail: assignment banner, Mark Complete button, prev/next nav, reassign - Make all field components accept readOnly prop for role-based editing - Gate settings page behind admin role - Add userId to stats API for per-user card counts - Expose dbUser and role through UserProfileProvider context Made-with: Cursor
176 lines
4.6 KiB
Text
176 lines
4.6 KiB
Text
generator client {
|
|
provider = "prisma-client"
|
|
output = "../src/generated/prisma"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
}
|
|
|
|
model User {
|
|
id String @id @default(cuid())
|
|
authentikUid String @unique
|
|
username String
|
|
displayName String
|
|
email String
|
|
avatarUrl String @default("")
|
|
role String @default("viewer")
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
|
|
model ResponseCard {
|
|
id String @id @default(cuid())
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
// Personal Info (Response Card side)
|
|
name String?
|
|
gender String?
|
|
dateOfBirth String?
|
|
maritalStatus String?
|
|
maritalStatusOther String?
|
|
visitType String?
|
|
cellPhone String?
|
|
homePhone String?
|
|
email String?
|
|
address String?
|
|
aptNumber String?
|
|
city String?
|
|
state String?
|
|
zip String?
|
|
prayerRequests String?
|
|
prayerForTeam Boolean @default(false)
|
|
prayerConfidential Boolean @default(false)
|
|
|
|
// Survey Info (Easter Survey side)
|
|
messageTopics Json?
|
|
messageTopicsOther String?
|
|
nextStep Json?
|
|
attendanceDuration String?
|
|
campusPreference Json?
|
|
campusPreferenceOther String?
|
|
howHeard Json?
|
|
howHeardOther String?
|
|
serviceAttended String?
|
|
|
|
// Monday.com / Workflow fields
|
|
followUp String?
|
|
notes String?
|
|
serviceTime String?
|
|
planningCenter String?
|
|
iSaidYesBookSent Boolean @default(false)
|
|
ftGuestLetterSent Boolean @default(false)
|
|
firstTimeGuestDate DateTime?
|
|
salvationDate DateTime?
|
|
|
|
// Assignment / Review workflow
|
|
assignedToId String?
|
|
assignedById String?
|
|
assignedAt DateTime?
|
|
reviewedById String?
|
|
reviewedAt DateTime?
|
|
reviewNotes String?
|
|
|
|
// Meta
|
|
sourceFile String?
|
|
frontImagePath String?
|
|
backImagePath String?
|
|
ocrStatus String @default("pending")
|
|
reviewStatus String @default("unreviewed")
|
|
ocrConfidence Float?
|
|
ocrError String?
|
|
rawOcrResponse Json?
|
|
|
|
mondayItemId String?
|
|
|
|
@@index([ocrStatus])
|
|
@@index([reviewStatus])
|
|
@@index([name])
|
|
@@index([createdAt])
|
|
@@index([mondayItemId])
|
|
@@index([assignedToId])
|
|
@@index([reviewedById])
|
|
}
|
|
|
|
model ProcessingJob {
|
|
id String @id @default(cuid())
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
fileName String
|
|
filePath String
|
|
status String @default("queued")
|
|
totalPages Int @default(0)
|
|
processed Int @default(0)
|
|
error String?
|
|
cardIds Json?
|
|
|
|
@@index([status])
|
|
}
|
|
|
|
model AppSettings {
|
|
id String @id @default("singleton")
|
|
ollamaUrl String @default("http://192.168.68.108:11434")
|
|
model String @default("llava:7b")
|
|
watchDir String @default("")
|
|
watching Boolean @default(false)
|
|
|
|
sourceRetentionDays Int @default(30)
|
|
imageRetentionDays Int @default(180)
|
|
|
|
aiProvider String @default("gateway")
|
|
aiModel String @default("")
|
|
|
|
mondayApiToken String @default("")
|
|
mondayBoardId String @default("")
|
|
mondayEnabled Boolean @default(false)
|
|
mondayColumnMap Json?
|
|
mondayWebhookId String @default("")
|
|
mondayWebhookUrl String @default("")
|
|
|
|
webhookUrl String @default("")
|
|
webhookSecret String @default("")
|
|
webhookEnabled Boolean @default(false)
|
|
webhookEvents Json?
|
|
|
|
emailImapHost String @default("imap.dreamhost.com")
|
|
emailImapPort Int @default(993)
|
|
emailImapUser String @default("echo-ocr@stillwell.cloud")
|
|
emailImapPass String @default("")
|
|
emailImapTls Boolean @default(true)
|
|
emailFolder String @default("INBOX")
|
|
emailWatching Boolean @default(false)
|
|
emailProcessed String @default("mark_read")
|
|
emailProcessedFolder String @default("Processed")
|
|
}
|
|
|
|
model ActivityLog {
|
|
id String @id @default(cuid())
|
|
createdAt DateTime @default(now())
|
|
cardId String
|
|
action String
|
|
source String
|
|
summary String
|
|
changes Json?
|
|
userId String?
|
|
|
|
@@index([cardId, createdAt])
|
|
}
|
|
|
|
model Notification {
|
|
id String @id @default(cuid())
|
|
createdAt DateTime @default(now())
|
|
read Boolean @default(false)
|
|
dismissed Boolean @default(false)
|
|
type String
|
|
title String
|
|
message String
|
|
cardId String?
|
|
actionUrl String?
|
|
meta Json?
|
|
userId String?
|
|
|
|
@@index([read, dismissed, createdAt])
|
|
@@index([cardId])
|
|
@@index([userId])
|
|
}
|