Files
qvyun/backend/app/http/medias/controller.go
2025-01-21 11:22:22 +08:00

75 lines
1.7 KiB
Go

package medias
import (
"mime/multipart"
"time"
"backend/app/http/storages"
"backend/app/http/tenants"
"backend/database/schemas/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
}