2016-12-08 08:12:18 +00:00
|
|
|
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))))
|
|
|
|
|
2016-12-04 18:15:39 +00:00
|
|
|
rteh := rte.Path("/hints").Subrouter()
|
|
|
|
rteh.Methods("GET").HandlerFunc(apiHandler(themeHandler(themedExerciceHandler(listThemedExerciceHints))))
|
|
|
|
rteh.Methods("POST").HandlerFunc(apiHandler(themeHandler(themedExerciceHandler(createExerciceHint))))
|
|
|
|
|
2016-12-08 08:12:18 +00:00
|
|
|
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()
|
|
|
|
}
|
|
|
|
|
2016-12-04 18:15:39 +00:00
|
|
|
func listThemedExerciceHints(theme fic.Theme, exercice fic.Exercice, args map[string]string, body []byte) (interface{}, error) {
|
|
|
|
return exercice.GetHints()
|
|
|
|
}
|
|
|
|
|
2016-12-08 08:12:18 +00:00
|
|
|
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()
|
|
|
|
}
|