From 97c92531274e5b5a174849ebb1c06d4aa2f7bc68 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 10 Aug 2024 17:16:35 +0530 Subject: [PATCH] [server] Support for reporting preview video --- server/ente/filedata/putfiledata.go | 10 ++++++++++ server/pkg/controller/filedata/controller.go | 17 +++++++++++++++-- server/pkg/controller/filedata/s3.go | 20 ++++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/server/ente/filedata/putfiledata.go b/server/ente/filedata/putfiledata.go index 0d70570da3..08ef42ef1b 100644 --- a/server/ente/filedata/putfiledata.go +++ b/server/ente/filedata/putfiledata.go @@ -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)) +} diff --git a/server/pkg/controller/filedata/controller.go b/server/pkg/controller/filedata/controller.go index b01cec9c48..9809d7f217 100644 --- a/server/pkg/controller/filedata/controller.go +++ b/server/pkg/controller/filedata/controller.go @@ -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, diff --git a/server/pkg/controller/filedata/s3.go b/server/pkg/controller/filedata/s3.go index 415e28cb28..e6f1200bf8 100644 --- a/server/pkg/controller/filedata/s3.go +++ b/server/pkg/controller/filedata/s3.go @@ -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 +}