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 }