diff --git a/admin/api/export.go b/admin/api/export.go index 32f43e79..aa24920a 100644 --- a/admin/api/export.go +++ b/admin/api/export.go @@ -3,9 +3,12 @@ package api import ( "archive/zip" "encoding/json" + "io" + "log" "net/http" "path" + "srs.epita.fr/fic-server/admin/sync" "srs.epita.fr/fic-server/libfic" "srs.epita.fr/fic-server/settings" @@ -59,6 +62,41 @@ func declareExportRoutes(router *gin.RouterGroup) { json.NewEncoder(f).Encode(challengeinfo) } + // Include partners' logos from challenge.json + if sync.GlobalImporter != nil { + if len(challengeinfo.MainLogo) > 0 { + for _, logo := range challengeinfo.MainLogo { + fd, closer, err := sync.OpenOrGetFile(sync.GlobalImporter, logo) + if err != nil { + log.Printf("Unable to archive main logo %q: %s", logo, err.Error()) + continue + } + + f, err := w.Create(path.Join("logo", path.Base(logo))) + if err == nil { + io.Copy(f, fd) + } + closer() + } + } + + if len(challengeinfo.Partners) > 0 { + for _, partner := range challengeinfo.Partners { + fd, closer, err := sync.OpenOrGetFile(sync.GlobalImporter, partner.Src) + if err != nil { + log.Printf("Unable to archive partner logo %q: %s", partner.Src, err.Error()) + continue + } + + f, err := w.Create(path.Join("partner", path.Base(partner.Src))) + if err == nil { + io.Copy(f, fd) + } + closer() + } + } + } + // my.json f, err = w.Create("my.json") if err == nil { diff --git a/admin/sync/file.go b/admin/sync/file.go index 59b1ec6e..39dc11e2 100644 --- a/admin/sync/file.go +++ b/admin/sync/file.go @@ -238,3 +238,21 @@ func WriteFileContent(i Importer, URI string, content []byte) error { return fmt.Errorf("%t is not capable of writing", i) } } + +func OpenOrGetFile(i Importer, URI string) (fd io.Reader, closer func() error, err error) { + if strings.HasPrefix(URI, "$FILES$") { + var fdc io.ReadCloser + fdc, err = os.Open(path.Join(fic.FilesDir, strings.TrimPrefix(URI, "$FILES$/"))) + fd = fdc + closer = fdc.Close + } else { + fd, err = GlobalImporter.GetFile(URI) + if fdcloser, ok := fd.(io.ReadCloser); ok { + closer = fdcloser.Close + } else { + closer = func() error { return nil } + } + } + + return +}