package models import ( "time" "github.com/google/uuid" ) // PublicEvent is a holiday or school-vacation row imported from // OpenHolidaysAPI. Global (no owner) — same for every school per region. type PublicEvent struct { ID uuid.UUID `json:"id" db:"id"` Region string `json:"region" db:"region"` // e.g. "DE-NI" EventType string `json:"event_type" db:"event_type"` // public_holiday | school_holiday NameDe string `json:"name_de" db:"name_de"` NameEn string `json:"name_en,omitempty" db:"name_en"` StartDate string `json:"start_date" db:"start_date"` // YYYY-MM-DD EndDate string `json:"end_date" db:"end_date"` Source string `json:"source,omitempty" db:"source"` CreatedAt time.Time `json:"created_at" db:"created_at"` } // SchoolCalendarConfig stores the Bundesland selection for one school // (= one Rektor account). One row per user. type SchoolCalendarConfig struct { UserID uuid.UUID `json:"user_id" db:"user_id"` Bundesland string `json:"bundesland" db:"bundesland"` // DE-NI ... SchoolYearStart *string `json:"school_year_start,omitempty" db:"school_year_start"` SchoolYearEnd *string `json:"school_year_end,omitempty" db:"school_year_end"` CreatedAt time.Time `json:"created_at" db:"created_at"` UpdatedAt time.Time `json:"updated_at" db:"updated_at"` } // SchoolEvent is a user-managed event (Fortbildung, Schulfeier, …). type SchoolEvent struct { ID uuid.UUID `json:"id" db:"id"` CreatedByUserID uuid.UUID `json:"created_by_user_id" db:"created_by_user_id"` Title string `json:"title" db:"title"` Description string `json:"description,omitempty" db:"description"` EventType string `json:"event_type" db:"event_type"` IsSchoolFree bool `json:"is_school_free" db:"is_school_free"` StartDate string `json:"start_date" db:"start_date"` EndDate string `json:"end_date" db:"end_date"` StartTime *string `json:"start_time,omitempty" db:"start_time"` EndTime *string `json:"end_time,omitempty" db:"end_time"` AffectedClassIDs []uuid.UUID `json:"affected_class_ids" db:"affected_class_ids"` VisibleToParents bool `json:"visible_to_parents" db:"visible_to_parents"` NotifyParents bool `json:"notify_parents" db:"notify_parents"` NotifyStudents bool `json:"notify_students" db:"notify_students"` NotificationLeadDays []int `json:"notification_lead_days" db:"notification_lead_days"` CreatedAt time.Time `json:"created_at" db:"created_at"` UpdatedAt time.Time `json:"updated_at" db:"updated_at"` } // Request DTOs // UpsertSchoolCalendarConfigRequest sets or updates the Bundesland for the // authenticated user. Both school-year dates are optional (defaults to the // running year based on today's date). type UpsertSchoolCalendarConfigRequest struct { Bundesland string `json:"bundesland" binding:"required,len=5"` SchoolYearStart *string `json:"school_year_start,omitempty"` SchoolYearEnd *string `json:"school_year_end,omitempty"` } type CreateSchoolEventRequest struct { Title string `json:"title" binding:"required"` Description string `json:"description"` EventType string `json:"event_type" binding:"required,oneof=fortbildung schulfeier klassenfahrt projekttag eltern_info andere"` IsSchoolFree bool `json:"is_school_free"` StartDate string `json:"start_date" binding:"required"` EndDate string `json:"end_date" binding:"required"` StartTime *string `json:"start_time,omitempty"` EndTime *string `json:"end_time,omitempty"` AffectedClassIDs []string `json:"affected_class_ids"` VisibleToParents bool `json:"visible_to_parents"` NotifyParents bool `json:"notify_parents"` NotifyStudents bool `json:"notify_students"` NotificationLeadDays []int `json:"notification_lead_days"` }