81 lines
2.1 KiB
Go
81 lines
2.1 KiB
Go
// Code scaffolded by goctl. Safe to edit.
|
|
// goctl 1.9.2
|
|
|
|
package file
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/perfect-panel/server/internal/svc"
|
|
"github.com/perfect-panel/server/internal/types"
|
|
"github.com/perfect-panel/server/pkg/logger"
|
|
)
|
|
|
|
type FileUploadInitLogic struct {
|
|
logger.Logger
|
|
ctx context.Context
|
|
svcCtx *svc.ServiceContext
|
|
}
|
|
|
|
// Init file upload
|
|
func NewFileUploadInitLogic(ctx context.Context, svcCtx *svc.ServiceContext) *FileUploadInitLogic {
|
|
return &FileUploadInitLogic{
|
|
Logger: logger.WithContext(ctx),
|
|
ctx: ctx,
|
|
svcCtx: svcCtx,
|
|
}
|
|
}
|
|
|
|
func (l *FileUploadInitLogic) FileUploadInit(req *types.FileUploadInitRequest) (resp *types.FileUploadInitResponse, err error) {
|
|
u, err := currentUserFromContext(l.ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err := validateInitRequest(l.svcCtx, req.BizType, req.FileName, req.ContentType, req.Size); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
now := time.Now()
|
|
fileID := buildFileID(u.Id, req.BizType, req.FileName)
|
|
objectKey := buildObjectKey(l.svcCtx.Config.S3.Prefix, u.Id, req.BizType, fileID, req.FileName, now)
|
|
expireSeconds := l.svcCtx.Config.S3.PresignExpireSeconds
|
|
if expireSeconds <= 0 {
|
|
expireSeconds = 300
|
|
}
|
|
|
|
presigned, err := l.svcCtx.S3Store.PresignPutObject(l.ctx, objectKey, req.ContentType, time.Duration(expireSeconds)*time.Second)
|
|
if err != nil {
|
|
l.Errorw("presign put object failed", logger.Field("error", err.Error()), logger.Field("user_id", u.Id))
|
|
return nil, err
|
|
}
|
|
|
|
meta := &uploadMeta{
|
|
FileID: fileID,
|
|
UserID: u.Id,
|
|
BizType: req.BizType,
|
|
FileName: req.FileName,
|
|
ContentType: req.ContentType,
|
|
ObjectKey: objectKey,
|
|
Size: req.Size,
|
|
Sha256: req.Sha256,
|
|
Status: fileUploadInitStatus,
|
|
CreatedAt: now.Unix(),
|
|
}
|
|
if err := saveUploadMeta(l.ctx, l.svcCtx, meta, 24*time.Hour); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &types.FileUploadInitResponse{
|
|
FileId: fileID,
|
|
ObjectKey: objectKey,
|
|
UploadURL: presigned.URL,
|
|
Method: presigned.Method,
|
|
Headers: map[string]string{
|
|
"Content-Type": req.ContentType,
|
|
},
|
|
ExpiredAt: presigned.ExpiresAt,
|
|
}, nil
|
|
}
|