mirror of
https://github.com/ente-io/ente.git
synced 2025-05-04 20:38:01 +00:00
100 lines
3.3 KiB
Go
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
|
|
}
|