[server] Support for reporting preview video
This commit is contained in:
@@ -54,3 +54,13 @@ func (r PutFileDataRequest) S3FileMetadataObjectKey(ownerID int64) string {
|
||||
}
|
||||
panic(fmt.Sprintf("S3FileMetadata should not be written for %s type", r.Type))
|
||||
}
|
||||
|
||||
func (r PutFileDataRequest) S3FileObjectKey(ownerID int64) string {
|
||||
if r.Type == ente.PreviewVideo {
|
||||
return previewVideoPath(r.FileID, ownerID)
|
||||
}
|
||||
if r.Type == ente.PreviewImage {
|
||||
return previewImagePath(r.FileID, ownerID)
|
||||
}
|
||||
panic(fmt.Sprintf("S3FileObjectKey should not be written for %s type", r.Type))
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ import (
|
||||
"github.com/ente-io/stacktrace"
|
||||
"github.com/gin-gonic/gin"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"strings"
|
||||
"sync"
|
||||
gTime "time"
|
||||
)
|
||||
@@ -87,10 +88,21 @@ func (c *Controller) InsertOrUpdate(ctx *gin.Context, req *fileData.PutFileDataR
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "")
|
||||
}
|
||||
if req.Type != ente.DerivedMeta {
|
||||
if req.Type != ente.DerivedMeta && req.Type != ente.PreviewVideo {
|
||||
return stacktrace.Propagate(ente.NewBadRequestWithMessage("unsupported object type "+string(req.Type)), "")
|
||||
}
|
||||
fileOwnerID := userID
|
||||
bucketID := c.S3Config.GetBucketID(req.Type)
|
||||
if req.Type == ente.PreviewVideo {
|
||||
fileObjectKey := req.S3FileObjectKey(fileOwnerID)
|
||||
if !strings.Contains(*req.ObjectKey, fileObjectKey) {
|
||||
return stacktrace.Propagate(ente.NewBadRequestWithMessage("objectKey should contain the file object key"), "")
|
||||
}
|
||||
err = c.copyObject(*req.ObjectKey, fileObjectKey, bucketID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
objectKey := req.S3FileMetadataObjectKey(fileOwnerID)
|
||||
obj := fileData.S3FileMetadata{
|
||||
Version: *req.Version,
|
||||
@@ -98,12 +110,13 @@ func (c *Controller) InsertOrUpdate(ctx *gin.Context, req *fileData.PutFileDataR
|
||||
DecryptionHeader: *req.DecryptionHeader,
|
||||
Client: network.GetClientInfo(ctx),
|
||||
}
|
||||
bucketID := c.S3Config.GetBucketID(req.Type)
|
||||
|
||||
size, uploadErr := c.uploadObject(obj, objectKey, bucketID)
|
||||
if uploadErr != nil {
|
||||
log.Error(uploadErr)
|
||||
return stacktrace.Propagate(uploadErr, "")
|
||||
}
|
||||
|
||||
row := fileData.Row{
|
||||
FileID: req.FileID,
|
||||
Type: req.Type,
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/aws/aws-sdk-go/aws"
|
||||
"github.com/aws/aws-sdk-go/service/s3"
|
||||
"github.com/aws/aws-sdk-go/service/s3/s3manager"
|
||||
@@ -90,3 +91,22 @@ func (c *Controller) uploadObject(obj fileData.S3FileMetadata, objectKey string,
|
||||
log.Infof("Uploaded to bucket %s", result.Location)
|
||||
return int64(len(embeddingObj)), nil
|
||||
}
|
||||
|
||||
// copyObject copies the object from srcObjectKey to destObjectKey in the same bucket and returns the object size
|
||||
func (c *Controller) copyObject(srcObjectKey string, destObjectKey string, bucketID string) error {
|
||||
bucket := c.S3Config.GetBucket(bucketID)
|
||||
s3Client := c.S3Config.GetS3Client(bucketID)
|
||||
copySource := fmt.Sprintf("%s/%s", *bucket, srcObjectKey)
|
||||
copyInput := &s3.CopyObjectInput{
|
||||
Bucket: bucket,
|
||||
CopySource: ©Source,
|
||||
Key: aws.String(destObjectKey),
|
||||
}
|
||||
|
||||
_, err := s3Client.CopyObject(copyInput)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to copy (%s) from %s to %s: %v", bucketID, srcObjectKey, destObjectKey, err)
|
||||
}
|
||||
log.Infof("Copied (%s) from %s to %s", bucketID, srcObjectKey, destObjectKey)
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user