Identity & auth
dancers
Columns
| Column | Type | Null | Default | Keys |
|---|---|---|---|---|
| id | uuid | no | gen_random_uuid() | PK |
| text | no | — | unique | |
| name | text | no | — | |
| photo | text | yes | — | |
| dance_styles | json | yes | [] | |
| dance_levels | jsonb | no | {} | |
| role | text | yes | — | |
| city | text | yes | — | |
| neon_auth_id | text | yes | — | unique |
| is_admin | boolean | yes | false | |
| username | text | yes | — | unique |
| old_usernames | jsonb | no | [] | |
| bio | text | yes | — | |
| text | yes | — | ||
| youtube | text | yes | — | |
| website | text | yes | — | |
| profile_public | boolean | yes | true | |
| salt | text | yes | "" | |
| hash | text | yes | "" | |
| intent | text | yes | — | |
| onboarded_at | timestamp | yes | — | |
| magic_token | text | yes | — | |
| magic_token_expires_at | timestamp | yes | — | |
| email_verified_at | timestamp | yes | — | |
| source_ref | jsonb | yes | — | |
| created_at | timestamp | yes | now() |
Value lists come from .$type<'a' | 'b'>() in the schema — enforced in TypeScript only, not by the database.
Keys, constraints & indexes
Unique
- (email) dancers_email_unique
- (neon_auth_id) dancers_neon_auth_id_unique
- (username) dancers_username_unique
Indexes
No secondary indexes.
Foreign keys
None.
Referenced by
- ai_usage (dancer_id)
- attendances (dancer_id)
- booking_inquiries (requester_id)
- booking_requests (requester_id, moderated_by_id)
- brand_looks (created_by)
- city_battle_votes (voter_dancer_id)
- city_videos (dancer_id)
- community_group_reports (dancer_id)
- dancer_goals (dancer_id)
- dinner_group_members (dancer_id)
- dinner_signups (dancer_id)
- discover_swipes (dancer_id)
- election_candidates (dancer_id)
- election_vote_history (voter_dancer_id)
- election_votes (voter_dancer_id)
- event_flyers (created_by)
- event_posts (created_by)
- events (edited_by)
- festival_ride_shares (dancer_id)
- festival_roommate_lookups (dancer_id)
- festival_signups (dancer_id)
- festival_submissions (submitted_by_id)
- festival_waves (dancer_id, target_dancer_id)
- follows (dancer_id, target_dancer_id)
- gig_applications (dancer_id, decided_by)
- gigs (dancer_id)
- giveaway_entries (dancer_id)
- giveaway_proposals (proposed_by, decided_by)
- guideline_versions (moderator_dancer_id)
- handles (dancer_id)
- hangout_rsvps (dancer_id)
- hangouts (dancer_id)
- inbound_requests (dancer_id)
- legacy_follows (dancer_id)
- mcp_audit (dancer_id)
- network_links (created_by)
- oauth_grants (dancer_id)
- organizer_subscriptions (dancer_id)
- plan_items (dancer_id)
- profile_access_log (actor_id, subject_id)
- profile_claims (dancer_id, decided_by)
- profile_contacts (dancer_id)
- profile_invites (created_by)
- profile_members (dancer_id, added_by)
- profile_sites (updated_by)
- profile_suggestions (suggested_by)
- recommendation_requests (asker_id)
- referrals (referrer_id, referee_id)
- reviews (dancer_id)
- sessions (dancer_id)
- tracked_link_actions (dancer_id)
- tracked_links (created_by)
- video_votes (voter_dancer_id)
Used by
Code that reads or writes this table, found by static analysis of the tRPC routers and API handlers (including helpers they call).
tRPC procedures
- auth.requestMagicLink
- auth.verifyMagicLink
- auth.resetPassword
- auth.login
- auth.register
- auth.changePassword
- auth.completeOnboarding
- auth.me
- auth.myEmail
- auth.deleteAccount
- dinner.list
- festivalSignup.ticketCheckout
- festivalSignup.publicRoster
- claim.claimMyTicketHolderRows
- claim.getClaimStatus
- festivalInsights.styleLevelMix
- profile.movedTo
- profile.getByUsername
- profile.update
- review.create
- askLocals.recommend
- election.forProfile
- election.nominate
- election.castVote
- election.close
- feedback.reporter
- gigs.applyTo
- gigs.applications
- gigs.decideApplication
- hangouts.create
- events.festivals
- plan.goingList
- plan.sharedPlan
- plan.discover
- plan.weekSocials
- plan.goingBatch
- plan.proofShowcase
- referral.validate
- rideShare.list
- business.create
- businessEvents.attendees
- businessEvents.inbox
- artistInvites.notify
- inquiries.me
- inquiries.send
- businessTeam.team
- businessTeam.decideJoin
- businessTeam.history
- roommate.list
- wave.wavesForMe
- wave.friends
- wave.discoverPool
- organizerSubscription.createCheckout
- attendance.publicList
- attendance.counts
- attendance.proofShowcase
- oauth.authorizeInfo
- oauth.auditForProfile
REST & webhooks
- GET /api/architecture/admin
- GET /api/festivals
- ANY /api/profiles/:username/contacts
- POST /api/stripe/webhook
- POST /api/webhooks/tickettailor
- ANY /mcp
- ANY /mcp/public
Relations
Rendering diagram…
Diagram source
erDiagram
ai_usage {
uuid id PK
uuid event_id FK
uuid flyer_id FK
uuid dancer_id FK
}
attendances {
uuid id PK
uuid event_id FK
uuid dancer_id FK
}
booking_inquiries {
uuid id PK
uuid profile_id FK
uuid requester_id FK
}
booking_requests {
uuid id PK
uuid space_id FK
uuid profile_id FK
uuid organizer_id FK
uuid requester_id FK
uuid moderated_by_id FK
}
brand_looks {
uuid id PK
uuid profile_id FK
uuid created_by FK
}
city_battle_votes {
uuid id PK
uuid voter_dancer_id FK
}
city_videos {
uuid id PK
uuid dancer_id FK
}
community_group_reports {
uuid id PK
uuid group_id FK
uuid dancer_id FK
}
dancer_goals {
uuid id PK
uuid dancer_id FK
}
dancers {
uuid id PK
text email UK
text neon_auth_id UK
text username UK
}
dinner_group_members {
uuid id PK
uuid group_id FK
uuid dancer_id FK
}
dinner_signups {
uuid id PK
uuid dinner_id FK
uuid dancer_id FK
}
discover_swipes {
uuid id PK
uuid dancer_id FK
}
election_candidates {
uuid id PK
uuid election_id FK
uuid dancer_id FK
}
election_vote_history {
uuid id PK
uuid election_id FK
uuid voter_dancer_id FK
}
election_votes {
uuid id PK
uuid election_id FK
uuid voter_dancer_id FK
uuid candidate_id FK
}
event_flyers {
uuid id PK
uuid event_id FK
uuid post_id FK
uuid look_id FK
uuid created_by FK
}
event_posts {
uuid id PK
uuid event_id FK
uuid created_by FK
}
events {
uuid id PK
uuid host_profile_id FK
uuid edited_by FK
}
festival_ride_shares {
uuid id PK
uuid festival_id FK
uuid dancer_id FK
}
festival_roommate_lookups {
uuid id PK
uuid festival_id FK
uuid dancer_id FK
}
festival_signups {
uuid id PK
uuid festival_id FK
uuid dancer_id FK
text tickettailor_order_id UK
}
festival_submissions {
uuid id PK
uuid submitted_by_id FK
}
festival_waves {
uuid id PK
uuid dancer_id FK
uuid target_dancer_id FK
}
follows {
uuid id PK
uuid dancer_id FK
uuid profile_id FK
uuid target_dancer_id FK
}
gig_applications {
uuid id PK
uuid gig_id FK
uuid dancer_id FK
uuid profile_id FK
uuid decided_by FK
}
gigs {
uuid id PK
uuid dancer_id FK
uuid poster_profile_id FK
}
giveaway_entries {
uuid id PK
uuid giveaway_id FK
uuid dancer_id FK
}
giveaway_proposals {
uuid id PK
uuid event_id FK
uuid proposed_by FK
uuid profile_id FK
uuid giveaway_id FK
uuid decided_by FK
}
guideline_versions {
uuid id PK
uuid profile_id FK
uuid election_id FK
uuid moderator_dancer_id FK
}
handles {
text handle PK
uuid dancer_id FK,UK
uuid profile_id FK,UK
}
hangout_rsvps {
uuid id PK
uuid hangout_id FK
uuid dancer_id FK
}
hangouts {
uuid id PK
uuid event_id FK
uuid dancer_id FK
}
inbound_requests {
uuid id PK
uuid dancer_id FK
uuid event_id FK
uuid profile_id FK
uuid gig_id FK
}
legacy_follows {
uuid id PK
uuid dancer_id FK
}
mcp_audit {
uuid id PK
uuid grant_id FK
uuid dancer_id FK
uuid profile_id FK
text confirm_nonce UK
}
network_links {
uuid id PK
uuid profile_id FK
uuid other_profile_id FK
uuid created_by FK
}
oauth_grants {
uuid id PK
uuid dancer_id FK
text client_id FK
}
organizer_subscriptions {
uuid id PK
uuid profile_id FK
uuid dancer_id FK
text stripe_subscription_id UK
}
plan_items {
uuid id PK
uuid dancer_id FK
}
profile_access_log {
uuid id PK
uuid profile_id FK
uuid actor_id FK
uuid subject_id FK
}
profile_claims {
uuid id PK
uuid profile_id FK
uuid dancer_id FK
uuid decided_by FK
}
profile_contacts {
uuid id PK
uuid profile_id FK
uuid dancer_id FK
}
profile_invites {
uuid id PK
uuid profile_id FK
uuid event_id FK
uuid created_by FK
}
profile_members {
uuid id PK
uuid profile_id FK
uuid dancer_id FK
uuid added_by FK
}
profile_sites {
uuid profile_id PK,FK
uuid updated_by FK
}
profile_suggestions {
uuid id PK
uuid profile_id FK
uuid event_id FK
uuid suggested_by FK
}
recommendation_requests {
uuid id PK
uuid asker_id FK
}
referrals {
uuid id PK
uuid festival_id FK
uuid referrer_id FK
uuid referee_id FK
}
reviews {
uuid id PK
uuid dancer_id FK
}
sessions {
uuid id PK
uuid dancer_id FK
text token UK
}
tracked_link_actions {
uuid id PK
uuid link_id FK
uuid dancer_id FK
}
tracked_links {
uuid id PK
text code UK
uuid event_id FK
uuid profile_id FK
uuid created_by FK
}
video_votes {
uuid id PK
uuid winner_video_id FK
uuid loser_video_id FK
uuid voter_dancer_id FK
}
events |o--o{ ai_usage : "event_id"
event_flyers |o--o{ ai_usage : "flyer_id"
dancers |o--o{ ai_usage : "dancer_id"
events ||--o{ attendances : "event_id"
dancers |o--o{ attendances : "dancer_id"
dancers |o--o{ booking_inquiries : "requester_id"
dancers |o--o{ booking_requests : "requester_id"
dancers |o--o{ booking_requests : "moderated_by_id"
dancers |o--o{ brand_looks : "created_by"
dancers |o--o{ city_battle_votes : "voter_dancer_id"
dancers |o--o{ city_videos : "dancer_id"
dancers ||--o{ community_group_reports : "dancer_id"
dancers ||--o{ dancer_goals : "dancer_id"
dancers ||--o{ dinner_group_members : "dancer_id"
dancers ||--o{ dinner_signups : "dancer_id"
dancers ||--o{ discover_swipes : "dancer_id"
dancers ||--o{ election_candidates : "dancer_id"
dancers ||--o{ election_vote_history : "voter_dancer_id"
dancers ||--o{ election_votes : "voter_dancer_id"
election_candidates ||--o{ election_votes : "candidate_id"
events ||--o{ event_flyers : "event_id"
event_posts |o--o{ event_flyers : "post_id"
brand_looks |o--o{ event_flyers : "look_id"
dancers |o--o{ event_flyers : "created_by"
events ||--o{ event_posts : "event_id"
dancers |o--o{ event_posts : "created_by"
dancers |o--o{ events : "edited_by"
dancers ||--o{ festival_ride_shares : "dancer_id"
dancers ||--o{ festival_roommate_lookups : "dancer_id"
dancers |o--o{ festival_signups : "dancer_id"
dancers |o--o{ festival_submissions : "submitted_by_id"
dancers ||--o{ festival_waves : "dancer_id"
dancers ||--o{ festival_waves : "target_dancer_id"
dancers ||--o{ follows : "dancer_id"
dancers |o--o{ follows : "target_dancer_id"
gigs ||--o{ gig_applications : "gig_id"
dancers ||--o{ gig_applications : "dancer_id"
dancers |o--o{ gig_applications : "decided_by"
dancers |o--o{ gigs : "dancer_id"
dancers |o--o{ giveaway_entries : "dancer_id"
events ||--o{ giveaway_proposals : "event_id"
dancers |o--o{ giveaway_proposals : "proposed_by"
dancers |o--o{ giveaway_proposals : "decided_by"
dancers |o--o{ guideline_versions : "moderator_dancer_id"
dancers |o--o{ handles : "dancer_id"
hangouts ||--o{ hangout_rsvps : "hangout_id"
dancers ||--o{ hangout_rsvps : "dancer_id"
events |o--o{ hangouts : "event_id"
dancers ||--o{ hangouts : "dancer_id"
dancers |o--o{ inbound_requests : "dancer_id"
events |o--o{ inbound_requests : "event_id"
gigs |o--o{ inbound_requests : "gig_id"
dancers ||--o{ legacy_follows : "dancer_id"
oauth_grants |o--o{ mcp_audit : "grant_id"
dancers |o--o{ mcp_audit : "dancer_id"
dancers |o--o{ network_links : "created_by"
dancers ||--o{ oauth_grants : "dancer_id"
dancers ||--o{ organizer_subscriptions : "dancer_id"
dancers ||--o{ plan_items : "dancer_id"
dancers |o--o{ profile_access_log : "actor_id"
dancers |o--o{ profile_access_log : "subject_id"
dancers ||--o{ profile_claims : "dancer_id"
dancers |o--o{ profile_claims : "decided_by"
dancers |o--o{ profile_contacts : "dancer_id"
events |o--o{ profile_invites : "event_id"
dancers |o--o{ profile_invites : "created_by"
dancers ||--o{ profile_members : "dancer_id"
dancers |o--o{ profile_members : "added_by"
dancers |o--o{ profile_sites : "updated_by"
events |o--o{ profile_suggestions : "event_id"
dancers |o--o{ profile_suggestions : "suggested_by"
dancers ||--o{ recommendation_requests : "asker_id"
dancers ||--o{ referrals : "referrer_id"
dancers ||--o{ referrals : "referee_id"
dancers ||--o{ reviews : "dancer_id"
dancers ||--o{ sessions : "dancer_id"
tracked_links ||--o{ tracked_link_actions : "link_id"
dancers |o--o{ tracked_link_actions : "dancer_id"
events ||--o{ tracked_links : "event_id"
dancers |o--o{ tracked_links : "created_by"
city_videos ||--o{ video_votes : "winner_video_id"
city_videos ||--o{ video_votes : "loser_video_id"
dancers |o--o{ video_votes : "voter_dancer_id" Defined at server/database/schema.ts:18 as dancers.