/** * Core Event Interfaces * * Defines the fundamental structure and types for calendar events */ /** * Event priority levels */ export type EventPriority = 'low' | 'normal' | 'high' | 'urgent'; /** * Event status types */ export type EventStatus = 'tentative' | 'confirmed' | 'cancelled' | 'completed'; /** * Event visibility levels */ export type EventVisibility = 'default' | 'public' | 'private' | 'confidential'; /** * Event frequency for recurring events */ export type EventFrequency = 'none' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'custom'; /** * Time zone representation */ export interface TimeZone { /** IANA time zone identifier (e.g., 'America/New_York') */ id: string; /** Display name (e.g., 'Eastern Standard Time') */ displayName: string; /** Offset from UTC in minutes */ offset: number; } /** * Event date/time information */ export interface EventDateTime { /** Start date and time */ start: Date; /** End date and time */ end: Date; /** Whether the event is all-day */ isAllDay: boolean; /** Time zone for the event */ timeZone: TimeZone; /** Original time zone (for moved events) */ originalTimeZone?: TimeZone; } /** * Event location information */ export interface EventLocation { /** Location name or address */ name: string; /** Additional address details */ address?: string; /** Geographic coordinates */ coordinates?: { latitude: number; longitude: number; }; /** Room or venue details */ room?: string; /** Virtual meeting link */ virtualLink?: string; } /** * Event attendee information */ export interface EventAttendee { /** Unique identifier */ id: string; /** Display name */ name: string; /** Email address */ email: string; /** Response status */ status: 'pending' | 'accepted' | 'declined' | 'tentative'; /** Whether attendance is required */ required: boolean; /** Role in the event */ role?: 'organizer' | 'attendee' | 'optional' | 'resource'; } /** * Event recurrence rule */ export interface EventRecurrence { /** Frequency of recurrence */ frequency: EventFrequency; /** Interval (e.g., every 2 weeks) */ interval: number; /** Days of week for weekly recurrence */ daysOfWeek?: number[]; /** Day of month for monthly recurrence */ dayOfMonth?: number; /** Month for yearly recurrence */ month?: number; /** End date for recurrence */ endDate?: Date; /** Number of occurrences */ count?: number; /** Custom recurrence pattern */ customPattern?: string; /** Exceptions (dates to exclude) */ exceptions?: Date[]; } /** * Event attachment */ export interface EventAttachment { /** Unique identifier */ id: string; /** File name */ name: string; /** File URL or path */ url: string; /** MIME type */ mimeType: string; /** File size in bytes */ size: number; /** Description */ description?: string; } /** * Event reminder/notification */ export interface EventReminder { /** Unique identifier */ id: string; /** Minutes before event to trigger */ minutesBefore: number; /** Reminder method */ method: 'popup' | 'email' | 'sms' | 'push'; /** Whether reminder is enabled */ enabled: boolean; /** Custom message */ message?: string; } /** * Event metadata and custom fields */ export interface EventMetadata { /** Custom fields */ [key: string]: any; /** Tags for categorization */ tags?: string[]; /** Color coding */ color?: string; /** Icon identifier */ icon?: string; /** External system IDs */ externalIds?: Record; } /** * Core Event interface */ export interface CalendarEvent { /** Unique identifier */ id: string; /** Event title */ title: string; /** Event description */ description?: string; /** Date and time information */ dateTime: EventDateTime; /** Event location */ location?: EventLocation; /** Event organizer */ organizer?: EventAttendee; /** Event attendees */ attendees?: EventAttendee[]; /** Event priority */ priority: EventPriority; /** Event status */ status: EventStatus; /** Event visibility */ visibility: EventVisibility; /** Event category */ category?: string; /** Recurrence rule */ recurrence?: EventRecurrence; /** Event reminders */ reminders?: EventReminder[]; /** Event attachments */ attachments?: EventAttachment[]; /** Event metadata */ metadata?: EventMetadata; /** Creation timestamp */ createdAt: Date; /** Last modified timestamp */ updatedAt: Date; /** Creator information */ createdBy: string; /** Last modifier information */ updatedBy: string; /** Version for conflict resolution */ version: number; } /** * Event creation input */ export interface CreateEventInput { title: string; description?: string; dateTime: Omit & { timeZone?: TimeZone; }; location?: EventLocation; attendees?: Omit[]; priority?: EventPriority; status?: EventStatus; visibility?: EventVisibility; category?: string; recurrence?: EventRecurrence; reminders?: Omit[]; attachments?: Omit[]; metadata?: EventMetadata; } /** * Event update input */ export interface UpdateEventInput { id: string; title?: string; description?: string; dateTime?: Partial; location?: EventLocation; attendees?: EventAttendee[]; priority?: EventPriority; status?: EventStatus; visibility?: EventVisibility; category?: string; recurrence?: EventRecurrence; reminders?: EventReminder[]; attachments?: EventAttachment[]; metadata?: EventMetadata; version: number; } /** * Event query filters */ export interface EventFilter { /** Date range filter */ dateRange?: { start: Date; end: Date; }; /** Category filter */ categories?: string[]; /** Status filter */ statuses?: EventStatus[]; /** Priority filter */ priorities?: EventPriority[]; /** Attendee filter */ attendeeId?: string; /** Search text */ searchText?: string; /** Tags filter */ tags?: string[]; /** Custom metadata filters */ metadata?: Record; } /** * Event sort options */ export interface EventSort { /** Field to sort by */ field: 'title' | 'start' | 'end' | 'priority' | 'status' | 'createdAt' | 'updatedAt'; /** Sort direction */ direction: 'asc' | 'desc'; } /** * Paginated event results */ export interface EventResults { /** Event items */ events: CalendarEvent[]; /** Total count */ total: number; /** Current page */ page: number; /** Page size */ pageSize: number; /** Whether there are more results */ hasMore: boolean; } /** * Event conflict information */ export interface EventConflict { /** Conflicting event */ event: CalendarEvent; /** Type of conflict */ type: 'overlap' | 'double_booking' | 'resource_conflict'; /** Conflict details */ details: string; /** Suggested resolution */ suggestion?: string; } /** * Event validation result */ export interface EventValidationResult { /** Whether the event is valid */ isValid: boolean; /** Validation errors */ errors: string[]; /** Validation warnings */ warnings: string[]; /** Conflicts found */ conflicts: EventConflict[]; }