192 lines
4.6 KiB
Go
192 lines
4.6 KiB
Go
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)
|
|
}
|