79 lines
2.0 KiB
Go
79 lines
2.0 KiB
Go
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
|
|
}
|