diff --git a/admin/api_team.go b/admin/api_team.go index e32833c5..021550ca 100644 --- a/admin/api_team.go +++ b/admin/api_team.go @@ -1,12 +1,9 @@ package main import ( - "encoding/hex" "encoding/json" "fmt" - "path" "strconv" - "time" "srs.epita.fr/fic-server/libfic" ) @@ -18,70 +15,6 @@ var ApiTeamsRouting = map[string]DispatchFunction{ "DELETE": deletionTeam, } -type myTeamFile struct { - Path string `json:"path"` - Name string `json:"name"` - Checksum string `json:"checksum"` - Size int64 `json:"size"` -} -type myTeamExercice struct { - Statement string `json:"statement"` - Hint string `json:"hint"` - Gain int64 `json:"gain"` - Files []myTeamFile `json:"files"` - Keys []string `json:"keys"` - Solved bool `json:"solved"` - SolvedTime time.Time `json:"solved_time"` - SolvedNumber int64 `json:"solved_number"` -} -type myTeam struct { - Id int64 `json:"team_id"` - Exercices map[string]myTeamExercice `json:"exercices"` -} - -func myJSONTeam(t fic.Team) (interface{}, error) { - ret := myTeam{} - ret.Id = t.Id - ret.Exercices = map[string]myTeamExercice{} - - if exos, err := fic.GetExercices(); err != nil { - return ret, err - } else { - for _, e := range exos { - if t.HasAccess(e) { - exercice := myTeamExercice{} - exercice.Statement = e.Statement - exercice.Hint = e.Hint - exercice.Solved, exercice.SolvedTime, exercice.SolvedNumber = t.HasSolved(e) - - exercice.Keys = []string{} - - if keys, err := e.GetKeys(); err != nil { - return nil, err - } else { - for _, k := range keys { - exercice.Keys = append(exercice.Keys, k.Type) - } - } - - exercice.Files = []myTeamFile{} - - if files, err := e.GetFiles(); err != nil { - return nil, err - } else { - for _, f := range files { - exercice.Files = append(exercice.Files, myTeamFile{path.Join("/files", f.Path), f.Name, hex.EncodeToString(f.Checksum), f.Size}) - } - } - - ret.Exercices[fmt.Sprintf("%d", e.Id)] = exercice - } - } - } - - return ret, nil -} - func nginxGenTeam() (string, error) { if teams, err := fic.GetTeams(); err != nil { return "", err @@ -146,12 +79,23 @@ func listTeam(args []string, body []byte) (interface{}, error) { if len(args) >= 2 { if tid, err := strconv.Atoi(string(args[0])); err != nil { return nil, err - } else if team, err := fic.GetTeam(tid); err != nil { - return nil, err - } else if args[1] == "my.json" { - return myJSONTeam(team) - } else if args[1] == "certificate" { - return CertificateAPI(team, args[2:]) + } else { + var team *fic.Team + if tid == 0 { + team = nil + } else if t, err := fic.GetTeam(tid); err != nil { + return nil, err + } else { + team = &t + } + + if args[1] == "my.json" { + return fic.MyJSONTeam(team, true) + } else if args[1] == "wait.json" { + return fic.MyJSONTeam(team, false) + } else if args[1] == "certificate" && team != nil { + return CertificateAPI(*team, args[2:]) + } } } else if len(args) == 1 { if args[0] == "teams.json" { diff --git a/libfic/team_my.go b/libfic/team_my.go new file mode 100644 index 00000000..5401cf04 --- /dev/null +++ b/libfic/team_my.go @@ -0,0 +1,84 @@ +package fic + +import ( + "encoding/hex" + "fmt" + "path" + "time" +) + +type myTeamFile struct { + Path string `json:"path"` + Name string `json:"name"` + Checksum string `json:"checksum"` + Size int64 `json:"size"` +} +type myTeamExercice struct { + Statement string `json:"statement"` + Hint string `json:"hint"` + Gain int64 `json:"gain"` + Files []myTeamFile `json:"files"` + Keys []string `json:"keys"` + Solved bool `json:"solved"` + SolvedTime time.Time `json:"solved_time"` + SolvedNumber int64 `json:"solved_number"` +} +type myTeam struct { + Id int64 `json:"team_id"` + Exercices map[string]myTeamExercice `json:"exercices"` +} + +func MyJSONTeam(t *Team, started bool) (interface{}, error) { + ret := myTeam{} + if t == nil { + ret.Id = 0 + } else { + ret.Id = t.Id + } + ret.Exercices = map[string]myTeamExercice{} + + if exos, err := GetExercices(); err != nil { + return ret, err + } else if started { + for _, e := range exos { + if t == nil || t.HasAccess(e) { + exercice := myTeamExercice{} + exercice.Statement = e.Statement + exercice.Hint = e.Hint + if t == nil { + exercice.Solved = true + } else { + exercice.Solved, exercice.SolvedTime, exercice.SolvedNumber = t.HasSolved(e) + } + + exercice.Keys = []string{} + + if keys, err := e.GetKeys(); err != nil { + return nil, err + } else { + for _, k := range keys { + if t == nil { + exercice.Keys = append(exercice.Keys, fmt.Sprintf("%x", k.Value)+k.Type) + } else { + exercice.Keys = append(exercice.Keys, k.Type) + } + } + } + + exercice.Files = []myTeamFile{} + + if files, err := e.GetFiles(); err != nil { + return nil, err + } else { + for _, f := range files { + exercice.Files = append(exercice.Files, myTeamFile{path.Join("/files", f.Path), f.Name, hex.EncodeToString(f.Checksum), f.Size}) + } + } + + ret.Exercices[fmt.Sprintf("%d", e.Id)] = exercice + } + } + } + + return ret, nil +}