2016-12-08 08:12:18 +00:00
|
|
|
package api
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"strconv"
|
|
|
|
|
2017-12-08 20:01:42 +00:00
|
|
|
"srs.epita.fr/fic-server/admin/sync"
|
2016-12-08 08:12:18 +00:00
|
|
|
"srs.epita.fr/fic-server/libfic"
|
2016-12-15 23:51:56 +00:00
|
|
|
|
|
|
|
"github.com/julienschmidt/httprouter"
|
2016-12-08 08:12:18 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
2016-12-15 23:51:56 +00:00
|
|
|
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)))
|
2016-12-08 08:12:18 +00:00
|
|
|
|
2016-12-15 23:51:56 +00:00
|
|
|
router.GET("/api/themes/:thid/exercices", apiHandler(themeHandler(listThemedExercices)))
|
|
|
|
router.POST("/api/themes/:thid/exercices", apiHandler(themeHandler(createExercice)))
|
2016-12-08 08:12:18 +00:00
|
|
|
|
2016-12-26 00:14:46 +00:00
|
|
|
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)))
|
2016-12-08 08:12:18 +00:00
|
|
|
|
|
|
|
|
2016-12-26 00:14:46 +00:00
|
|
|
router.GET("/api/themes/:thid/exercices/:eid/files", apiHandler(exerciceHandler(listExerciceFiles)))
|
|
|
|
router.POST("/api/themes/:thid/exercices/:eid/files", apiHandler(exerciceHandler(createExerciceFile)))
|
2016-12-08 08:12:18 +00:00
|
|
|
|
2016-12-26 00:14:46 +00:00
|
|
|
router.GET("/api/themes/:thid/exercices/:eid/hints", apiHandler(exerciceHandler(listExerciceHints)))
|
|
|
|
router.POST("/api/themes/:thid/exercices/:eid/hints", apiHandler(exerciceHandler(createExerciceHint)))
|
2016-12-04 18:15:39 +00:00
|
|
|
|
2016-12-26 00:14:46 +00:00
|
|
|
router.GET("/api/themes/:thid/exercices/:eid/keys", apiHandler(exerciceHandler(listExerciceKeys)))
|
|
|
|
router.POST("/api/themes/:thid/exercices/:eid/keys", apiHandler(exerciceHandler(createExerciceKey)))
|
2017-12-08 20:01:42 +00:00
|
|
|
|
|
|
|
// Remote
|
|
|
|
router.GET("/api/remote/themes", apiHandler(sync.ApiListRemoteThemes))
|
2017-12-09 00:21:58 +00:00
|
|
|
router.GET("/api/remote/themes/:thid", apiHandler(sync.ApiGetRemoteTheme))
|
|
|
|
router.GET("/api/remote/themes/:thid/exercices", apiHandler(themeHandler(sync.ApiListRemoteExercices)))
|
2017-12-08 20:01:42 +00:00
|
|
|
|
|
|
|
// Synchronize
|
2018-01-06 14:08:05 +00:00
|
|
|
router.POST("/api/sync/deep", apiHandler(
|
2017-12-09 09:54:16 +00:00
|
|
|
func(_ httprouter.Params, _ []byte) (interface{}, error) { return sync.SyncDeep(sync.GlobalImporter), nil }))
|
2018-01-06 14:08:05 +00:00
|
|
|
router.POST("/api/sync/themes", apiHandler(
|
2017-12-08 20:01:42 +00:00
|
|
|
func(_ httprouter.Params, _ []byte) (interface{}, error) { return sync.SyncThemes(sync.GlobalImporter), nil }))
|
2018-01-06 14:08:05 +00:00
|
|
|
router.POST("/api/sync/themes/:thid/exercices", apiHandler(themeHandler(
|
2017-12-09 00:21:58 +00:00
|
|
|
func(theme fic.Theme, _ []byte) (interface{}, error) { return sync.SyncExercices(sync.GlobalImporter, theme), nil })))
|
2018-01-06 14:08:05 +00:00
|
|
|
router.POST("/api/sync/themes/:thid/exercices/:eid/files", apiHandler(exerciceHandler(
|
2017-12-09 00:21:58 +00:00
|
|
|
func(exercice fic.Exercice, _ []byte) (interface{}, error) { return sync.SyncExerciceFiles(sync.GlobalImporter, exercice), nil })))
|
2018-01-06 14:08:05 +00:00
|
|
|
router.POST("/api/sync/themes/:thid/exercices/:eid/hints", apiHandler(exerciceHandler(
|
2017-12-09 00:21:58 +00:00
|
|
|
func(exercice fic.Exercice, _ []byte) (interface{}, error) { return sync.SyncExerciceHints(sync.GlobalImporter, exercice), nil })))
|
2018-01-06 14:08:05 +00:00
|
|
|
router.POST("/api/sync/themes/:thid/exercices/:eid/keys", apiHandler(exerciceHandler(
|
2017-12-09 00:21:58 +00:00
|
|
|
func(exercice fic.Exercice, _ []byte) (interface{}, error) { return sync.SyncExerciceKeys(sync.GlobalImporter, exercice), nil })))
|
2018-01-06 14:08:05 +00:00
|
|
|
router.POST("/api/sync/themes/:thid/exercices/:eid/quiz", apiHandler(exerciceHandler(
|
2017-12-16 02:39:57 +00:00
|
|
|
func(exercice fic.Exercice, _ []byte) (interface{}, error) { return sync.SyncExerciceMCQ(sync.GlobalImporter, exercice), nil })))
|
2016-12-08 08:12:18 +00:00
|
|
|
}
|
|
|
|
|
2016-12-15 23:51:56 +00:00
|
|
|
func bindingFiles(_ httprouter.Params, body []byte) (interface{}, error) {
|
2016-12-08 08:12:18 +00:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-15 23:51:56 +00:00
|
|
|
func listThemes(_ httprouter.Params, _ []byte) (interface{}, error) {
|
2016-12-08 08:12:18 +00:00
|
|
|
return fic.GetThemes()
|
|
|
|
}
|
|
|
|
|
2016-12-15 23:51:56 +00:00
|
|
|
func exportThemes(_ httprouter.Params, _ []byte) (interface{}, error) {
|
2016-12-08 08:12:18 +00:00
|
|
|
return fic.ExportThemes()
|
|
|
|
}
|
|
|
|
|
2016-12-15 23:51:56 +00:00
|
|
|
func showTheme(theme fic.Theme, _ []byte) (interface{}, error) {
|
2016-12-08 08:12:18 +00:00
|
|
|
return theme, nil
|
|
|
|
}
|
|
|
|
|
2016-12-15 23:51:56 +00:00
|
|
|
func listThemedExercices(theme fic.Theme, _ []byte) (interface{}, error) {
|
2016-12-08 08:12:18 +00:00
|
|
|
return theme.GetExercices()
|
|
|
|
}
|
|
|
|
|
2016-12-15 23:51:56 +00:00
|
|
|
func showThemedExercice(theme fic.Theme, exercice fic.Exercice, body []byte) (interface{}, error) {
|
2016-12-08 08:12:18 +00:00
|
|
|
return exercice, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type uploadedTheme struct {
|
|
|
|
Name string
|
2018-01-18 10:07:50 +00:00
|
|
|
URLId string
|
2016-12-08 08:12:18 +00:00
|
|
|
Authors string
|
2017-12-21 21:17:41 +00:00
|
|
|
Intro string
|
2016-12-08 08:12:18 +00:00
|
|
|
}
|
|
|
|
|
2016-12-15 23:51:56 +00:00
|
|
|
func createTheme(_ httprouter.Params, body []byte) (interface{}, error) {
|
2016-12-08 08:12:18 +00:00
|
|
|
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")
|
|
|
|
}
|
|
|
|
|
2018-01-18 10:07:50 +00:00
|
|
|
return fic.CreateTheme(ut.Name, ut.URLId, ut.Authors, ut.Intro)
|
2016-12-08 08:12:18 +00:00
|
|
|
}
|
|
|
|
|
2016-12-15 23:51:56 +00:00
|
|
|
func updateTheme(theme fic.Theme, body []byte) (interface{}, error) {
|
2016-12-08 08:12:18 +00:00
|
|
|
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")
|
|
|
|
}
|
|
|
|
|
2016-12-26 00:14:46 +00:00
|
|
|
if _, err := ut.Update(); err != nil {
|
2016-12-08 08:12:18 +00:00
|
|
|
return nil, err
|
2016-12-26 00:14:46 +00:00
|
|
|
} else {
|
|
|
|
return ut, nil
|
2016-12-08 08:12:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-15 23:51:56 +00:00
|
|
|
func deleteTheme(theme fic.Theme, _ []byte) (interface{}, error) {
|
2016-12-08 08:12:18 +00:00
|
|
|
return theme.Delete()
|
|
|
|
}
|