server/libfic/mcq.go

122 lines
3.1 KiB
Go
Raw Normal View History

package fic
import (
)
type MCQ struct {
Id int64 `json:"id"`
IdExercice int64 `json:"idExercice"`
Title string `json:"title"`
Kind string `json:"kind"`
Entries []MCQ_entry `json:"entries"`
}
type MCQ_entry struct {
Id int64 `json:"id"`
Label string `json:"label"`
Response bool `json:"response"`
}
func (e Exercice) GetMCQ() ([]MCQ, error) {
if rows, err := DBQuery("SELECT id_mcq, id_exercice, title, kind FROM exercice_mcq WHERE id_exercice = ?", e.Id); err != nil {
return nil, err
} else {
defer rows.Close()
var mcqs = make([]MCQ, 0)
for rows.Next() {
var m MCQ
m.IdExercice = e.Id
if err := rows.Scan(&m.Id, &m.IdExercice, &m.Title, &m.Kind); err != nil {
return nil, err
}
if entries_rows, err := DBQuery("SELECT id_mcq, id_exercice, label, response FROM mcq_entries WHERE id_mcq = ?", m.Id); err != nil {
return nil, err
} else {
defer entries_rows.Close()
mcqs = append(mcqs, m)
}
}
if err := rows.Err(); err != nil {
return nil, err
}
return mcqs, nil
}
}
func (e Exercice) AddMCQ(title string, kind string) (MCQ, error) {
if res, err := DBExec("INSERT INTO exercice_mcq (id_exercice, title, kind) VALUES (?, ?, ?)", e.Id, title, kind); err != nil {
return MCQ{}, err
} else if qid, err := res.LastInsertId(); err != nil {
return MCQ{}, err
} else {
return MCQ{qid, e.Id, title, kind, []MCQ_entry{}}, nil
}
}
func (m MCQ) Update() (int64, error) {
if res, err := DBExec("UPDATE exercice_mcq SET id_exercice = ?, title = ?, kind = ? WHERE id_mcq = ?", m.IdExercice, m.Title, m.Kind, m.Id); err != nil {
return 0, err
} else if nb, err := res.RowsAffected(); err != nil {
return 0, err
} else {
return nb, err
}
}
func (m MCQ) Delete() (int64, error) {
if res, err := DBExec("DELETE FROM exercice_mcq WHERE id_mcq = ?", m.Id); err != nil {
return 0, err
} else if nb, err := res.RowsAffected(); err != nil {
return 0, err
} else {
return nb, err
}
}
func (m MCQ) AddEntry(label string, response bool) (MCQ_entry, error) {
if res, err := DBExec("INSERT INTO mcq_entries (id_mcq, label, response) VALUES (?, ?, ?)", m.Id, label, response); err != nil {
return MCQ_entry{}, err
} else if nid, err := res.LastInsertId(); err != nil {
return MCQ_entry{}, err
} else {
return MCQ_entry{nid, label, response}, nil
}
}
func (n MCQ_entry) Update() (int64, error) {
if res, err := DBExec("UPDATE mcq_entries SET label = ?, response = ? WHERE id_mcq = ?", n.Label, n.Response, n.Id); err != nil {
return 0, err
} else if nb, err := res.RowsAffected(); err != nil {
return 0, err
} else {
return nb, err
}
}
func (n MCQ_entry) Delete() (int64, error) {
if res, err := DBExec("DELETE FROM mcq_entries WHERE id_mcq_entry = ?", n.Id); err != nil {
return 0, err
} else if nb, err := res.RowsAffected(); err != nil {
return 0, err
} else {
return nb, err
}
}
func (m MCQ) Check(vals map[int64]bool) int {
diff := 0
for _, n := range m.Entries {
if v, ok := vals[n.Id]; ok && v == n.Response {
continue
}
diff += 1
}
return diff
}