< Summary

Information
Class: LifeChart.Infrastructure.Backup.LocalExportProvider
Assembly: LifeChart.Infrastructure
File(s): /home/runner/work/lifechart/lifechart/src/LifeChart.Infrastructure/Backup/LocalExportProvider.cs
Tag: 113_29159449707
Line coverage
0%
Covered lines: 0
Uncovered lines: 32
Coverable lines: 32
Total lines: 60
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 4
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor()100%210%
BackupAsync()100%210%
ListBackupsAsync()0%620%
RestoreAsync()0%620%
get_BackupDirectory()100%210%
CopyFileAsync()100%210%

File(s)

/home/runner/work/lifechart/lifechart/src/LifeChart.Infrastructure/Backup/LocalExportProvider.cs

#LineLine coverage
 1using LifeChart.Application.Interfaces;
 2
 3namespace LifeChart.Infrastructure.Backup;
 4
 5public class LocalExportProvider : IBackupProvider
 6{
 7    private readonly string _backupDir;
 8
 09    public LocalExportProvider()
 10    {
 011        _backupDir = Path.Combine(
 012            Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
 013            "LifeChart", "Backups");
 14
 015        Directory.CreateDirectory(_backupDir);
 016    }
 17
 18    public async Task BackupAsync(string dbPath)
 19    {
 020        var fileName = $"lifechart_backup_{DateTime.Today:yyyy-MM-dd}.sqlite";
 021        var destPath = Path.Combine(_backupDir, fileName);
 022        await CopyFileAsync(dbPath, destPath);
 023    }
 24
 25    public Task<IEnumerable<BackupInfo>> ListBackupsAsync()
 26    {
 027        if (!Directory.Exists(_backupDir))
 028            return Task.FromResult(Enumerable.Empty<BackupInfo>());
 29
 030        var files = Directory
 031            .GetFiles(_backupDir, "lifechart_backup_*.sqlite")
 032            .Select(path =>
 033            {
 034                var info = new FileInfo(path);
 035                return new BackupInfo(info.Name, info.LastWriteTimeUtc, info.Length);
 036            })
 037            .OrderByDescending(b => b.CreatedAt);
 38
 039        return Task.FromResult<IEnumerable<BackupInfo>>(files);
 40    }
 41
 42    public async Task RestoreAsync(BackupInfo backup, string targetPath)
 43    {
 044        var sourcePath = Path.Combine(_backupDir, backup.FileName);
 045        if (!File.Exists(sourcePath))
 046            throw new FileNotFoundException(
 047                $"Backup-Datei nicht gefunden: {backup.FileName}");
 48
 049        await CopyFileAsync(sourcePath, targetPath);
 050    }
 51
 052    public string BackupDirectory => _backupDir;
 53
 54    private static async Task CopyFileAsync(string source, string destination)
 55    {
 056        await using var src = File.OpenRead(source);
 057        await using var dst = File.Create(destination);
 058        await src.CopyToAsync(dst);
 059    }
 60}