99 lines
3.3 KiB
Go
99 lines
3.3 KiB
Go
package ipanonymization
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
"codeberg.org/mapleopentech/monorepo/cloud/maplefile-backend/config"
|
|
uc_collection "codeberg.org/mapleopentech/monorepo/cloud/maplefile-backend/internal/usecase/collection"
|
|
uc_filemetadata "codeberg.org/mapleopentech/monorepo/cloud/maplefile-backend/internal/usecase/filemetadata"
|
|
uc_user "codeberg.org/mapleopentech/monorepo/cloud/maplefile-backend/internal/usecase/user"
|
|
)
|
|
|
|
// AnonymizeOldIPsService handles the business logic for anonymizing old IP addresses
|
|
type AnonymizeOldIPsService interface {
|
|
Execute(ctx context.Context) error
|
|
}
|
|
|
|
type anonymizeOldIPsServiceImpl struct {
|
|
config *config.Config
|
|
logger *zap.Logger
|
|
userAnonymizeUseCase uc_user.AnonymizeOldIPsUseCase
|
|
collectionAnonymizeUseCase uc_collection.AnonymizeOldIPsUseCase
|
|
fileMetadataAnonymizeUseCase uc_filemetadata.AnonymizeOldIPsUseCase
|
|
}
|
|
|
|
// NewAnonymizeOldIPsService creates a new service for anonymizing old IP addresses
|
|
func NewAnonymizeOldIPsService(
|
|
cfg *config.Config,
|
|
logger *zap.Logger,
|
|
userAnonymizeUseCase uc_user.AnonymizeOldIPsUseCase,
|
|
collectionAnonymizeUseCase uc_collection.AnonymizeOldIPsUseCase,
|
|
fileMetadataAnonymizeUseCase uc_filemetadata.AnonymizeOldIPsUseCase,
|
|
) AnonymizeOldIPsService {
|
|
logger = logger.Named("AnonymizeOldIPsService")
|
|
return &anonymizeOldIPsServiceImpl{
|
|
config: cfg,
|
|
logger: logger,
|
|
userAnonymizeUseCase: userAnonymizeUseCase,
|
|
collectionAnonymizeUseCase: collectionAnonymizeUseCase,
|
|
fileMetadataAnonymizeUseCase: fileMetadataAnonymizeUseCase,
|
|
}
|
|
}
|
|
|
|
// Execute runs the IP anonymization process for all tables
|
|
func (s *anonymizeOldIPsServiceImpl) Execute(ctx context.Context) error {
|
|
if !s.config.Security.IPAnonymizationEnabled {
|
|
s.logger.Info("IP anonymization is disabled, skipping")
|
|
return nil
|
|
}
|
|
|
|
retentionDays := s.config.Security.IPAnonymizationRetentionDays
|
|
cutoffDate := time.Now().AddDate(0, 0, -retentionDays)
|
|
|
|
s.logger.Info("Starting IP anonymization process",
|
|
zap.Int("retention_days", retentionDays),
|
|
zap.Time("cutoff_date", cutoffDate))
|
|
|
|
totalAnonymized := 0
|
|
|
|
// Anonymize user tables using use-case
|
|
userCount, err := s.userAnonymizeUseCase.Execute(ctx, cutoffDate)
|
|
if err != nil {
|
|
s.logger.Error("Failed to anonymize user tables",
|
|
zap.Error(err),
|
|
zap.Int("records_anonymized_before_error", totalAnonymized))
|
|
return err
|
|
}
|
|
totalAnonymized += userCount
|
|
|
|
// Anonymize collection tables using use-case
|
|
collectionCount, err := s.collectionAnonymizeUseCase.Execute(ctx, cutoffDate)
|
|
if err != nil {
|
|
s.logger.Error("Failed to anonymize collection tables",
|
|
zap.Error(err),
|
|
zap.Int("records_anonymized_before_error", totalAnonymized))
|
|
return err
|
|
}
|
|
totalAnonymized += collectionCount
|
|
|
|
// Anonymize file tables using use-case
|
|
fileCount, err := s.fileMetadataAnonymizeUseCase.Execute(ctx, cutoffDate)
|
|
if err != nil {
|
|
s.logger.Error("Failed to anonymize file tables",
|
|
zap.Error(err),
|
|
zap.Int("records_anonymized_before_error", totalAnonymized))
|
|
return err
|
|
}
|
|
totalAnonymized += fileCount
|
|
|
|
s.logger.Info("IP anonymization process completed successfully",
|
|
zap.Int("total_rows_anonymized", totalAnonymized),
|
|
zap.Int("user_rows", userCount),
|
|
zap.Int("collection_rows", collectionCount),
|
|
zap.Int("file_rows", fileCount))
|
|
|
|
return nil
|
|
}
|