From 11a12e1d44ebb7c0e87edef8e9a14636a942bba1 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Mon, 6 Jun 2022 20:42:46 +0200 Subject: [PATCH] Import logos from challenge.json --- admin/api/settings.go | 30 +++++++++------ admin/sync/challengeinfo.go | 38 +++++++++++++++++++ admin/sync/file.go | 34 ++++++++++------- frontend/ui/src/components/Header.svelte | 2 +- .../ui/src/components/HeaderPartners.svelte | 4 +- 5 files changed, 81 insertions(+), 27 deletions(-) create mode 100644 admin/sync/challengeinfo.go diff --git a/admin/api/settings.go b/admin/api/settings.go index ce2ab503..0a182c73 100644 --- a/admin/api/settings.go +++ b/admin/api/settings.go @@ -118,7 +118,6 @@ func GetChallengeInfo() (*settings.ChallengeInfo, error) { func getChallengeInfo(c *gin.Context) { if s, err := GetChallengeInfo(); err != nil { c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": err.Error()}) - } else { c.JSON(http.StatusOK, s) } @@ -132,17 +131,26 @@ func saveChallengeInfo(c *gin.Context) { return } - jenc, err := json.Marshal(info) - if err != nil { - c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": err.Error()}) - return - } + if sync.GlobalImporter != nil { + jenc, err := json.Marshal(info) + if err != nil { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": err.Error()}) + return + } - err = sync.WriteFileContent(sync.GlobalImporter, "challenge.json", jenc) - if err != nil { - log.Println("Unable to SaveChallengeInfo:", err.Error()) - c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": fmt.Sprintf("Unable to save challenge info: %s", err.Error())}) - return + err = sync.WriteFileContent(sync.GlobalImporter, "challenge.json", jenc) + if err != nil { + log.Println("Unable to SaveChallengeInfo:", err.Error()) + c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": fmt.Sprintf("Unable to save challenge info: %s", err.Error())}) + return + } + + err = sync.ImportChallengeInfo(info) + if err != nil { + log.Println("Unable to ImportChallengeInfo:", err.Error()) + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": fmt.Sprintf("Something goes wrong when trying to import related files: %s", err.Error())}) + return + } } if err := settings.SaveChallengeInfo(path.Join(settings.SettingsDir, settings.ChallengeFile), info); err != nil { diff --git a/admin/sync/challengeinfo.go b/admin/sync/challengeinfo.go new file mode 100644 index 00000000..436756e8 --- /dev/null +++ b/admin/sync/challengeinfo.go @@ -0,0 +1,38 @@ +package sync + +import ( + "path" + "strings" + + "srs.epita.fr/fic-server/libfic" + "srs.epita.fr/fic-server/settings" +) + +// ImportChallengeInfo imports images defined in the challengeinfo. +func ImportChallengeInfo(ci *settings.ChallengeInfo) (err error) { + if len(ci.MainLogo) > 0 { + for i, logo := range ci.MainLogo { + dest := path.Join(fic.FilesDir, "logo", path.Base(logo)) + err = importFile(GlobalImporter, logo, dest) + if err != nil { + return + } + + ci.MainLogo[i] = path.Join("$FILES$", strings.TrimPrefix(dest, fic.FilesDir)) + } + } + + if len(ci.Partners) > 0 { + for i, partner := range ci.Partners { + dest := path.Join(fic.FilesDir, "partner", path.Base(partner.Src)) + err = importFile(GlobalImporter, partner.Src, dest) + if err != nil { + return + } + + ci.Partners[i].Src = path.Join("$FILES$", strings.TrimPrefix(dest, fic.FilesDir)) + } + } + + return nil +} diff --git a/admin/sync/file.go b/admin/sync/file.go index b8c60d1c..6f067170 100644 --- a/admin/sync/file.go +++ b/admin/sync/file.go @@ -165,6 +165,26 @@ func getDestinationFilePath(URI string) string { return path.Join(fic.FilesDir, strings.ToLower(base32.StdEncoding.WithPadding(base32.NoPadding).EncodeToString(hash[:])), path.Base(URI)) } +func importFile(i Importer, URI string, dest string) error { + if err := os.MkdirAll(path.Dir(dest), 0755); err != nil { + return err + } + + // Write file + if fdto, err := os.Create(dest); err != nil { + return err + } else { + defer fdto.Close() + writer := bufio.NewWriter(fdto) + if err := GetFile(i, URI, writer); err != nil { + os.Remove(dest) + return err + } + } + + return nil +} + // ImportFile imports the file at the given URI, using helpers of the given Importer. // After import, next is called with relative path where the file has been saved and the original URI. func ImportFile(i Importer, URI string, next func(string, string) (interface{}, error)) (interface{}, error) { @@ -177,22 +197,10 @@ func ImportFile(i Importer, URI string, next func(string, string) (interface{}, } } - if err := os.MkdirAll(path.Dir(dest), 0755); err != nil { + if err := importFile(i, URI, dest); err != nil { return nil, err } - // Write file - if fdto, err := os.Create(dest); err != nil { - return nil, err - } else { - defer fdto.Close() - writer := bufio.NewWriter(fdto) - if err := GetFile(i, URI, writer); err != nil { - os.Remove(dest) - return nil, err - } - } - return next(dest, URI) } diff --git a/frontend/ui/src/components/Header.svelte b/frontend/ui/src/components/Header.svelte index 081bc70f..16056708 100644 --- a/frontend/ui/src/components/Header.svelte +++ b/frontend/ui/src/components/Header.svelte @@ -45,7 +45,7 @@ {#if $challengeInfo && $challengeInfo.main_logo} {#each $challengeInfo.main_logo as logo, i} - {'Logo 0?' d-none d-md-inline ms-2':'')}> + {'Logo 0?' d-none d-md-inline ms-2':'')}> {/each} {/if} diff --git a/frontend/ui/src/components/HeaderPartners.svelte b/frontend/ui/src/components/HeaderPartners.svelte index b1c6749f..ab4bfd7f 100644 --- a/frontend/ui/src/components/HeaderPartners.svelte +++ b/frontend/ui/src/components/HeaderPartners.svelte @@ -16,10 +16,10 @@ {#if partner.href} - {partner.alt} + {partner.alt} {:else} - {partner.alt} + {partner.alt} {/if} {/each}