[server] Support for reporting preview video

This commit is contained in:
Neeraj Gupta
2024-08-10 17:16:35 +05:30
parent 251a627219
commit 97c9253127
3 changed files with 45 additions and 2 deletions

View File

@@ -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))
}

View File

@@ -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,

View File

@@ -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: &copySource,
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
}