Conversation Data Model Analysis
Current State Comparison
App Code (conversationService.ts)
| Field | TotoConversation | ConversationData | saveConversation (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
| Field | TotoMessage | ConversationData.messages | saveConversation messages | Status |
|---|---|---|---|---|
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
updatedAtfield - Impact: No tracking of when conversation was last modified
- Recommendation: Add
updatedAtfield
2. isActive vs isArchived Inconsistency
- TotoConversation: Uses
isActive: boolean - saveConversation: Uses
isArchived: boolean - Transform:
isActive: !data.isArchived - Question: Should we standardize on
isArchivedorisActive? - 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
actionTakenbe 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
updatedAtfor conversation - No
isArchivedin TotoConversation interface (only in storage)
Recommendations
1. Standardize on isArchived
Recommendation: Use isArchived: boolean (not isActive)
- More explicit
- Common pattern
- Can derive
isActive = !isArchivedif needed
2. Add updatedAt
Recommendation: Add updatedAt field
- Track when conversation was last modified
- Set to
createdAton 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
platformfrom message (use conversation-level)
Questions for User
-
isActive vs isArchived: Should we use
isArchived(storage) orisActive(app)?- My recommendation: Use
isArchived(more explicit)
- My recommendation: Use
-
actionTaken: Should this be part of the base model?
- My recommendation: Yes, as optional field
-
Platform: Should platform be at conversation level, message level, or both?
- My recommendation: Conversation level only (array)
-
Message platform: Remove
platformfrom message structure?- My recommendation: Yes, use conversation-level platform
-
updatedAt: Should we add
updatedAtfield?- My recommendation: Yes
-
Seeding: Should we create a seeding script for conversations?
- My recommendation: Optional, conversations are typically user-generated