package domain import "time" // Program is the top-level container in the LMS hierarchy (e.g. tracks like Beginner / Intermediate / Advanced). type Program struct { ID int64 `json:"id"` Name string `json:"name"` Description *string `json:"description,omitempty"` Category string `json:"category"` Thumbnail *string `json:"thumbnail,omitempty"` SortOrder int `json:"sort_order"` PublishStatus ContentPublishStatus `json:"publish_status"` CreatedAt time.Time `json:"created_at"` UpdatedAt *time.Time `json:"updated_at,omitempty"` Access *LMSEntityAccess `json:"access,omitempty"` } // VisibleToLearners is true when the program appears in subscriber/catalog LMS APIs. func (p Program) VisibleToLearners() bool { return p.PublishStatus == ContentPublishPublished } type CreateProgramInput struct { Name string `json:"name" validate:"required"` Description *string `json:"description,omitempty"` Category string `json:"category" validate:"required,oneof=LEARN_ENGLISH IELTS DUOLINGO"` Thumbnail *string `json:"thumbnail,omitempty"` // SortOrder inserts at this global program order when set; omit to append after current max (sort_order uniqueness is enforced). SortOrder *int `json:"sort_order,omitempty" validate:"omitempty,min=0"` // Omit or empty defaults to DRAFT; set PUBLISHED to make visible to learners immediately. PublishStatus *string `json:"publish_status,omitempty" validate:"omitempty,oneof=DRAFT draft PUBLISHED published"` } type UpdateProgramInput struct { Name *string `json:"name,omitempty"` Description *string `json:"description,omitempty"` Category *string `json:"category,omitempty" validate:"omitempty,oneof=LEARN_ENGLISH IELTS DUOLINGO"` Thumbnail *string `json:"thumbnail,omitempty"` SortOrder *int `json:"sort_order,omitempty"` PublishStatus *string `json:"publish_status,omitempty" validate:"omitempty,oneof=DRAFT draft PUBLISHED published"` }