2016-12-08 08:12:18 +00:00
|
|
|
package api
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
2017-12-21 20:25:23 +00:00
|
|
|
"time"
|
2016-12-08 08:12:18 +00:00
|
|
|
|
2019-01-21 01:54:27 +00:00
|
|
|
"srs.epita.fr/fic-server/admin/pki"
|
2016-12-08 08:12:18 +00:00
|
|
|
"srs.epita.fr/fic-server/libfic"
|
2016-12-15 23:51:56 +00:00
|
|
|
|
|
|
|
"github.com/julienschmidt/httprouter"
|
2016-12-08 08:12:18 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
2016-12-15 23:51:56 +00:00
|
|
|
router.GET("/api/teams.json", apiHandler(
|
2018-03-09 18:07:08 +00:00
|
|
|
func(httprouter.Params, []byte) (interface{}, error) {
|
|
|
|
return fic.ExportTeams()
|
|
|
|
}))
|
2016-12-15 23:51:56 +00:00
|
|
|
router.GET("/api/teams-binding", apiHandler(
|
2018-03-09 18:07:08 +00:00
|
|
|
func(httprouter.Params, []byte) (interface{}, error) {
|
|
|
|
return bindingTeams()
|
|
|
|
}))
|
2018-12-10 01:17:11 +00:00
|
|
|
router.GET("/api/teams-nginx", apiHandler(
|
|
|
|
func(httprouter.Params, []byte) (interface{}, error) {
|
|
|
|
return nginxGenTeams()
|
|
|
|
}))
|
2019-01-21 01:54:27 +00:00
|
|
|
router.POST("/api/disableinactiveteams", apiHandler(disableInactiveTeams))
|
|
|
|
router.POST("/api/enableallteams", apiHandler(enableAllTeams))
|
2018-12-10 01:17:11 +00:00
|
|
|
router.GET("/api/teams-members-nginx", apiHandler(
|
2018-03-09 18:07:08 +00:00
|
|
|
func(httprouter.Params, []byte) (interface{}, error) {
|
|
|
|
return nginxGenMember()
|
|
|
|
}))
|
2016-12-15 23:51:56 +00:00
|
|
|
router.GET("/api/teams-tries.json", apiHandler(
|
2018-03-09 18:07:08 +00:00
|
|
|
func(httprouter.Params, []byte) (interface{}, error) {
|
|
|
|
return fic.GetTries(nil, nil)
|
|
|
|
}))
|
2016-12-08 08:12:18 +00:00
|
|
|
|
2016-12-15 23:51:56 +00:00
|
|
|
router.GET("/api/teams/", apiHandler(
|
2018-03-09 18:07:08 +00:00
|
|
|
func(httprouter.Params, []byte) (interface{}, error) {
|
|
|
|
return fic.GetTeams()
|
|
|
|
}))
|
2017-01-19 12:12:26 +00:00
|
|
|
router.POST("/api/teams/", apiHandler(createTeam))
|
2016-12-08 08:12:18 +00:00
|
|
|
|
2016-12-15 23:51:56 +00:00
|
|
|
router.GET("/api/teams/:tid/", apiHandler(teamHandler(
|
|
|
|
func(team fic.Team, _ []byte) (interface{}, error) {
|
2018-03-09 18:07:08 +00:00
|
|
|
return team, nil
|
|
|
|
})))
|
2017-01-28 18:36:28 +00:00
|
|
|
router.PUT("/api/teams/:tid/", apiHandler(teamHandler(updateTeam)))
|
2017-01-19 12:12:26 +00:00
|
|
|
router.POST("/api/teams/:tid/", apiHandler(teamHandler(addTeamMember)))
|
2016-12-15 23:51:56 +00:00
|
|
|
router.DELETE("/api/teams/:tid/", apiHandler(teamHandler(
|
|
|
|
func(team fic.Team, _ []byte) (interface{}, error) {
|
2018-03-09 18:07:08 +00:00
|
|
|
return team.Delete()
|
|
|
|
})))
|
2018-12-08 02:30:56 +00:00
|
|
|
router.GET("/api/teams/:tid/score-grid.json", apiHandler(teamHandler(
|
|
|
|
func(team fic.Team, _ []byte) (interface{}, error) {
|
|
|
|
return team.ScoreGrid()
|
|
|
|
})))
|
2016-12-15 23:51:56 +00:00
|
|
|
router.GET("/api/teams/:tid/my.json", apiHandler(teamPublicHandler(
|
|
|
|
func(team *fic.Team, _ []byte) (interface{}, error) {
|
2018-03-09 18:07:08 +00:00
|
|
|
return fic.MyJSONTeam(team, true)
|
|
|
|
})))
|
2016-12-15 23:51:56 +00:00
|
|
|
router.GET("/api/teams/:tid/wait.json", apiHandler(teamPublicHandler(
|
|
|
|
func(team *fic.Team, _ []byte) (interface{}, error) {
|
2018-03-09 18:07:08 +00:00
|
|
|
return fic.MyJSONTeam(team, false)
|
|
|
|
})))
|
2016-12-15 23:51:56 +00:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
})))
|
2017-11-12 21:14:41 +00:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
})))
|
2017-12-21 20:25:23 +00:00
|
|
|
router.DELETE("/api/teams/:tid/history.json", apiHandler(teamPublicHandler(delHistory)))
|
2016-12-15 23:51:56 +00:00
|
|
|
router.GET("/api/teams/:tid/tries", apiHandler(teamPublicHandler(
|
|
|
|
func(team *fic.Team, _ []byte) (interface{}, error) {
|
2018-03-09 18:07:08 +00:00
|
|
|
return fic.GetTries(team, nil)
|
|
|
|
})))
|
2016-12-15 23:51:56 +00:00
|
|
|
router.GET("/api/teams/:tid/members", apiHandler(teamHandler(
|
|
|
|
func(team fic.Team, _ []byte) (interface{}, error) {
|
2018-03-09 18:07:08 +00:00
|
|
|
return team.GetMembers()
|
|
|
|
})))
|
2017-01-28 18:36:28 +00:00
|
|
|
router.POST("/api/teams/:tid/members", apiHandler(teamHandler(addTeamMember)))
|
|
|
|
router.PUT("/api/teams/:tid/members", apiHandler(teamHandler(setTeamMember)))
|
2016-12-08 08:12:18 +00:00
|
|
|
}
|
|
|
|
|
2018-12-10 01:17:11 +00:00
|
|
|
func nginxGenTeams() (string, error) {
|
|
|
|
if teams, err := fic.GetTeams(); err != nil {
|
|
|
|
return "", err
|
|
|
|
} else {
|
|
|
|
ret := ""
|
|
|
|
for _, team := range teams {
|
|
|
|
ret += fmt.Sprintf(" if ($remote_user = \"%s\") { set $team \"%d\"; }\n", strings.ToLower(team.Name), team.Id)
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-08 08:12:18 +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 {
|
2018-02-16 09:50:44 +00:00
|
|
|
ret += fmt.Sprintf(" if ($remote_user = \"%s\") { set $team \"%d\"; }\n", member.Nickname, team.Id)
|
2016-12-08 08:12:18 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func bindingTeams() (string, error) {
|
|
|
|
if teams, err := fic.GetTeams(); err != nil {
|
|
|
|
return "", err
|
2018-03-09 18:07:08 +00:00
|
|
|
} else {
|
|
|
|
ret := ""
|
|
|
|
for _, team := range teams {
|
|
|
|
if members, err := team.GetMembers(); err != nil {
|
|
|
|
return "", err
|
2016-12-08 08:12:18 +00:00
|
|
|
} else {
|
2018-03-09 18:07:08 +00:00
|
|
|
var mbs []string
|
2016-12-08 08:12:18 +00:00
|
|
|
for _, member := range members {
|
2018-03-09 18:07:08 +00:00
|
|
|
mbs = append(mbs, fmt.Sprintf("%s %s", member.Firstname, member.Lastname))
|
2016-12-08 08:12:18 +00:00
|
|
|
}
|
2018-03-09 18:07:08 +00:00
|
|
|
ret += fmt.Sprintf("%d;%s;%s\n", team.Id, team.Name, strings.Join(mbs, ";"))
|
2016-12-08 08:12:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return ret, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-19 12:12:26 +00:00
|
|
|
func createTeam(_ httprouter.Params, body []byte) (interface{}, error) {
|
2019-01-17 08:44:07 +00:00
|
|
|
var ut fic.Team
|
2016-12-08 08:12:18 +00:00
|
|
|
if err := json.Unmarshal(body, &ut); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2017-01-19 12:12:26 +00:00
|
|
|
return fic.CreateTeam(strings.TrimSpace(ut.Name), ut.Color)
|
2016-12-08 08:12:18 +00:00
|
|
|
}
|
|
|
|
|
2017-01-28 18:36:28 +00:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2019-01-21 01:54:27 +00:00
|
|
|
func disableInactiveTeams(_ httprouter.Params, _ []byte) (interface{}, error) {
|
|
|
|
if teams, err := fic.GetTeams(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
} else {
|
|
|
|
for _, team := range teams {
|
|
|
|
var serials []uint64
|
|
|
|
serials, err = pki.GetTeamSerials(TeamsDir, team.Id)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2019-02-04 18:59:29 +00:00
|
|
|
var assocs []string
|
|
|
|
assocs, err = pki.GetTeamAssociations(TeamsDir, team.Id)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(serials) == 0 && len(assocs) == 0 {
|
2019-01-21 01:54:27 +00:00
|
|
|
if team.Active {
|
|
|
|
team.Active = false
|
|
|
|
team.Update()
|
|
|
|
}
|
|
|
|
} else if !team.Active {
|
|
|
|
team.Active = true
|
|
|
|
team.Update()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func enableAllTeams(_ httprouter.Params, _ []byte) (interface{}, error) {
|
|
|
|
if teams, err := fic.GetTeams(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
} else {
|
|
|
|
for _, team := range teams {
|
|
|
|
if !team.Active {
|
|
|
|
team.Active = true
|
|
|
|
team.Update()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-19 12:12:26 +00:00
|
|
|
func addTeamMember(team fic.Team, body []byte) (interface{}, error) {
|
2019-01-17 08:44:07 +00:00
|
|
|
var members []fic.Member
|
2016-12-08 08:12:18 +00:00
|
|
|
if err := json.Unmarshal(body, &members); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, member := range members {
|
2017-01-19 12:12:26 +00:00
|
|
|
team.AddMember(strings.TrimSpace(member.Firstname), strings.TrimSpace(member.Lastname), strings.TrimSpace(member.Nickname), strings.TrimSpace(member.Company))
|
2016-12-08 08:12:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return team.GetMembers()
|
|
|
|
}
|
2017-01-20 19:52:31 +00:00
|
|
|
|
2017-01-28 18:36:28 +00:00
|
|
|
func setTeamMember(team fic.Team, body []byte) (interface{}, error) {
|
2019-01-17 08:44:07 +00:00
|
|
|
var members []fic.Member
|
2017-01-28 18:36:28 +00:00
|
|
|
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()
|
|
|
|
}
|
|
|
|
|
2017-12-21 20:25:23 +00:00
|
|
|
type uploadedHistory struct {
|
2019-02-03 21:49:03 +00:00
|
|
|
Kind string
|
|
|
|
Time time.Time
|
|
|
|
Primary *int64
|
|
|
|
Secondary *int64
|
|
|
|
Coefficient float32
|
|
|
|
}
|
|
|
|
|
|
|
|
func updateHistory(team *fic.Team, body []byte) (interface{}, error) {
|
|
|
|
var uh uploadedHistory
|
|
|
|
if err := json.Unmarshal(body, &uh); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
var givenId int64
|
|
|
|
if uh.Secondary != nil {
|
|
|
|
givenId = *uh.Secondary
|
|
|
|
} else if uh.Primary != nil {
|
|
|
|
givenId = *uh.Primary
|
|
|
|
}
|
|
|
|
|
|
|
|
return team.UpdateHistoryCoeff(uh.Kind, uh.Time, givenId, uh.Coefficient)
|
2017-12-21 20:25:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
|
|
|
}
|