Skip to content

Table Reference Docs

Auto-generated from apps/api/prisma/schema.prisma by scripts/generate-table-docs.ts. Do not edit — overwritten by CI on every push to main. Run locally: npx tsx scripts/generate-table-docs.ts

40 models. Jump to:


User

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
externalUserIdStringyesUNIQUE · Clerk subject ID (adults only)
emailStringyesUNIQUE · NULL for children
usernameStringyesUNIQUE · NULL for adults
credentialTypeCredentialTypenodefault: SOCIAL
passwordHashStringyesArgon2id hash for parent-managed PINs ONLY
accountTypeAccountTypenodefault: MEMBER
parentUserIdStringyesFK to managing parent (NULL for adults)
familyGroupIdStringyesFK to FamilyGroups (NULL until approved)
firstNameStringno
lastNameStringno
displayNameStringyes
photoUrlStringyesLong-lived SAS read URL; set on upload, cleared on delete (AB#4411)
phoneStringyesREQUIRED for adults; NULL allowed for CHILD
streetAddressStringyes
cityStringyes
stateStringyes
zipStringyes
birthdayDateTimeyes
anniversaryDateTimeyes
showBirthdayBooleannodefault: true
showAnniversaryBooleannodefault: true
showAddressBooleannodefault: false
showPhoneBooleannodefault: true
showEmailBooleannodefault: true
showInDirectoryBooleannodefault: true
notifyByEmailBooleannodefault: true
notifyBySmsBooleannodefault: true
notifyByPushBooleannodefault: true
notifyNewMessagesBooleannodefault: true
notifyRepliesBooleannodefault: true
notifyAnnouncementsBooleannodefault: true
notifyApprovalUpdatesBooleannodefault: true
genderGendernodefault: NOT_SPECIFIED · for gendered comms (brothers/sisters)
isBaptizedBooleannodefault: false
baptismDateDateTimeyesexact date of baptism; set alongside isBaptized
motherUserIdStringyes
fatherUserIdStringyes
roleAppRolenodefault: VISITOR
statusUserStatusnodefault: PENDING_APPROVAL
isActiveBooleannodefault: true
approvedByIdStringyes
approvedAtDateTimeyes
invitationCodeStringyes
createdAtDateTimenodefault: now(
updatedAtDateTimeno
lastLoginAtDateTimeyes

Relations:

  • parentUser (optional FK)
  • childrenUser (one-to-many)
  • motherUser (optional FK)
  • motherOfUser (one-to-many)
  • fatherUser (optional FK)
  • fatherOfUser (one-to-many)
  • approvedByUser (optional FK)
  • approvedUsersUser (one-to-many)
  • familyGroupFamilyGroup (optional FK)
  • familyGroupMembershipsFamilyGroupMember (one-to-many)
  • familyGroupsAnchoredFamilyGroup (one-to-many)
  • familyGroupsCreatedFamilyGroup (one-to-many)
  • groupMembershipsGroupMember (one-to-many)
  • groupsLedGroup (one-to-many)
  • eventsCreatedEvent (one-to-many)
  • eventsModifiedEvent (one-to-many)
  • eventAttendeesEventAttendee (one-to-many)
  • workflowsAsSubjectApprovalWorkflow (one-to-many)
  • workflowsRequestedApprovalWorkflow (one-to-many)
  • workflowsAssignedApprovalWorkflow (one-to-many)
  • workflowsAsGroupLeadApprovalWorkflow (one-to-many)
  • workflowsAsMinisterApprovalWorkflow (one-to-many)
  • workflowsAsAdminApprovalWorkflow (one-to-many)
  • announcementsAuthoredAnnouncement (one-to-many)
  • announcementsApprovedAnnouncement (one-to-many)
  • announcementReceiptsAnnouncementReceipt (one-to-many)
  • communicationsScopesUserCommunicationsScope (one-to-many)
  • pushTokensPushToken (one-to-many)
  • pushSubscriptionsPushSubscription (one-to-many)
  • auditLogActionsAuditLog (one-to-many)
  • userRolesUserRole (one-to-many)
  • assignedRolesUserRole (one-to-many)
  • invitationsCreatedInvitation (one-to-many)
  • invitationUsedInvitation (optional FK)
  • groupResourceUploadsGroupResource (one-to-many)
  • groupThreadsAuthoredGroupThread (one-to-many)
  • groupPostsAuthoredGroupPost (one-to-many)
  • seriesCreatedMediaSeries (one-to-many)
  • mediaItemsUploadedMediaItem (one-to-many)
  • mediaItemsPublishedMediaItem (one-to-many)
  • mediaReceiptsMediaReceipt (one-to-many)
  • liveEventsCreatedLiveEvent (one-to-many)
  • versesCreatedVerseOfDay (one-to-many)
  • listingsListing (one-to-many)
  • listingReviewsListingReview (one-to-many)
  • studentEnrollmentsHomeschoolEnrollment (one-to-many)
  • guardianEnrollmentsHomeschoolEnrollment (one-to-many)
  • resourceUploadsEducationResource (one-to-many)
  • driverTripsTrip (one-to-many)
  • passengerTripsTripPassenger (one-to-many)
  • requestedDeliveriesDeliveryRequest (one-to-many)
  • courierOffersDeliveryOffer (one-to-many)
  • groupLeaderAssignmentsMemberGroupLeaderAssignment (one-to-many)
  • leadingGroupMembersMemberGroupLeaderAssignment (one-to-many)
  • groupAssignmentsMadeMemberGroupLeaderAssignment (one-to-many)

FamilyGroup

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
familyNameStringno
primaryMemberIdStringno
householdNotesStringyes
isActiveBooleannodefault: true
createdAtDateTimenodefault: now(
updatedAtDateTimeno
createdByIdStringno

Relations:

  • primaryMemberUser (FK)
  • createdByUser (FK)
  • membersFamilyGroupMember (one-to-many)
  • usersUser (one-to-many)

FamilyGroupMember

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
familyGroupIdStringno
userIdStringno
relationshipFamilyRelationshipno
joinedAtDateTimenodefault: now(
isActiveBooleannodefault: true
watchListenEnabledBooleannodefault: true

Relations:

  • familyGroupFamilyGroup (FK)
  • userUser (FK)

Group

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
nameStringno
groupTypeGroupTypeno
descriptionStringyes
leaderIdStringyes
isActiveBooleannodefault: true
createdAtDateTimenodefault: now(
updatedAtDateTimeno

Relations:

  • leaderUser (optional FK)
  • membersGroupMember (one-to-many)
  • eventsEvent (one-to-many)
  • audienceAnnouncementsAnnouncement (one-to-many)
  • commsScopesUserCommunicationsScope (one-to-many)
  • resourcesGroupResource (one-to-many)
  • threadsGroupThread (one-to-many)

GroupMember

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
groupIdStringno
userIdStringno
joinedAtDateTimenodefault: now(
isActiveBooleannodefault: true
memberRoleStringnodefault: "MEMBER" · "LEADER"

Relations:

  • groupGroup (FK)
  • userUser (FK)

GroupResource

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
groupIdStringno
uploadedByIdStringno
titleStringno
descriptionStringyes
externalUrlStringyes
storageKeyStringyes
isFileBooleannodefault: false · AB#3442 — file-sharing flag
mimeTypeStringyes
fileSizeIntyes
isActiveBooleannodefault: true
createdAtDateTimenodefault: now(
updatedAtDateTimeno

Relations:

  • groupGroup (FK)
  • uploadedByUser (FK)

GroupThread

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
groupIdStringno
authorIdStringno
titleStringno
bodyStringno
isPinnedBooleannodefault: false
isActiveBooleannodefault: true
createdAtDateTimenodefault: now(
updatedAtDateTimeno

Relations:

  • groupGroup (FK)
  • authorUser (FK)
  • postsGroupPost (one-to-many)

GroupPost

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
threadIdStringno
authorIdStringno
bodyStringno
isActiveBooleannodefault: true
createdAtDateTimenodefault: now(

Relations:

  • threadGroupThread (FK)
  • authorUser (FK)

Event

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
titleStringno
descriptionStringyes
startAtDateTimeno
endAtDateTimeno
locationStringyes
eventTypeEventTypeno
visibilityLevelIntno1=All, 2=Ministry, 3=SmallGroup, 4=Leadership
groupIdStringyes
maxAttendeesIntyes
requiresRsvpBooleannodefault: false
createdByIdStringno
createdAtDateTimenodefault: now(
modifiedByIdStringyes
updatedAtDateTimeno
isActiveBooleannodefault: true

Relations:

  • groupGroup (optional FK)
  • createdByUser (FK)
  • modifiedByUser (optional FK)
  • attendeesEventAttendee (one-to-many)

EventAttendee

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
eventIdStringno
userIdStringno
rsvpStatusRsvpStatusnodefault: PENDING
rsvpAtDateTimenodefault: now(
checkedInBooleannodefault: false
checkInAtDateTimeyes

Relations:

  • eventEvent (FK)
  • userUser (FK)

ApprovalWorkflow

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
workflowTypeWorkflowTypeno
userIdStringyesUser being approved (member-join / spouse-add / child-add)
subjectEntityTypeStringyese.g. 'Announcement' for content-publish
subjectEntityIdStringyes
requestedByIdStringno
assignedToIdStringyes
currentStepIntnodefault: 1
statusWorkflowStatusnodefault: PENDING
smallGroupLeaderIdStringyes
smallGroupApprovalAtDateTimeyes
smallGroupCommentsStringyes
ministerIdStringyes
ministerApprovalAtDateTimeyes
ministerCommentsStringyes
adminIdStringyes
adminApprovalAtDateTimeyes
adminCommentsStringyes
createdAtDateTimenodefault: now(
completedAtDateTimeyes

Relations:

  • userUser (optional FK)
  • requestedByUser (FK)
  • assignedToUser (optional FK)
  • smallGroupLeaderUser (optional FK)
  • ministerUser (optional FK)
  • adminUser (optional FK)
  • announcementsAnnouncement (one-to-many)

Announcement

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
titleStringno
bodyStringno
priorityAnnouncementPrioritynodefault: NORMAL
authorIdStringno
approvedByIdStringyes
approvalWorkflowIdStringyes
audienceScopeAudienceScopenodefault: ALL
audienceRoleAppRoleyespopulated when audienceScope = ROLE
audienceGroupIdStringyes
publishAtDateTimeyes
expiresAtDateTimeyes
publishedAtDateTimeyes
statusAnnouncementStatusnodefault: DRAFT
createdAtDateTimenodefault: now(
updatedAtDateTimeno
isActiveBooleannodefault: true

Relations:

  • authorUser (FK)
  • approvedByUser (optional FK)
  • approvalWorkflowApprovalWorkflow (optional FK)
  • audienceGroupGroup (optional FK)
  • receiptsAnnouncementReceipt (one-to-many)

AnnouncementReceipt

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
announcementIdStringno
userIdStringno
channelNotificationChannelno
deliveredAtDateTimeyes
readAtDateTimeyes
createdAtDateTimenodefault: now(

Relations:

  • announcementAnnouncement (FK)
  • userUser (FK)

UserCommunicationsScope

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
userIdStringno
scopeTypeCommsScopeTypeno
groupIdStringyespopulated when scopeType = GROUP or MINISTRY
createdAtDateTimenodefault: now(

Relations:

  • userUser (FK)
  • groupGroup (optional FK)

Role

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
slugStringnoUNIQUE · e.g. 'admin', 'member'
nameStringnoUNIQUE · e.g. 'Community Leader'
descriptionStringyes
permissionLevelIntno
isActiveBooleannodefault: true
createdAtDateTimenodefault: now(

Relations:

  • userRolesUserRole (one-to-many)

UserRole

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
userIdStringno
roleIdStringno
assignedByStringnouser ID of the admin who granted the role
isActiveBooleannodefault: true
createdAtDateTimenodefault: now(

Relations:

  • userUser (FK)
  • roleRole (FK)
  • assignerUser (FK)

Invitation

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
codeStringnoUNIQUE
emailStringyes
createdByIdStringno
expiresAtDateTimeyes
usedByIdStringyesUNIQUE
usedAtDateTimeyes
isActiveBooleannodefault: true
maxUsesIntnodefault: 1
currentUsesIntnodefault: 0
createdAtDateTimenodefault: now(

Relations:

  • createdByUser (FK)
  • usedByUser (optional FK)

PushToken

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
userIdStringno
tokenStringnoUNIQUE
platformStringno'ios'
isActiveBooleannodefault: true
createdAtDateTimenodefault: now(
updatedAtDateTimeno

Relations:

  • userUser (FK)

PushSubscription

DB table: push_subscriptions

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
userIdStringno
endpointStringnoUNIQUE
p256dhStringno
authStringno
userAgentStringyes
createdAtDateTimenodefault: now(

Relations:

  • userUser (FK)

AuditLog

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
actorIdStringyes
actionStringno'Login'
entityTypeStringyes'User'
entityIdStringyes
oldValuesJsonyes
newValuesJsonyes
ipAddressStringyes
userAgentStringyes
createdAtDateTimenodefault: now(

Relations:

  • actorUser (optional FK)

MemberGroupLeaderAssignment

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
memberIdStringno
groupLeaderIdStringno
assignedByIdStringno
assignedAtDateTimenodefault: now(

Relations:

  • memberUser (FK)
  • groupLeaderUser (FK)
  • assignerUser (FK)

MediaSeries

DB table: media_series

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
nameStringno
typeMediaTypeno
accessTierAccessTiernodefault: MEMBERS
descriptionStringyes
artworkKeyStringyesstorage key for series artwork; NEVER returned raw to client
createdByIdStringnoFK → User.id
createdAtDateTimenodefault: now(
updatedAtDateTimeno

Relations:

  • createdByUser (FK)
  • itemsMediaItem (one-to-many)

MediaItem

DB table: media_items

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
titleStringno
speakerStringyesfree text (NOT a FK)
seriesIdStringnoFK → media_series.id (required)
itemTypeMediaTypenocontent category (MESSAGES / MUSIC / VIDEOS)
mediaTypeStringnotechnical format: "audio"
dateDateTimeno
tagsStringyescomma-separated controlled vocabulary
durationSecIntyes
storageKeyStringnoprovider-agnostic object key; NEVER returned to clients
statusMediaStatusnodefault: DRAFT
uploadedByIdStringno
publishedByIdStringyes
publishedAtDateTimeyes
createdAtDateTimenodefault: now(
updatedAtDateTimeno

Relations:

  • seriesMediaSeries (FK)
  • uploadedByUser (FK)
  • publishedByUser (optional FK)
  • chaptersMediaChapter (one-to-many)
  • receiptsMediaReceipt (one-to-many)
  • archivedFromLiveEvent (one-to-many)

MediaChapter

DB table: media_chapters

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
itemIdStringno
titleStringno
offsetSecsIntno

Relations:

  • itemMediaItem (FK)

MediaReceipt

DB table: media_receipts

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
itemIdStringno
memberIdStringnorenamed from userId
progressSecsIntnodefault: 0
completedBooleannodefault: false
updatedAtDateTimeno

Relations:

  • itemMediaItem (FK)
  • memberUser (FK)

LiveEvent

DB table: live_events

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
titleStringno
cloudflareInputIdStringnoserver-side only; NEVER returned to client
cloudflarePlaybackIdStringnoserver-side only; NEVER returned to client
statusLiveEventStatusnodefault: SCHEDULED
accessTierAccessTiernodefault: MEMBERS
scheduledAtDateTimeyes
startedAtDateTimeyes
endedAtDateTimeyes
archivedItemIdStringyes
createdByIdStringno
createdAtDateTimenodefault: now(

Relations:

  • archivedItemMediaItem (optional FK)
  • createdByUser (FK)

Listing

DB table: listings

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
sellerIdStringno
titleStringno
descriptionStringno
priceDecimalyes
isFreeBooleannodefault: false
categoryListingCategoryno
statusListingStatusnodefault: ACTIVE
expiresAtDateTimeyes
createdAtDateTimenodefault: now(
updatedAtDateTimeno

Relations:

  • sellerUser (FK)
  • imagesListingImage (one-to-many)
  • reviewsListingReview (one-to-many)

ListingImage

DB table: listing_images

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
listingIdStringno
storageKeyStringno
sortOrderIntnodefault: 0

Relations:

  • listingListing (FK)

ListingReview

DB table: listing_reviews

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
listingIdStringno
reviewerIdStringno
ratingIntno
bodyStringyes
createdAtDateTimenodefault: now(

Relations:

  • listingListing (FK)
  • reviewerUser (FK)

HomeschoolEnrollment

DB table: homeschool_enrollments

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
studentIdStringno
guardianIdStringno
gradeStringyes
statusEnrollmentStatusnodefault: PENDING
enrolledAtDateTimeyes
withdrawnAtDateTimeyes
createdAtDateTimenodefault: now(
updatedAtDateTimeno

Relations:

  • studentUser (FK)
  • guardianUser (FK)
  • recordsAcademicRecord (one-to-many)

AcademicRecord

DB table: academic_records

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
enrollmentIdStringno
subjectStringno
gradeStringyes
notesStringyes
termYearStringno
createdAtDateTimenodefault: now(

Relations:

  • enrollmentHomeschoolEnrollment (FK)

EducationResource

DB table: education_resources

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
titleStringno
descriptionStringyes
storageKeyStringyes
externalUrlStringyes
subjectStringyes
gradeLevelStringyes
uploadedByIdStringno
downloadCountIntnodefault: 0
createdAtDateTimenodefault: now(
updatedAtDateTimeno

Relations:

  • uploadedByUser (FK)

Trip

DB table: trips

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
driverIdStringno
originStringno
destinationStringno
departureAtDateTimeno
seatsIntno
notesStringyes
statusTripStatusnodefault: OPEN
createdAtDateTimenodefault: now(
updatedAtDateTimeno

Relations:

  • driverUser (FK)
  • passengersTripPassenger (one-to-many)

TripPassenger

DB table: trip_passengers

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
tripIdStringno
userIdStringno
statusPassengerStatusnodefault: PENDING
requestedAtDateTimenodefault: now(

Relations:

  • tripTrip (FK)
  • userUser (FK)

DeliveryRequest

DB table: delivery_requests

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
requesterIdStringno
descriptionStringno
pickupAddressStringno
dropoffAddressStringno
neededByDateTimeyes
statusDeliveryStatusnodefault: REQUESTED
createdAtDateTimenodefault: now(
updatedAtDateTimeno

Relations:

  • requesterUser (FK)
  • offersDeliveryOffer (one-to-many)
  • trackingDeliveryTracking (one-to-many)

DeliveryOffer

DB table: delivery_offers

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
requestIdStringno
courierIdStringno
notesStringyes
acceptedBooleannodefault: false
createdAtDateTimenodefault: now(

Relations:

  • requestDeliveryRequest (FK)
  • courierUser (FK)

DeliveryTracking

DB table: delivery_tracking

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
requestIdStringno
statusDeliveryStatusno
notesStringyes
createdAtDateTimenodefault: now(

Relations:

  • requestDeliveryRequest (FK)

BibleTranslation

DB table: bible_translations

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
nameStringnoe.g. "King James Version"
abbreviationStringnoUNIQUE · e.g. "KJV"
isDefaultBooleannodefault: false
isActiveBooleannodefault: true
createdAtDateTimenodefault: now(
updatedAtDateTimeno

Relations:

  • versesVerseOfDay (one-to-many)

VerseOfDay

DB table: verses_of_day

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
referenceStringnoe.g. "John 3:16"
textStringnoFull verse text
translationIdStringyes
displayDateDateTimeyesnull = pool (auto-rotated); non-null = pinned to this date
statusVerseStatusnodefault: SCHEDULED
createdByIdStringyes
createdAtDateTimenodefault: now(
updatedAtDateTimeno

Relations:

  • translationBibleTranslation (optional FK)
  • createdByUser (optional FK)

SisterCommunity

DB table: sister_communities

ColumnTypeNullableNotes
idStringnoPK · default: cuid(
nameStringno
locationStringno
stateStringyes
websiteStringyes
contactNameStringyes
contactEmailStringyes
notesStringyes
statusSisterCommunityStatusnodefault: PROSPECTIVE
createdAtDateTimenodefault: now(
updatedAtDateTimeno

Heritage Community Hub — Internal. Access restricted via Cloudflare Access + Entra ID.