150 lines
4.2 KiB
Go
150 lines
4.2 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"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", apiHandler(
|
|
func(httprouter.Params,[]byte) (interface{}, error) {
|
|
return nginxGenTeam() }))
|
|
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.GET("/api/teams/:tid/", apiHandler(teamHandler(
|
|
func(team fic.Team, _ []byte) (interface{}, error) {
|
|
return team, nil })))
|
|
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/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.GET("/api/teams/:tid/name", apiHandler(teamHandler(
|
|
func(team fic.Team, _ []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()
|
|
}
|