package main import ( "encoding/json" "errors" "fmt" "strconv" "srs.epita.fr/fic-server/libfic" ) var ApiThemesRouting = map[string]DispatchFunction{ "GET": listTheme, "POST": creationTheme, "DELETE": deletionTheme, } type exportedExercice struct { Title string `json:"title"` Gain int64 `json:"gain"` Solved int64 `json:"solved"` } type exportedTheme struct { Name string `json:"name"` Exercices map[string]exportedExercice `json:"exercices"` } func exportThemes() (interface{}, error) { if themes, err := fic.GetThemes(); err != nil { return nil, err } else { ret := map[string]exportedTheme{} for _, theme := range themes { if exercices, err := theme.GetExercices(); err != nil { return nil, err } else { exos := map[string]exportedExercice{} for _, exercice := range exercices { exos[fmt.Sprintf("%d", exercice.Id)] = exportedExercice{ exercice.Title, exercice.Gain, exercice.SolvedCount(), } } ret[fmt.Sprintf("%d", theme.Id)] = exportedTheme{ theme.Name, exos, } } } return ret, nil } } func getTheme(args []string) (fic.Theme, error) { if tid, err := strconv.Atoi(string(args[0])); err != nil { return fic.Theme{}, err } else { return fic.GetTheme(tid) } } func getExercice(args []string) (fic.Exercice, error) { if theme, err := getTheme(args); err != nil { return fic.Exercice{}, err } else if eid, err := strconv.Atoi(string(args[1])); err != nil { return fic.Exercice{}, err } else { return theme.GetExercice(eid) } } func listTheme(args []string, body []byte) (interface{}, error) { if len(args) == 3 { if e, err := getExercice(args); err != nil { return nil, err } else { if args[2] == "files" { return e.GetFiles() } else if args[2] == "keys" { return e.GetKeys() } } } else if len(args) == 2 { return getExercice(args) } else if len(args) == 1 { if args[0] == "themes.json" { return exportThemes() } else { return getTheme(args) } } else if len(args) == 0 { // List all themes return fic.GetThemes() } return nil, nil } type uploadedTheme struct { Name string } func creationTheme(args []string, body []byte) (interface{}, error) { if len(args) >= 1 { if theme, err := getTheme(args); err != nil { return nil, err } else { return createExercice(theme, args[1:], body) } } else if len(args) == 0 { // Create a new theme var ut uploadedTheme if err := json.Unmarshal(body, &ut); err != nil { return nil, err } if len(ut.Name) == 0 { return nil, errors.New("Theme's name not filled") } return fic.CreateTheme(ut.Name) } else { return nil, nil } } func deletionTheme(args []string, body []byte) (interface{}, error) { if len(args) == 2 { if exercice, err := getExercice(args); err != nil { return nil, err } else { return exercice.Delete() } } else if len(args) == 1 { if theme, err := getTheme(args); err != nil { return nil, err } else { return theme.Delete() } } else { return nil, nil } }