Completed
Push — master ( f62f21...f72c97 )
by Freek
05:09
created

ListCommand::displayOverview()   B

Complexity

Conditions 4
Paths 1

Size

Total Lines 29
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 29
rs 8.5806
cc 4
eloc 18
nc 1
nop 1
1
<?php
2
3
namespace Spatie\Backup\Commands;
4
5
use Illuminate\Support\Collection;
6
use Spatie\Backup\Helpers\Format;
7
use Spatie\Backup\Tasks\Monitor\BackupDestinationStatus;
8
use Spatie\Backup\Tasks\Monitor\BackupDestinationStatusFactory;
9
10
class ListCommand extends BaseCommand
11
{
12
    /**
13
     * @var string
14
     */
15
    protected $signature = 'backup:list';
16
17
    /**
18
     * @var string
19
     */
20
    protected $description = 'Display a list of all backups.';
21
22
    public function handle()
23
    {
24
        $statuses = BackupDestinationStatusFactory::createForMonitorConfig(config('laravel-backup.monitorBackups'));
25
26
        $this->displayOverview($statuses);
27
28
        $this->displayConnectionErrors($statuses);
29
    }
30
31
    /**
32
     * @param \Illuminate\Support\Collection $backupDestinationStatuses
33
     */
34
    protected function displayOverview(Collection $backupDestinationStatuses)
35
    {
36
        $headers = ['Name', 'Disk', 'Reachable', 'Healthy', '# of backups', 'Youngest backup', 'Used storage'];
37
38
        $rows = $backupDestinationStatuses->map(function (BackupDestinationStatus $backupDestinationStatus) {
39
40
            $row = [
41
                $backupDestinationStatus->getBackupName(),
42
                $backupDestinationStatus->getFilesystemName(),
43
                Format::getEmoji($backupDestinationStatus->isReachable()),
44
                Format::getEmoji($backupDestinationStatus->isHealthy()),
45
                'amount' => $backupDestinationStatus->getAmountOfBackups(),
46
                'youngest' => $backupDestinationStatus->getDateOfNewestBackup()
47
                    ? Format::ageInDays($backupDestinationStatus->getDateOfNewestBackup())
48
                    : 'No backups present',
49
                'usedStorage' => $backupDestinationStatus->getHumanReadableUsedStorage(),
50
            ];
51
52
            if (!$backupDestinationStatus->isReachable()) {
53
                foreach (['amount', 'youngest', 'usedStorage'] as $propertyName) {
54
                    $row[$propertyName] = '/';
55
                }
56
            }
57
58
            return $row;
59
        });
60
61
        $this->table($headers, $rows);
62
    }
63
64
    /**
65
     * @param \Illuminate\Support\Collection $backupDestinationStatuses
66
     */
67
    protected function displayConnectionErrors(Collection $backupDestinationStatuses)
68
    {
69
        $unreachableBackupDestinationStatuses = $backupDestinationStatuses
70
            ->filter(function (BackupDestinationStatus $backupDestinationStatus) {
71
                return !$backupDestinationStatus->isReachable();
72
            });
73
74
        if ($unreachableBackupDestinationStatuses->isEmpty()) {
75
            return;
76
        }
77
78
        $this->warn('');
79
        $this->warn('Unreachable backup destinations');
80
        $this->warn('-------------------------------');
81
82
        $unreachableBackupDestinationStatuses->each(function (BackupDestinationStatus $backupStatus) {
83
84
            $this->warn("Could not reach backups for {$backupStatus->getBackupName()} on disk {$backupStatus->getFilesystemName()} because:");
85
            $this->warn($backupStatus->getConnectionError()->getMessage());
86
            $this->warn('');
87
        });
88
    }
89
}
90