2024-08-08 13:03:34 +05:30

100 lines
3.3 KiB
Go

package filedata
import (
"context"
"fmt"
"github.com/ente-io/museum/ente/filedata"
fileDataRepo "github.com/ente-io/museum/pkg/repo/filedata"
"github.com/sirupsen/logrus"
log "github.com/sirupsen/logrus"
)
// StartDataDeletion clears associated file data from the object store
func (c *Controller) StartDataDeletion() {
log.Info("Cleaning up deleted file data")
// todo: start goroutine workers to delete data
}
func (c *Controller) DeleteFileData(fileID int64) error {
ownerID, err := c.FileRepo.GetOwnerID(fileID)
if err != nil {
return err
}
rows, err := c.Repo.GetFileData(context.Background(), fileID)
if err != nil {
return err
}
for i := range rows {
fileDataRow := rows[i]
ctxLogger := log.WithField("file_id", fileDataRow.DeleteFromBuckets).WithField("type", fileDataRow.Type).WithField("user_id", fileDataRow.UserID)
objectKeys := filedata.AllObjects(fileID, ownerID, fileDataRow.Type)
bucketColumnMap := make(map[string]string)
bucketColumnMap, err = getMapOfbucketItToColumn(fileDataRow)
if err != nil {
ctxLogger.WithError(err).Error("Failed to get bucketColumnMap")
return err
}
// Delete objects and remove buckets
for bucketID, columnName := range bucketColumnMap {
for _, objectKey := range objectKeys {
err := c.ObjectCleanupController.DeleteObjectFromDataCenter(objectKey, bucketID)
if err != nil {
ctxLogger.WithError(err).WithFields(logrus.Fields{
"bucketID": bucketID,
"column": columnName,
"objectKey": objectKey,
}).Error("Failed to delete object from datacenter")
return err
}
}
dbErr := c.Repo.RemoveBucket(fileDataRow, bucketID, columnName)
if dbErr != nil {
ctxLogger.WithError(dbErr).WithFields(logrus.Fields{
"bucketID": bucketID,
"column": columnName,
}).Error("Failed to remove bucket from db")
return dbErr
}
}
// Delete from Latest bucket
for k := range objectKeys {
err = c.ObjectCleanupController.DeleteObjectFromDataCenter(objectKeys[k], fileDataRow.LatestBucket)
if err != nil {
ctxLogger.WithError(err).Error("Failed to delete object from datacenter")
return err
}
}
dbErr := c.Repo.DeleteFileData(context.Background(), fileDataRow)
if dbErr != nil {
ctxLogger.WithError(dbErr).Error("Failed to remove from db")
return err
}
}
return nil
}
func getMapOfbucketItToColumn(row filedata.Row) (map[string]string, error) {
bucketColumnMap := make(map[string]string)
for _, bucketID := range row.DeleteFromBuckets {
if existingColumn, exists := bucketColumnMap[bucketID]; exists {
return nil, fmt.Errorf("Duplicate DeleteFromBuckets ID found: %s in column %s", bucketID, existingColumn)
}
bucketColumnMap[bucketID] = fileDataRepo.DeletionColumn
}
for _, bucketID := range row.ReplicatedBuckets {
if existingColumn, exists := bucketColumnMap[bucketID]; exists {
return nil, fmt.Errorf("Duplicate ReplicatedBuckets ID found: %s in column %s", bucketID, existingColumn)
}
bucketColumnMap[bucketID] = fileDataRepo.ReplicationColumn
}
for _, bucketID := range row.InflightReplicas {
if existingColumn, exists := bucketColumnMap[bucketID]; exists {
return nil, fmt.Errorf("Duplicate InFlightBucketID found: %s in column %s", bucketID, existingColumn)
}
bucketColumnMap[bucketID] = fileDataRepo.InflightRepColumn
}
return bucketColumnMap, nil
}