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"
)
type Exercice struct {
2016-01-13 00:20:21 +00:00
Id int64 ` json:"id" `
Title string ` json:"title" `
Statement string ` json:"statement" `
Hint string ` json:"hint" `
2016-01-13 12:07:45 +00:00
Depend * int64 ` json:"depend" `
2016-01-13 00:20:21 +00:00
Gain int64 ` json:"gain" `
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
if err := DBQueryRow ( "SELECT id_exercice, title, statement, hint, depend, gain, video_uri FROM exercices WHERE id_exercice = ?" , id ) . Scan ( & e . Id , & e . Title , & e . Statement , & e . Hint , & e . Depend , & e . Gain , & e . VideoURI ) ; err != nil {
return Exercice { } , err
}
return e , nil
}
func ( t Theme ) GetExercice ( id int ) ( Exercice , error ) {
var e Exercice
if err := DBQueryRow ( "SELECT id_exercice, title, statement, hint, depend, gain, video_uri FROM exercices WHERE id_theme = ? AND id_exercice = ?" , t . Id , id ) . Scan ( & e . Id , & e . Title , & e . Statement , & e . Hint , & e . Depend , & e . Gain , & e . VideoURI ) ; err != nil {
return Exercice { } , err
}
return e , nil
}
2016-01-18 17:25:06 +00:00
func GetExercices ( ) ( [ ] Exercice , error ) {
if rows , err := DBQuery ( "SELECT id_exercice, title, statement, hint, depend, gain, video_uri FROM exercices" ) ; err != nil {
return nil , err
} else {
defer rows . Close ( )
var exos = make ( [ ] Exercice , 0 )
for rows . Next ( ) {
var e Exercice
if err := rows . Scan ( & e . Id , & e . Title , & e . Statement , & e . Hint , & e . Depend , & e . Gain , & e . VideoURI ) ; err != nil {
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 ) {
2016-01-19 12:09:36 +00:00
if rows , err := DBQuery ( "SELECT id_exercice, title, statement, hint, depend, gain, 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
2016-01-13 00:20:21 +00:00
if err := rows . Scan ( & e . Id , & e . Title , & e . Statement , & e . Hint , & e . Depend , & e . Gain , & 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
}
}
func ( t Theme ) AddExercice ( title string , statement string , hint string , depend * Exercice , gain int , videoURI string ) ( Exercice , error ) {
2016-01-13 12:07:45 +00:00
var dpd interface { }
if depend == nil {
dpd = nil
} else {
dpd = depend . Id
}
if res , err := DBExec ( "INSERT INTO exercices (id_theme, title, statement, hint, depend, gain, video_uri) VALUES (?, ?, ?, ?, ?, ?, ?)" , t . Id , title , statement , hint , 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 {
return Exercice { eid , title , statement , hint , nil , int64 ( gain ) , videoURI } , nil
} else {
return Exercice { eid , title , statement , hint , & depend . Id , int64 ( gain ) , videoURI } , nil
}
2016-01-07 17:43:02 +00:00
}
}
func ( e Exercice ) Update ( ) ( int64 , error ) {
2016-01-13 00:20:21 +00:00
if res , err := DBExec ( "UPDATE exercices SET title = ?, statement = ?, hint = ?, depend = ?, gain = ?, video_uri = ? WHERE id_exercice = ?" , e . Title , e . Statement , e . Hint , e . Depend , e . Gain , 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
}
}
func ( e Exercice ) Solved ( t Team ) error {
2016-01-13 00:20:21 +00:00
if _ , err := DBExec ( "INSERT INTO exercice_solved (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
}
}
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
}
}
2016-02-26 00:27:08 +00:00
func ( e Exercice ) CheckResponse ( resps map [ string ] string , 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
2016-01-15 11:57:35 +00:00
} else {
if len ( keys ) < 1 {
2016-02-26 00:27:08 +00:00
return true , errors . New ( "Exercice with no key registered" )
2016-01-15 11:57:35 +00:00
}
2016-01-23 11:28:31 +00:00
valid := true
for _ , key := range keys {
if _ , ok := resps [ key . Type ] ; ! ok {
valid = false
break
}
if ! key . Check ( resps [ key . Type ] ) {
valid = false
break
2016-01-15 11:57:35 +00:00
}
}
2016-02-26 00:27:08 +00:00
return valid , nil
2016-01-15 11:57:35 +00:00
}
}