From a06602a7e84310e23e4b7c63f9c9a017ad87c6f1 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Sat, 13 Nov 2021 02:00:24 +0100 Subject: [PATCH] admin: Add new API route to perform smart theme update controled by hooks --- admin/api/theme.go | 55 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 5 deletions(-) diff --git a/admin/api/theme.go b/admin/api/theme.go index 8df3b5ac..9be6bf34 100644 --- a/admin/api/theme.go +++ b/admin/api/theme.go @@ -5,9 +5,11 @@ import ( "errors" "fmt" "strconv" + "strings" "srs.epita.fr/fic-server/admin/sync" "srs.epita.fr/fic-server/libfic" + "srs.epita.fr/fic-server/settings" "github.com/julienschmidt/httprouter" ) @@ -71,6 +73,49 @@ func init() { sync.DeepSyncProgress = 255 return st, nil }))) + router.POST("/api/sync/auto/*p", apiHandler( + func(ps httprouter.Params, _ []byte) (interface{}, error) { + p := strings.TrimPrefix(ps.ByName("p"), "/") + + themes, err := fic.GetThemes() + if err != nil { + return nil, err + } + + if p == "" { + if !IsProductionEnv { + for _, theme := range themes { + theme.DeleteDeep() + } + } + + st := sync.SyncDeep(sync.GlobalImporter) + return st, nil + } + + for _, theme := range themes { + if theme.Path == p { + if !IsProductionEnv { + exercices, err := theme.GetExercices() + if err == nil { + for _, exercice := range exercices { + exercice.DeleteDeep() + } + } + } + + st := sync.SyncThemeDeep(sync.GlobalImporter, theme, 0, 250) + sync.EditDeepReport(map[string][]string{theme.Name: st}, false) + sync.DeepSyncProgress = 255 + + settings.ForceRegeneration() + + return st, nil + } + } + + return nil, fmt.Errorf("Theme not found %q", p) + })) router.POST("/api/sync/themes", apiHandler( func(_ httprouter.Params, _ []byte) (interface{}, error) { return sync.SyncThemes(sync.GlobalImporter), nil @@ -215,12 +260,12 @@ func getThemedExercicesStats(theme fic.Theme, body []byte) (interface{}, error) ret := []exerciceStats{} for _, e := range exercices { ret = append(ret, exerciceStats{ - IdExercice: e.Id, - TeamTries: e.TriedTeamCount(), - TotalTries: e.TriedCount(), + IdExercice: e.Id, + TeamTries: e.TriedTeamCount(), + TotalTries: e.TriedCount(), SolvedCount: e.SolvedCount(), - FlagSolved: e.FlagSolved(), - MCQSolved: e.MCQSolved(), + FlagSolved: e.FlagSolved(), + MCQSolved: e.MCQSolved(), }) } return ret, nil