89 lines
2.8 KiB
Go
89 lines
2.8 KiB
Go
// codeberg.org/mapleopentech/monorepo/cloud/maplefile-backend/internal/usecase/filemetadata/anonymize_user_references.go
|
|
package filemetadata
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/gocql/gocql"
|
|
"go.uber.org/zap"
|
|
|
|
dom_file "codeberg.org/mapleopentech/monorepo/cloud/maplefile-backend/internal/domain/file"
|
|
)
|
|
|
|
// AnonymizeUserReferencesUseCase handles anonymizing CreatedByUserID and ModifiedByUserID
|
|
// references when a user is deleted, replacing them with a special "deleted user" UUID.
|
|
type AnonymizeUserReferencesUseCase interface {
|
|
Execute(ctx context.Context, userID gocql.UUID) (int, error)
|
|
}
|
|
|
|
type anonymizeUserReferencesUseCaseImpl struct {
|
|
logger *zap.Logger
|
|
repo dom_file.FileMetadataRepository
|
|
}
|
|
|
|
// NewAnonymizeUserReferencesUseCase creates a new use case for anonymizing user references in files
|
|
func NewAnonymizeUserReferencesUseCase(
|
|
logger *zap.Logger,
|
|
repo dom_file.FileMetadataRepository,
|
|
) AnonymizeUserReferencesUseCase {
|
|
return &anonymizeUserReferencesUseCaseImpl{
|
|
logger: logger,
|
|
repo: repo,
|
|
}
|
|
}
|
|
|
|
// DeletedUserUUID is a well-known UUID representing a deleted user
|
|
// UUID: 00000000-0000-0000-0000-000000000001 (DELETED_USER)
|
|
var DeletedUserUUID = gocql.UUID{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}
|
|
|
|
func (uc *anonymizeUserReferencesUseCaseImpl) Execute(ctx context.Context, userID gocql.UUID) (int, error) {
|
|
uc.logger.Info("Anonymizing user references in file metadata",
|
|
zap.String("user_id", userID.String()))
|
|
|
|
// Get all files created or modified by this user
|
|
files, err := uc.repo.GetByCreatedByUserID(userID)
|
|
if err != nil {
|
|
uc.logger.Error("Failed to get files by created_by_user_id",
|
|
zap.String("user_id", userID.String()),
|
|
zap.Error(err))
|
|
return 0, fmt.Errorf("failed to get files by creator: %w", err)
|
|
}
|
|
|
|
updatedCount := 0
|
|
|
|
// Update each file to replace user references with deleted user UUID
|
|
for _, file := range files {
|
|
needsUpdate := false
|
|
|
|
// Check if this file has references to the deleted user
|
|
if file.CreatedByUserID == userID {
|
|
file.CreatedByUserID = DeletedUserUUID
|
|
needsUpdate = true
|
|
}
|
|
|
|
if file.ModifiedByUserID == userID {
|
|
file.ModifiedByUserID = DeletedUserUUID
|
|
needsUpdate = true
|
|
}
|
|
|
|
if needsUpdate {
|
|
// Update the file with anonymized references
|
|
if err := uc.repo.Update(file); err != nil {
|
|
uc.logger.Error("Failed to anonymize user references in file",
|
|
zap.String("file_id", file.ID.String()),
|
|
zap.String("user_id", userID.String()),
|
|
zap.Error(err))
|
|
// Continue with other files even if one fails
|
|
continue
|
|
}
|
|
updatedCount++
|
|
}
|
|
}
|
|
|
|
uc.logger.Info("✅ Anonymized user references in file metadata",
|
|
zap.String("user_id", userID.String()),
|
|
zap.Int("files_updated", updatedCount))
|
|
|
|
return updatedCount, nil
|
|
}
|