package api import ( "encoding/json" "errors" "fmt" "strconv" "srs.epita.fr/fic-server/libfic" "github.com/julienschmidt/httprouter" ) func init() { router.GET("/api/themes", apiHandler(listThemes)) router.POST("/api/themes", apiHandler(createTheme)) router.GET("/api/themes.json", apiHandler(exportThemes)) router.GET("/api/files-bindings", apiHandler(bindingFiles)) router.GET("/api/themes/:thid", apiHandler(themeHandler(showTheme))) router.PUT("/api/themes/:thid", apiHandler(themeHandler(updateTheme))) router.DELETE("/api/themes/:thid", apiHandler(themeHandler(deleteTheme))) router.GET("/api/themes/:thid/exercices", apiHandler(themeHandler(listThemedExercices))) router.POST("/api/themes/:thid/exercices", apiHandler(themeHandler(createExercice))) router.GET("/api/themes/:thid/exercices/:eid", apiHandler(exerciceHandler(showExercice))) router.PUT("/api/themes/:thid/exercices/:eid", apiHandler(exerciceHandler(updateExercice))) router.DELETE("/api/themes/:thid/exercices/:eid", apiHandler(exerciceHandler(deleteExercice))) router.GET("/api/themes/:thid/exercices/:eid/files", apiHandler(exerciceHandler(listExerciceFiles))) router.POST("/api/themes/:thid/exercices/:eid/files", apiHandler(exerciceHandler(createExerciceFile))) router.GET("/api/themes/:thid/exercices/:eid/hints", apiHandler(exerciceHandler(listExerciceHints))) router.POST("/api/themes/:thid/exercices/:eid/hints", apiHandler(exerciceHandler(createExerciceHint))) router.GET("/api/themes/:thid/exercices/:eid/keys", apiHandler(exerciceHandler(listExerciceKeys))) router.POST("/api/themes/:thid/exercices/:eid/keys", apiHandler(exerciceHandler(createExerciceKey))) } func bindingFiles(_ httprouter.Params, 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(_ httprouter.Params, _ []byte) (interface{}, error) { return fic.GetThemes() } func exportThemes(_ httprouter.Params, _ []byte) (interface{}, error) { return fic.ExportThemes() } func showTheme(theme fic.Theme, _ []byte) (interface{}, error) { return theme, nil } func listThemedExercices(theme fic.Theme, _ []byte) (interface{}, error) { return theme.GetExercices() } func showThemedExercice(theme fic.Theme, exercice fic.Exercice, body []byte) (interface{}, error) { return exercice, nil } type uploadedTheme struct { Name string Authors string } func createTheme(_ httprouter.Params, 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, 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") } if _, err := ut.Update(); err != nil { return nil, err } else { return ut, nil } } func deleteTheme(theme fic.Theme, _ []byte) (interface{}, error) { return theme.Delete() }