Completed
Push — master ( 9f6466...621974 )
by Freek
02:29 queued 58s
created

ListCommand::displayConnectionErrors()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
nc 2
nop 1
dl 0
loc 21
rs 9.584
c 0
b 0
f 0

1 Method

Rating   Name   Duplication   Size   Complexity  
A ListCommand::getFormattedBackupDate() 0 6 2
1
<?php
2
3
namespace Spatie\Backup\Commands;
4
5
use Spatie\Backup\Helpers\Format;
6
use Illuminate\Support\Collection;
7
use Spatie\Backup\BackupDestination\Backup;
8
use Spatie\Backup\Tasks\Monitor\BackupDestinationStatus;
9
use Spatie\Backup\Tasks\Monitor\BackupDestinationStatusFactory;
10
11
class ListCommand extends BaseCommand
12
{
13
    /** @var string */
14
    protected $signature = 'backup:list';
15
16
    /** @var string */
17
    protected $description = 'Display a list of all backups.';
18
19
    public function handle()
20
    {
21
        $statuses = BackupDestinationStatusFactory::createForMonitorConfig(config('backup.monitor_backups'));
22
23
        $this->displayOverview($statuses)->displayFailures($statuses);
24
    }
25
26
    protected function displayOverview(Collection $backupDestinationStatuses)
27
    {
28
        $headers = ['Name', 'Disk', 'Reachable', 'Healthy', '# of backups', 'Newest backup', 'Used storage'];
29
30
        $rows = $backupDestinationStatuses->map(function (BackupDestinationStatus $backupDestinationStatus) {
31
            return $this->convertToRow($backupDestinationStatus);
32
        });
33
34
        $this->table($headers, $rows);
35
36
        return $this;
37
    }
38
39
    public function convertToRow(BackupDestinationStatus $backupDestinationStatus): array
40
    {
41
        $destination = $backupDestinationStatus->backupDestination();
42
43
        $row = [
44
            $destination->backupName(),
45
            'disk' => $destination->diskName(),
46
            Format::emoji($destination->isReachable()),
47
            Format::emoji($backupDestinationStatus->isHealthy()),
48
            'amount' => $destination->backups()->count(),
49
            'newest' => $this->getFormattedBackupDate($destination->newestBackup()),
50
            'usedStorage' => Format::humanReadableSize($destination->usedStorage()),
51
        ];
52
53
        if (! $destination->isReachable()) {
54
            foreach (['amount', 'newest', 'usedStorage'] as $propertyName) {
55
                $row[$propertyName] = '/';
56
            }
57
        }
58
59
        if ($backupDestinationStatus->getHealthCheckFailure() !== null) {
60
            $row['disk'] = '<error>'.$row['disk'].'</error>';
61
        }
62
63
        return $row;
64
    }
65
66
    protected function displayFailures(Collection $backupDestinationStatuses)
67
    {
68
        $failed = $backupDestinationStatuses
69
            ->filter(function (BackupDestinationStatus $backupDestinationStatus) {
70
                return $backupDestinationStatus->getHealthCheckFailure() !== null;
71
            })
72
            ->map(function (BackupDestinationStatus $backupDestinationStatus) {
73
                return [
74
                    $backupDestinationStatus->backupDestination()->backupName(),
75
                    $backupDestinationStatus->backupDestination()->diskName(),
76
                    $backupDestinationStatus->getHealthCheckFailure()->healthCheck()->name(),
77
                    $backupDestinationStatus->getHealthCheckFailure()->exception()->getMessage(),
78
                ];
79
            });
80
81
        if ($failed->isNotEmpty()) {
82
            $this->warn('');
83
            $this->warn('Unhealthy backup destinations');
84
            $this->warn('-----------------------------');
85
            $this->table(['Name', 'Disk', 'Failed check', 'Description'], $failed->all());
86
        }
87
88
        return $this;
89
    }
90
91
    protected function getFormattedBackupDate(Backup $backup = null)
92
    {
93
        return is_null($backup)
94
            ? 'No backups present'
95
            : Format::ageInDays($backup->date());
96
    }
97
}
98