From 0ec6e2e0aede23dcc1bdb65a7ab599027005ce6d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 19 Aug 2025 16:18:07 +0530 Subject: [PATCH] refactor --- server/ente/file.go | 14 ++++++++ server/pkg/api/file.go | 11 ++++--- server/pkg/controller/file_meta.go | 4 +-- server/pkg/repo/file.go | 53 ++++++++++++++++++++---------- 4 files changed, 57 insertions(+), 25 deletions(-) diff --git a/server/ente/file.go b/server/ente/file.go index 117db44729..9196db810a 100644 --- a/server/ente/file.go +++ b/server/ente/file.go @@ -26,6 +26,20 @@ type File struct { Info *FileInfo `json:"info,omitempty"` } +type MetaFile struct { + ID int64 `json:"id"` + OwnerID int64 `json:"ownerID"` + CollectionID int64 `json:"collectionID"` + EncryptedKey string `json:"encryptedKey"` + KeyDecryptionNonce string `json:"keyDecryptionNonce"` + Metadata FileAttributes `json:"metadata" binding:"required"` + // IsDeleted is True when the file ID is removed from the CollectionID + IsDeleted bool `json:"isDeleted"` + UpdationTime int64 `json:"updationTime"` + MagicMetadata *MagicMetadata `json:"magicMetadata,omitempty"` + PubicMagicMetadata *MagicMetadata `json:"pubMagicMetadata,omitempty"` +} + // FileInfo has information about storage used by the file & it's metadata(future) type FileInfo struct { FileSize int64 `json:"fileSize,omitempty"` diff --git a/server/pkg/api/file.go b/server/pkg/api/file.go index df57223fd9..cbb31790c5 100644 --- a/server/pkg/api/file.go +++ b/server/pkg/api/file.go @@ -2,14 +2,15 @@ package api import ( "fmt" - "github.com/ente-io/museum/pkg/controller/file_copy" - "github.com/ente-io/museum/pkg/controller/filedata" - "github.com/ente-io/museum/pkg/controller/public" "net/http" "os" "strconv" "strings" + "github.com/ente-io/museum/pkg/controller/file_copy" + "github.com/ente-io/museum/pkg/controller/filedata" + "github.com/ente-io/museum/pkg/controller/public" + "github.com/ente-io/stacktrace" "github.com/gin-contrib/requestid" log "github.com/sirupsen/logrus" @@ -69,13 +70,13 @@ func (h *FileHandler) CreateOrUpdate(c *gin.Context) { // CreateMetaFile creates an entry for a file func (h *FileHandler) CreateMetaFile(c *gin.Context) { userID := auth.GetUserID(c.Request.Header) - var file ente.File + var file ente.MetaFile if err := c.ShouldBindJSON(&file); err != nil { handler.Error(c, stacktrace.Propagate(err, "")) return } if file.ID != 0 { - handler.Error(c, stacktrace.Propagate(ente.ErrBadRequest, "fileID can't be set when creating a new file" + handler.Error(c, stacktrace.Propagate(ente.ErrBadRequest, "fileID can't be set when creating a new file")) return } file.UpdationTime = time.Microseconds() diff --git a/server/pkg/controller/file_meta.go b/server/pkg/controller/file_meta.go index 5f3712eb00..c4b7d5ecb5 100644 --- a/server/pkg/controller/file_meta.go +++ b/server/pkg/controller/file_meta.go @@ -7,7 +7,7 @@ import ( ) // CreateMetaFile adds an entry for a file in the respective tables -func (c *FileController) CreateMetaFile(ctx *gin.Context, userID int64, file ente.File, userAgent string, app ente.App) (*ente.File, error) { +func (c *FileController) CreateMetaFile(ctx *gin.Context, userID int64, file ente.MetaFile, userAgent string, app ente.App) (*ente.File, error) { collection, collErr := c.CollectionRepo.Get(file.CollectionID) if collErr != nil { return nil, stacktrace.Propagate(collErr, "") @@ -24,5 +24,5 @@ func (c *FileController) CreateMetaFile(ctx *gin.Context, userID int64, file ent return nil, stacktrace.Propagate(ente.ErrPermissionDenied, "file ownerID doesn't match with userID") } resp, err := c.FileRepo.CreateMetaFile(file, userID, app) - return &resp, stacktrace.Propagate(err, "failed to create meta file") + return resp, stacktrace.Propagate(err, "failed to create meta file") } diff --git a/server/pkg/repo/file.go b/server/pkg/repo/file.go index f91cbea571..6d021f7ea1 100644 --- a/server/pkg/repo/file.go +++ b/server/pkg/repo/file.go @@ -128,52 +128,69 @@ func (repo *FileRepository) Create( // CreateMetaFile creates an entry in the database for the given file func (repo *FileRepository) CreateMetaFile( - file ente.File, + metaFile ente.MetaFile, collectionOwnerID int64, app ente.App, -) (ente.File, error) { +) (*ente.File, error) { ctx := context.Background() tx, err := repo.DB.BeginTx(ctx, nil) if err != nil { - return file, stacktrace.Propagate(err, "") + return nil, stacktrace.Propagate(err, "") } - if file.OwnerID != collectionOwnerID { - return file, stacktrace.Propagate(errors.New("both file and collection should belong to same owner"), "") + if metaFile.OwnerID != collectionOwnerID { + return nil, stacktrace.Propagate(errors.New("both file and collection should belong to same owner"), "") } + var fileID int64 + info := &ente.FileInfo{ + FileSize: 0, + ThumbnailSize: 0, + } err = tx.QueryRowContext(ctx, `INSERT INTO files (owner_id, encrypted_metadata, file_decryption_header, thumbnail_decryption_header, metadata_decryption_header, magic_metadata, pub_magic_metadata, info, updation_time) VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING file_id`, - file.OwnerID, file.Metadata.EncryptedData, file.File.DecryptionHeader, - file.Thumbnail.DecryptionHeader, file.Metadata.DecryptionHeader, - file.MagicMetadata, file.PubicMagicMetadata, file.Info, - file.UpdationTime).Scan(&fileID) + metaFile.OwnerID, metaFile.Metadata.EncryptedData, "", + "", metaFile.Metadata.DecryptionHeader, + metaFile.MagicMetadata, metaFile.PubicMagicMetadata, info, + metaFile.UpdationTime).Scan(&fileID) if err != nil { tx.Rollback() - return file, stacktrace.Propagate(err, "") + return nil, stacktrace.Propagate(err, "") } - file.ID = fileID + _, err = tx.ExecContext(ctx, `INSERT INTO collection_files (collection_id, file_id, encrypted_key, key_decryption_nonce, is_deleted, updation_time, c_owner_id, f_owner_id) - VALUES($1, $2, $3, $4, $5, $6, $7, $8)`, file.CollectionID, file.ID, - file.EncryptedKey, file.KeyDecryptionNonce, false, file.UpdationTime, file.OwnerID, collectionOwnerID) + VALUES($1, $2, $3, $4, $5, $6, $7, $8)`, metaFile.CollectionID, metaFile.ID, + metaFile.EncryptedKey, metaFile.KeyDecryptionNonce, false, metaFile.UpdationTime, metaFile.OwnerID, collectionOwnerID) if err != nil { tx.Rollback() - return file, stacktrace.Propagate(err, "") + return nil, stacktrace.Propagate(err, "") } _, err = tx.ExecContext(ctx, `UPDATE collections SET updation_time = $1 - WHERE collection_id = $2`, file.UpdationTime, file.CollectionID) + WHERE collection_id = $2`, metaFile.UpdationTime, metaFile.CollectionID) if err != nil { tx.Rollback() - return file, stacktrace.Propagate(err, "") + return nil, stacktrace.Propagate(err, "") } err = tx.Commit() if err != nil { - return file, stacktrace.Propagate(err, "") + return nil, stacktrace.Propagate(err, "") } - return file, stacktrace.Propagate(err, "") + var file ente.File = ente.File{ + ID: fileID, + UpdationTime: metaFile.UpdationTime, + OwnerID: metaFile.OwnerID, + Metadata: metaFile.Metadata, + PubicMagicMetadata: metaFile.PubicMagicMetadata, + MagicMetadata: metaFile.MagicMetadata, + EncryptedKey: metaFile.EncryptedKey, + KeyDecryptionNonce: metaFile.KeyDecryptionNonce, + Info: info, + CollectionID: collectionOwnerID, + } + return &file, stacktrace.Propagate(err, "") } // markAsNeedingReplication inserts new entries in object_copies, setting the