2016-01-13 19:25:25 +00:00
package fic
2016-01-07 17:43:02 +00:00
2016-01-18 18:40:11 +00:00
import (
"time"
)
2016-01-07 17:43:02 +00:00
type Team struct {
2016-01-20 09:14:13 +00:00
Id int64 ` json:"id" `
Name string ` json:"name" `
Color int64 ` json:"color" `
2016-01-07 17:43:02 +00:00
}
func GetTeams ( ) ( [ ] Team , error ) {
2016-01-20 09:14:13 +00:00
if rows , err := DBQuery ( "SELECT id_team, name, color FROM teams" ) ; err != nil {
2016-01-07 17:43:02 +00:00
return nil , err
} else {
defer rows . Close ( )
var teams = make ( [ ] Team , 0 )
for rows . Next ( ) {
var t Team
2016-01-20 09:14:13 +00:00
if err := rows . Scan ( & t . Id , & t . Name , & t . Color ) ; err != nil {
2016-01-07 17:43:02 +00:00
return nil , err
}
teams = append ( teams , t )
}
if err := rows . Err ( ) ; err != nil {
return nil , err
}
return teams , nil
}
}
func GetTeam ( id int ) ( Team , error ) {
var t Team
2016-01-20 09:14:13 +00:00
if err := DBQueryRow ( "SELECT id_team, name, color FROM teams WHERE id_team = ?" , id ) . Scan ( & t . Id , & t . Name , & t . Color ) ; err != nil {
2016-01-07 17:43:02 +00:00
return t , err
}
return t , nil
}
2016-01-20 09:14:13 +00:00
func CreateTeam ( name string , color int64 ) ( Team , error ) {
if res , err := DBExec ( "INSERT INTO teams (name, color) VALUES (?, ?)" , name , color ) ; err != nil {
2016-01-07 17:43:02 +00:00
return Team { } , err
} else if tid , err := res . LastInsertId ( ) ; err != nil {
return Team { } , err
} else {
2016-01-20 09:14:13 +00:00
return Team { tid , name , color } , nil
2016-01-07 17:43:02 +00:00
}
}
func ( t Team ) Update ( ) ( int64 , error ) {
2016-01-20 09:14:13 +00:00
if res , err := DBExec ( "UPDATE teams SET name = ?, color = ? WHERE id_team = ?" , t . Name , t . Color , t . 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
}
}
func ( t Team ) Delete ( ) ( int64 , error ) {
2016-01-13 00:20:21 +00:00
if res , err := DBExec ( "DELETE FROM team_members WHERE id_team = ?; DELETE FROM teams WHERE id_team = ?" , t . Id , t . 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-15 11:57:35 +00:00
2016-01-21 00:36:58 +00:00
func ( t Team ) GetPoints ( ) ( int64 , error ) {
var nb * int64
err := DBQueryRow ( "SELECT SUM(E.gain) FROM exercice_solved S INNER JOIN exercices E ON E.id_exercice = S.id_exercice WHERE id_team = ?" , t . Id ) . Scan ( & nb )
if nb != nil {
return * nb , err
} else {
return 0 , err
}
}
2016-01-21 04:00:15 +00:00
func GetRank ( ) ( map [ int64 ] int , error ) {
2016-01-24 13:32:36 +00:00
if rows , err := DBQuery ( "SELECT id_team, SUM(E.gain) AS score, MAX(S.time) FROM exercice_solved S INNER JOIN exercices E ON E.id_exercice = S.id_exercice GROUP BY id_team HAVING score > 0 ORDER BY score DESC, time ASC" ) ; err != nil {
2016-01-21 04:00:15 +00:00
return nil , err
} else {
defer rows . Close ( )
rank := map [ int64 ] int { }
nteam := 0
for rows . Next ( ) {
nteam += 1
var tid int64
var score int64
2016-01-23 13:12:03 +00:00
var tzzz time . Time
2016-01-21 04:00:15 +00:00
if err := rows . Scan ( & tid , & score , & tzzz ) ; err != nil {
return nil , err
}
rank [ tid ] = nteam
}
if err := rows . Err ( ) ; err != nil {
return nil , err
}
return rank , nil
}
}
2016-01-18 17:24:46 +00:00
func ( t Team ) HasAccess ( e Exercice ) bool {
if e . Depend == nil {
return true
} else {
ed := Exercice { }
ed . Id = * e . Depend
2016-01-18 18:40:11 +00:00
s , _ , _ := t . HasSolved ( ed )
return s
2016-01-18 17:24:46 +00:00
}
}
2016-01-18 18:40:11 +00:00
func ( t Team ) HasSolved ( e Exercice ) ( bool , time . Time , int64 ) {
2016-01-23 12:16:31 +00:00
var nb * int64
var tm * time . Time
if DBQueryRow ( "SELECT MIN(time) FROM exercice_solved WHERE id_team = ? AND id_exercice = ?" , t . Id , e . Id ) . Scan ( & tm ) ; tm == nil {
if DBQueryRow ( "SELECT COUNT(id_exercice), MAX(time) FROM exercice_tries WHERE id_team = ? AND id_exercice = ?" , t . Id , e . Id ) . Scan ( & nb , & tm ) ; tm == nil {
2016-01-21 04:33:40 +00:00
return false , time . Unix ( 0 , 0 ) , 0
2016-01-23 12:16:31 +00:00
} else if nb == nil {
return false , * tm , 0
2016-01-21 04:33:40 +00:00
} else {
2016-01-23 12:16:31 +00:00
return false , * tm , * nb
2016-01-21 04:33:40 +00:00
}
2016-01-23 12:16:31 +00:00
} else if DBQueryRow ( "SELECT COUNT(id_exercice) FROM exercice_solved WHERE id_exercice = ? AND time < ?" , e . Id , tm ) . Scan ( & nb ) ; nb == nil {
return true , * tm , 0
2016-01-15 11:57:35 +00:00
} else {
2016-01-23 12:16:31 +00:00
return true , * tm , * nb + 1
2016-01-15 11:57:35 +00:00
}
}