admin: display file dependancies and be able to remove them
This commit is contained in:
parent
c8ece39cb2
commit
8131fda0e7
5 changed files with 93 additions and 3 deletions
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Reference in a new issue