From 24855a41151d1dff635e07a24550ceeec33a34a6 Mon Sep 17 00:00:00 2001 From: Victor Lacasse-Beaudoin Date: Mon, 18 Dec 2023 17:40:37 -0500 Subject: [PATCH] wip: ajouter `MediaClient.UploadFormFiles` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Une fois terminé, permettra de téléverser plusieurs documents à la fois dans un même bucket. Pour l'instant, est capable de recevoir des `[]*multipart.FileHeader` et de valider leur `Content-Type` selon une liste prédéfinie (pdf, markdown et plain text). Valide aussi que les pointeurs mémoires sont non-nil. Retourne `http.StatusCreated` ainsi que la liste des documents validés qui doivent être insérés. Le travail restant est écrit en commentaires TODO --- media/media.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/media/media.go b/media/media.go index b5cb765..7f295d4 100644 --- a/media/media.go +++ b/media/media.go @@ -3,6 +3,10 @@ package media import ( "context" "errors" + "fmt" + "mime" + "mime/multipart" + "net/http" "git.agecem.com/agecem/agecem-org/config" "github.com/minio/minio-go/v7" @@ -76,3 +80,57 @@ func (m *MediaClient) Seed() ([]string, error) { return new_buckets, nil } + +func (m *MediaClient) UploadFormFiles(fileHeaders []*multipart.FileHeader) (statusCode int, result string) { + switch count := len(fileHeaders); count { + case 0: + return http.StatusBadRequest, "Veuillez sélectionner au moins 1 document à téléverser" + case 1: + result = "Téléversement de 1 fichier\n" + default: + result = fmt.Sprintf("Téléversement de %d fichiers\n", count) + } + + var allowedMediaTypes = []string{"application/pdf", "text/markdown", "text/plain"} + + var fileNames []string + for _, fileHeader := range fileHeaders { + fileNames = append(fileNames, fileHeader.Filename) + } + + for i, fileHeader := range fileHeaders { + // Check for conflicting file names in upload + for j, fileName := range fileNames { + if fileName == fileHeader.Filename && i != j { + return http.StatusBadRequest, fmt.Sprintf("Doublon de nom de fichier '%s' trouvé, les noms de fichiers doivent être uniques", fileName) + } + } + + //TODO check for conflicting fileNames with existing files + + // Check media type + mediaType, _, err := mime.ParseMediaType(fileHeader.Header.Get("Content-Type")) + if err != nil { + return http.StatusBadRequest, fmt.Sprintf("Impossible de déterminer le type de fichier pour %d '%s'.\nPlus de détails: %s", i, fileHeader.Filename, err.Error()) + } + + var isAllowedMediaType bool + + for _, allowedMediaType := range allowedMediaTypes { + if allowedMediaType == mediaType { + isAllowedMediaType = true + } + } + + if !isAllowedMediaType { + return http.StatusBadRequest, fmt.Sprintf("Type de fichier interdit '%s' pour '%s'.\nTypes de fichiers permis: %s", mediaType, fileHeader.Filename, allowedMediaTypes) + } + + result = fmt.Sprintf("%sDocument %d '%s' est de type '%s'\n", + result, i, fileHeader.Filename, mediaType) + + //TODO Upload file + } + + return http.StatusCreated, result +}