diff --git a/admin/api/settings.go b/admin/api/settings.go index 40afef56..0ce7528b 100644 --- a/admin/api/settings.go +++ b/admin/api/settings.go @@ -2,6 +2,7 @@ package api import ( "encoding/json" + "errors" "path" "time" @@ -16,6 +17,8 @@ var TeamsDir string func init() { router.GET("/api/settings.json", apiHandler(getSettings)) router.PUT("/api/settings.json", apiHandler(saveSettings)) + + router.POST("/api/reset", apiHandler(reset)) } func getSettings(_ httprouter.Params, body []byte) (interface{}, error) { @@ -38,3 +41,22 @@ func saveSettings(_ httprouter.Params, body []byte) (interface{}, error) { return config, err } } + +func reset(_ httprouter.Params, body []byte) (interface{}, error) { + var m map[string]string + if err := json.Unmarshal(body, &m); err != nil { + return nil, err + } + + if t, ok := m["type"]; !ok { + return nil, errors.New("Field type not found") + } else if t == "teams" { + return true, fic.ResetTeams() + } else if t == "challenges" { + return true, fic.ResetExercices() + } else if t == "game" { + return true, fic.ResetGame() + } else { + return nil, errors.New("Unknown reset type") + } +} diff --git a/admin/static/js/app.js b/admin/static/js/app.js index 4e95ed68..bfdfda50 100644 --- a/admin/static/js/app.js +++ b/admin/static/js/app.js @@ -280,6 +280,13 @@ angular.module("FICApp") var f = new Date(ts + 120000 + this.duration * 60000); this.config.end = f.toISOString(); } + $scope.reset = function(type) { + if (confirm("Êtes-vous sûr ?")) { + $http.post("/api/reset", {"type": type}).success(function(time) { + $location.url("/"); + }); + } + }; }) .controller("PublicController", function($scope, Scene, Theme, Teams, Exercice) { diff --git a/admin/static/views/settings.html b/admin/static/views/settings.html index 97aebc06..16e1d3b1 100644 --- a/admin/static/views/settings.html +++ b/admin/static/views/settings.html @@ -102,3 +102,9 @@ + +
diff --git a/libfic/reset.go b/libfic/reset.go new file mode 100644 index 00000000..14215f87 --- /dev/null +++ b/libfic/reset.go @@ -0,0 +1,30 @@ +package fic + +import () + +func truncateTable(tables ...string) (error) { + if _, err := DBExec("SET FOREIGN_KEY_CHECKS = 0;"); err != nil { + return err + } + for _, table := range tables { + if _, err := DBExec("TRUNCATE TABLE " + table + ";"); err != nil { + return err + } + } + if _, err := DBExec("SET FOREIGN_KEY_CHECKS = 1;"); err != nil { + return err + } + return nil +} + +func ResetGame() (error) { + return truncateTable("team_hints", "key_found", "exercice_solved", "exercice_tries") +} + +func ResetExercices() (error) { + return truncateTable("team_hints", "exercice_files", "key_found", "exercice_keys", "exercice_solved", "exercice_tries", "exercice_hints", "exercices", "themes") +} + +func ResetTeams() (error) { + return truncateTable("team_hints", "key_found", "exercice_solved", "exercice_tries", "team_members", "teams") +}