Skip to main content

Conversation Data Model Analysis

Current State Comparison

App Code (conversationService.ts)

FieldTotoConversationConversationDatasaveConversation (actual storage)Status
id✅ Required❌ Missing✅ Auto-generated⚠️ INCONSISTENT
userId✅ Required❌ Missing✅ Required⚠️ INCONSISTENT
caseId✅ Required✅ Required✅ Required✅ Match
caseName✅ Required✅ Required✅ Required✅ Match
caseImageUrl✅ Optional✅ Optional✅ Optional✅ Match
messages✅ Required✅ Required✅ Required⚠️ STRUCTURE DIFF
createdAt✅ Required (string)✅ Required (string)✅ Required (Timestamp)⚠️ TYPE MISMATCH
lastMessageAt✅ Required (string)✅ Optional (string)✅ Required (Timestamp)⚠️ TYPE MISMATCH
platform✅ Optional (string[])❌ Missing✅ Required (string[])⚠️ INCONSISTENT
isActive✅ Required (boolean)❌ Missing❌ Missing⚠️ INCONSISTENT
isArchived❌ Missing❌ Missing✅ Required (boolean)⚠️ INCONSISTENT
actionTaken❌ Missing✅ Required✅ Optional⚠️ INCONSISTENT

Message Structure

FieldTotoMessageConversationData.messagessaveConversation messagesStatus
id✅ Required✅ Optional✅ Required⚠️ INCONSISTENT
type✅ Required✅ Required✅ Required✅ Match
message✅ Required✅ Required✅ Required✅ Match
timestamp✅ Required (Date)✅ Optional (string)✅ Required (Timestamp)⚠️ TYPE MISMATCH
platform✅ Optional✅ Optional✅ Required⚠️ INCONSISTENT
metadata✅ Optional✅ Optional✅ Optional✅ Match

Issues Identified

1. Missing updatedAt Field

  • Current: No updatedAt field
  • Impact: No tracking of when conversation was last modified
  • Recommendation: Add updatedAt field

2. isActive vs isArchived Inconsistency

  • TotoConversation: Uses isActive: boolean
  • saveConversation: Uses isArchived: boolean
  • Transform: isActive: !data.isArchived
  • Question: Should we standardize on isArchived or isActive?
  • Recommendation: Use isArchived (more explicit, follows common patterns)

3. Timestamp Type Mismatch

  • App Interface: Uses string (ISO 8601)
  • Storage: Uses Firestore Timestamp
  • Impact: Type conversion needed
  • Recommendation: Standardize on string (ISO 8601) in model, convert to Timestamp for storage

4. actionTaken Field

  • ConversationData: Required
  • TotoConversation: Missing
  • Storage: Optional (defaults to 'chat')
  • Question: Should actionTaken be part of the base model?
  • Recommendation: Make it optional, track what action was taken

5. platform Field

  • TotoConversation: platform?: string[] (array)
  • Storage: platform: ['casecard'] (required array)
  • Message: platform?: string (single string)
  • Question: Should platform be at conversation level, message level, or both?
  • Recommendation: Keep at conversation level (array), remove from message level

6. Message ID Generation

  • TotoMessage: Required
  • ConversationData: Optional
  • Storage: Auto-generated if missing
  • Recommendation: Make message ID required

7. Missing Fields in Base Model

  • No updatedAt for conversation
  • No isArchived in TotoConversation interface (only in storage)

Recommendations

1. Standardize on isArchived

Recommendation: Use isArchived: boolean (not isActive)

  • More explicit
  • Common pattern
  • Can derive isActive = !isArchived if needed

2. Add updatedAt

Recommendation: Add updatedAt field

  • Track when conversation was last modified
  • Set to createdAt on creation

3. Standardize Timestamps

Recommendation: Use string (ISO 8601) in model

  • Convert to Firestore Timestamp only for storage
  • Consistent with other models

4. Make actionTaken Optional

Recommendation: Add actionTaken?: string to base model

  • Track what action was taken in conversation
  • Optional field

5. Platform Field

Recommendation: Keep platform at conversation level only

  • Array of platforms where conversation occurred
  • Remove from message level

6. Message Structure

Recommendation: Standardize message structure

  • Required: id, type, message, timestamp
  • Optional: metadata
  • Remove platform from message (use conversation-level)

Questions for User

  1. isActive vs isArchived: Should we use isArchived (storage) or isActive (app)?

    • My recommendation: Use isArchived (more explicit)
  2. actionTaken: Should this be part of the base model?

    • My recommendation: Yes, as optional field
  3. Platform: Should platform be at conversation level, message level, or both?

    • My recommendation: Conversation level only (array)
  4. Message platform: Remove platform from message structure?

    • My recommendation: Yes, use conversation-level platform
  5. updatedAt: Should we add updatedAt field?

    • My recommendation: Yes
  6. Seeding: Should we create a seeding script for conversations?

    • My recommendation: Optional, conversations are typically user-generated