# MCC (Mail, Calendar, Contacts) Specification This document outlines the data models for the MCC system, which is designed to be a self-hosted alternative to Google's Mail, Calendar, and Contacts services with full control over data. ## Overview The MCC system consists of three main components: 1. **Mail**: A messaging system that can be used for email as well as chat 2. **Calendar**: A calendar system for managing events and appointments 3. **Contacts**: A contact management system All components are integrated with the `circle.User` model, which serves as the primary user model for the system. ## Data Models ### User Model The user model is defined in `circle/user.v` and has been enhanced with additional fields for MCC functionality: ```v // User represents a member of a circle pub struct User { base.Base pub mut: name string // name of the member as used in this circle description string // optional description which is relevant to this circle role Role // role of the member in the circle contact_ids []u32 // IDs of contacts linked to this member wallet_ids []u32 // IDs of wallets owned by this member which are relevant to this circle pubkey string // public key of the member as used in this circle // Additional fields needed for MCC functionality email string // Primary email address timezone string // User's preferred timezone preferences UserPreferences // User preferences for MCC } // UserPreferences represents user preferences for MCC pub struct UserPreferences { pub mut: default_calendar_id u32 // Default calendar ID default_view string // Default view (day, week, month) email_signature string // Default email signature theme string // UI theme preference notifications bool // Enable/disable notifications } ``` ### Mail Models The mail models are defined in `mcc/message.v`: ```v // Message represents an email message pub struct Message { base.Base pub mut: id u32 // Database ID message_id string // Unique identifier for the email conversation_id string // ID for grouping messages in the same thread folder string // The folder this email belongs to (inbox, sent, drafts, etc.) labels []string // Google-style labels for organization message string // The email body content attachments []Attachment // Any file attachments send_time ourtime.OurTime date i64 // Unix timestamp when the email was sent/received size u32 // Size of the message in bytes read bool // Whether the email has been read flagged bool // Whether the email has been flagged/starred priority string // Priority level (high, normal, low) // Header information subject string from []u32 // List of user IDs who sent the email sender []u32 reply_to []u32 to []u32 cc []u32 bcc []u32 in_reply_to u32 // Additional fields draft bool // Whether this is a draft message scheduled_send ourtime.OurTime // Time to send if scheduled } // Attachment represents an email attachment pub struct Attachment { pub mut: filename string content_type string hash string // Hash of the attachment data size u32 // Size in bytes content []byte // Optional, for storing small attachments directly } ``` ### Calendar Models The calendar models are defined in `mcc/calendar.v`: ```v // Calendar represents a collection of events pub struct Calendar { base.Base pub mut: name string // Name of the calendar description string // Description of the calendar color string // Color for the calendar owner_id u32 // User who owns this calendar timezone string // Default timezone for this calendar visibility string // Public, private, etc. shared_with []CalendarShare // Users this calendar is shared with } // CalendarShare represents calendar sharing permissions pub struct CalendarShare { pub mut: user_id u32 // User ID this calendar is shared with permission string // Read, write, owner, etc. } // CalendarEvent represents a calendar event with all its properties pub struct CalendarEvent { base.Base pub mut: calendar_id u32 // ID of the calendar this event belongs to title string // Event title description string // Event details location string // Event location start_time ourtime.OurTime end_time ourtime.OurTime // End time all_day bool // True if it's an all-day event recurrence string // RFC 5545 Recurrence Rule (e.g., "FREQ=DAILY;COUNT=10") attendees []Attendee // List of attendees organizer u32 // The user who created the event status string // "CONFIRMED", "CANCELLED", "TENTATIVE" color string // User-friendly color categorization reminders []Reminder // Reminders for this event timezone string // Timezone for this specific event visibility string // Public, private, etc. attachments []Attachment // Attachments for this event } // Reminder represents a reminder for an event pub struct Reminder { pub mut: event_id u32 // Event this reminder is for time ourtime.OurTime // When to send the reminder method string // How to deliver the reminder (email, notification, etc.) } // Attendee represents an attendee of an event pub struct Attendee { pub mut: user_id u32 // User ID of the attendee email string // Email of the attendee (for external attendees) name string // Name of the attendee response string // "ACCEPTED", "DECLINED", "TENTATIVE", "NEEDS-ACTION" optional bool // Whether attendance is optional comment string // Attendee's comment } ``` ### Contacts Models The contacts models are defined in `mcc/contacts.v`: ```v // Contact represents a contact with all their information pub struct Contact { base.Base pub mut: name string // Display name of the contact first_name string last_name string nickname string email []ContactEmail // Multiple email addresses with labels phone []ContactPhone // Multiple phone numbers with labels address []ContactAddress // Multiple addresses with labels company string job_title string notes string birthday ourtime.OurTime website []string social_profiles []SocialProfile photo string // Path or URL to contact photo groups []u32 // IDs of groups this contact belongs to custom_fields []CustomField // User-defined fields } // ContactEmail represents an email address with a label pub struct ContactEmail { pub mut: email string label string // Home, Work, Other, etc. primary bool } // ContactPhone represents a phone number with a label pub struct ContactPhone { pub mut: number string label string // Mobile, Home, Work, etc. primary bool } // ContactAddress represents a physical address with a label pub struct ContactAddress { pub mut: street string city string state string postal_code string country string label string // Home, Work, Other, etc. primary bool } // SocialProfile represents a social media profile pub struct SocialProfile { pub mut: platform string // Facebook, Twitter, LinkedIn, etc. username string url string } // CustomField represents a user-defined field pub struct CustomField { pub mut: label string value string } // ContactGroup represents a group of contacts pub struct ContactGroup { base.Base pub mut: name string description string contacts []u32 // IDs of contacts in this group owner_id u32 // User who owns this group shared_with []u32 // Users this group is shared with } ``` ## Integration Points The MCC system integrates with the existing system in the following ways: 1. **User Integration**: - Uses `circle.User` as the primary user model - The `biz.User` model has been deprecated and should not be used 2. **Cross-Component Integration**: - Calendar events can reference contacts as attendees - Emails can reference calendar events (for invitations) - Contacts can be used in email addressing 3. **Base Integration**: - All models extend the `base.Base` struct for common fields - Consistent ID and timestamp handling ## System Architecture ``` +----------------+ +----------------+ +----------------+ | | | | | | | Mail System |<----->| User System |<----->| Contact System | | | | | | | +----------------+ +----------------+ +----------------+ ^ ^ ^ | | | v v v +----------------+ +----------------+ +----------------+ | | | | | | | Calendar System|<----->| Base System |<----->| Group System | | | | | | | +----------------+ +----------------+ +----------------+ ``` This specification provides a comprehensive data model for creating a self-hosted alternative to Google's Mail, Calendar, and Contacts services, with a focus on data ownership and control.