From 4d1dde452838466c309f8a3d7afe0c879517f047 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Fri, 8 Dec 2017 21:01:42 +0100 Subject: [PATCH] admin: Implement theme synchronization --- admin/api/theme.go | 9 ++++++ admin/sync/themes.go | 75 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 admin/sync/themes.go diff --git a/admin/api/theme.go b/admin/api/theme.go index 4ec35732..fcaf39cf 100644 --- a/admin/api/theme.go +++ b/admin/api/theme.go @@ -6,6 +6,7 @@ import ( "fmt" "strconv" + "srs.epita.fr/fic-server/admin/sync" "srs.epita.fr/fic-server/libfic" "github.com/julienschmidt/httprouter" @@ -37,6 +38,14 @@ func init() { router.GET("/api/themes/:thid/exercices/:eid/keys", apiHandler(exerciceHandler(listExerciceKeys))) router.POST("/api/themes/:thid/exercices/:eid/keys", apiHandler(exerciceHandler(createExerciceKey))) + + // Remote + router.GET("/api/remote/themes", apiHandler(sync.ApiListRemoteThemes)) + router.GET("/api/remote/themes/:thname", apiHandler(sync.ApiGetRemoteTheme)) + + // Synchronize + router.GET("/api/sync/themes", apiHandler( + func(_ httprouter.Params, _ []byte) (interface{}, error) { return sync.SyncThemes(sync.GlobalImporter), nil })) } func bindingFiles(_ httprouter.Params, body []byte) (interface{}, error) { diff --git a/admin/sync/themes.go b/admin/sync/themes.go new file mode 100644 index 00000000..8408c740 --- /dev/null +++ b/admin/sync/themes.go @@ -0,0 +1,75 @@ +package sync + +import ( + "fmt" + "path" + "strings" + + "srs.epita.fr/fic-server/libfic" + "github.com/julienschmidt/httprouter" +) + +func getThemes(i Importer) ([]string, error) { + var themes []string + + if dirs, err := i.listDir("/"); err != nil { + return nil, err + } else { + for _, dir := range dirs { + if _, err := i.listDir(dir); err == nil { + themes = append(themes, dir) + } + } + } + + return themes, nil +} + +func getAuthors(i Importer, tname string) ([]string, error) { + if authors, err := getFileContent(i, path.Join(tname, "AUTHORS.txt")); err != nil { + return nil, err + } else { + return strings.Split(strings.TrimSpace(authors), "\n"), nil + } +} + +func SyncThemes(i Importer) []string { + var errs []string + + if themes, err := getThemes(i); err != nil { + errs = append(errs, err.Error()) + } else { + for _, tname := range themes { + if authors, err := getAuthors(i, tname); err != nil { + errs = append(errs, fmt.Sprintf("%q: unable to get AUTHORS: %s", tname, err)) + continue + } else if theme, err := fic.GetThemeByName(tname); err != nil { + if _, err := fic.CreateTheme(tname, strings.Join(authors, ", ")); err != nil { + errs = append(errs, fmt.Sprintf("%q: an error occurs during add: %s", tname, err)) + continue + } + } else { + authors_str := strings.Join(authors, ", ") + + if theme.Name != tname || theme.Authors != authors_str { + theme.Name = tname + theme.Authors = authors_str + if _, err := theme.Update(); err != nil { + errs = append(errs, fmt.Sprintf("%q: an error occurs during update: %s", tname, err)) + continue + } + } + } + } + } + + return errs +} + +func ApiListRemoteThemes(_ httprouter.Params, _ []byte) (interface{}, error) { + return getThemes(GlobalImporter) +} + +func ApiGetRemoteTheme(ps httprouter.Params, _ []byte) (interface{}, error) { + return getAuthors(GlobalImporter, ps.ByName("thid")) +}