Disciplines · Reference

Database Schema Inventory

Activities, Notifications, Preferences, ApiKeys

6sections14 minread

On this page

Comprehensive database schema documentation for the Oshun platform.

Note: This inventory was originally generated from the Lilith and Yemaya codebases during the initial monorepo migration. Additional domains (Iris, Tara, Veritas, Psyche, Nyx, Aja, Aphrodite, and others) have since been added and their schemas should be documented separately.

Generated: 2026-01-10 | Last updated: 2026-02-14


Overview#

Codebase ORM/Query Builder Architecture Total Tables
Yemaya Prisma (full ORM) Centralized single schema 36+ models
Lilith Knex.js (query builder) Decentralized per-service 40+ tables

Yemaya Database Schema (Prisma)#

Location: /home/ubuntu/oshun/yemaya/packages/database/prisma/schema.prisma Database: PostgreSQL with Prisma Client

User & Authentication Models#

User#

Field Type Constraints Description
id String (CUID) PK Primary identifier
email String Unique User email address
emailVerified DateTime? Email verification timestamp
passwordHash String? Hashed password
firstName String? First name
lastName String? Last name
displayName String? Display name
avatarUrl String? Profile picture URL
bio String? User biography
locale String Default: "en" Language preference
timezone String Default: "UTC" Timezone
status Enum active/inactive/suspended/pending/deleted Account status
lastLoginAt DateTime? Last login timestamp
mfaEnabled Boolean Default: false MFA status
createdAt DateTime Auto Creation timestamp
updatedAt DateTime Auto Last update timestamp
deletedAt DateTime? Soft delete timestamp

Relationships: Accounts, Sessions, Memberships, Projects, Assets, Comments, Activities, Notifications, Preferences, ApiKeys

Account (OAuth)#

Field Type Constraints Description
id String (CUID) PK Primary identifier
userId String FK to User Owner user
type String Account type
provider String OAuth provider (google, github, etc.)
providerAccountId String Provider's user ID
refreshToken String? OAuth refresh token
accessToken String? OAuth access token
expiresAt Int? Token expiration
tokenType String? Token type
scope String? OAuth scopes

Unique: provider + providerAccountId

Session#

Field Type Constraints Description
id String (CUID) PK Primary identifier
userId String FK to User Owner user
token String Unique Session token
expiresAt DateTime Session expiration
ipAddress String? Client IP address
userAgent String? Client user agent

ApiKey#

Field Type Constraints Description
id String (CUID) PK Primary identifier
userId String FK to User Owner user
name String Key name/description
keyHash String Unique Hashed API key
keyPrefix String Visible key prefix
scopes String[] Authorized scopes
lastUsedAt DateTime? Last usage timestamp
expiresAt DateTime? Key expiration

Organization & Team Models#

Organization#

Field Type Constraints Description
id String (CUID) PK Primary identifier
name String Organization name
slug String Unique URL-safe identifier
description String? Description
logoUrl String? Logo URL
website String? Website URL
plan Enum FREE/STARTER/PROFESSIONAL/ENTERPRISE Subscription plan
settings Json Organization settings
deletedAt DateTime? Soft delete timestamp

Relationships: Members, Teams, Projects, Invitations

OrganizationMember#

Field Type Constraints Description
id String (CUID) PK Primary identifier
organizationId String FK Organization
userId String FK User
role Enum OWNER/ADMIN/MEMBER/VIEWER Member role
joinedAt DateTime Join timestamp

Unique: organizationId + userId

Team#

Field Type Constraints Description
id String (CUID) PK Primary identifier
organizationId String FK Parent organization
name String Team name
slug String URL-safe identifier
description String? Team description
color String? Team color (hex)
visibility Enum PRIVATE/ORGANIZATION/PUBLIC Visibility level
status Enum ACTIVE/ARCHIVED/SUSPENDED Team status
createdBy String Creator user ID

Relationships: Members, Projects

Project Models#

Project#

Field Type Constraints Description
id String (CUID) PK Primary identifier
name String Project name
slug String URL-safe identifier
description String? Project description
thumbnailUrl String? Thumbnail URL
type Enum FILM/SHORT_FILM/DOCUMENTARY/ANIMATION/GAME/COMMERCIAL/MUSIC_VIDEO/OTHER Project type
status Enum DRAFT/PRE_PRODUCTION/PRODUCTION/POST_PRODUCTION/COMPLETED/ARCHIVED Project status
visibility Enum PRIVATE/TEAM/ORGANIZATION/PUBLIC Visibility level
ownerId String FK Owner user
organizationId String? FK Parent organization
settings Json Project settings
metadata Json Project metadata
version Int Default: 1 Version number
deletedAt DateTime? Soft delete timestamp

Relationships: Members, Assets, Folders, Tags, Activities, Comments, Concepts, Documents, Scripts, Sequences, Locations

ProjectMember#

Field Type Constraints Description
id String (CUID) PK Primary identifier
projectId String FK Project
userId String FK User
role Enum OWNER/ADMIN/EDITOR/VIEWER Member role

Asset & File Models#

Asset#

Field Type Constraints Description
id String (CUID) PK Primary identifier
projectId String FK Parent project
folderId String? FK Parent folder
creatorId String FK Creator user
name String Asset name
description String? Asset description
type Enum IMAGE/VIDEO/AUDIO/DOCUMENT/SCRIPT/MODEL_3D/TEXTURE/ANIMATION/RIG/SCENE/MATERIAL/EFFECT/FONT/OTHER Asset type
mimeType String MIME type
extension String File extension
size BigInt File size in bytes
status Enum UPLOADING/PROCESSING/READY/FAILED/ARCHIVED Processing status
storageKey String Unique Storage path/key
storageUrl String Direct storage URL
thumbnailUrl String? Thumbnail URL
previewUrl String? Preview URL
checksum String? File checksum
metadata Json Technical metadata
aiMetadata Json AI-extracted metadata
version Int Default: 1 Version number
parentId String? FK Parent asset (versions)
isLatest Boolean Default: true Latest version flag

Relationships: Tags, Comments, Usages, ShotAssets

Folder#

Field Type Constraints Description
id String (CUID) PK Primary identifier
projectId String FK Parent project
parentId String? FK Parent folder
name String Folder name
color String? Folder color
sortOrder Int Default: 0 Sort position

Creative Content Models#

Script#

Field Type Constraints Description
id String (CUID) PK Primary identifier
projectId String FK Parent project
title String Script title
content String Script content
format Enum FOUNTAIN/FDX/PLAIN_TEXT/HTML Script format
version Int Default: 1 Version number
parentId String? FK Parent version
isLatest Boolean Default: true Latest version flag
status Enum DRAFT/IN_REVIEW/APPROVED/LOCKED Script status
metadata Json Script metadata

Relationships: Scenes, Characters

Scene#

Field Type Constraints Description
id String (CUID) PK Primary identifier
scriptId String FK Parent script
sceneNumber String Scene number
heading String Scene heading
locationText String? Location description
locationId String? FK Linked location
timeOfDay String? Time of day
description String Scene description
pageStart Float? Start page number
pageEnd Float? End page number
sortOrder Int Default: 0 Sort position

Relationships: Shots

Character#

Field Type Constraints Description
id String (CUID) PK Primary identifier
projectId String FK Parent project
name String Character name
fullName String? Full name
age String? Character age
description String Character description
backstory String? Character backstory
personality Json Personality traits
relationships Json Character relationships
appearance Json Physical appearance
voice Json Voice characteristics
avatarUrl String? Character image

Production Models#

Sequence#

Field Type Constraints Description
id String (CUID) PK Primary identifier
projectId String FK Parent project
name String Sequence name
description String? Description
sequenceNumber Int Sequence number
color String? Sequence color
thumbnailUrl String? Thumbnail URL
sortOrder Int Default: 0 Sort position
status Enum CONCEPT/STORYBOARD/ANIMATIC/IN_PRODUCTION/REVIEW/APPROVED/FINAL Status
deletedAt DateTime? Soft delete timestamp

Relationships: Shots

Location#

Field Type Constraints Description
id String (CUID) PK Primary identifier
projectId String FK Parent project
name String Location name
description String? Description
type Enum INTERIOR/EXTERIOR/INT_EXT/STUDIO/VIRTUAL/MIXED Location type
address String? Physical address
coordinates Json GPS coordinates
timezone String? Location timezone
accessibility String? Accessibility notes
photos String[] Photo URLs
contacts Json Contact information
permits Json Permit information
costs Json Cost breakdown
deletedAt DateTime? Soft delete timestamp

Relationships: Shots, Scenes, Permits, Checklists, Media, WeatherCache

Shot#

Field Type Constraints Description
id String (CUID) PK Primary identifier
projectId String FK Parent project
sceneId String? FK Parent scene
sequenceId String? FK Parent sequence
locationId String? FK Shooting location
shotNumber String Shot number
name String Shot name
description String? Shot description
shotType Enum ESTABLISHING/MASTER/COVERAGE/INSERT/CUTAWAY/REACTION/POV/OVER_SHOULDER/etc. Shot type
shotSize Enum EXTREME_WIDE/VERY_WIDE/WIDE/FULL/MEDIUM_FULL/MEDIUM/MEDIUM_CLOSE_UP/etc. Shot size
cameraAngle Enum EYE_LEVEL/LOW_ANGLE/HIGH_ANGLE/DUTCH_ANGLE/BIRDS_EYE/WORMS_EYE/etc. Camera angle
cameraMovement Enum STATIC/PAN_LEFT/PAN_RIGHT/TILT_UP/TILT_DOWN/DOLLY_IN/TRACKING/etc. Camera movement
focalLength Int? Focal length (mm)
aperture String? Aperture setting
durationFrames Int? Duration in frames
durationMs Int? Duration in milliseconds
fps Float Default: 24 Frames per second
storyboardUrl String? Storyboard image
thumbnailUrl String? Thumbnail URL
animaticUrl String? Animatic video URL
status Enum CONCEPT/STORYBOARD/ANIMATIC/LAYOUT/BLOCKED/ANIMATION/POLISH/etc. Production status
priority Enum URGENT/HIGH/MEDIUM/LOW/BACKLOG Priority level
difficulty Int? Difficulty rating
dialogue String? Shot dialogue
action String? Action description
vfxNotes String? VFX notes
sfxNotes String? SFX notes
deletedAt DateTime? Soft delete timestamp

Relationships: Characters, Assets, Tasks, Comments

Supporting Models#

Tag#

Field Type Constraints Description
id String (CUID) PK Primary identifier
name String Tag name
slug String URL-safe identifier
color String? Tag color
category String? Tag category

Unique: slug + category

Comment#

Field Type Constraints Description
id String (CUID) PK Primary identifier
projectId String FK Parent project
assetId String? FK Parent asset
userId String FK Author user
parentId String? FK Parent comment (replies)
content String Comment content
metadata Json Comment metadata
resolved Boolean Default: false Resolution status
resolvedBy String? Resolver user ID
resolvedAt DateTime? Resolution timestamp

Activity#

Field Type Constraints Description
id String (CUID) PK Primary identifier
projectId String FK Parent project
userId String FK Acting user
action String Action type
entityType String Target entity type
entityId String Target entity ID
metadata Json Activity metadata
ipAddress String? Client IP address
userAgent String? Client user agent

Notification#

Field Type Constraints Description
id String (CUID) PK Primary identifier
userId String FK Target user
type String Notification type
title String Notification title
message String Notification message
data Json Notification data
read Boolean Default: false Read status
readAt DateTime? Read timestamp

Lilith Database Schema (Knex.js)#

Architecture: Decentralized per-service migrations Database: PostgreSQL with Knex.js query builder

Auth Service Tables#

Location: /services/auth/src/db/migrations/

users#

Field Type Constraints Description
id UUID PK Primary identifier
email VARCHAR(255) Unique, Not Null User email
email_normalized VARCHAR(255) Unique, Not Null Normalized email
password_hash VARCHAR(255) Hashed password
email_verified BOOLEAN Default: false Email verification status
status ENUM active/inactive/suspended/pending/deleted Account status
mfa_enabled BOOLEAN Default: false MFA status
mfa_secret TEXT MFA secret key
mfa_backup_codes JSONB Backup codes
failed_login_attempts INT Default: 0 Failed login count
locked_until TIMESTAMP Account lock expiration
password_changed_at TIMESTAMP Last password change
last_login_at TIMESTAMP Last login timestamp
last_login_ip VARCHAR(45) Last login IP
metadata JSONB User metadata
created_at TIMESTAMP Default: now() Creation timestamp
updated_at TIMESTAMP Auto-update Last update timestamp
deleted_at TIMESTAMP Soft delete timestamp

Indexes: email, email_normalized, status, created_at, status+email_verified Triggers: update_users_updated_at

user_profiles, user_sessions, refresh_tokens, oauth_connections, verification_tokens, audit_logs, webauthn_credentials#

(Additional tables for auth service - see migration files)

Conversation Service Tables#

Location: /services/conversation/src/db/migrations/

threads#

Field Type Constraints Description
id UUID PK Primary identifier
user_id UUID Not Null Owner user
title VARCHAR(500) Thread title
summary TEXT Thread summary
type ENUM general/meditation_guidance/spiritual_discussion/learning_session/reflection/counseling/q_and_a Thread type
persona_id UUID AI persona
persona_name VARCHAR(255) Persona name
context JSONB Conversation context
memory JSONB Conversation memory
metadata JSONB Thread metadata
content_type VARCHAR(50) Related content type
content_id UUID Related content ID
message_count INT Default: 0 Total messages
user_message_count INT Default: 0 User messages
assistant_message_count INT Default: 0 Assistant messages
total_tokens_used BIGINT Default: 0 Total tokens used
status ENUM active/archived/deleted Thread status
is_pinned BOOLEAN Default: false Pinned status
is_starred BOOLEAN Default: false Starred status
last_message_at TIMESTAMP Last message timestamp
deleted_at TIMESTAMP Soft delete timestamp
created_at TIMESTAMP Default: now() Creation timestamp
updated_at TIMESTAMP Auto-update Last update timestamp

Indexes: user_id, type, persona_id, status, user_id+status, user_id+is_pinned, user_id+last_message_at, content_type+content_id

messages#

Field Type Constraints Description
id UUID PK Primary identifier
thread_id UUID FK, Not Null Parent thread
role ENUM user/assistant/system/tool Message role
user_id UUID Author user
content TEXT Message content
content_html TEXT HTML content
content_parts JSONB Structured content
type ENUM text/audio/image/mixed/system_notification/tool_call/tool_result Message type
sequence_number INT Not Null Message order
parent_id UUID FK Parent message
model VARCHAR(100) AI model used
model_version VARCHAR(50) Model version
prompt_tokens INT Prompt token count
completion_tokens INT Completion token count
total_tokens INT Total token count
generation_params JSONB Generation parameters
tool_calls JSONB Tool call data
tool_call_id UUID Tool call ID
attachments JSONB Message attachments
metadata JSONB Message metadata
status ENUM pending/streaming/completed/failed/cancelled/deleted Message status
error_message TEXT Error message
is_edited BOOLEAN Default: false Edit flag
edited_at TIMESTAMP Edit timestamp
original_content TEXT Original content
regenerated_from UUID FK Source message
regeneration_count INT Default: 0 Regeneration count
deleted_at TIMESTAMP Soft delete timestamp
created_at TIMESTAMP Default: now() Creation timestamp
updated_at TIMESTAMP Auto-update Last update timestamp

Indexes: thread_id, thread_id+sequence_number, role, user_id, status, parent_id, created_at, thread_id+created_at

message_citations, message_feedback, conversation_summaries, conversation_participants, conversation_shares#

(Additional conversation tables)

Content Service Tables#

Location: /services/content/src/db/migrations/

courses#

Field Type Constraints Description
id UUID PK Primary identifier
slug VARCHAR(255) Unique URL-safe identifier
title VARCHAR(500) Not Null Course title
description TEXT Full description
short_description VARCHAR(500) Short description
type ENUM course/series/collection/path Course type
difficulty ENUM beginner/intermediate/advanced/all_levels Difficulty level
estimated_duration_minutes INT Estimated duration
lesson_count INT Default: 0 Number of lessons
category_id UUID Category
tags JSONB Course tags
thumbnail_url TEXT Thumbnail URL
cover_image_url TEXT Cover image URL
preview_video_url TEXT Preview video URL
instructor_id UUID Instructor user
instructor_name VARCHAR(255) Instructor name
is_premium BOOLEAN Default: false Premium content flag
is_free BOOLEAN Default: false Free content flag
price DECIMAL(10,2) Course price
currency VARCHAR(3) Default: USD Price currency
status ENUM draft/review/published/archived/deleted Course status
published_at TIMESTAMP Publication timestamp
default_locale VARCHAR(10) Default: en Default language
available_locales JSONB Available languages
seo_title VARCHAR(255) SEO title
seo_description TEXT SEO description
seo_keywords JSONB SEO keywords
enrollment_count INT Default: 0 Total enrollments
average_rating DECIMAL(3,2) Average rating
rating_count INT Default: 0 Number of ratings
completion_count INT Default: 0 Total completions
sort_order INT Default: 0 Sort position
deleted_at TIMESTAMP Soft delete timestamp
created_at TIMESTAMP Default: now() Creation timestamp
updated_at TIMESTAMP Auto-update Last update timestamp

Indexes: slug, status, category_id, instructor_id, is_premium, status+published_at

lessons, meditations, lectures, wisdoms, quotes, reflections, personas, content_versions, categories#

(Additional content tables)

Media Service Tables#

Location: /services/media/src/db/migrations/

assets#

Field Type Constraints Description
id UUID PK Primary identifier
owner_id UUID Not Null Owner user
owner_type VARCHAR(50) Owner type
filename VARCHAR(500) Not Null Stored filename
original_filename VARCHAR(500) Original filename
title VARCHAR(500) Asset title
description TEXT Asset description
alt_text VARCHAR(500) Alt text
type ENUM image/video/audio/document/model_3d/archive/other Asset type
mime_type VARCHAR(100) Not Null MIME type
extension VARCHAR(20) File extension
storage_provider VARCHAR(50) Not Null Storage provider
bucket VARCHAR(255) Storage bucket
storage_key VARCHAR(1000) Unique Storage key/path
storage_region VARCHAR(50) Storage region
public_url TEXT Public URL
cdn_url TEXT CDN URL
is_public BOOLEAN Default: false Public access flag
file_size BIGINT Not Null File size in bytes
checksum VARCHAR(128) File checksum
checksum_algorithm VARCHAR(20) Checksum algorithm
width INT Image/video width
height INT Image/video height
aspect_ratio VARCHAR(20) Aspect ratio
duration_ms INT Audio/video duration
status ENUM uploading/uploaded/processing/ready/failed/deleted Processing status
processing_error TEXT Processing error
variants JSONB Generated variants
metadata JSONB Technical metadata
custom_metadata JSONB User metadata
view_count INT Default: 0 View count
download_count INT Default: 0 Download count
bandwidth_used BIGINT Default: 0 Bandwidth used
content_type VARCHAR(50) Related content type
content_id UUID Related content ID
tags JSONB Asset tags
deleted_at TIMESTAMP Soft delete timestamp
created_at TIMESTAMP Default: now() Creation timestamp
updated_at TIMESTAMP Auto-update Last update timestamp

Indexes: owner_id, type, mime_type, status, storage_key, content_type+content_id, owner_id+type

asset_versions, transcripts, processing_jobs#

(Additional media tables)

Notification Service Tables#

Location: /services/notification/src/db/migrations/

notification_subscriptions#

Field Type Constraints Description
id UUID PK Primary identifier
user_id UUID Not Null User
channel ENUM email/push/sms/in_app/webhook Notification channel
category ENUM marketing/transactional/reminders/social/content_updates/account/security/system Notification category
is_subscribed BOOLEAN Default: true Subscription status
is_verified BOOLEAN Default: false Channel verification
contact_value VARCHAR(500) Contact address
contact_hash VARCHAR(128) Hashed contact
preferences JSONB Channel preferences
frequency VARCHAR(50) Delivery frequency
timezone VARCHAR(50) User timezone
quiet_hours JSONB Quiet hours config
subscribed_at TIMESTAMP Subscription timestamp
unsubscribed_at TIMESTAMP Unsubscription timestamp
verified_at TIMESTAMP Verification timestamp

Unique: user_id + channel + category

notification_templates, device_tokens, delivery_log#

(Additional notification tables)

Payment Orchestrator Tables#

Location: /services/payment-orchestrator/src/db/migrations/

customers#

Field Type Constraints Description
id UUID PK Primary identifier
user_id UUID Unique User
stripe_customer_id VARCHAR(255) Unique Stripe customer ID
paypal_customer_id VARCHAR(255) PayPal customer ID
email VARCHAR(255) Customer email
name VARCHAR(255) Customer name
phone VARCHAR(50) Phone number
billing_address JSONB Billing address
tax_id VARCHAR(50) Tax ID
currency VARCHAR(3) Default: USD Preferred currency
default_payment_method_id VARCHAR(255) Default payment method
payment_methods JSONB Payment methods
balance DECIMAL(12,2) Default: 0 Account balance
status ENUM active/inactive/suspended/deleted Customer status
delinquent BOOLEAN Default: false Payment delinquency
metadata JSONB Customer metadata

products, prices, subscriptions, invoices, payments, refunds, discounts, entitlements#

(Additional payment tables)

Analytics Service Tables#

Location: /services/analytics/src/db/migrations/

events#

Field Type Constraints Description
id UUID PK Primary identifier
event_name VARCHAR(255) Not Null Event name
event_category ENUM navigation/engagement/content/conversion/system/error/performance/user_action/ai_interaction/payment Event category
user_id UUID User (if authenticated)
session_id UUID Session ID
anonymous_id VARCHAR(255) Anonymous ID
timestamp TIMESTAMP Not Null Event timestamp
properties JSONB Event properties
device_type VARCHAR(50) Device type
device_os VARCHAR(50) Operating system
browser VARCHAR(50) Browser
country VARCHAR(2) Country code
region VARCHAR(100) Region
city VARCHAR(100) City
referrer TEXT Referrer URL
utm_source VARCHAR(255) UTM source
utm_medium VARCHAR(255) UTM medium
utm_campaign VARCHAR(255) UTM campaign

Indexes: user_id, session_id, event_name, event_category, timestamp, user_id+timestamp, event_name+timestamp

sessions, user_metrics, content_metrics, funnel_definitions, funnel_events#

(Additional analytics tables)


Schema Comparison Summary#

Aspect Yemaya Lilith
ORM Prisma (full type-safe ORM) Knex.js (query builder)
Schema Location Single centralized file Per-service migration folders
Relationships Explicit Prisma relations Foreign key constraints
Type Generation Automatic Prisma client Manual TypeScript types
Migrations prisma migrate knex migrate
Soft Deletes Built-in deletedAt Per-table deletedAt
Audit Logging Activity model audit_logs table
User Model Part of central schema Auth service owned
Total Tables 36+ models 40+ tables

Migration Recommendations#

  1. Unified Schema Strategy: Migrate to Prisma for type safety and developer experience
  2. Database Per Domain: Each domain (Isis, Sophia, Hathor, Bellona) gets its own database
  3. Shared Auth Database: Oshun Auth maintains user/session tables accessed by all domains
  4. Event Sourcing: Use events for cross-domain data synchronization
  5. Gradual Migration: Migrate domain by domain, starting with shared infrastructure

Revision History#

Version Date Author Changes
1.0 2026-01-10 Development Team Initial version