// Code generated by summer make. DO NOT EDIT. package models import ( "time" "git.golem15.com/golem15/summercms/modules/pact" "gorm.io/gorm" ) // Question types. const ( TypeSingle = "single" TypeMultiple = "multiple" TypeSelfCheck = "self_check" ) // QuestionTypes lists the valid values of Question.Type. var QuestionTypes = []string{TypeSingle, TypeMultiple, TypeSelfCheck} // Question is one question of a quiz. A self_check question is a flashcard: // the user reveals AnswerText and marks whether they knew it. type Question struct { ID uint `gorm:"column:id;primaryKey"` QuizID uint `gorm:"column:quiz_id"` Text string `gorm:"column:text"` Type string `gorm:"column:type"` Category *string `gorm:"column:category"` AnswerText *string `gorm:"column:answer_text"` Explanation *string `gorm:"column:explanation"` SortOrder int `gorm:"column:sort_order"` Points int `gorm:"column:points"` CreatedAt time.Time `gorm:"column:created_at"` UpdatedAt time.Time `gorm:"column:updated_at"` Quiz *Quiz `gorm:"foreignKey:QuizID"` Answers []Answer `gorm:"foreignKey:QuestionID"` } // TableName is the plugin-prefixed table. func (Question) TableName() string { return "golem15_quizzes_questions" } // Fillable lists the columns mass assignment may set. func (Question) Fillable() []string { return []string{"quiz_id", "text", "type", "category", "answer_text", "explanation", "sort_order", "points"} } // Rules are checked by the admin API on every save. func (Question) Rules() map[string]string { return map[string]string{ "quiz_id": "required|integer|min:1", "text": "required", "type": "required|in:single,multiple,self_check", "category": "nullable|max:255", "sort_order": "nullable|integer", "points": "required|integer|min:0", } } // FilterDB returns the database the admin filter choices are read from. The // plugin sets it at boot. // // TODO: requires SummerCMS change. pact.FilterOptions receives neither a // context nor a database handle, so a model whose filter choices come from // the database needs this package-level hook. var FilterDB func() *gorm.DB // Filter scopes of the questions admin list. const ( ScopeByQuiz = "filterByQuiz" ScopeByCategory = "filterByCategory" ) // FilterScopes lists the admin list scopes the model answers. func (Question) FilterScopes() []string { return []string{ScopeByQuiz, ScopeByCategory} } // FilterScope narrows the admin list to the chosen quizzes or categories. func (Question) FilterScope(name string, db *gorm.DB, value any) *gorm.DB { if db == nil { return db } values := filterValues(value) if len(values) == 0 { return db } switch name { case ScopeByQuiz: return db.Where("golem15_quizzes_questions.quiz_id IN ?", values) case ScopeByCategory: return db.Where("golem15_quizzes_questions.category IN ?", values) } return db } // FilterOptions serves the quizzes and the distinct categories as choices. func (Question) FilterOptions(scope string) []pact.Option { if FilterDB == nil { return nil } db := FilterDB() if db == nil { return nil } var out []pact.Option switch scope { case ScopeByQuiz: var quizzes []Quiz if err := db.Select("id", "title").Order("title").Find(&quizzes).Error; err != nil { return nil } for _, q := range quizzes { out = append(out, pact.Option{Value: uintString(q.ID), Label: q.Title}) } case ScopeByCategory: var cats []string if err := db.Model(&Question{}).Where("category IS NOT NULL AND category <> ''"). Distinct("category").Order("category").Pluck("category", &cats).Error; err != nil { return nil } for _, c := range cats { out = append(out, pact.Option{Value: c, Label: c}) } } return out } func filterValues(value any) []string { switch v := value.(type) { case string: if v == "" { return nil } return []string{v} case []string: return v case []any: out := make([]string, 0, len(v)) for _, x := range v { if s, ok := x.(string); ok && s != "" { out = append(out, s) } } return out } return nil }