CreatePersonalDataDownloadJob::mailZip()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
<?php
2
3
namespace Spatie\PersonalDataDownload\Jobs;
4
5
use Illuminate\Support\Facades\Mail;
6
use Spatie\PersonalDataDownload\Events\PersonalDataDownloadCreated;
7
use Spatie\PersonalDataDownload\Events\PersonalDataSelected;
8
use Spatie\PersonalDataDownload\Exceptions\InvalidUser;
9
use Spatie\PersonalDataDownload\Zip;
10
use Illuminate\Database\Eloquent\Model;
11
use Illuminate\Support\Facades\Storage;
12
use Illuminate\Contracts\Queue\ShouldQueue;
13
use Spatie\PersonalDataDownload\PersonalData;
14
use Illuminate\Contracts\Filesystem\Filesystem;
15
use Spatie\TemporaryDirectory\TemporaryDirectory;
16
17
class CreatePersonalDataDownloadJob implements ShouldQueue
18
{
19
    /** @var \Illuminate\Database\Eloquent\Model */
20
    protected $user;
21
22
    public function __construct(Model $user)
23
    {
24
        $this->ensureValidUser($user);
25
26
        $this->user = $user;
27
    }
28
29
    public function handle()
30
    {
31
        $temporaryDirectory = (new TemporaryDirectory())->create();
32
33
        $personalData = (new PersonalData($temporaryDirectory))->forUser($this->user);
34
35
        $this->user->selectPersonalData($personalData);
36
37
        event(new PersonalDataSelected($personalData, $this->user));
38
39
        $zipFilename = $this->zipPersonalData($personalData, $this->getDisk(), $temporaryDirectory);
40
41
        $temporaryDirectory->delete();
42
43
        event(new PersonalDataDownloadCreated($zipFilename, $this->user));
44
45
        $this->mailZip($zipFilename);
46
    }
47
48
    protected function selectPersonalData(TemporaryDirectory $temporaryDirectory): PersonalData
49
    {
50
        $personalData = new PersonalData($temporaryDirectory);
51
52
        $this->user->selectPersonalData($personalData);
53
54
        return $personalData;
55
    }
56
57
    protected function zipPersonalData(
58
        PersonalData $personalData,
59
        Filesystem $filesystem,
60
        TemporaryDirectory $temporaryDirectory
61
    ): string {
62
        $zip = Zip::createForPersonalData($personalData, $temporaryDirectory);
63
64
        $zipFilename = pathinfo($zip->path(), PATHINFO_BASENAME);
65
66
        $filesystem->writeStream($zipFilename, fopen($zip->path(), 'r'));
67
68
69
70
        return $zipFilename;
71
    }
72
73
    public function getDisk(): Filesystem
74
    {
75
        return Storage::disk(config('personal-data-download.disk'));
76
    }
77
78
    protected function mailZip(string $zipFilename)
79
    {
80
        $mailableClass = config('personal-data-download.mailable');
81
82
        Mail::to($this->user)->send(new $mailableClass($zipFilename));
83
    }
84
85
    protected function ensureValidUser(Model $user)
86
    {
87
        if (! method_exists($user, 'selectPersonalData')) {
88
            throw InvalidUser::doesNotHaveSelectPersonalDataMethod($user);
89
        }
90
    }
91
}
92