Complete Database Schema Reference
users Table
- name: string (optional)
- image: string (optional)
- email: string (optional)
- emailVerificationTime: number (optional)
- phone: string (optional)
- phoneVerificationTime: number (optional)
- isAnonymous: boolean (optional)
- hashedPassword: string (optional)
- token: string (optional)
- gender: string (optional) - ['male', 'female', 'non-binary']
- sexualOrientation: string (optional)
- interestedIn: string[] (optional)
- age: number (optional)
- birthDate: number (timestamp, optional)
- latitude: float64 (optional)
- longitude: float64 (optional)
- city: string (optional)
- country: string (optional)
- ageRangeMin: number (optional)
- ageRangeMax: number (optional)
- maxDistancePreference: number (km, optional)
- interests: string[] (optional)
- languages: string[] (optional)
- relationshipType: string (optional) - ['casual', 'serious', 'friendship']
- longDistanceRelationship: string (optional)
- profileCompleteness: number (%, optional)
- matchabilityScore: number (optional)
- isActive: boolean (optional)
- lastActiveTimestamp: number (optional)
- isVerified: boolean (optional)
- showInSearchResults: boolean (optional)
- discoveryPreferences: object (optional) - {
- showMen: boolean
- showWomen: boolean
- showNonBinary: boolean
}
messages Table
- body: string (required)
- userId: ID reference to users (required)
partnerConnections Table
- userId: ID (users) (required)
- partnerId: ID (users) (optional)
- connectionCode: string (required)
- status: string - ['pending', 'connected', 'expired']
- initiatorUserId: ID (users) (optional)
- createdAt: number (required)
- expiresAt: number (required)
- targetUserId: ID (users) (optional)
moods Table
- userId: ID (users) (required)
- mood: string (required)
- reason: string (optional)
- images: string[] (required)
- note: string (optional)
- createdAt: number (required)
- moodIntensity: number (optional)
- tags: string[] (optional)
- visibilitySettings: string (optional)
habits Table
- userId: ID (users) (required)
- title: string (required)
- description: string (optional)
- frequency: string (required)
- streak: number (required)
- longestStreak: number (required)
- lastCheckedIn: number (timestamp, required)
events Table
- userId: ID (users) (required)
- title: string (required)
- description: string (optional)
- startDate: string (ISO, required)
- endDate: string (ISO, required)
- startTime: string (required)
- endTime: string (required)
- participants: ID[] (users) (optional)
- eventType: string (required) - ['date', 'meeting', 'reminder', 'traveling', 'task', 'other']
- importanceLevel: string - ['Low', 'Medium', 'High']
- notify: string (optional)
- location: string (optional)
memories Table
- userId: ID (users) (required)
- title: string (required)
- description: string (optional)
- date: string (ISO, required)
- location: string (optional)
- latitude: number (optional)
- longitude: number (optional)
- images: string[] (required)
- memoryType: string (optional)
- createdAt: string (required)
questions Table
- category: string (required)
- subcategory: string (optional)
- content: string (required)
questionAnswers Table
- userId: ID (users) (required)
- questionId: ID (questions) (required)
- answer: string (required)
gameStates Table
- userId: ID (users) (required)
- partnerId: ID (users) (required)
- gameType: string (required)
- currentState: any (required)
- lastUpdated: number (timestamp, required)
notifications Table
- userId: ID (users) (required)
- type: string (required)
- content: string (required)
- isRead: boolean (required)
- createdAt: number (timestamp, required)
images Table
- userId: string (required)
- url: string (required)
- key: string (required)
- title: string (optional)
- description: string (optional)
- createdAt: string (optional)
- groupId: string (optional)
Schema Notes:
- All ID fields reference Convex document IDs
- Timestamps are stored as milliseconds since epoch
- Date fields without times use ISO 8601 strings
- Arrays are represented as JavaScript arrays
- Optional fields may be null or undefined
- v.float64() fields use 64-bit floating point numbers
- Indexes are maintained for query optimization