package api import ( "encoding/json" "errors" "fmt" "strconv" "srs.epita.fr/fic-server/libfic" ) func init() { router.Path("/themes/").Methods("GET").HandlerFunc(apiHandler(listThemes)) router.Path("/themes/").Methods("POST").HandlerFunc(apiHandler(createTheme)) router.Path("/themes.json").Methods("GET").HandlerFunc(apiHandler(exportThemes)) router.Path("/themes/files-bindings").Methods("GET").HandlerFunc(apiHandler(bindingFiles)) rt := router.PathPrefix("/themes/{tid:[0-9]+}").Subrouter() rt.Path("/").Methods("GET").HandlerFunc(apiHandler(themeHandler(showTheme))) rt.Path("/").Methods("PUT").HandlerFunc(apiHandler(themeHandler(updateTheme))) rt.Path("/").Methods("DELETE").HandlerFunc(apiHandler(themeHandler(deleteTheme))) rtes := rt.PathPrefix("/exercices").Subrouter() rtes.Path("/").Methods("GET").HandlerFunc(apiHandler(themeHandler(listThemedExercices))) rtes.Path("/").Methods("POST").HandlerFunc(apiHandler(themeHandler(createExercice))) rte := rtes.PathPrefix("/{eid:[0-9]+}").Subrouter() rte.Path("/").Methods("GET").HandlerFunc(apiHandler(themeHandler(themedExerciceHandler(showThemedExercice)))) rte.Path("/").Methods("PUT").HandlerFunc(apiHandler(themeHandler(themedExerciceHandler(updateThemedExercice)))) rte.Path("/").Methods("DELETE").HandlerFunc(apiHandler(themeHandler(themedExerciceHandler(deleteThemedExercice)))) rtef := rte.Path("/files").Subrouter() rtef.Methods("GET").HandlerFunc(apiHandler(themeHandler(themedExerciceHandler(listThemedExerciceFiles)))) rtef.Methods("POST").HandlerFunc(apiHandler(themeHandler(themedExerciceHandler(createExerciceFile)))) rteh := rte.Path("/hints").Subrouter() rteh.Methods("GET").HandlerFunc(apiHandler(themeHandler(themedExerciceHandler(listThemedExerciceHints)))) rteh.Methods("POST").HandlerFunc(apiHandler(themeHandler(themedExerciceHandler(createExerciceHint)))) rtek := rte.Path("/keys").Subrouter() rtek.Methods("GET").HandlerFunc(apiHandler(themeHandler(themedExerciceHandler(listThemedExerciceKeys)))) rtek.Methods("POST").HandlerFunc(apiHandler(themeHandler(themedExerciceHandler(createExerciceKey)))) } func bindingFiles(args map[string]string, body []byte) (interface{}, error) { if files, err := fic.GetFiles(); err != nil { return "", err } else { ret := "" for _, file := range files { ret += fmt.Sprintf("%s;%s\n", file.GetOrigin(), file.Path) } return ret, nil } } func getExercice(args []string) (fic.Exercice, error) { if tid, err := strconv.Atoi(string(args[0])); err != nil { return fic.Exercice{}, err } else if theme, err := fic.GetTheme(tid); 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 listThemes(args map[string]string, body []byte) (interface{}, error) { return fic.GetThemes() } func exportThemes(args map[string]string, body []byte) (interface{}, error) { return fic.ExportThemes() } func showTheme(theme fic.Theme, args map[string]string, body []byte) (interface{}, error) { return theme, nil } func listThemedExercices(theme fic.Theme, args map[string]string, body []byte) (interface{}, error) { return theme.GetExercices() } func showThemedExercice(theme fic.Theme, exercice fic.Exercice, args map[string]string, body []byte) (interface{}, error) { return exercice, nil } func listThemedExerciceFiles(theme fic.Theme, exercice fic.Exercice, args map[string]string, body []byte) (interface{}, error) { return exercice.GetFiles() } func listThemedExerciceHints(theme fic.Theme, exercice fic.Exercice, args map[string]string, body []byte) (interface{}, error) { return exercice.GetHints() } func listThemedExerciceKeys(theme fic.Theme, exercice fic.Exercice, args map[string]string, body []byte) (interface{}, error) { return exercice.GetKeys() } type uploadedTheme struct { Name string Authors string } func createTheme(args map[string]string, body []byte) (interface{}, error) { 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, ut.Authors) } func updateTheme(theme fic.Theme, args map[string]string, body []byte) (interface{}, error) { var ut fic.Theme if err := json.Unmarshal(body, &ut); err != nil { return nil, err } ut.Id = theme.Id if len(ut.Name) == 0 { return nil, errors.New("Theme's name not filled") } return ut.Update() } func updateThemedExercice(theme fic.Theme, exercice fic.Exercice, args map[string]string, body []byte) (interface{}, error) { // Update an exercice var ue fic.Exercice if err := json.Unmarshal(body, &ue); err != nil { return nil, err } ue.Id = exercice.Id if len(ue.Title) == 0 { return nil, errors.New("Exercice's title not filled") } if _, err := ue.Update(); err != nil { return nil, err } return ue, nil } func deleteTheme(theme fic.Theme, args map[string]string, body []byte) (interface{}, error) { return theme.Delete() } func deleteThemedExercice(theme fic.Theme, exercice fic.Exercice, args map[string]string, body []byte) (interface{}, error) { return exercice.Delete() }