package core import ( "backea/internal/backup/models" "backea/internal/backup/strategy" "backea/internal/logging" "backea/internal/mail" "context" "os" "time" ) type Service struct { Name string Directory string Strategy strategy.Strategy Mailer *mail.Mailer logger *logging.Logger } func NewService(name string, directory string, strategy strategy.Strategy, mailer *mail.Mailer) *Service { return &Service{ Name: name, Directory: directory, Strategy: strategy, Mailer: mailer, logger: logging.GetLogger(), } } func (s *Service) Backup(ctx context.Context) error { s.logger.Info("Backing up service: %s", s.Name) startTime := time.Now() if _, err := os.Stat(s.Directory); os.IsNotExist(err) { return NewBackupError("directory does not exist: "+s.Directory, nil) } if err := s.Strategy.Execute(ctx, s.Name, s.Directory); err != nil { if s.Mailer != nil { s.Mailer.SendErrorNotification(s.Name, err) } return NewBackupError("backup failed for "+s.Name, err) } duration := time.Since(startTime) s.logger.Info("Backup completed for %s in %v", s.Name, duration) if s.Mailer != nil { s.Mailer.SendSuccessNotification(s.Name, duration) } return nil } func (s *Service) GetBackupInfos(ctx context.Context) ([]models.BackupInfo, error) { infos, err := s.Strategy.ListBackups(ctx, s.Name) if err != nil { return nil, NewBackupError("failed to list backups for "+s.Name, err) } return infos, nil } func (s *Service) GetStorageUsage(ctx context.Context) (*models.StorageUsageInfo, error) { usage, err := s.Strategy.GetStorageUsage(ctx, s.Name) if err != nil { return nil, NewBackupError("failed to get storage usage for "+s.Name, err) } return usage, nil } func (s *Service) RestoreBackup(ctx context.Context, backupID string) error { s.logger.Info("Restoring backup %s for service %s", backupID, s.Name) if err := s.Strategy.RestoreBackup(ctx, backupID, s.Name); err != nil { return NewBackupError("failed to restore backup "+backupID+" for "+s.Name, err) } return nil }