package filedata import ( "context" "github.com/ente-io/museum/ente" "github.com/ente-io/museum/ente/filedata" "github.com/ente-io/museum/pkg/utils/auth" "github.com/ente-io/museum/pkg/utils/network" "github.com/ente-io/stacktrace" "github.com/gin-gonic/gin" log "github.com/sirupsen/logrus" ) func (c *Controller) InsertVideoPreview(ctx *gin.Context, req *filedata.VidPreviewRequest) error { if err := req.Validate(); err != nil { return stacktrace.Propagate(err, "validation failed") } userID := auth.GetUserID(ctx.Request.Header) err := c._validatePermission(ctx, req.FileID, userID) if err != nil { return stacktrace.Propagate(err, "") } fileOwnerID := userID bucketID := c.S3Config.GetBucketID(ente.PreviewVideo) fileObjectKey := filedata.ObjectKey(req.FileID, fileOwnerID, ente.PreviewVideo, &req.ObjectID) objectKey := filedata.ObjectMedata(req.FileID, fileOwnerID, ente.PreviewVideo, &req.ObjectID) if sizeErr := c.verifySize(bucketID, fileObjectKey, req.ObjectSize); sizeErr != nil { return stacktrace.Propagate(sizeErr, "failed to validate size") } // Start a goroutine to handle the upload and insert operations go func() { obj := filedata.S3FileMetadata{ Version: *req.Version, EncryptedData: req.Playlist, DecryptionHeader: req.PlayListNonce, Client: network.GetClientInfo(ctx), } logger := log. WithField("objectKey", objectKey). WithField("fileID", req.FileID). WithField("type", ente.PreviewVideo) size, uploadErr := c.uploadObject(obj, objectKey, bucketID) if uploadErr != nil { logger.WithError(uploadErr).Error("upload failed") return } row := filedata.Row{ FileID: req.FileID, Type: ente.PreviewVideo, UserID: fileOwnerID, Size: size + req.ObjectSize, LatestBucket: bucketID, ObjectID: &req.ObjectID, } dbInsertErr := c.Repo.InsertOrUpdatePreviewData(context.Background(), row) if dbInsertErr != nil { logger.WithError(dbInsertErr).Error("insert or update failed") return } }() return nil }