oef/orm/question.go

141 lines
3.3 KiB
Go
Raw Permalink Normal View History

2019-11-04 15:00:46 +01:00
package orm
import (
"net/http"
2019-11-13 12:15:29 +01:00
"git.andreafazzi.eu/andrea/oef/renderer"
"github.com/jinzhu/gorm"
2019-11-04 15:00:46 +01:00
)
type Question struct {
gorm.Model
2020-12-16 15:37:42 +01:00
Text string `gorm:"type:varchar(1024)"`
2019-11-14 12:55:22 +01:00
Contest *Contest
ContestID uint `schema:"contest_id"`
Answers []*Answer
2019-11-14 12:55:22 +01:00
SelectedContest map[uint]string `gorm:"-"`
AllContests []*Contest `gorm:"-"`
2019-11-04 15:00:46 +01:00
}
func (q *Question) GetID() uint { return q.ID }
func (q *Question) String() string {
return q.Text
}
2020-01-11 08:03:56 +01:00
func (q *Question) BeforeCreate(tx *gorm.DB) error {
if len(q.Answers) > 0 {
q.Answers[0].Correct = true
}
return nil
}
func (q *Question) Create(db *Database, args map[string]string, w http.ResponseWriter, r *http.Request) (interface{}, error) {
2019-11-13 12:15:29 +01:00
if r.Method == "GET" {
2019-11-14 12:55:22 +01:00
question := new(Question)
if err := db._db.Find(&question.AllContests).Error; err != nil {
2019-11-14 12:55:22 +01:00
return nil, err
}
return question, nil
2019-11-13 12:15:29 +01:00
} else {
question := new(Question)
err := renderer.Decode(question, r)
if err != nil {
return nil, err
}
question, err = CreateQuestion(db, question)
2019-11-13 12:15:29 +01:00
if err != nil {
return nil, err
}
return question, nil
}
2019-11-04 15:00:46 +01:00
}
func (q *Question) Read(db *Database, args map[string]string, w http.ResponseWriter, r *http.Request) (interface{}, error) {
var question Question
id := args["id"]
if err := db._db.Preload("Answers", func(db *gorm.DB) *gorm.DB {
2019-12-13 12:55:11 +01:00
return db.Order("answers.correct DESC")
}).Preload("Contest").First(&question, id).Error; err != nil {
return nil, err
}
return &question, nil
2019-11-04 15:00:46 +01:00
}
func (q *Question) ReadAll(db *Database, args map[string]string, w http.ResponseWriter, r *http.Request) (interface{}, error) {
2019-11-04 15:00:46 +01:00
var questions []*Question
if err := db._db.Preload("Contest").Order("created_at").Find(&questions).Error; err != nil {
2019-11-04 15:00:46 +01:00
return nil, err
}
return questions, nil
}
func (q *Question) Update(db *Database, args map[string]string, w http.ResponseWriter, r *http.Request) (interface{}, error) {
if r.Method == "GET" {
result, err := q.Read(db, args, w, r)
2019-11-14 12:55:22 +01:00
if err != nil {
return nil, err
}
question := result.(*Question)
if err := db._db.Find(&question.AllContests).Error; err != nil {
2019-11-14 12:55:22 +01:00
return nil, err
}
question.SelectedContest = make(map[uint]string)
question.SelectedContest[question.ContestID] = "selected"
return question, nil
} else {
question, err := q.Read(db, args, w, r)
if err != nil {
return nil, err
}
err = renderer.Decode(question, r)
if err != nil {
return nil, err
}
_, err = SaveQuestion(db, question)
if err != nil {
return nil, err
}
question, err = q.Read(db, args, w, r)
if err != nil {
return nil, err
}
return question.(*Question), nil
}
2019-11-04 15:00:46 +01:00
}
func (model *Question) Delete(db *Database, args map[string]string, w http.ResponseWriter, r *http.Request) (interface{}, error) {
question, err := model.Read(db, args, w, r)
if err != nil {
return nil, err
}
if err := db._db.Unscoped().Delete(question.(*Question)).Error; err != nil {
return nil, err
}
return question.(*Question), nil
2019-11-04 15:00:46 +01:00
}
2019-11-13 12:15:29 +01:00
func CreateQuestion(db *Database, question *Question) (*Question, error) {
if err := db._db.Create(question).Error; err != nil {
2019-11-13 12:15:29 +01:00
return nil, err
}
return question, nil
}
func SaveQuestion(db *Database, question interface{}) (interface{}, error) {
if err := db._db.Omit("Answers", "Contest").Save(question).Error; err != nil {
return nil, err
}
return question, nil
}