DefaultStrategy   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 106
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 7

Importance

Changes 0
Metric Value
dl 0
loc 106
rs 10
c 0
b 0
f 0
wmc 9
lcom 1
cbo 7

6 Methods

Rating   Name   Duplication   Size   Complexity  
A deleteOldBackups() 0 24 1
A calculateDateRanges() 0 31 1
A groupByDateFormat() 0 6 1
A removeBackupsForAllPeriodsExceptOne() 0 10 1
A removeBackupsOlderThan() 0 6 2
A removeOldBackupsUntilUsingLessThanMaximumStorage() 0 18 3
1
<?php
2
3
namespace Spatie\Backup\Tasks\Cleanup\Strategies;
4
5
use Carbon\Carbon;
6
use Illuminate\Support\Collection;
7
use Spatie\Backup\BackupDestination\Backup;
8
use Spatie\Backup\BackupDestination\BackupCollection;
9
use Spatie\Backup\Tasks\Cleanup\CleanupStrategy;
10
use Spatie\Backup\Tasks\Cleanup\Period;
11
12
class DefaultStrategy extends CleanupStrategy
13
{
14
    /** @var \Spatie\Backup\BackupDestination\Backup */
15
    protected $newestBackup;
16
17
    public function deleteOldBackups(BackupCollection $backups)
18
    {
19
        // Don't ever delete the newest backup.
20
        $this->newestBackup = $backups->shift();
21
22
        $dateRanges = $this->calculateDateRanges();
23
24
        $backupsPerPeriod = $dateRanges->map(function (Period $period) use ($backups) {
25
            return $backups->filter(function (Backup $backup) use ($period) {
26
                return $backup->date()->between($period->startDate(), $period->endDate());
27
            });
28
        });
29
30
        $backupsPerPeriod['daily'] = $this->groupByDateFormat($backupsPerPeriod['daily'], 'Ymd');
31
        $backupsPerPeriod['weekly'] = $this->groupByDateFormat($backupsPerPeriod['weekly'], 'YW');
32
        $backupsPerPeriod['monthly'] = $this->groupByDateFormat($backupsPerPeriod['monthly'], 'Ym');
33
        $backupsPerPeriod['yearly'] = $this->groupByDateFormat($backupsPerPeriod['yearly'], 'Y');
34
35
        $this->removeBackupsForAllPeriodsExceptOne($backupsPerPeriod);
36
37
        $this->removeBackupsOlderThan($dateRanges['yearly']->endDate(), $backups);
38
39
        $this->removeOldBackupsUntilUsingLessThanMaximumStorage($backups);
40
    }
41
42
    protected function calculateDateRanges(): Collection
43
    {
44
        $config = $this->config->get('backup.cleanup.default_strategy');
45
46
        $daily = new Period(
47
            Carbon::now()->subDays($config['keep_all_backups_for_days']),
48
            Carbon::now()
49
                ->subDays($config['keep_all_backups_for_days'])
50
                ->subDays($config['keep_daily_backups_for_days'])
51
        );
52
53
        $weekly = new Period(
54
            $daily->endDate(),
55
            $daily->endDate()
56
                ->subWeeks($config['keep_weekly_backups_for_weeks'])
57
        );
58
59
        $monthly = new Period(
60
            $weekly->endDate(),
61
            $weekly->endDate()
62
                ->subMonths($config['keep_monthly_backups_for_months'])
63
        );
64
65
        $yearly = new Period(
66
            $monthly->endDate(),
67
            $monthly->endDate()
68
                ->subYears($config['keep_yearly_backups_for_years'])
69
        );
70
71
        return collect(compact('daily', 'weekly', 'monthly', 'yearly'));
72
    }
73
74
    protected function groupByDateFormat(Collection $backups, string $dateFormat): Collection
75
    {
76
        return $backups->groupBy(function (Backup $backup) use ($dateFormat) {
77
            return $backup->date()->format($dateFormat);
78
        });
79
    }
80
81
    protected function removeBackupsForAllPeriodsExceptOne(Collection $backupsPerPeriod)
82
    {
83
        $backupsPerPeriod->each(function (Collection $groupedBackupsByDateProperty, string $periodName) {
0 ignored issues
show
Unused Code introduced by
The parameter $periodName is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
84
            $groupedBackupsByDateProperty->each(function (Collection $group) {
85
                $group->shift();
86
87
                $group->each->delete();
88
            });
89
        });
90
    }
91
92
    protected function removeBackupsOlderThan(Carbon $endDate, BackupCollection $backups)
93
    {
94
        $backups->filter(function (Backup $backup) use ($endDate) {
95
            return $backup->exists() && $backup->date()->lt($endDate);
96
        })->each->delete();
97
    }
98
99
    protected function removeOldBackupsUntilUsingLessThanMaximumStorage(BackupCollection $backups)
100
    {
101
        if (! $oldest = $backups->oldest()) {
102
            return;
103
        }
104
105
        $maximumSize = $this->config->get('backup.cleanup.default_strategy.delete_oldest_backups_when_using_more_megabytes_than')
106
            * 1024 * 1024;
107
108
        if (($backups->size() + $this->newestBackup->size()) <= $maximumSize) {
109
            return;
110
        }
111
        $oldest->delete();
112
113
        $backups = $backups->filter->exists();
114
115
        $this->removeOldBackupsUntilUsingLessThanMaximumStorage($backups);
116
    }
117
}
118