Completed
Pull Request — master (#34)
by Thorsten
06:33 queued 05:24
created

DirectoryCleaner::deleteEmptySubdirectories()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 10
rs 9.9332
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
namespace Spatie\DirectoryCleanup;
4
5
use Carbon\Carbon;
6
use Illuminate\Filesystem\Filesystem;
7
use Illuminate\Support\Collection;
8
use Spatie\DirectoryCleanup\Policies\CleanupPolicy;
9
10
class DirectoryCleaner
11
{
12
    /** @var \Illuminate\Filesystem\Filesystem */
13
    protected $filesystem;
14
15
    /** @var string */
16
    protected $directory;
17
18
    /** @var Carbon */
19
    protected $timeInPast;
20
21
    public function __construct(Filesystem $filesystem)
22
    {
23
        $this->filesystem = $filesystem;
24
    }
25
26
    public function setDirectory(string $directory)
27
    {
28
        $this->directory = $directory;
29
30
        return $this;
31
    }
32
33
    public function setMinutes($minutes)
34
    {
35
        $this->timeInPast = Carbon::now()->subMinutes($minutes);
36
37
        return $this;
38
    }
39
40
    public function deleteFilesOlderThanMinutes($amountOfFilesDeleted = 0, $directory = ''): int
41
    {
42
        if ($directory === '') { // Empty directory given - lets take the default folder, and all sub directories.
43
            $directory = realpath($this->directory);
44
            $directories = collect(array_merge($this->filesystem->directories($directory), [$directory]));
45
        } else {
46
            $directories = collect($this->filesystem->directories($directory));
47
        }
48
49
        foreach ($directories as $subDirectory) {
50
            $amountOfFilesDeleted = $this->deleteFilesOlderThanMinutes($amountOfFilesDeleted, $subDirectory);
51
        }
52
53
        $files = collect($this->filesystem->files($directory, true))
54
            ->filter(function ($file) {
55
                return Carbon::createFromTimestamp(filemtime($file))
56
                    ->lt($this->timeInPast);
57
            })
58
            ->filter(function ($file) {
59
                return $this->policy()->shouldDelete($file);
60
            })
61
            ->each(function ($file) {
62
                $this->filesystem->delete($file);
63
            });
64
65
        return $amountOfFilesDeleted + $files->count();
66
    }
67
68
    public function deleteEmptySubdirectories(): Collection
69
    {
70
        return collect($this->filesystem->directories($this->directory))
71
            ->filter(function ($directory) {
72
                return ! $this->filesystem->allFiles($directory, true);
73
            })
74
            ->each(function ($directory) {
75
                $this->filesystem->deleteDirectory($directory);
76
            });
77
    }
78
79
    protected function policy(): CleanupPolicy
80
    {
81
        return resolve(config(
82
            'laravel-directory-cleanup.cleanup_policy',
83
            \Spatie\DirectoryCleanup\Policies\DeleteEverything::class
84
        ));
85
    }
86
}
87