Files
hi-server/internal/logic/public/file/fileuploadcompletelogic.go
T

72 lines
2.0 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"
"github.com/perfect-panel/server/pkg/xerr"
"github.com/pkg/errors"
)
type FileUploadCompleteLogic struct {
logger.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
// Complete file upload
func NewFileUploadCompleteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *FileUploadCompleteLogic {
return &FileUploadCompleteLogic{
Logger: logger.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *FileUploadCompleteLogic) FileUploadComplete(req *types.FileUploadCompleteRequest) (resp *types.FileUploadCompleteResponse, err error) {
u, err := currentUserFromContext(l.ctx)
if err != nil {
return nil, err
}
meta, err := loadUploadMeta(l.ctx, l.svcCtx, req.FileId)
if err != nil {
return nil, err
}
if meta.UserID != u.Id {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.InvalidAccess), "Invalid Access")
}
head, err := l.svcCtx.S3Store.HeadObject(l.ctx, meta.ObjectKey)
if err != nil {
l.Errorw("head object failed", logger.Field("error", err.Error()), logger.Field("file_id", meta.FileID))
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "uploaded file not found")
}
if meta.Size > 0 && head.ContentLength != meta.Size {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.InvalidParams), "uploaded file size mismatch")
}
meta.Status = fileUploadCompleteStatus
meta.Etag = head.ETag
meta.ContentType = head.ContentType
meta.CompletedAt = time.Now().Unix()
if err := saveUploadMeta(l.ctx, l.svcCtx, meta, 7*24*time.Hour); err != nil {
return nil, err
}
return &types.FileUploadCompleteResponse{
FileId: meta.FileID,
ObjectKey: meta.ObjectKey,
Size: head.ContentLength,
ContentType: head.ContentType,
Etag: head.ETag,
Status: meta.Status,
}, nil
}