Support Ticket Model - Implementation Summary
Changes Implemented
✅ 1. Fixed Critical Field Name Inconsistency
- Before:
requesterId,requesterEmail,requesterName - After:
userId,userEmail,userName - Impact: Now matches Firestore rules which use
userId - Files Updated:
toto-bo/src/lib/seeding/supportTickets.ts- Updated interface and creation logictoto-bo/src/app/api/support/route.ts- Updated interface, validation, and creation logictoto-docs/app/docs/architecture/support-ticket-base-model.ts- Base model uses correct field names
✅ 2. Standardized Collection Name
- Before: App used
supportTickets(camelCase), Backoffice usedsupport_tickets(snake_case) - After: Both use
support_tickets(snake_case) - Files Updated:
toto-app/firebase/firestore.rules- Updated collection name tosupport_tickets
✅ 3. Made userId Optional
- Before:
requesterIdwas required - After:
userIdis optional, but at least one ofuserIdoruserEmailis required - Validation: API validates
if (!userId && !userEmail) - Files Updated:
toto-bo/src/app/api/support/route.ts- Updated validation logic
✅ 4. Added Related Entity References
- Added:
caseId?: stringandguardianId?: stringfields - Purpose: Link tickets to specific cases or guardians
- Files Updated:
toto-bo/src/lib/seeding/supportTickets.ts- Added to interfacetoto-bo/src/app/api/support/route.ts- Added to interface and creation logictoto-docs/app/docs/architecture/support-ticket-base-model.ts- Added to base model
✅ 5. Included 'cancelled' Status
- Status: Already in code, now documented in base model
- Type:
'open' | 'in_progress' | 'resolved' | 'closed' | 'cancelled' - Files Updated:
toto-docs/app/docs/architecture/support-ticket-base-model.ts- Included inTicketStatustype
Files Modified
-
toto-docs/app/docs/architecture/support-ticket-base-model.ts(NEW)- Created base support ticket model as single source of truth
- Defined
BaseSupportTicket,TicketStatus,TicketPriority,TicketCategory
-
toto-bo/src/lib/seeding/supportTickets.ts- Updated
SupportTicketinterface:requesterId→userId,requesterEmail→userEmail,requesterName→userName - Added
caseIdandguardianIdoptional fields - Updated ticket creation logic to use new field names
- Updated
-
toto-bo/src/app/api/support/route.ts- Updated
SupportTicketinterface: same field name changes - Updated validation:
userIdoptional, require at least one ofuserIdoruserEmail - Updated search filter: use
userEmailinstead ofrequesterEmail - Updated ticket creation: use new field names and add
caseId/guardianId
- Updated
-
toto-app/firebase/firestore.rules- Updated collection name:
supportTickets→support_tickets
- Updated collection name:
Model Structure
BaseSupportTicket
{
id: string;
ticketNumber: string;
title: string;
description: string;
status: TicketStatus; // 'open' | 'in_progress' | 'resolved' | 'closed' | 'cancelled'
priority: TicketPriority; // 'low' | 'medium' | 'high' | 'urgent'
category: TicketCategory;
assignedTo?: string;
assignedToName?: string;
userId?: string; // Optional - at least one of userId or userEmail required
userEmail: string; // Required
userName?: string; // Denormalized
caseId?: string; // Optional - related case
guardianId?: string; // Optional - related guardian
createdAt: string;
updatedAt: string;
dueDate?: string;
resolvedAt?: string;
closedAt?: string;
tags?: string[];
attachments?: string[];
internalNotes?: string;
}
Breaking Changes
⚠️ Note: These changes may require updates in other parts of the codebase:
- Field Names: Any code using
requesterId/requesterEmail/requesterNameneeds to useuserId/userEmail/userName - Collection Name: App code using
supportTicketscollection needs to usesupport_tickets - userId Optional: Code assuming
userIdis always present needs to handle optional case
Migration Notes
When migrating existing support tickets:
- Rename
requesterId→userId(if present) - Rename
requesterEmail→userEmail - Rename
requesterName→userName(if present) - Ensure at least one of
userIdoruserEmailexists - Add
caseIdandguardianIdif tickets are related to cases/guardians
Next Steps
- Update any remaining code that uses old field names (
requesterId,requesterEmail,requesterName) - Create migration script for existing support tickets
- Test ticket creation, reading, and updating
- Verify Firestore rules work correctly with new field names