package quiz_files import ( "errors" "gitea.pena/SQuiz/common/dal" mw "gitea.pena/SQuiz/common/middleware" "gitea.pena/SQuiz/storer/internal/repository" "github.com/gofiber/fiber/v2" "github.com/rs/xid" "io" "strconv" "sync" ) type QuizFiles struct { stDal *repository.S3 pgDal *dal.DAL } func New(stDal *repository.S3, pgDal *dal.DAL) *QuizFiles { return &QuizFiles{ stDal: stDal, pgDal: pgDal, } } func (r *QuizFiles) UploadCustom(c *fiber.Ctx) error { accountId, ok := mw.GetAccountId(c) if !ok { return nil } // Check valid file form, err := c.MultipartForm() if err != nil || form == nil || form.File == nil { return c.Status(fiber.StatusBadRequest).SendString("expecting multipart form file") } squizIdStr := form.Value["quiz"] if len(squizIdStr) == 0 { return c.Status(fiber.StatusFailedDependency).SendString("no quiz id provided") } squizId, err := strconv.ParseInt(squizIdStr[0], 10, 64) if err != nil { return c.Status(fiber.StatusBadRequest).SendString("not valid quiz id provided " + err.Error()) } quiz, err := r.pgDal.QuizRepo.GetQuizById(c.Context(), accountId, uint64(squizId)) if err != nil { return c.Status(fiber.StatusNotAcceptable).SendString("not exists quiz id provided " + err.Error()) } var ( wg sync.WaitGroup errm sync.Mutex errs []error ) if len(form.File["script"]) >= 1 { wg.Add(1) go func() { defer wg.Done() fileHeader := form.File["script"][0] file, err := fileHeader.Open() if err != nil { errm.Lock() defer errm.Unlock() errs = append(errs, errors.New(err.Error()+" => script read")) return } defer file.Close() if err := r.stDal.UploadScript(c.Context(), quiz.Qid, file, fileHeader.Size); err != nil { errm.Lock() defer errm.Unlock() errs = append(errs, errors.New(err.Error()+" => script upload")) } }() } if len(form.File["style"]) >= 1 { wg.Add(1) go func() { defer wg.Done() fileHeader := form.File["style"][0] file, err := fileHeader.Open() if err != nil { errm.Lock() defer errm.Unlock() errs = append(errs, errors.New(err.Error()+" => style read")) return } defer file.Close() if err := r.stDal.UploadStyle(c.Context(), quiz.Qid, file, fileHeader.Size); err != nil { errm.Lock() defer errm.Unlock() errs = append(errs, errors.New(err.Error()+" => style upload")) } }() } if len(form.File["fonts"]) >= 1 { files, sizes := map[string]io.Reader{}, map[string]int64{} for _, fileHeader := range form.File["fonts"] { file, err := fileHeader.Open() if err != nil { errm.Lock() errs = append(errs, errors.New(err.Error()+" => fonts read")) errm.Unlock() } files[fileHeader.Filename] = file sizes[fileHeader.Filename] = fileHeader.Size } wg.Add(1) go func() { defer wg.Done() if errorsFontUploading := r.stDal.UploadFonts(c.Context(), quiz.Qid, files, sizes); err != nil { errm.Lock() defer errm.Unlock() errs = append(errs, errorsFontUploading...) } }() } wg.Wait() if len(errs) > 0 { return c.Status(fiber.StatusInternalServerError).JSON(errs) } return c.SendStatus(fiber.StatusOK) } func (r *QuizFiles) UploadImages(c *fiber.Ctx) error { accountId, ok := mw.GetAccountId(c) if !ok { return nil } // Check valid file form, err := c.MultipartForm() if err != nil || form == nil || form.File == nil { return c.Status(fiber.StatusBadRequest).SendString("expecting multipart form file") } squizIdStr := form.Value["quiz"] if len(squizIdStr) == 0 { return c.Status(fiber.StatusFailedDependency).SendString("no quiz id provided") } squizId, err := strconv.ParseInt(squizIdStr[0], 10, 64) if err != nil { return c.Status(fiber.StatusBadRequest).SendString("not valid quiz id provided " + err.Error()) } quiz, err := r.pgDal.QuizRepo.GetQuizById(c.Context(), accountId, uint64(squizId)) if err != nil { return c.Status(fiber.StatusNotAcceptable).SendString("not exists quiz id provided " + err.Error()) } var errs []error imgids := make(map[string]string) if len(form.File["image"]) >= 1 { files, sizes := make(map[string]io.Reader), make(map[string]int64) for _, imgFile := range form.File["image"] { f, err := imgFile.Open() if err != nil { errs = append(errs, errors.New(err.Error()+" => imgs read")) continue } fname := xid.New().String() files[fname] = f sizes[fname] = imgFile.Size imgids[imgFile.Filename] = fname defer f.Close() } if err := r.stDal.UploadImages(c.Context(), quiz.Qid, files, sizes); err != nil { errs = append(errs, err...) } } if len(errs) > 0 { return c.Status(fiber.StatusInternalServerError).JSON(errs) } return c.Status(fiber.StatusOK).JSON(imgids) }