Overview

Pine Cove Bridge API — Data Model

Bridge API is the central aggregation backend powering every Pine Cove digital touchpoint: the parent-facing Camp Life app, the staff Sidekick Portal and Sidekick Mobile apps, and asynchronous Lambda processing. A single MySQL database (TypeORM, master/slave replication) backs the system. Explore each domain in the sidebar, or search for a specific entity.

81
Entities
14
Domains
~4
Join tables
7
External systems

How the domains relate at a glance

flowchart LR classDef core fill:#3f6a47,stroke:#253f2e,color:#fff,font-weight:600 classDef content fill:#7ba883,stroke:#3f6a47,color:#1a2e1f classDef ops fill:#c98a3a,stroke:#6e531f,color:#fff classDef meta fill:#a9c9b0,stroke:#558a5e,color:#1a2e1f users[1 · Core User]:::core admin[2 · Admin System]:::ops camp[3 · Camp]:::core reg[4 · Registration]:::core staff[5 · Staff]:::core cabin[6 · Cabin & Housing]:::core media[7 · Media & Content]:::content gallery[8 · Photo Galleries]:::content articles[9 · Articles & Publishing]:::content comm[10 · Communication]:::content surveys[11 · Surveys]:::ops social[12 · Social]:::content report[13 · Reporting]:::ops misc[14 · Tools & System]:::meta users --> reg users --> staff users --> comm users --> social camp --> reg camp --> cabin camp --> surveys camp --> report reg --> cabin staff --> cabin staff --> articles reg --> media camp --> media media --> gallery media --> articles articles --> comm admin --> camp admin --> report surveys --> report

Explore by domain

External system IDs carried by entities

  • iCampPro — legacy registration source of truth (iCampPro_id)
  • Rockpile — previous API (rockpile_id)
  • CampLife — mobile app topic/post IDs
  • Salesforce — contact, account, and generic IDs
  • WordPress — article post + revision IDs
  • Tableau — dashboard usernames/links
  • PaperSurvey.io — survey + response IDs

Base entity inheritance

All entities inherit audit columns (createdBy, createdAt, createdByIP, modifiedBy, modifiedAt, modifiedByIP) from BaseEntity.

  • ICampProBaseEntity — adds iCampPro_id, iCampPro_createdAt, iCampPro_updatedAt
  • IRockpileBaseEntity (interface) — adds rockpile_id
Domain 1

Core User

The foundation of the system. User represents campers, parents, and staff alike. Household groups family members together, with one user as the primary contact.

Key pattern — A user is not role-specific at the model level; roles emerge via related tables (Staff, Registration, AdminUser). Households act as the family billing/communication unit.

Entity diagram

erDiagram User { uuid id PK int rockpile_id UK varchar iCampPro_id UK varchar login UK int camplife_topicId UK varchar salesforce_contactId boolean isChild varchar firstName varchar lastName varchar email boolean activated varchar langKey varchar iCampProProfileUrl varchar ICPProfileName timestamp lastActivityAt } UserExtra { uuid id PK varchar userId FK varchar gender date birthdate varchar cellphone int grade boolean isHeadshotUploaded boolean isIcpProfileValid enum headshotStatus varchar city varchar state } Household { uuid id PK int rockpile_id UK varchar iCampPro_id UK varchar name varchar salesforce_accountId int campLife_topicId varchar contactId FK } HouseholdMember { uuid id PK int rockpile_id UK varchar iCampPro_id UK enum type varchar userId FK varchar householdId FK } User ||--o| UserExtra : "has profile" User ||--o| Household : "is contact of" User ||--o{ HouseholdMember : "belongs to" Household ||--o{ HouseholdMember : "has members"

Entities

EntityPurposeKey relationships
UserPrimary account (campers + staff + parents)Has UserExtra, Staff, Registrations, HouseholdMembers
UserExtraExtended profile (gender, birthdate, headshot status)1:1 with User
HouseholdFamily grouping unit; billing/contact anchorHas primary contact User, many HouseholdMembers
HouseholdMemberLinks Users to Households with a role typeMany-to-one User and Household
Domain 2

Admin System

A separate authentication and authorization system for internal staff/administrators. Uses role-based access control (RBAC) with fine-grained abilities, plus camp-level position assignments for per-camp privileges.

Key pattern — AdminUser is distinct from User. Abilities (54+ distinct) are assigned to roles, roles to admins. AdminUserPosition adds camp-scoping on top of the global role.

Entity diagram

erDiagram AdminUser { uuid id PK varchar firstName varchar lastName varchar email varchar tableauUsername boolean activated varchar campAssociation enum userType boolean receiveManagerEmail varchar roleId FK } AdminRole { uuid id PK varchar roleName UK boolean activated int displayOrder int rank } AdminAbility { uuid id PK varchar name varchar groupName boolean activated json abilityLevel varchar permissionSection } AdminRoleAbility { uuid id PK varchar adminAbilityId FK varchar adminRoleId FK varchar accessLevel } AdminUserPosition { uuid id PK varchar adminUserId FK varchar campId FK enum role } AdminRoleCard { uuid id PK varchar adminRoleId FK varchar cardName int displayOrder } AdminUserRecentTabs { uuid id PK varchar adminUserId FK varchar label varchar title varchar tableauId } AdminAccessedHouseholds { uuid id PK varchar adminUserId FK varchar householdId FK timestamp lastActivity } AdminUser }o--|| AdminRole : "has role" AdminUser ||--o{ AdminUserRecentTabs : "has tabs" AdminUser ||--o{ AdminUserPosition : "has positions" AdminRole ||--o{ AdminRoleAbility : "has abilities" AdminAbility ||--o{ AdminRoleAbility : "granted to" AdminRole ||--o{ AdminRoleCard : "dashboard cards" AdminUser ||--o{ AdminAccessedHouseholds : "accessed"

Entities

EntityPurposeKey relationships
AdminUserAdmin portal login (separate from User)Has AdminRole, positions, recent tabs
AdminRoleRole definitions with rankingHas abilities + dashboard cards
AdminAbilityGranular permission definitionsLinked to roles via AdminRoleAbility
AdminRoleAbilityJunction: role ↔ ability with access levelLinks both sides
AdminUserPositionPer-camp role assignment for an adminLinks AdminUser to Camp
AdminRoleCardDashboard card visibility per roleMany-to-one AdminRole
AdminUserRecentTabsRecently viewed Tableau tabsMany-to-one AdminUser
AdminAccessedHouseholdsAudit trail of household viewsLinks AdminUser to Household
Domain 3

Camp

The physical camps, their sessions, and geographic locations. Camp → CampSession is the core hierarchy driving nearly every downstream domain (registration, cabins, media, surveys).

Key pattern — A CampSession carries dates, grade/age ranges, status, and optional off-site venue. CampSessionLocation represents churches or remote venues distinct from the main camp Location.

Entity diagram

erDiagram Camp { uuid id PK int rockpile_id UK varchar iCampPro_id UK varchar name enum programCategory enum type varchar regionName json mapData json cmsData varchar directorId FK varchar locationId FK } CampSession { uuid id PK int rockpile_id UK varchar iCampPro_id UK varchar name varchar code enum type int year int eventYear date startDate date endDate enum status varchar campId FK varchar locationId FK int minGrade int maxGrade int minAge int maxAge boolean isRegistrationEnabled varchar familyCampScheduleVersionId FK } CampSessionLocation { uuid id PK int rockpile_id UK varchar iCampPro_id UK varchar name varchar shortName varchar primaryEmail boolean isLunchProvided varchar customUrl int gmtOffset varchar locationId FK } Location { uuid id PK int rockpile_id UK varchar iCampPro_id UK varchar name varchar address varchar city varchar state varchar country varchar timeZone varchar postalCode varchar latitude varchar longitude } Camp }o--|| Location : "located at" Camp }o--|| User : "directed by" CampSession }o--|| Camp : "belongs to" CampSession }o--o| CampSessionLocation : "held at" CampSessionLocation }o--o| Location : "located at"

Entities

EntityPurposeKey relationships
CampCamp site (e.g., Pine Cove, Towers)Has Location, director, sessions
CampSessionA specific session/week at a campBelongs to Camp, has Registrations
CampSessionLocationChurch/off-site session venueHas a Location
LocationGeographic address with lat/longUsed by Camp, CampSessionLocation
Domain 4

Registration & Attendance

Tracks camper sign-ups and session attendance. Registration is the central bridge connecting Users to CampSessions, carrying the full registration lifecycle and logistical details.

Key pattern — Status enum drives the full lifecycle: registered → cancelled → waitlisted and back. Attendee is a lighter profile used at check-in. Staff-side applications live in the Staff domain.

Entity diagram

erDiagram Registration { uuid id PK int rockpile_id varchar iCampPro_id UK int iCampProEnrollmentId int iCampProAttendeeId int grade varchar gender enum status timestamp registeredAt timestamp canceledAt varchar cancelReason boolean isAdult varchar pickupCode varchar sessionId FK varchar userId FK varchar householdId FK varchar cabinCamperId FK varchar familyAccommodationId FK } Attendee { uuid id PK int rockpile_id UK varchar iCampPro_id UK varchar statusCode int age varchar gender varchar grade boolean isGuest boolean formFlag varchar userId FK varchar counselorId FK } Registration }o--|| CampSession : "for session" Registration }o--|| User : "registered user" Registration }o--|| Household : "from household" Attendee }o--|| User : "is user" Attendee }o--o| User : "has counselor"

Entities

EntityPurposeKey relationships
RegistrationA user's registration for a sessionLinks User, CampSession, Household
AttendeeAttendee profile with counselor assignmentLinks User (attendee) + counselor
Domain 5

Staff

Staff-specific data beyond the base User account — bios, hobbies, school background, per-session employment records, and the applicant pipeline for prospective staff.

Key pattern — Staff and User are a 1:1 pair. Employment is per CampSession — a single staffer may be employed across multiple sessions. PositionGroup standardizes position names into three groups: Leadership, Counselor, Program. Applicant tracks prospective staff through hiring; once hired, the same User gets a Staff record.

Entity diagram

erDiagram Staff { uuid id PK varchar type varchar campName varchar campNameShort varchar role varchar userId FK varchar bioId FK varchar school boolean hasEmployment varchar major text hobbies text funFact text lookingForwardTo } Employment { uuid id PK varchar staffId FK varchar positionName varchar sessionId FK varchar staffingSeasonName varchar staffRosterName enum employmentStatus } PositionGroup { uuid id PK varchar positionName UK enum positionGroupName } Applicant { uuid id PK int rockpile_id UK varchar iCampPro_id UK varchar type varchar code varchar status varchar school varchar statusCode timestamp submittedAt int counselorBioArticleId boolean stafferImpact varchar offerStatus varchar userId FK } ApplicantPhoto { uuid id PK int rockpile_id UK enum type varchar imageId FK } User ||--o| Staff : "is staff" Staff ||--o{ Employment : "has employments" Employment }o--|| CampSession : "for session" Applicant }o--|| User : "is user" ApplicantPhoto ||--o| Image : "has image"

Entities

EntityPurposeKey relationships
StaffStaff profile (bio, school, hobbies)1:1 with User, has CampArticle bio
EmploymentEmployment record per sessionLinks Staff to CampSession
PositionGroupMaps position names to groups (Leadership/Counselor/Program)Lookup (table name: EmploymentPositionGroup)
ApplicantProspective staff — application tracking through hiringLinks to User
ApplicantPhotoApplicant headshot/photosLinks to Image
Domain 6

Cabin & Housing

Physical housing assignments for campers and families. Each session instantiates its cabin layout as CabinSessionGroups with assigned counselors; family camps use a parallel accommodation system.

Key pattern — CabinSessionGroup is the per-session instance of a Cabin (with a counselor + optional senior counselor). CabinCamper places individual campers in a group. Family camp accommodations are tracked via FamilyAccommodation + FamilySessionGroup. (Daily schedule content for the Camp Life app lives in the Articles & Publishing domain.)

Entity diagram

erDiagram Cabin { uuid id PK int rockpile_id UK varchar iCampPro_id UK varchar name UK varchar code varchar cluster int idealCapacity int maxCapacity varchar gender int displayOrder } CabinSessionGroup { uuid id PK int rockpile_id UK varchar iCampPro_id UK varchar groupCode varchar cabinNickname varchar sessionId FK varchar cabinId FK varchar counselorId FK varchar seniorCounselorId FK enum cabinPhotoStatus } CabinCamper { uuid id PK int rockpile_id UK varchar camperId FK varchar buddyCamperId FK varchar cabinGroupId FK } FamilyAccommodation { uuid id PK int spaceId UK varchar spaceName } FamilySessionGroup { uuid id PK varchar sessionId FK varchar householdId FK enum familyPhotoStatus } CabinSessionGroup }o--|| CampSession : "for session" CabinSessionGroup }o--|| Cabin : "uses cabin" CabinSessionGroup }o--o| Staff : "counselor" CabinSessionGroup ||--o{ CabinCamper : "has campers" CabinCamper }o--|| User : "is camper" FamilySessionGroup }o--|| CampSession : "for session" FamilySessionGroup }o--|| Household : "for household"

Entities

EntityPurposeKey relationships
CabinPhysical cabin definitionHas many CabinSessionGroups
CabinSessionGroupCabin instance for a session with counselorLinks Cabin, CampSession, Staff
CabinCamperCamper assignment to cabin groupLinks User to CabinSessionGroup
FamilyAccommodationFamily-camp housing optionsReferenced by Registration
FamilySessionGroupFamily group in a sessionLinks Household to CampSession
Domain 7

Media & Content

Photos, videos, and AI-powered tagging. Image/Video are raw assets; TaggedImage/TaggedVideo overlay facial recognition results and confidence scores; EntityTag provides polymorphic tagging across types.

Key pattern — AWS Rekognition produces faceId + bounding box + confidence, stored on TaggedImage. EntityTag uses a polymorphic targetType + targetId to tag photos/videos with Users, Cabins, or other entities.

Entity diagram

erDiagram Image { uuid id PK varchar rockpile_id UK varchar source varchar format varchar sourceType timestamp timestamp varchar title varchar caption varchar md5Hash varchar imageFrom numeric taggingThreshold varchar campName } Video { uuid id PK int rockpile_id UK varchar title enum status varchar source varchar folderPath varchar fileName varchar baseUrl varchar streamBaseUrl varchar youTubeUrl bigint contentLength varchar typeId FK varchar scheduleId FK } TaggedImage { uuid id PK int rockpile_id UK enum status varchar typeId FK varchar imageId FK varchar sessionId FK varchar faceId float confidenceScore varchar faceBoundingBox float faceSize float blurValue float brightness float sharpness } TaggedVideo { uuid id PK int rockpile_id UK varchar typeId FK varchar videoId FK varchar sessionId FK } MediaType { uuid id PK varchar rockpile_id UK varchar code UK varchar name varchar description boolean isActive varchar defaultTransform } ContentEntityTag { uuid id PK int rockpile_id UK varchar tagId FK varchar imageId FK varchar videoId FK } EntityTag { uuid id PK int rockpile_targetId enum targetType varchar targetId } TaggedImage }o--|| Image : "references image" TaggedImage }o--|| MediaType : "of type" TaggedImage }o--|| CampSession : "from session" TaggedImage ||--o{ ContentEntityTag : "has tags" TaggedVideo }o--|| Video : "references video" TaggedVideo }o--|| MediaType : "of type" TaggedVideo ||--o{ ContentEntityTag : "has tags" ContentEntityTag }o--|| EntityTag : "references tag" Video }o--|| MediaType : "of type"

Entities

EntityPurposeKey relationships
ImageCore image asset + metadataReferenced by many entities
VideoVideo asset with streaming URLsHas MediaType, PostSchedule
TaggedImageImage with face detection/tagging resultsLinks Image, MediaType, CampSession
TaggedVideoVideo with entity tagsLinks Video, MediaType, CampSession
MediaTypeContent type definitionsReferenced by media entities
ContentEntityTagJunction: content → entity tagLinks TaggedImage/Video to EntityTag
EntityTagPolymorphic tag (person, cabin, etc.)targetType + targetId
Domain 8

Photo Galleries

Gallery management and publishing — albums, session photos, EXIF data, and per-camp tagging statistics. Gallery albums are scheduled for audience-targeted delivery.

Entity diagram

erDiagram PhotoGallery { uuid id PK int rockpile_id UK enum status varchar title varchar folderPath varchar baseUrl int submittedCount varchar typeId FK int galleryTotal } GalleryAlbum { uuid id PK varchar title int photosCount date scheduledDate time scheduledTime enum audience enum status enum day text folderPath int eventYear varchar campName varchar week timestamp buildRunAt } GalleryAlbumPhotos { uuid id PK varchar galleryAlbumId FK varchar imageId FK boolean isCoverPhoto } CampSessionPhoto { uuid id PK int rockpile_id UK varchar campSessionId FK varchar photoId FK } CampSessionPhotoGallery { uuid id PK int rockpile_id UK varchar campSessionId FK varchar photoGalleryId FK } CampSessionVideo { uuid id PK int rockpile_id UK varchar campSessionId FK varchar videoId FK } ImageExifData { uuid id PK timestamp createdAt varchar imagePath varchar faceDetails } ImageContent { uuid id PK int rockpile_id UK varchar iCampPro_id UK varchar userId FK varchar sessionId FK } TaggedImageStats { uuid id PK varchar campId FK int eventYear int campWeek int totalCampers int totalTags float avgTagsPerCamper int percentChangeTags int percentChangeTagsPerCamper } PhotoGallery }o--|| MediaType : "of type" GalleryAlbum ||--o{ GalleryAlbumPhotos : "contains" GalleryAlbumPhotos }o--|| Image : "is image" CampSessionPhoto }o--|| CampSession : "for session" CampSessionPhoto }o--|| Image : "is photo" CampSessionPhotoGallery }o--|| CampSession : "for session" CampSessionPhotoGallery }o--|| PhotoGallery : "is gallery" CampSessionVideo }o--|| CampSession : "for session" CampSessionVideo }o--|| Video : "is video" ImageContent }o--|| User : "tagged user" ImageContent }o--|| CampSession : "from session" TaggedImageStats }o--|| Camp : "for camp"

Entities

EntityPurposeKey relationships
PhotoGalleryGallery collectionHas MediaType
GalleryAlbumAlbum with schedulingHas GalleryAlbumPhotos
GalleryAlbumPhotosPhotos in an albumLinks GalleryAlbum to Image
CampSessionPhotoSession-specific photosLinks CampSession to Image
CampSessionPhotoGallerySession gallery assignmentsLinks CampSession to PhotoGallery
CampSessionVideoSession-specific videosLinks CampSession to Video
ImageExifDataEXIF metadata from photosStandalone
ImageContentLinks users to images per sessionLinks User, CampSession
TaggedImageStatsPer-camp weekly tagging statisticsLinks to Camp
Domain 9

Articles & Content Publishing

Blog posts, camp updates, the publishing pipeline that delivers content into the Camp Life app, and the MyWeek schedule builder. Content flows: creation → scheduling (PostSchedule / MediaConfig) → publishing (ContentPost) → delivery to Camp Life.

Key pattern — ContentType is the master taxonomy referenced by many entities. PostSchedule batches content for timed publishing. CampCQ (Camp Content Quotes) pairs images with AI-generated words for in-app engagement. The MyWeek schedule builder — FamilyCampSchedule, its versions, and MyWeekBlock — is authored in Sidekick Portal and shows campers what's happening each day of their week; CampSession references a specific version.

Entity diagram

erDiagram CampArticle { uuid id PK int rockpile_id UK varchar title varchar summary enum status varchar postUrl varchar feedImageUrl date targetDate varchar access boolean isSharingEnabled int wp_postId int wp_postRevision varchar priorRevisionId FK varchar typeId FK boolean isPushNotifyEnabled } CampArticleType { uuid id PK int rockpile_id UK varchar wp_type UK varchar contentTypeId FK varchar name UK varchar description boolean isActive } ContentType { uuid id PK int rockpile_id UK varchar code UK varchar name varchar description varchar category boolean isActive } ContentPost { uuid id PK int rockpile_id UK varchar type varchar appContentType varchar sourceObject varchar sourceId varchar sharedFromCampSessionId FK timestamp postedAt timestamp publishAt enum status boolean isHidden int campLife_postId varchar scheduleId FK varchar sourceContentTypeId FK } PostSchedule { uuid id PK int rockpile_id UK varchar description varchar postType varchar sourceObject varchar targetTopicType timestamp startAt timestamp endAt timestamp publishAt enum status int totalCount int processedCount varchar contentTypeId FK } MediaConfig { uuid id PK int rockpile_id UK varchar iCampPro_id UK varchar day int hour int minutes varchar appContentType varchar caption1Template varchar notificationTitle varchar contentTypeId FK } CampUpdate { uuid id PK varchar contentTypeId FK varchar content enum status boolean isPushNotifyEnabled enum scheduleRepeat time scheduleTime int scheduleDay json scheduleWeek } CampCQ { uuid id PK int rockpile_id UK varchar text varchar word1 varchar word2 varchar word3 varchar status boolean isRegenerated varchar fullImageId FK varchar feedImageId FK varchar userId FK varchar campSessionId FK } FamilyCampSchedule { uuid id PK varchar campId FK int eventYear } FamilyCampScheduleVersion { uuid id PK varchar familyCampScheduleId FK int versionNumber varchar versionName json content } MyWeekBlock { uuid id PK varchar campType json blocks } CampArticle }o--|| CampArticleType : "of type" CampArticle }o--o| CampArticle : "prior revision" CampArticleType }o--|| ContentType : "categorized as" ContentPost }o--o| PostSchedule : "scheduled by" ContentPost }o--|| ContentType : "of type" PostSchedule }o--|| ContentType : "for type" Video }o--o| PostSchedule : "scheduled by" MediaConfig }o--|| ContentType : "for type" CampUpdate }o--|| ContentType : "of type" Staff ||--o| CampArticle : "has bio" CampCQ }o--|| User : "for user" CampCQ }o--|| CampSession : "in session" FamilyCampSchedule }o--|| Camp : "for camp" FamilyCampScheduleVersion }o--|| FamilyCampSchedule : "version of" CampSession }o--o| FamilyCampScheduleVersion : "uses schedule"

Entities

EntityPurposeKey relationships
CampArticleBlog/article content (WordPress-backed)Has type, linked to sessions
CampArticleTypeArticle categoriesLinks to ContentType
ContentTypeMaster content categorizationReferenced by many entities
ContentPostPublished content pushed to Camp LifeLinks CampSession, PostSchedule, ContentType
PostScheduleBatch publishing scheduleLinks to ContentType
MediaConfigPublishing schedule config per campLinks to ContentType
CampUpdateRecurring update postsLinks to ContentType, Camps
CampCQCamp content quotes with AI-generated wordsLinks Image, User, CampSession
FamilyCampSchedulePer-camp/year config for the MyWeek schedule builderLinks to Camp
FamilyCampScheduleVersionVersioned JSON schedule content surfaced in Camp LifeLinks to FamilyCampSchedule; referenced by CampSession
MyWeekBlockBlock definitions (by camp type) used in the MyWeek builderStandalone (table: MyWeekBlockManagement)
Domain 10

Communication

Camp mail (physical scan-to-digital) and notifications. Physical camper letters are scanned in batches, processed with blank-letter AI detection, and delivered digitally to parents. Outbound messages to campers are scheduled for delivery.

Entity diagram

erDiagram CampMailFromCamper { uuid id PK int rockpile_id UK boolean isRead enum status varchar batchId FK varchar imageId FK varchar scanFileName varchar currentFilePath varchar senderId FK varchar recipientId FK varchar sessionId FK float blankLetterConfidenceScore } CampMailFromCamperBatch { varchar id PK timestamp generatedAt boolean autoDelivery varchar sourcePath } CampMailToCamper { uuid id PK int rockpile_id UK timestamp deliverAt varchar text varchar senderName varchar senderId FK varchar recipientId FK varchar sessionId FK } Notification { uuid id PK int rockpile_id UK varchar status varchar type varchar deliveryMethod timestamp sendAfter timestamp sendBy varchar email varchar payload varchar deliveryId varchar userId FK varchar bundleId FK varchar postScheduleId FK } CampMailFromCamper }o--|| CampMailFromCamperBatch : "in batch" CampMailFromCamper }o--|| Image : "scanned image" CampMailFromCamper }o--|| User : "sent by" CampMailFromCamper }o--|| User : "sent to" CampMailFromCamper }o--|| CampSession : "during session" CampMailToCamper }o--|| User : "from" CampMailToCamper }o--|| User : "to" CampMailToCamper }o--|| CampSession : "during session" Notification }o--|| User : "for user" Notification }o--o| Notification : "bundled in" Notification }o--o| PostSchedule : "from schedule"

Entities

EntityPurposeKey relationships
CampMailFromCamperScanned physical mail from campers (with AI blank-letter scoring)Links sender/recipient, CampSession, Image
CampMailFromCamperBatchBatch scan processingHas many CampMailFromCamper
CampMailToCamperDigital messages to campers (parent → child)Links sender/recipient, CampSession
NotificationPush/email notification queue with bundlingLinks User, PostSchedule; self-referencing
Domain 11

Surveys

Survey collection and metrics analysis. Responses are imported from PaperSurvey.io, linked back to Registrations or Employments, and aggregated into dashboards with statistical color-coding per camp.

Key pattern — StandardSurveyQuestion provides cross-survey metric normalization so metrics can be compared year over year. HalftimeQuestionMapping and PaperSurveyMetricThreshold are recent additions (March 2026) enabling halftime-survey ingestion and statistical dashboard thresholding.

Entity diagram

erDiagram PaperSurvey { uuid id PK varchar surveyId int surveyCollectionId varchar surveyVersionId varchar surveyName enum type boolean activated varchar campId FK } PaperSurveyBatch { uuid id PK int surveyBatchId varchar paperSurveyId FK varchar sessionId FK enum status varchar s3Path int usersCount int responseCount json generatedSummary json calculatedMetrics } PaperSurveyFilter { uuid id PK varchar paperSurveyBatchId FK enum gender enum positionGroup json calculatedMetrics } PaperSurveyQuestion { uuid id PK varchar paperSurveyId FK int displayOrder int surveyQuestionId varchar name varchar group enum type text options } PaperSurveyResponse { uuid id PK int responseId varchar paperSurveyId FK varchar sessionId FK varchar registrationId FK varchar employmentId FK } PaperSurveyAnswer { uuid id PK varchar paperSurveyResponseId FK varchar paperSurveyQuestionId FK varchar answer varchar scanImage } StandardSurveyQuestion { uuid id PK varchar standardQuestionKey UK varchar standardQuestionLabel varchar category enum surveyType enum processingType } StandardSurveyQuestionMapping { uuid id PK varchar standardSurveyQuestionId FK int surveyQuestionId UK boolean isActive } HalftimeQuestionMapping { uuid id PK varchar paperSurveyId FK varchar paperSurveyQuestionId FK enum questionType varchar prefillKey varchar evaluationTargetPrefillKey varchar prefillSlot varchar questionKey enum processingType } PaperSurveyMetricThreshold { uuid id PK varchar campId FK varchar metricName boolean isStaff decimal average decimal standardDeviation decimal lowerThreshold decimal upperThreshold } PaperSurvey }o--|| Camp : "for camp" PaperSurveyBatch }o--|| PaperSurvey : "of survey" PaperSurveyBatch }o--|| CampSession : "for session" PaperSurveyFilter }o--|| PaperSurveyBatch : "filters batch" PaperSurveyQuestion }o--|| PaperSurvey : "in survey" PaperSurveyResponse }o--|| PaperSurvey : "for survey" PaperSurveyResponse }o--|| CampSession : "for session" PaperSurveyResponse }o--o| Registration : "by registrant" PaperSurveyResponse }o--o| Employment : "by staff" PaperSurveyAnswer }o--|| PaperSurveyResponse : "in response" PaperSurveyAnswer }o--o| PaperSurveyQuestion : "answers question" StandardSurveyQuestionMapping }o--|| StandardSurveyQuestion : "maps to" HalftimeQuestionMapping }o--|| PaperSurvey : "classifies survey" HalftimeQuestionMapping }o--|| PaperSurveyQuestion : "classifies question" PaperSurveyMetricThreshold }o--|| Camp : "thresholds for"

Entities

EntityPurposeKey relationships
PaperSurveySurvey definitionLinks to Camp
PaperSurveyBatchBatch of responses per session with rollup JSONLinks PaperSurvey, CampSession
PaperSurveyFilterPre-calculated filtered metrics (by gender/position)Links to PaperSurveyBatch
PaperSurveyQuestionQuestion definitionsLinks to PaperSurvey
PaperSurveyResponseIndividual response recordLinks PaperSurvey, CampSession, Registration/Employment
PaperSurveyAnswerIndividual answer to a questionLinks Response, Question
StandardSurveyQuestionCanonical metric definitions across surveysStandalone reference
StandardSurveyQuestionMappingMaps vendor questions → standardsLinks to StandardSurveyQuestion
HalftimeQuestionMapping New 2026-03Classification of halftime survey questions for ingestion + LLM summarizationLinks PaperSurvey + PaperSurveyQuestion
PaperSurveyMetricThreshold New 2026-03Per-camp statistical thresholds for dashboard color-codingLinks to Camp
Domain 12

Social Features

The follow/connection system allowing parents, families, and supporters to follow campers and receive their activity updates.

Entity diagram

erDiagram Follower { uuid id PK int rockpile_id UK enum status timestamp deactivatedAt varchar invitationId FK varchar userId FK varchar targetId FK } FollowInvitation { uuid id PK int rockpile_id UK varchar code varchar inviteeLabel varchar email enum status timestamp expiresAt timestamp respondedAt varchar inviterId FK varchar requesterUserId FK enum invitationType } Follower }o--|| User : "follower" Follower }o--|| User : "following" Follower ||--o| FollowInvitation : "from invitation" FollowInvitation }o--|| User : "invited by" FollowInvitation }o--o| User : "requested by"

Entities

EntityPurposeKey relationships
FollowerFollow relationship between usersLinks two Users
FollowInvitationInvitation to follow (code-based)Links inviter/requester Users
Domain 13

Reporting & Dashboards

Tableau integration for analytics. Dashboards are grouped for discoverability and admin users can favorite their go-to views. Reports provide metadata for downloadable reports.

Entity diagram

erDiagram Report { uuid id PK varchar name varchar description enum category enum type varchar code } TableauDashboard { uuid id PK varchar title varchar shortTitle varchar description varchar tableauLink int displayOrder } TableauDashboardGroup { uuid id PK varchar name varchar colorCode int displayOrder } TableauDashboardGroupRelation { uuid id PK varchar dashboardId FK varchar dashboardGroupId FK int dashboardDisplayOrder } TableauDashboardFavorites { uuid id PK varchar dashboardId FK varchar adminUserId FK } TableauDashboard ||--o{ TableauDashboardGroupRelation : "in groups" TableauDashboardGroup ||--o{ TableauDashboardGroupRelation : "has dashboards" TableauDashboardFavorites }o--|| TableauDashboard : "favorites" TableauDashboardFavorites }o--|| AdminUser : "favorited by"

Entities

EntityPurposeKey relationships
ReportReport definitionsStandalone
TableauDashboardDashboard metadataHas group relations
TableauDashboardGroupDashboard categoriesHas group relations
TableauDashboardGroupRelationJunction: dashboard ↔ groupLinks both sides
TableauDashboardFavoritesAdmin user favoritesLinks AdminUser to Dashboard
Domain 14

Tools & System

Miscellaneous system entities: admin shortcuts, background job observability, device sync state, and the content-discovery pipeline.

Entity diagram

erDiagram Tool { uuid id PK varchar name varchar link varchar description } ToolFavorites { uuid id PK varchar toolId FK varchar adminUserId FK varchar displayOrder } TriggeredAction { uuid id PK varchar type enum status timestamp startedAt timestamp endedAt timestamp cancelledAt int discoveredCount int errorCount int successCount varchar parameterStore varchar errorMessage decimal memoryUsedStartMB decimal memoryUsedEndMB decimal memoryDeltaMB } SidekickDeviceStatus { uuid id PK timestamp createdAt timestamp modifiedAt varchar deviceName varchar model varchar operatingSystem varchar deviceId UK varchar IPAddress timestamp lastPingAt varchar sidekickBuildNumber varchar photoQueue enum syncStatus } DiscoveredContent { uuid id PK varchar sourceReference varchar targetReference enum status timestamp catalogedAt timestamp publishedAt varchar typeId FK } ToolFavorites }o--|| Tool : "favorites" ToolFavorites }o--|| AdminUser : "favorited by" DiscoveredContent }o--|| ContentType : "of type"

Entities

EntityPurposeKey relationships
ToolExternal tools/links for admin portalStandalone
ToolFavoritesAdmin user's favorite toolsLinks Tool, AdminUser
TriggeredActionBackground job tracking with memory metricsStandalone
SidekickDeviceStatusMobile device sync statusStandalone
DiscoveredContentContent discovery/cataloging pipelineLinks to ContentType