2016-01-13 19:25:25 +00:00
package fic
2016-01-07 17:43:02 +00:00
import (
2016-01-15 11:57:35 +00:00
"errors"
2016-01-07 17:43:02 +00:00
"time"
)
2016-12-04 18:08:46 +00:00
var PartialValidation bool
2017-12-16 00:16:30 +00:00
var PartialMCQValidation bool
2016-12-04 18:08:46 +00:00
2016-01-07 17:43:02 +00:00
type Exercice struct {
2017-01-15 22:40:58 +00:00
Id int64 ` json:"id" `
Title string ` json:"title" `
2018-01-18 10:07:50 +00:00
URLId string ` json:"urlid" `
2017-12-08 23:52:15 +00:00
Path string ` json:"path" `
2017-01-15 22:40:58 +00:00
Statement string ` json:"statement" `
2017-12-17 13:30:48 +00:00
Overview string ` json:"overview" `
2017-01-15 22:40:58 +00:00
Depend * int64 ` json:"depend" `
Gain int64 ` json:"gain" `
Coefficient float64 ` json:"coefficient" `
VideoURI string ` json:"videoURI" `
2016-01-07 17:43:02 +00:00
}
2016-01-25 02:08:27 +00:00
func GetExercice ( id int64 ) ( Exercice , error ) {
2016-01-13 12:07:45 +00:00
var e Exercice
2018-01-18 10:07:50 +00:00
if err := DBQueryRow ( "SELECT id_exercice, title, url_id, path, statement, overview, depend, gain, coefficient_cur, video_uri FROM exercices WHERE id_exercice = ?" , id ) . Scan ( & e . Id , & e . Title , & e . URLId , & e . Path , & e . Statement , & e . Overview , & e . Depend , & e . Gain , & e . Coefficient , & e . VideoURI ) ; err != nil {
2016-01-13 12:07:45 +00:00
return Exercice { } , err
}
return e , nil
}
func ( t Theme ) GetExercice ( id int ) ( Exercice , error ) {
var e Exercice
2018-01-18 10:07:50 +00:00
if err := DBQueryRow ( "SELECT id_exercice, title, url_id, path, statement, overview, depend, gain, coefficient_cur, video_uri FROM exercices WHERE id_theme = ? AND id_exercice = ?" , t . Id , id ) . Scan ( & e . Id , & e . Title , & e . URLId , & e . Path , & e . Statement , & e . Overview , & e . Depend , & e . Gain , & e . Coefficient , & e . VideoURI ) ; err != nil {
2016-01-13 12:07:45 +00:00
return Exercice { } , err
}
return e , nil
}
2017-12-08 23:53:08 +00:00
func ( t Theme ) GetExerciceByTitle ( title string ) ( Exercice , error ) {
var e Exercice
2018-01-18 10:07:50 +00:00
if err := DBQueryRow ( "SELECT id_exercice, title, url_id, path, statement, overview, depend, gain, coefficient_cur, video_uri FROM exercices WHERE id_theme = ? AND title = ?" , t . Id , title ) . Scan ( & e . Id , & e . Title , & t . URLId , & e . Path , & e . Statement , & e . Overview , & e . Depend , & e . Gain , & e . Coefficient , & e . VideoURI ) ; err != nil {
2017-12-08 23:53:08 +00:00
return Exercice { } , err
}
return e , nil
}
2016-01-18 17:25:06 +00:00
func GetExercices ( ) ( [ ] Exercice , error ) {
2018-01-18 10:07:50 +00:00
if rows , err := DBQuery ( "SELECT id_exercice, title, url_id, path, statement, overview, depend, gain, coefficient_cur, video_uri FROM exercices" ) ; err != nil {
2016-01-18 17:25:06 +00:00
return nil , err
} else {
defer rows . Close ( )
var exos = make ( [ ] Exercice , 0 )
for rows . Next ( ) {
var e Exercice
2018-01-18 10:07:50 +00:00
if err := rows . Scan ( & e . Id , & e . Title , & e . URLId , & e . Path , & e . Statement , & e . Overview , & e . Depend , & e . Gain , & e . Coefficient , & e . VideoURI ) ; err != nil {
2016-01-18 17:25:06 +00:00
return nil , err
}
exos = append ( exos , e )
}
if err := rows . Err ( ) ; err != nil {
return nil , err
}
return exos , nil
}
}
2016-01-07 17:43:02 +00:00
func ( t Theme ) GetExercices ( ) ( [ ] Exercice , error ) {
2018-01-18 10:07:50 +00:00
if rows , err := DBQuery ( "SELECT id_exercice, title, url_id, path, statement, overview, depend, gain, coefficient_cur, video_uri FROM exercices WHERE id_theme = ?" , t . Id ) ; err != nil {
2016-01-07 17:43:02 +00:00
return nil , err
} else {
defer rows . Close ( )
var exos = make ( [ ] Exercice , 0 )
for rows . Next ( ) {
var e Exercice
2018-01-18 10:07:50 +00:00
if err := rows . Scan ( & e . Id , & e . Title , & e . URLId , & e . Path , & e . Statement , & e . Overview , & e . Depend , & e . Gain , & e . Coefficient , & e . VideoURI ) ; err != nil {
2016-01-07 17:43:02 +00:00
return nil , err
}
exos = append ( exos , e )
}
if err := rows . Err ( ) ; err != nil {
return nil , err
}
return exos , nil
}
}
2018-01-18 10:07:50 +00:00
func ( t Theme ) AddExercice ( title string , urlId string , path string , statement string , overview string , depend * Exercice , gain int64 , videoURI string ) ( Exercice , error ) {
2016-01-13 12:07:45 +00:00
var dpd interface { }
if depend == nil {
dpd = nil
} else {
dpd = depend . Id
}
2018-01-18 10:07:50 +00:00
if res , err := DBExec ( "INSERT INTO exercices (id_theme, title, url_id, path, statement, overview, depend, gain, video_uri) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)" , t . Id , title , urlId , path , statement , overview , dpd , gain , videoURI ) ; err != nil {
2016-01-07 17:43:02 +00:00
return Exercice { } , err
} else if eid , err := res . LastInsertId ( ) ; err != nil {
return Exercice { } , err
} else {
2016-01-13 12:07:45 +00:00
if depend == nil {
2018-01-18 10:07:50 +00:00
return Exercice { eid , title , urlId , path , statement , overview , nil , gain , 1.0 , videoURI } , nil
2016-01-13 12:07:45 +00:00
} else {
2018-01-18 10:07:50 +00:00
return Exercice { eid , title , urlId , path , statement , overview , & depend . Id , gain , 1.0 , videoURI } , nil
2016-01-13 12:07:45 +00:00
}
2016-01-07 17:43:02 +00:00
}
}
func ( e Exercice ) Update ( ) ( int64 , error ) {
2018-01-18 10:07:50 +00:00
if res , err := DBExec ( "UPDATE exercices SET title = ?, url_id = ?, path = ?, statement = ?, overview = ?, depend = ?, gain = ?, coefficient_cur = ?, video_uri = ? WHERE id_exercice = ?" , e . Title , e . URLId , e . Path , e . Statement , e . Overview , e . Depend , e . Gain , e . Coefficient , e . VideoURI , e . Id ) ; err != nil {
2016-01-07 17:43:02 +00:00
return 0 , err
} else if nb , err := res . RowsAffected ( ) ; err != nil {
return 0 , err
} else {
return nb , err
}
}
2016-01-25 02:08:27 +00:00
func ( e Exercice ) GetThemeId ( ) ( int , error ) {
2016-01-23 11:23:14 +00:00
var tid int
if err := DBQueryRow ( "SELECT id_theme FROM exercices WHERE id_exercice=?" , e . Id ) . Scan ( & tid ) ; err != nil {
2016-01-25 02:08:27 +00:00
return 0 , err
}
return tid , nil
}
func ( e Exercice ) GetTheme ( ) ( Theme , error ) {
if tid , err := e . GetThemeId ( ) ; err != nil {
2016-01-23 11:23:14 +00:00
return Theme { } , err
2016-01-25 02:08:27 +00:00
} else {
return GetTheme ( tid )
2016-01-23 11:23:14 +00:00
}
}
2016-01-07 17:43:02 +00:00
func ( e Exercice ) Delete ( ) ( int64 , error ) {
2016-01-13 00:20:21 +00:00
if res , err := DBExec ( "DELETE FROM exercices WHERE id_exercice = ?" , e . Id ) ; err != nil {
2016-01-07 17:43:02 +00:00
return 0 , err
} else if nb , err := res . RowsAffected ( ) ; err != nil {
return 0 , err
} else {
return nb , err
}
}
2016-01-25 02:09:22 +00:00
func ( e Exercice ) GetLevel ( ) ( int , error ) {
dep := e . Depend
nb := 1
for dep != nil {
nb += 1
if edep , err := GetExercice ( * dep ) ; err != nil {
return nb , err
} else {
dep = edep . Depend
}
}
return nb , nil
}
2016-01-07 17:43:02 +00:00
func ( e Exercice ) NewTry ( t Team ) error {
2016-01-13 00:20:21 +00:00
if _ , err := DBExec ( "INSERT INTO exercice_tries (id_exercice, id_team, time) VALUES (?, ?, ?)" , e . Id , t . Id , time . Now ( ) ) ; err != nil {
2016-01-07 17:43:02 +00:00
return err
} else {
return nil
}
}
2017-12-17 01:48:02 +00:00
func ( e Exercice ) UpdateTry ( t Team , nbdiff int ) error {
if _ , err := DBExec ( "UPDATE exercice_tries SET nbdiff = ?, time = ? WHERE id_exercice = ? AND id_team = ? ORDER BY time DESC LIMIT 1" , nbdiff , time . Now ( ) , e . Id , t . Id ) ; err != nil {
return err
} else {
return nil
}
}
2016-01-07 17:43:02 +00:00
func ( e Exercice ) Solved ( t Team ) error {
2017-01-15 22:40:58 +00:00
if _ , err := DBExec ( "INSERT INTO exercice_solved (id_exercice, id_team, time, coefficient) VALUES (?, ?, ?, ?)" , e . Id , t . Id , time . Now ( ) , e . Coefficient ) ; err != nil {
2016-01-07 17:43:02 +00:00
return err
} else {
return nil
}
}
2016-01-15 11:57:35 +00:00
2016-01-21 00:37:33 +00:00
func ( e Exercice ) SolvedCount ( ) int64 {
var nb int64
if err := DBQueryRow ( "SELECT COUNT(id_exercice) FROM exercice_solved WHERE id_exercice = ?" , e . Id ) . Scan ( & nb ) ; err != nil {
return 0
} else {
return nb
}
}
2016-01-25 02:05:32 +00:00
func ( e Exercice ) TriedTeamCount ( ) int64 {
var nb int64
if err := DBQueryRow ( "SELECT COUNT(DISTINCT id_team) FROM exercice_tries WHERE id_exercice = ?" , e . Id ) . Scan ( & nb ) ; err != nil {
return 0
} else {
return nb
}
}
func ( e Exercice ) TriedCount ( ) int64 {
var nb int64
if err := DBQueryRow ( "SELECT COUNT(id_team) FROM exercice_tries WHERE id_exercice = ?" , e . Id ) . Scan ( & nb ) ; err != nil {
return 0
} else {
return nb
}
}
2017-12-16 00:16:30 +00:00
func ( e Exercice ) CheckResponse ( respkeys map [ string ] string , respmcq map [ int64 ] bool , t Team ) ( bool , error ) {
2016-01-15 11:57:35 +00:00
if err := e . NewTry ( t ) ; err != nil {
2016-02-26 00:27:08 +00:00
return false , err
2016-01-15 11:57:35 +00:00
} else if keys , err := e . GetKeys ( ) ; err != nil {
2016-02-26 00:27:08 +00:00
return false , err
2017-12-16 00:16:30 +00:00
} else if mcqs , err := e . GetMCQ ( ) ; err != nil {
return false , err
} else if len ( keys ) < 1 && len ( mcqs ) < 1 {
return true , errors . New ( "Exercice with no key registered" )
2016-01-15 11:57:35 +00:00
} else {
2017-12-16 00:16:30 +00:00
valid := true
diff := 0
// Check MCQs
for _ , mcq := range mcqs {
if d := mcq . Check ( respmcq ) ; d > 0 {
if ! PartialValidation || t . HasPartiallyRespond ( mcq ) == nil {
valid = false
diff += d
}
} else if ! PartialMCQValidation {
mcq . FoundBy ( t )
}
2016-01-15 11:57:35 +00:00
}
2017-12-16 00:16:30 +00:00
// Validate MCQs if no error
if valid {
for _ , mcq := range mcqs {
mcq . FoundBy ( t )
}
}
// Check keys
2016-01-23 11:28:31 +00:00
for _ , key := range keys {
2017-12-16 00:16:30 +00:00
if res , ok := respkeys [ key . Label ] ; ! ok {
2016-01-23 11:28:31 +00:00
valid = false
2016-12-04 18:08:46 +00:00
} else if ! key . Check ( res ) {
if ! PartialValidation || t . HasPartiallySolved ( key ) == nil {
valid = false
}
} else {
key . FoundBy ( t )
2016-01-15 11:57:35 +00:00
}
}
2017-12-16 00:16:30 +00:00
if diff > 0 {
e . UpdateTry ( t , diff )
}
2016-02-26 00:27:08 +00:00
return valid , nil
2016-01-15 11:57:35 +00:00
}
}