package api import ( "encoding/json" "fmt" "strings" "srs.epita.fr/fic-server/libfic" ) func init() { rts := router.PathPrefix("/teams").Subrouter() router.Path("/teams.json").Methods("GET").HandlerFunc(apiHandler( func(map[string]string,[]byte) (interface{}, error) { return fic.ExportTeams() })) rts.Path("/").Methods("GET").HandlerFunc(apiHandler( func(map[string]string,[]byte) (interface{}, error) { return fic.GetTeams() })) rts.Path("/binding").Methods("GET").HandlerFunc(apiHandler( func(map[string]string,[]byte) (interface{}, error) { return bindingTeams() })) rts.Path("/nginx").Methods("GET").HandlerFunc(apiHandler( func(map[string]string,[]byte) (interface{}, error) { return nginxGenTeam() })) rts.Path("/nginx-members").Methods("GET").HandlerFunc(apiHandler( func(map[string]string,[]byte) (interface{}, error) { return nginxGenMember() })) rts.Path("/binding").Methods("GET").HandlerFunc(apiHandler( func(map[string]string,[]byte) (interface{}, error) { return fic.GetTries(nil, nil) })) rts.Path("/0/my.json").Methods("GET").HandlerFunc(apiHandler( func(map[string]string,[]byte) (interface{}, error) { return fic.MyJSONTeam(nil, true) })) rts.Path("/0/wait.json").Methods("GET").HandlerFunc(apiHandler( func(map[string]string,[]byte) (interface{}, error) { return fic.MyJSONTeam(nil, false) })) rts.Path("/0/stats.json").Methods("GET").HandlerFunc(apiHandler( func(map[string]string,[]byte) (interface{}, error) { return fic.GetTeamsStats(nil) })) rts.Path("/0/tries").Methods("GET").HandlerFunc(apiHandler( func(map[string]string,[]byte) (interface{}, error) { return fic.GetTries(nil, nil) })) rt := rts.PathPrefix("/{tid}").Subrouter() rt.Path("/").Methods("GET").HandlerFunc(apiHandler(teamHandler( func(team fic.Team, args map[string]string, body []byte) (interface{}, error) { return team, nil }))) rt.Path("/").Methods("DELETE").HandlerFunc(apiHandler(teamHandler( func(team fic.Team, args map[string]string, body []byte) (interface{}, error) { return team.Delete() }))) rt.Path("/my.json").Methods("GET").HandlerFunc(apiHandler(teamHandler( func(team fic.Team, args map[string]string, body []byte) (interface{}, error) { return fic.MyJSONTeam(&team, true) }))) rt.Path("/wait.json").Methods("GET").HandlerFunc(apiHandler(teamHandler( func(team fic.Team, args map[string]string, body []byte) (interface{}, error) { return fic.MyJSONTeam(&team, false) }))) rt.Path("/stats.json").Methods("GET").HandlerFunc(apiHandler(teamHandler( func(team fic.Team, args map[string]string, body []byte) (interface{}, error) { return team.GetStats() }))) rt.Path("/tries").Methods("GET").HandlerFunc(apiHandler(teamHandler( func(team fic.Team, args map[string]string, body []byte) (interface{}, error) { return fic.GetTries(&team, nil) }))) rt.Path("/members").Methods("GET").HandlerFunc(apiHandler(teamHandler( func(team fic.Team, args map[string]string, body []byte) (interface{}, error) { return team.GetMembers() }))) rt.Path("/name").Methods("GET").HandlerFunc(apiHandler(teamHandler( func(team fic.Team, args map[string]string, body []byte) (interface{}, error) { return team.Name, nil }))) } 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 \"%s\"; }\n", member.Nickname, team.InitialName) } } else { return "", err } } return ret, nil } } func nginxGenTeam() (string, error) { if teams, err := fic.GetTeams(); err != nil { return "", err } else { ret := "" for _, team := range teams { ret += fmt.Sprintf(" if ($ssl_client_s_dn ~ \"/C=FR/ST=France/O=Epita/OU=SRS/CN=%s\") { set $team \"%s\"; }\n", team.InitialName, team.InitialName) } 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(args map[string]string, body []byte) (interface{}, error) { var ut uploadedTeam if err := json.Unmarshal(body, &ut); err != nil { return nil, err } return fic.CreateTeam(ut.Name, ut.Color) } func addTeamMember(team fic.Team, args map[string]string, body []byte) (interface{}, error) { var members []uploadedMember if err := json.Unmarshal(body, &members); err != nil { return nil, err } for _, member := range members { team.AddMember(member.Firstname, member.Lastname, member.Nickname, member.Company) } return team.GetMembers() }