server/admin/sync/full.go

71 lines
1.8 KiB
Go

package sync
import (
"encoding/json"
"fmt"
"log"
"os"
"time"
"sync"
"srs.epita.fr/fic-server/libfic"
"srs.epita.fr/fic-server/settings"
)
// DeepReportPath stores the path to the report generated during full recursive import.
var DeepReportPath = "full_import_report.json"
// oneDeepSync ensure there is no more than one running deep sync.
var oneDeepSync sync.Mutex
// SyncDeep performs a recursive synchronisation: from themes to challenge items.
func SyncDeep(i Importer) (errs map[string][]string) {
oneDeepSync.Lock()
defer oneDeepSync.Unlock()
errs = map[string][]string{}
errs["_date"] = []string{fmt.Sprintf("%v", time.Now())}
errs["_themes"] = SyncThemes(i)
if themes, err := fic.GetThemes(); err == nil {
for _, theme := range themes {
errs[theme.Name] = SyncExercices(i, theme)
if exercices, err := theme.GetExercices(); err == nil {
for _, exercice := range exercices {
errs[theme.Name] = append(errs[theme.Name], SyncExerciceKeys(i, exercice)...)
errs[theme.Name] = append(errs[theme.Name], SyncExerciceFiles(i, exercice)...)
errs[theme.Name] = append(errs[theme.Name], SyncExerciceHints(i, exercice)...)
}
}
}
}
errs["_date"] = append(errs["_date"], fmt.Sprintf("%v", time.Now()))
errs["_regeneration"] = []string{}
if fdto, err := os.Create(DeepReportPath); err == nil {
defer fdto.Close()
fdto.Write([]byte("disp("))
if out, err := json.Marshal(errs); err == nil {
fdto.Write(out)
} else {
errs["_regeneration"] = append(errs["_regeneration"], err.Error())
log.Println(err)
}
fdto.Write([]byte(");"))
} else {
errs["_regeneration"] = append(errs["_regeneration"], err.Error())
log.Println(err)
}
if err := settings.ForceRegeneration(); err != nil {
errs["_regeneration"] = append(errs["_regeneration"], err.Error())
}
return
}