diff --git a/admin/api_team.go b/admin/api_team.go index ed2f1376..cebc1d5e 100644 --- a/admin/api_team.go +++ b/admin/api_team.go @@ -95,6 +95,39 @@ func nginxGenTeam() (string, error) { } } +type exportedTeam struct { + Name string `json:"name"` + Color string `json:"color"` + Rank int64 `json:"rank"` + Points int64 `json:"score"` + Members []fic.Member `json:"members"` +} + +func exportTeams() (interface{}, error) { + if teams, err := fic.GetTeams(); err != nil { + return nil, err + } else { + ret := map[string]exportedTeam{} + for _, team := range teams { + if points, err := team.GetPoints(); err != nil { + return nil, err + } else if members, err := team.GetMembers(); err != nil { + return nil, err + } else { + ret[fmt.Sprintf("%d", team.Id)] = exportedTeam{ + team.Name, + fmt.Sprintf("#%x", team.Color), + 1, + points, + members, + } + } + } + + return ret, nil + } +} + type uploadedTeam struct { Name string Color int64 @@ -119,7 +152,9 @@ func listTeam(args []string, body []byte) (interface{}, error) { return CertificateAPI(team, args[2:]) } } else if len(args) == 1 { - if args[0] == "nginx" { + if args[0] == "teams.json" { + return exportTeams() + } else if args[0] == "nginx" { return nginxGenTeam() } else if tid, err := strconv.Atoi(string(args[0])); err != nil { return nil, err diff --git a/libfic/team.go b/libfic/team.go index 009be29e..c7939139 100644 --- a/libfic/team.go +++ b/libfic/team.go @@ -71,6 +71,16 @@ func (t Team) Delete() (int64, error) { } } +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 + } +} + func (t Team) HasAccess(e Exercice) bool { if e.Depend == nil { return true