storer/internal/controllers/http_controllers/quiz_files/quiz_files.go

192 lines
4.6 KiB
Go
Raw Normal View History

2025-04-17 12:44:25 +00:00
package quiz_files
2024-02-19 18:09:39 +00:00
import (
"errors"
2025-04-17 12:44:25 +00:00
"gitea.pena/SQuiz/common/dal"
mw "gitea.pena/SQuiz/common/middleware"
"gitea.pena/SQuiz/storer/internal/repository"
2024-02-19 18:09:39 +00:00
"github.com/gofiber/fiber/v2"
2025-04-17 12:44:25 +00:00
"github.com/rs/xid"
2024-02-19 18:09:39 +00:00
"io"
"strconv"
"sync"
)
2025-04-17 12:44:25 +00:00
type QuizFiles struct {
stDal *repository.S3
pgDal *dal.DAL
2024-02-19 18:09:39 +00:00
}
2025-04-17 12:44:25 +00:00
func New(stDal *repository.S3, pgDal *dal.DAL) *QuizFiles {
return &QuizFiles{
stDal: stDal,
pgDal: pgDal,
2024-02-19 18:09:39 +00:00
}
}
2025-04-17 12:44:25 +00:00
func (r *QuizFiles) UploadCustom(c *fiber.Ctx) error {
2024-02-19 18:09:39 +00:00
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())
}
2025-04-17 12:44:25 +00:00
quiz, err := r.pgDal.QuizRepo.GetQuizById(c.Context(), accountId, uint64(squizId))
2024-02-19 18:09:39 +00:00
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()
2025-04-17 12:44:25 +00:00
if err := r.stDal.UploadScript(c.Context(), quiz.Qid, file, fileHeader.Size); err != nil {
2024-02-19 18:09:39 +00:00
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()
2025-04-17 12:44:25 +00:00
if err := r.stDal.UploadStyle(c.Context(), quiz.Qid, file, fileHeader.Size); err != nil {
2024-02-19 18:09:39 +00:00
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()
2025-04-17 12:44:25 +00:00
if errorsFontUploading := r.stDal.UploadFonts(c.Context(), quiz.Qid, files, sizes); err != nil {
2024-02-19 18:09:39 +00:00
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)
}
2025-04-17 12:44:25 +00:00
func (r *QuizFiles) UploadImages(c *fiber.Ctx) error {
2024-02-19 18:09:39 +00:00
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())
}
2025-04-17 12:44:25 +00:00
quiz, err := r.pgDal.QuizRepo.GetQuizById(c.Context(), accountId, uint64(squizId))
2024-02-19 18:09:39 +00:00
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()
}
2025-04-17 12:44:25 +00:00
if err := r.stDal.UploadImages(c.Context(), quiz.Qid, files, sizes); err != nil {
2024-02-19 18:09:39 +00:00
errs = append(errs, err...)
}
}
if len(errs) > 0 {
return c.Status(fiber.StatusInternalServerError).JSON(errs)
}
return c.Status(fiber.StatusOK).JSON(imgids)
}