package medias import ( "mime/multipart" "time" "backend/app/http/storages" "backend/app/http/tenants" "backend/database/models/qvyun_v2/public/model" "backend/pkg/storage" "backend/providers/jwt" "github.com/gofiber/fiber/v3" log "github.com/sirupsen/logrus" ) // @provider type Controller struct { tenantSvc *tenants.Service svc *Service storageSvc *storages.Service log *log.Entry `inject:"false"` } func (ctl *Controller) Prepare() error { ctl.log = log.WithField("module", "medias.Controller") return nil } // Upload // @Router /api/v1/medias/:tenant/upload [post] // @Bind req body // @Bind file file // @Bind claim local func (ctl *Controller) Upload(ctx fiber.Ctx, claim *jwt.Claims, file *multipart.FileHeader, req *UploadReq) (*storage.UploadedFile, error) { uploader, err := storage.NewUploader(req.FileName, req.ChunkNumber, req.TotalChunks, req.FileMD5) if err != nil { return nil, err } defaultStorage, err := ctl.storageSvc.GetDefault(ctx.Context()) if err != nil { return nil, err } fs, err := ctl.storageSvc.BuildFS(defaultStorage) if err != nil { return nil, err } uploadedFile, err := uploader.Save(ctx, fs, file) if err != nil { return nil, err } if uploadedFile == nil { return uploadedFile, nil } // save to db userMediaID, err := ctl.svc.Create(ctx.Context(), *claim.TenantID, claim.UserID, &model.Medias{ CreatedAt: time.Now(), StorageID: defaultStorage.ID, Hash: uploadedFile.Hash, Name: uploadedFile.Name, MimeType: uploadedFile.MimeType, Size: uploadedFile.Size, Path: uploadedFile.Path, }) uploadedFile.ID = userMediaID uploadedFile.Preview = "" return uploadedFile, err }