admin: display file dependancies and be able to remove them

This commit is contained in:
nemunaire 2019-07-21 23:46:23 +02:00
parent c8ece39cb2
commit 8131fda0e7
5 changed files with 93 additions and 3 deletions

View file

@ -3,6 +3,8 @@ package api
import (
"encoding/hex"
"encoding/json"
"errors"
"fmt"
"srs.epita.fr/fic-server/admin/sync"
"srs.epita.fr/fic-server/libfic"
@ -18,6 +20,8 @@ func init() {
router.PUT("/api/files/:fileid", apiHandler(fileHandler(updateFile)))
router.DELETE("/api/files/:fileid", apiHandler(fileHandler(deleteFile)))
router.DELETE("/api/files/:fileid/dependancies/:depid", apiHandler(fileDependancyHandler(deleteFileDep)))
router.GET("/api/exercices/:eid/files", apiHandler(exerciceHandler(listExerciceFiles)))
router.POST("/api/exercices/:eid/files", apiHandler(exerciceHandler(createExerciceFile)))
@ -35,13 +39,51 @@ func init() {
})))
}
type APIFile struct {
fic.EFile
Depends []fic.Flag `json:"depends,omitempty"`
}
func genFileList(in []fic.EFile, e error) (out []APIFile, err error) {
if e != nil {
return nil, e
}
for _, f := range in {
g := APIFile{EFile: f}
var deps []fic.Flag
deps, err = f.GetDepends()
if err != nil {
return
}
for _, d := range deps {
if k, ok := d.(fic.FlagKey); ok {
k, err = fic.GetFlagKey(k.Id)
if err != nil {
return
}
g.Depends = append(g.Depends, k)
} else {
err = errors.New(fmt.Sprintf("Unknown type %T to handle file dependancy", k))
return
}
}
out = append(out, g)
}
return
}
func listFiles(_ httprouter.Params, body []byte) (interface{}, error) {
// List all files
return fic.GetFiles()
return genFileList(fic.GetFiles())
}
func listExerciceFiles(exercice fic.Exercice, body []byte) (interface{}, error) {
return exercice.GetFiles()
return genFileList(exercice.GetFiles())
}
func clearFiles(_ httprouter.Params, _ []byte) (interface{}, error) {
@ -92,6 +134,10 @@ func deleteFile(file fic.EFile, _ []byte) (interface{}, error) {
return file.Delete()
}
func deleteFileDep(file fic.EFile, depid int64, _ []byte) (interface{}, error) {
return true, file.DeleteDepend(fic.FlagKey{Id: depid})
}
func checkFile(file fic.EFile, _ []byte) (interface{}, error) {
return true, file.CheckFileOnDisk()
}

View file

@ -316,6 +316,18 @@ func fileHandler(f func(fic.EFile, []byte) (interface{}, error)) func(httprouter
}
}
func fileDependancyHandler(f func(fic.EFile, int64, []byte) (interface{}, error)) func(httprouter.Params, []byte) (interface{}, error) {
return func(ps httprouter.Params, body []byte) (interface{}, error) {
if depid, err := strconv.ParseInt(string(ps.ByName("depid")), 10, 64); err != nil {
return nil, err
} else {
return fileHandler(func(file fic.EFile, b []byte) (interface{}, error) {
return f(file, depid, b)
})(ps, body)
}
}
}
func certificateHandler(f func(fic.Certificate, []byte) (interface{}, error)) func(httprouter.Params, []byte) (interface{}, error) {
return func(ps httprouter.Params, body []byte) (interface{}, error) {
if certid, err := strconv.ParseUint(strings.TrimSuffix(string(ps.ByName("certid")), ".p12"), 10, 64); err != nil {