2016-01-07 19:08:48 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2016-01-07 19:32:24 +00:00
|
|
|
"encoding/json"
|
2016-01-13 12:30:13 +00:00
|
|
|
"fmt"
|
2016-01-07 19:08:48 +00:00
|
|
|
"strconv"
|
2016-01-23 21:05:49 +00:00
|
|
|
"strings"
|
2016-01-13 19:25:25 +00:00
|
|
|
|
|
|
|
"srs.epita.fr/fic-server/libfic"
|
2016-01-07 19:08:48 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var ApiTeamsRouting = map[string]DispatchFunction{
|
2016-01-13 10:31:59 +00:00
|
|
|
"GET": listTeam,
|
|
|
|
"PUT": creationTeamMembers,
|
|
|
|
"POST": creationTeam,
|
2016-01-13 00:12:36 +00:00
|
|
|
"DELETE": deletionTeam,
|
2016-01-07 19:08:48 +00:00
|
|
|
}
|
|
|
|
|
2016-11-19 15:17:53 +00:00
|
|
|
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
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-13 12:30:13 +00:00
|
|
|
func nginxGenTeam() (string, error) {
|
2016-01-13 19:25:25 +00:00
|
|
|
if teams, err := fic.GetTeams(); err != nil {
|
2016-01-13 12:30:13 +00:00
|
|
|
return "", err
|
|
|
|
} else {
|
|
|
|
ret := ""
|
|
|
|
for _, team := range teams {
|
2016-04-28 15:34:37 +00:00
|
|
|
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)
|
2016-01-13 12:30:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return ret, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-23 21:05:49 +00:00
|
|
|
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
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-18 18:41:04 +00:00
|
|
|
type uploadedTeam struct {
|
2016-01-20 09:14:13 +00:00
|
|
|
Name string
|
2016-02-26 00:29:01 +00:00
|
|
|
Color uint32
|
2016-01-18 18:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type uploadedMember struct {
|
|
|
|
Firstname string
|
|
|
|
Lastname string
|
|
|
|
Nickname string
|
|
|
|
Company string
|
|
|
|
}
|
|
|
|
|
2016-01-07 19:32:24 +00:00
|
|
|
func listTeam(args []string, body []byte) (interface{}, error) {
|
2016-01-20 18:56:08 +00:00
|
|
|
if len(args) >= 2 {
|
2016-04-28 14:11:19 +00:00
|
|
|
var team *fic.Team
|
|
|
|
if tid, err := strconv.Atoi(args[0]); err != nil {
|
|
|
|
if t, err := fic.GetTeamByInitialName(args[0]); err != nil {
|
|
|
|
return nil, err
|
|
|
|
} else {
|
|
|
|
team = &t
|
|
|
|
}
|
2016-01-23 11:20:30 +00:00
|
|
|
} else {
|
|
|
|
if tid == 0 {
|
|
|
|
team = nil
|
|
|
|
} else if t, err := fic.GetTeam(tid); err != nil {
|
|
|
|
return nil, err
|
|
|
|
} else {
|
|
|
|
team = &t
|
|
|
|
}
|
|
|
|
|
2016-04-28 14:11:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if args[1] == "my.json" {
|
|
|
|
return fic.MyJSONTeam(team, true)
|
|
|
|
} else if args[1] == "wait.json" {
|
|
|
|
return fic.MyJSONTeam(team, false)
|
2016-10-13 17:52:40 +00:00
|
|
|
} else if args[1] == "stats.json" {
|
|
|
|
if team != nil {
|
|
|
|
return team.GetStats()
|
|
|
|
} else {
|
|
|
|
return fic.GetTeamsStats(nil)
|
|
|
|
}
|
2016-10-13 17:52:13 +00:00
|
|
|
} else if args[1] == "tries" {
|
|
|
|
return fic.GetTries(team, nil)
|
2016-04-28 15:35:40 +00:00
|
|
|
} else if team != nil && args[1] == "members" {
|
|
|
|
return team.GetMembers()
|
2016-04-28 14:11:19 +00:00
|
|
|
} else if args[1] == "certificate" && team != nil {
|
|
|
|
return CertificateAPI(*team, args[2:])
|
|
|
|
} else if team != nil && args[1] == "name" {
|
|
|
|
return team.Name, nil
|
2016-01-19 12:10:18 +00:00
|
|
|
}
|
|
|
|
} else if len(args) == 1 {
|
2016-01-21 00:36:58 +00:00
|
|
|
if args[0] == "teams.json" {
|
2016-03-06 17:57:08 +00:00
|
|
|
return fic.ExportTeams()
|
2016-10-13 17:52:13 +00:00
|
|
|
} else if args[0] == "tries" {
|
|
|
|
return fic.GetTries(nil, nil)
|
2016-01-21 00:36:58 +00:00
|
|
|
} else if args[0] == "nginx" {
|
2016-01-13 12:30:13 +00:00
|
|
|
return nginxGenTeam()
|
2016-11-19 15:17:53 +00:00
|
|
|
} else if args[0] == "nginx-members" {
|
|
|
|
return nginxGenMember()
|
2016-01-23 21:05:49 +00:00
|
|
|
} else if args[0] == "binding" {
|
|
|
|
return bindingTeams()
|
2016-01-13 12:30:13 +00:00
|
|
|
} else if tid, err := strconv.Atoi(string(args[0])); err != nil {
|
2016-03-06 17:57:08 +00:00
|
|
|
return fic.GetTeamByInitialName(args[0])
|
2016-01-13 19:25:25 +00:00
|
|
|
} else if team, err := fic.GetTeam(tid); err != nil {
|
2016-01-07 19:08:48 +00:00
|
|
|
return nil, err
|
|
|
|
} else {
|
2016-04-28 15:35:40 +00:00
|
|
|
return team, nil
|
2016-01-07 19:08:48 +00:00
|
|
|
}
|
|
|
|
} else if len(args) == 0 {
|
|
|
|
// List all teams
|
2016-01-13 19:25:25 +00:00
|
|
|
return fic.GetTeams()
|
2016-01-07 19:08:48 +00:00
|
|
|
}
|
2016-01-19 12:10:18 +00:00
|
|
|
return nil, nil
|
2016-01-07 19:08:48 +00:00
|
|
|
}
|
2016-01-07 19:32:24 +00:00
|
|
|
|
|
|
|
func creationTeam(args []string, body []byte) (interface{}, error) {
|
2016-01-20 18:56:08 +00:00
|
|
|
if len(args) == 1 {
|
|
|
|
// List given team
|
|
|
|
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 {
|
|
|
|
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()
|
|
|
|
}
|
|
|
|
} else if len(args) == 0 {
|
2016-01-13 10:31:59 +00:00
|
|
|
// Create a new team
|
|
|
|
var ut uploadedTeam
|
|
|
|
if err := json.Unmarshal(body, &ut); err != nil {
|
|
|
|
return nil, err
|
2016-01-07 19:32:24 +00:00
|
|
|
}
|
|
|
|
|
2016-01-20 09:14:13 +00:00
|
|
|
return fic.CreateTeam(ut.Name, ut.Color)
|
2016-01-13 10:31:59 +00:00
|
|
|
} else {
|
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func creationTeamMembers(args []string, body []byte) (interface{}, error) {
|
|
|
|
if len(args) == 1 {
|
|
|
|
// List given team
|
|
|
|
if tid, err := strconv.Atoi(string(args[0])); err != nil {
|
|
|
|
return nil, err
|
2016-01-13 19:25:25 +00:00
|
|
|
} else if team, err := fic.GetTeam(tid); err != nil {
|
2016-01-13 10:31:59 +00:00
|
|
|
return nil, err
|
|
|
|
} else {
|
|
|
|
var member uploadedMember
|
|
|
|
if err := json.Unmarshal(body, &member); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
team.AddMember(member.Firstname, member.Lastname, member.Nickname, member.Company)
|
|
|
|
|
|
|
|
return team.GetMembers()
|
|
|
|
}
|
|
|
|
} else if len(args) == 0 {
|
2016-01-07 19:32:24 +00:00
|
|
|
// Create a new team
|
2016-01-13 10:31:59 +00:00
|
|
|
var members []uploadedMember
|
2016-01-07 19:32:24 +00:00
|
|
|
if err := json.Unmarshal(body, &members); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2016-01-20 09:14:13 +00:00
|
|
|
if team, err := fic.CreateTeam("", 0); err != nil {
|
2016-01-07 19:32:24 +00:00
|
|
|
return nil, err
|
|
|
|
} else {
|
|
|
|
for _, member := range members {
|
|
|
|
if _, err := team.AddMember(member.Firstname, member.Lastname, member.Nickname, member.Company); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-13 10:31:59 +00:00
|
|
|
return team, nil
|
2016-01-07 19:32:24 +00:00
|
|
|
}
|
|
|
|
} else {
|
2016-01-13 10:31:59 +00:00
|
|
|
return nil, nil
|
2016-01-07 19:32:24 +00:00
|
|
|
}
|
|
|
|
}
|
2016-01-13 00:12:36 +00:00
|
|
|
|
|
|
|
func deletionTeam(args []string, body []byte) (interface{}, error) {
|
|
|
|
if len(args) == 1 {
|
|
|
|
if tid, err := strconv.Atoi(string(args[0])); err != nil {
|
|
|
|
return nil, err
|
2016-01-13 19:25:25 +00:00
|
|
|
} else if team, err := fic.GetTeam(tid); err != nil {
|
2016-01-13 00:12:36 +00:00
|
|
|
return nil, err
|
|
|
|
} else {
|
|
|
|
return team.Delete()
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
}
|