package api import ( "encoding/json" "fmt" "strings" "time" "srs.epita.fr/fic-server/libfic" "github.com/julienschmidt/httprouter" ) func init() { router.GET("/api/teams.json", apiHandler( func(httprouter.Params, []byte) (interface{}, error) { return fic.ExportTeams() })) router.GET("/api/teams-binding", apiHandler( func(httprouter.Params, []byte) (interface{}, error) { return bindingTeams() })) router.GET("/api/teams-nginx-members", apiHandler( func(httprouter.Params, []byte) (interface{}, error) { return nginxGenMember() })) router.GET("/api/teams-tries.json", apiHandler( func(httprouter.Params, []byte) (interface{}, error) { return fic.GetTries(nil, nil) })) router.GET("/api/teams/", apiHandler( func(httprouter.Params, []byte) (interface{}, error) { return fic.GetTeams() })) router.POST("/api/teams/", apiHandler(createTeam)) router.GET("/api/teams/:tid/", apiHandler(teamHandler( func(team fic.Team, _ []byte) (interface{}, error) { return team, nil }))) router.PUT("/api/teams/:tid/", apiHandler(teamHandler(updateTeam))) router.POST("/api/teams/:tid/", apiHandler(teamHandler(addTeamMember))) router.DELETE("/api/teams/:tid/", apiHandler(teamHandler( func(team fic.Team, _ []byte) (interface{}, error) { return team.Delete() }))) router.GET("/api/teams/:tid/my.json", apiHandler(teamPublicHandler( func(team *fic.Team, _ []byte) (interface{}, error) { return fic.MyJSONTeam(team, true) }))) router.GET("/api/teams/:tid/wait.json", apiHandler(teamPublicHandler( func(team *fic.Team, _ []byte) (interface{}, error) { return fic.MyJSONTeam(team, false) }))) router.GET("/api/teams/:tid/stats.json", apiHandler(teamPublicHandler( func(team *fic.Team, _ []byte) (interface{}, error) { if team != nil { return team.GetStats() } else { return fic.GetTeamsStats(nil) } }))) router.GET("/api/teams/:tid/history.json", apiHandler(teamPublicHandler( func(team *fic.Team, _ []byte) (interface{}, error) { if team != nil { return team.GetHistory() } else { return fic.GetTeamsStats(nil) } }))) router.DELETE("/api/teams/:tid/history.json", apiHandler(teamPublicHandler(delHistory))) router.GET("/api/teams/:tid/tries", apiHandler(teamPublicHandler( func(team *fic.Team, _ []byte) (interface{}, error) { return fic.GetTries(team, nil) }))) router.GET("/api/teams/:tid/members", apiHandler(teamHandler( func(team fic.Team, _ []byte) (interface{}, error) { return team.GetMembers() }))) router.POST("/api/teams/:tid/members", apiHandler(teamHandler(addTeamMember))) router.PUT("/api/teams/:tid/members", apiHandler(teamHandler(setTeamMember))) } func nginxGenMember() (string, error) { if teams, err := fic.GetTeams(); err != nil { return "", err } else { ret := "" for _, team := range teams { if members, err := team.GetMembers(); err == nil { for _, member := range members { ret += fmt.Sprintf(" if ($remote_user = \"%s\") { set $team \"%d\"; }\n", member.Nickname, team.Id) } } else { return "", err } } return ret, nil } } func bindingTeams() (string, error) { if teams, err := fic.GetTeams(); err != nil { return "", err } else { ret := "" for _, team := range teams { if members, err := team.GetMembers(); err != nil { return "", err } else { var mbs []string for _, member := range members { mbs = append(mbs, fmt.Sprintf("%s %s", member.Firstname, member.Lastname)) } ret += fmt.Sprintf("%d;%s;%s\n", team.Id, team.Name, strings.Join(mbs, ";")) } } return ret, nil } } type uploadedTeam struct { Name string Color uint32 } type uploadedMember struct { Firstname string Lastname string Nickname string Company string } func createTeam(_ httprouter.Params, body []byte) (interface{}, error) { var ut uploadedTeam if err := json.Unmarshal(body, &ut); err != nil { return nil, err } return fic.CreateTeam(strings.TrimSpace(ut.Name), ut.Color) } func updateTeam(team fic.Team, body []byte) (interface{}, error) { var ut fic.Team if err := json.Unmarshal(body, &ut); err != nil { return nil, err } ut.Id = team.Id if _, err := ut.Update(); err != nil { return nil, err } return ut, nil } func addTeamMember(team fic.Team, body []byte) (interface{}, error) { var members []uploadedMember if err := json.Unmarshal(body, &members); err != nil { return nil, err } for _, member := range members { team.AddMember(strings.TrimSpace(member.Firstname), strings.TrimSpace(member.Lastname), strings.TrimSpace(member.Nickname), strings.TrimSpace(member.Company)) } return team.GetMembers() } func setTeamMember(team fic.Team, body []byte) (interface{}, error) { var members []uploadedMember if err := json.Unmarshal(body, &members); err != nil { return nil, err } team.ClearMembers() for _, member := range members { team.AddMember(strings.TrimSpace(member.Firstname), strings.TrimSpace(member.Lastname), strings.TrimSpace(member.Nickname), strings.TrimSpace(member.Company)) } return team.GetMembers() } type uploadedHistory struct { Kind string Time time.Time Primary *int64 Secondary *int64 } func delHistory(team *fic.Team, body []byte) (interface{}, error) { var uh uploadedHistory if err := json.Unmarshal(body, &uh); err != nil { return nil, err } return team.DelHistoryItem(uh.Kind, uh.Time, uh.Primary, uh.Secondary) }