// Package calendar ist ein eigenständiges Modul, kein Kernbestandteil: // CalDAV für Termine und Aufgaben. Es importiert nichts aus files, sharing // oder admin – nur auth und acl, wie jeder andere Bereich auch. Ist es // abgeschaltet, gibt es keine Route und keinen Menüpunkt; die Tabellen // bleiben dann einfach ungenutzt liegen. Siehe kalender-plan.md. package calendar import ( "time" "github.com/google/uuid" ) // Calendar ist eine Sammlung von Terminen/Aufgaben – das, was ein Client als // einen Kalender in seiner Liste zeigt. type Calendar struct { ID uuid.UUID `json:"id"` OwnerID uuid.UUID `json:"owner_id"` Name string `json:"name"` Color string `json:"color"` Description string `json:"description"` SupportsTodo bool `json:"supports_todo"` // TimeZone ist die Vorgabe für neue Termine, die die Web-Oberfläche // künftig hier anlegt (Phase 3). CalDAV selbst braucht sie nicht – // jeder Termin trägt seine Zeitzone bereits im .ics. TimeZone string `json:"timezone"` // PathSegment ist die Adresse, unter der ein Client diesen Kalender // angelegt hat ("…/calendars/max/arbeit/"). Leer heißt: keine gewählte // Adresse, es gilt die UUID. Siehe Ref. PathSegment string `json:"-"` CTag int64 `json:"ctag"` // SyncFloor: Bis zu diesem Stand sind Grabsteine weggeräumt. Ein Token // darunter lässt sich nicht mehr vollständig beantworten – der Client // bekommt dann eine Absage und gleicht vollständig ab. Siehe // Store.ChangesSince. SyncFloor int64 `json:"-"` CreatedAt time.Time `json:"created_at"` } // Ref ist das Pfadsegment, unter dem dieser Kalender in CalDAV erreichbar // ist: die vom Client gewählte Adresse, sonst die UUID. func (c *Calendar) Ref() string { if c.PathSegment != "" { return c.PathSegment } return c.ID.String() } // Object ist ein einzelner Termin oder eine Aufgabe. Data ist die // vollständige .ics-Datei, unverändert wie vom Client geschickt – siehe // kalender-plan.md, Abschnitt "Felder". type Object struct { ID uuid.UUID `json:"id"` CalendarID uuid.UUID `json:"calendar_id"` UID string `json:"uid"` Component string `json:"component"` // "VEVENT" | "VTODO" Data string `json:"-"` ETag string `json:"etag"` DTStart *time.Time `json:"dtstart,omitempty"` DTEnd *time.Time `json:"dtend,omitempty"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` }