75 lines
1.7 KiB
Go
75 lines
1.7 KiB
Go
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
|
|
}
|