2016-12-08 08:12:18 +00:00
|
|
|
package api
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"errors"
|
2017-01-05 01:21:32 +00:00
|
|
|
"strings"
|
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/exercices/", apiHandler(listExercices))
|
|
|
|
|
|
|
|
router.GET("/api/exercices/:eid", apiHandler(exerciceHandler(showExercice)))
|
2016-12-26 00:14:46 +00:00
|
|
|
router.PUT("/api/exercices/:eid", apiHandler(exerciceHandler(updateExercice)))
|
|
|
|
router.DELETE("/api/exercices/:eid", apiHandler(exerciceHandler(deleteExercice)))
|
|
|
|
|
|
|
|
router.GET("/api/exercices/:eid/files", apiHandler(exerciceHandler(listExerciceFiles)))
|
|
|
|
router.POST("/api/exercices/:eid/files", apiHandler(exerciceHandler(createExerciceFile)))
|
2016-12-27 20:08:36 +00:00
|
|
|
router.GET("/api/exercices/:eid/files/:fid", apiHandler(fileHandler(showExerciceFile)))
|
|
|
|
router.DELETE("/api/exercices/:eid/files/:fid", apiHandler(fileHandler(deleteExerciceFile)))
|
2016-12-26 00:14:46 +00:00
|
|
|
|
|
|
|
router.GET("/api/exercices/:eid/hints", apiHandler(exerciceHandler(listExerciceHints)))
|
|
|
|
router.POST("/api/exercices/:eid/hints", apiHandler(exerciceHandler(createExerciceHint)))
|
2016-12-27 20:08:36 +00:00
|
|
|
router.GET("/api/exercices/:eid/hints/:hid", apiHandler(hintHandler(showExerciceHint)))
|
|
|
|
router.PUT("/api/exercices/:eid/hints/:hid", apiHandler(hintHandler(updateExerciceHint)))
|
|
|
|
router.DELETE("/api/exercices/:eid/hints/:hid", apiHandler(hintHandler(deleteExerciceHint)))
|
2016-12-26 00:14:46 +00:00
|
|
|
|
|
|
|
router.GET("/api/exercices/:eid/keys", apiHandler(exerciceHandler(listExerciceKeys)))
|
|
|
|
router.POST("/api/exercices/:eid/keys", apiHandler(exerciceHandler(createExerciceKey)))
|
2016-12-27 20:08:36 +00:00
|
|
|
router.GET("/api/exercices/:eid/keys/:kid", apiHandler(keyHandler(showExerciceKey)))
|
|
|
|
router.PUT("/api/exercices/:eid/keys/:kid", apiHandler(keyHandler(updateExerciceKey)))
|
|
|
|
router.DELETE("/api/exercices/:eid/keys/:kid", apiHandler(keyHandler(deleteExerciceKey)))
|
2016-12-08 08:12:18 +00:00
|
|
|
}
|
|
|
|
|
2016-12-15 23:51:56 +00:00
|
|
|
func listExercices(_ httprouter.Params, body []byte) (interface{}, error) {
|
2016-12-08 08:12:18 +00:00
|
|
|
// List all exercices
|
|
|
|
return fic.GetExercices()
|
|
|
|
}
|
|
|
|
|
2016-12-26 00:14:46 +00:00
|
|
|
func listExerciceFiles(exercice fic.Exercice, body []byte) (interface{}, error) {
|
|
|
|
return exercice.GetFiles()
|
2016-12-08 08:12:18 +00:00
|
|
|
}
|
|
|
|
|
2016-12-26 00:14:46 +00:00
|
|
|
func listExerciceHints(exercice fic.Exercice, body []byte) (interface{}, error) {
|
|
|
|
return exercice.GetHints()
|
2016-12-08 08:12:18 +00:00
|
|
|
}
|
|
|
|
|
2016-12-26 00:14:46 +00:00
|
|
|
func listExerciceKeys(exercice fic.Exercice, body []byte) (interface{}, error) {
|
|
|
|
return exercice.GetKeys()
|
2016-12-08 08:12:18 +00:00
|
|
|
}
|
|
|
|
|
2016-12-26 00:14:46 +00:00
|
|
|
func showExercice(exercice fic.Exercice, body []byte) (interface{}, error) {
|
|
|
|
return exercice, nil
|
|
|
|
}
|
2016-12-08 08:12:18 +00:00
|
|
|
|
2016-12-26 00:14:46 +00:00
|
|
|
func deleteExercice(exercice fic.Exercice, _ []byte) (interface{}, error) {
|
|
|
|
return exercice.Delete()
|
|
|
|
}
|
2016-12-08 08:12:18 +00:00
|
|
|
|
2016-12-26 00:14:46 +00:00
|
|
|
func updateExercice(exercice fic.Exercice, body []byte) (interface{}, error) {
|
|
|
|
var ue fic.Exercice
|
|
|
|
if err := json.Unmarshal(body, &ue); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2016-12-08 08:12:18 +00:00
|
|
|
|
2016-12-26 00:14:46 +00:00
|
|
|
ue.Id = exercice.Id
|
2016-12-08 08:12:18 +00:00
|
|
|
|
2016-12-26 00:14:46 +00:00
|
|
|
if len(ue.Title) == 0 {
|
|
|
|
return nil, errors.New("Exercice's title not filled")
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := ue.Update(); err != nil {
|
|
|
|
return nil, err
|
2016-12-08 08:12:18 +00:00
|
|
|
}
|
2016-12-26 00:14:46 +00:00
|
|
|
|
|
|
|
return ue, nil
|
2016-12-08 08:12:18 +00:00
|
|
|
}
|
|
|
|
|
2016-12-15 23:51:56 +00:00
|
|
|
func createExercice(theme fic.Theme, body []byte) (interface{}, error) {
|
2016-12-08 08:12:18 +00:00
|
|
|
// Create a new exercice
|
2016-12-26 00:14:46 +00:00
|
|
|
var ue fic.Exercice
|
2016-12-08 08:12:18 +00:00
|
|
|
if err := json.Unmarshal(body, &ue); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(ue.Title) == 0 {
|
|
|
|
return nil, errors.New("Title not filled")
|
|
|
|
}
|
|
|
|
|
|
|
|
var depend *fic.Exercice = nil
|
|
|
|
if ue.Depend != nil {
|
|
|
|
if d, err := fic.GetExercice(*ue.Depend); err != nil {
|
|
|
|
return nil, err
|
|
|
|
} else {
|
|
|
|
depend = &d
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return theme.AddExercice(ue.Title, ue.Statement, depend, ue.Gain, ue.VideoURI)
|
|
|
|
}
|
|
|
|
|
|
|
|
type uploadedKey struct {
|
2016-12-27 20:08:36 +00:00
|
|
|
Type string
|
2016-12-08 08:12:18 +00:00
|
|
|
Key string
|
|
|
|
}
|
|
|
|
|
2016-12-26 00:14:46 +00:00
|
|
|
func createExerciceKey(exercice fic.Exercice, body []byte) (interface{}, error) {
|
2016-12-08 08:12:18 +00:00
|
|
|
var uk uploadedKey
|
|
|
|
if err := json.Unmarshal(body, &uk); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(uk.Key) == 0 {
|
|
|
|
return nil, errors.New("Key not filled")
|
|
|
|
}
|
|
|
|
|
2016-12-27 20:08:36 +00:00
|
|
|
return exercice.AddRawKey(uk.Type, uk.Key)
|
2016-12-08 08:12:18 +00:00
|
|
|
}
|
2016-12-04 18:15:39 +00:00
|
|
|
|
2017-01-05 01:21:32 +00:00
|
|
|
type uploadedHint struct {
|
|
|
|
Title string
|
|
|
|
Content string
|
|
|
|
Cost int64
|
|
|
|
Path string
|
|
|
|
}
|
|
|
|
|
2016-12-26 00:14:46 +00:00
|
|
|
func createExerciceHint(exercice fic.Exercice, body []byte) (interface{}, error) {
|
2017-01-05 01:21:32 +00:00
|
|
|
var uh uploadedHint
|
2016-12-04 18:15:39 +00:00
|
|
|
if err := json.Unmarshal(body, &uh); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2017-01-05 01:21:32 +00:00
|
|
|
if len(uh.Content) != 0 {
|
|
|
|
return exercice.AddHint(uh.Title, uh.Content, uh.Cost)
|
|
|
|
} else if len(uh.Path) != 0 {
|
|
|
|
return importFile(uploadedFile{Path: uh.Path},
|
|
|
|
func(filePath string, origin string, digest []byte) (interface{}, error) {
|
|
|
|
return exercice.AddHint(uh.Title, "$FILES" + strings.TrimPrefix(filePath, fic.FilesDir), uh.Cost)
|
|
|
|
})
|
|
|
|
} else {
|
2016-12-04 18:15:39 +00:00
|
|
|
return nil, errors.New("Hint's content not filled")
|
|
|
|
}
|
|
|
|
}
|
2016-12-27 20:08:36 +00:00
|
|
|
|
|
|
|
func showExerciceHint(hint fic.EHint, body []byte) (interface{}, error) {
|
|
|
|
return hint, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func updateExerciceHint(hint fic.EHint, body []byte) (interface{}, error) {
|
|
|
|
var uh fic.EHint
|
|
|
|
if err := json.Unmarshal(body, &uh); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
uh.Id = hint.Id
|
|
|
|
|
|
|
|
if len(uh.Title) == 0 {
|
|
|
|
return nil, errors.New("Hint's title not filled")
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := uh.Update(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return uh, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func deleteExerciceHint(hint fic.EHint, _ []byte) (interface{}, error) {
|
|
|
|
return hint.Delete()
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func showExerciceKey(key fic.Key, _ fic.Exercice, body []byte) (interface{}, error) {
|
|
|
|
return key, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func updateExerciceKey(key fic.Key, exercice fic.Exercice, body []byte) (interface{}, error) {
|
|
|
|
var uk fic.Key
|
|
|
|
if err := json.Unmarshal(body, &uk); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
uk.Id = key.Id
|
|
|
|
uk.IdExercice = exercice.Id
|
|
|
|
|
|
|
|
if len(uk.Type) == 0 {
|
|
|
|
uk.Type = "Flag"
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := uk.Update(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return uk, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func deleteExerciceKey(key fic.Key, _ fic.Exercice, _ []byte) (interface{}, error) {
|
|
|
|
return key.Delete()
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-01-05 01:21:32 +00:00
|
|
|
func createExerciceFile(exercice fic.Exercice, body []byte) (interface{}, error) {
|
|
|
|
var uf uploadedFile
|
|
|
|
if err := json.Unmarshal(body, &uf); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return importFile(uf, exercice.ImportFile)
|
|
|
|
}
|
|
|
|
|
2016-12-27 20:08:36 +00:00
|
|
|
func showExerciceFile(file fic.EFile, body []byte) (interface{}, error) {
|
|
|
|
return file, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func deleteExerciceFile(file fic.EFile, _ []byte) (interface{}, error) {
|
|
|
|
return file.Delete()
|
|
|
|
}
|