Completed
Push — master ( be2741...ff922a )
by Freek
03:09
created

ListCommand::convertToRow()   B

Complexity

Conditions 4
Paths 4

Size

Total Lines 24
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 16
c 1
b 0
f 0
nc 4
nop 1
dl 0
loc 24
rs 8.6845
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
            return $this->convertToRow($backupDestinationStatus);
40
        });
41
42
        $this->table($headers, $rows);
43
    }
44
45
    /**
46
     * @param \Spatie\Backup\Tasks\Monitor\BackupDestinationStatus $backupDestinationStatus
47
     *
48
     * @return array
49
     */
50
    public function convertToRow(BackupDestinationStatus $backupDestinationStatus)
51
    {
52
        $row = [
53
            $backupDestinationStatus->getBackupName(),
54
            $backupDestinationStatus->getDiskName(),
55
            Format::getEmoji($backupDestinationStatus->isReachable()),
56
            Format::getEmoji($backupDestinationStatus->isHealthy()),
57
            'amount' => $backupDestinationStatus->getAmountOfBackups(),
58
            'youngest' => $backupDestinationStatus->getDateOfNewestBackup()
59
                ? Format::ageInDays($backupDestinationStatus->getDateOfNewestBackup())
60
                : 'No backups present',
61
            'usedStorage' => $backupDestinationStatus->getHumanReadableUsedStorage(),
62
        ];
63
64
        if (!$backupDestinationStatus->isReachable()) {
65
            foreach (['amount', 'youngest', 'usedStorage'] as $propertyName) {
66
                $row[$propertyName] = '/';
67
            }
68
        }
69
70
        $row = $this->applyStylingToRow($row, $backupDestinationStatus);
71
72
        return $row;
73
    }
74
75
    /**
76
     * @param array                                                $row
77
     * @param \Spatie\Backup\Tasks\Monitor\BackupDestinationStatus $backupDestinationStatus
78
     *
79
     * @return array
80
     */
81
    protected function applyStylingToRow($row, BackupDestinationStatus $backupDestinationStatus)
82
    {
83
        if ($backupDestinationStatus->newestBackupIsToolOld() || (!$backupDestinationStatus->getDateOfNewestBackup())) {
84
            $row['youngest'] = "<error>{$row['youngest']}</error>";
85
        }
86
87
        if ($backupDestinationStatus->backupUsesTooMuchStorage()) {
88
            $row['usedStorage'] = "<error>{$row['usedStorage']} </error>";
89
        }
90
91
        return $row;
92
    }
93
94
    /**
95
     * @param \Illuminate\Support\Collection $backupDestinationStatuses
96
     */
97
    protected function displayConnectionErrors(Collection $backupDestinationStatuses)
98
    {
99
        $unreachableBackupDestinationStatuses = $backupDestinationStatuses
100
            ->filter(function (BackupDestinationStatus $backupDestinationStatus) {
101
                return !$backupDestinationStatus->isReachable();
102
            });
103
104
        if ($unreachableBackupDestinationStatuses->isEmpty()) {
105
            return;
106
        }
107
108
        $this->warn('');
109
        $this->warn('Unreachable backup destinations');
110
        $this->warn('-------------------------------');
111
112
        $unreachableBackupDestinationStatuses->each(function (BackupDestinationStatus $backupStatus) {
113
114
            $this->warn("Could not reach backups for {$backupStatus->getBackupName()} on disk {$backupStatus->getFilesystemName()} because:");
0 ignored issues
show
Deprecated Code introduced by
The method Spatie\Backup\Tasks\Moni...us::getFilesystemName() has been deprecated.

This method has been deprecated.

Loading history...
115
            $this->warn($backupStatus->getConnectionError()->getMessage());
116
            $this->warn('');
117
        });
118
    }
119
}
120